Nextcloud ist eine fantastische Self-Hosting-Alternative zu Google Drive oder Dropbox. Wenn man Nextcloud jedoch auf einem günstigen VPS hostet, stösst man durch den lokal begrenzten Festplattenspeicher schnell an Grenzen. Die Lösung? S3 Object Storage!

In diesem Tutorial zeige ich dir detailliert, wie du Nextcloud als Docker-Container auf einem VPS aufsetzt und einen S3-Bucket (z. B. Hetzner Storage Box, AWS S3 oder Wasabi) direkt als primären Speicher einbindest.

Achtung: Dieses Tutorial deckt die Einrichtung der dazugehörigen Backups (für die Datenbank und die Server-Konfigurationen) nicht ab. Für ein Production-Deployment ist ein vollumfängliches Backup-Konzept zwingend erforderlich!

Voraussetzungen

  • Ein Server (VPS) mit z.B. Ubuntu 24.04 (mindestens 2 GB RAM empfohlen).
  • S3 Zugangsdaten: Ein komplett leerer S3-Bucket mit den dazugehörigen Schlüsseln (bucket_name, endpoint_url, access_key und secret_key).
  • Eine Domain, die bereits per DNS-A-Record auf die IP-Adresse deines VPS zeigt.

Schritt 1: Docker und Docker Compose installieren

Bevor wir starten, müssen Docker und Docker Compose installiert sein. Auf einem frischen Ubuntu-System geht das über das offizielle Script am einfachsten:

sudo apt-get update && sudo apt-get upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

Schritt 2: Dateistruktur vorbereiten

Erstelle ein Verzeichnis für dein Nextcloud-Projekt. Dort werden wir die Konfiguration sowie die Datenbank mounten:

mkdir -p ~/nextcloud/db ~/nextcloud/html
cd ~/nextcloud

Schritt 3: Docker Compose Datei erstellen

Erstelle eine docker-compose.yml Datei in dem Ordner:

version: '3.8'

services:
  db:
    image: mariadb:10.11
    restart: always
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=EinSicheresRootPasswort!
      - MYSQL_PASSWORD=EinSicheresDbPasswort
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud

  app:
    image: nextcloud:apache
    restart: always
    ports:
      - 8080:80
    volumes:
      - ./html:/var/www/html
    environment:
      - MYSQL_PASSWORD=EinSicheresDbPasswort
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_HOST=db
      # S3 Config für primären Speicher
      - OBJECTSTORE_S3_BUCKET=dein-bucket-name
      - OBJECTSTORE_S3_REGION=eu-central-1
      - OBJECTSTORE_S3_HOST=s3.eu-central-1.amazonaws.com # oder Hetzner/Wasabi Endpoint
      - OBJECTSTORE_S3_KEY=dein-access-key
      - OBJECTSTORE_S3_SECRET=dein-secret-key
      - OBJECTSTORE_S3_SSL=true
      - OBJECTSTORE_S3_PORT=443
      - OBJECTSTORE_S3_USEPATH_STYLE=true
    depends_on:
      - db

  cron:
    image: nextcloud:apache
    restart: always
    volumes:
      - ./html:/var/www/html
    entrypoint: /cron.sh
    depends_on:
      - db

Erklärung der Konfiguration:

  • S3 Einstellungen: Wir übergeben Nextcloud via Umgebungsvariablen direkt die S3 Credentials. Das Attribut USEPATH_STYLE=true ist besonders bei alternativen Anbietern (wie MinIO oder Hetzner) wichtig.
  • Cron Service: Nextcloud benötigt regelmäßige Hintergrundaufgaben. Der Cron-Container führt diese Performance-schonend im Hintergrund aus, ohne dass wir Cronjobs auf dem Host-System anlegen müssen.
  • Wichtig: Tausche die Zugangsdaten für Datenbank und S3 durch deine echten Werte aus!

Schritt 4: S3 als Primary Storage konfigurieren & Container Starten

Nextcloud liest die OBJECTSTORE_S3-Variablen nur beim ersten Start und erstellt automatisch die config.php mit den richtigen Einträgen für den Primary Storage. Es ist fundamental wichtig, dass der S3 Bucket komplett leer ist.

Starte die Container mit:

sudo docker compose up -d

Es dauert ein paar Minuten, bis die Datenbank und Nextcloud initialisiert sind. Du kannst den Status mit sudo docker compose logs -f app überprüfen.

Schritt 5: Reverse Proxy & SSL (z. B. mit Caddy)

Es ist grob fahrlässig, Nextcloud ohne HTTPS (SSL) ins Netz zu stellen. Am einfachsten lässt sich das mit einem Reverse Proxy wie Caddy lösen.

Installiere Caddy auf dem VPS (siehe offizielle Caddy Docs) und konfiguriere in der /etc/caddy/Caddyfile einfach deine Domain:

nextcloud.deinedomain.ch {
    reverse_proxy localhost:8080
}

Lade Caddy neu und navigiere in deinem Browser zu der gewählten Domain. Du solltest nun das Nextcloud-Installationsfenster (über ein sicheres Let’s Encrypt Zertifikat) sehen. Dort legst du als finalen Schritt dein Admin-Konto an!

Fazit

Fertig! Deine Nextcloud-Instanz läuft nun. Anstatt den begrenzten (und oft teuren) NVMe-Speicher des VPS zu belasten, werden jetzt sämtliche Dateien transparent und hochverfügbar in deinem S3-Bucket gespeichert.

Das Setup ist nicht nur deutlich günstiger bei grossen Datenmengen, sondern lässt sich zudem leicht skalieren. Falls du Hilfe bei derartigen Setups oder bei professionellen Corporate IT Software-Projekten brauchst, zögere nicht, mich als Freelancer zu kontaktieren.