Nextcloud mit Docker einrichten: Ihre private Cloud in wenigen Schritten

Nextcloud ist die führende Open-Source-Alternative zu Google Drive, Dropbox und OneDrive. Mit Docker können Sie Ihre eigene private Cloud in wenigen Minuten einrichten. Diese Anleitung zeigt Ihnen Schritt für Schritt, wie Sie Nextcloud professionell mit Docker Compose betreiben.

Warum Nextcloud selbst hosten?

Nextcloud bietet Ihnen die volle Kontrolle über Ihre Daten. Anders als bei Cloud-Diensten wie Google Drive oder Dropbox liegen Ihre Dateien auf Ihrem eigenen Server. Sie bestimmen, wo Ihre Daten gespeichert werden, wer Zugriff hat und wie lange sie aufbewahrt werden. Für Unternehmen ist das besonders relevant in Bezug auf DSGVO-Konformität und Datenschutzanforderungen.

  • Dateisynchronisation: Desktop, Mobile und Web-Zugriff auf alle Dateien
  • Kalender und Kontakte: CalDAV und CardDAV Integration
  • Office-Dokumente: Kollaborative Bearbeitung mit Collabora oder OnlyOffice
  • Erweiterbar: Hunderte Apps für Notizen, Aufgaben, Passwörter und mehr

Voraussetzungen

Für dieses Tutorial benötigen Sie einen Server (VPS, Dedicated Server oder Homeserver) mit installiertem Docker und Docker Compose. Ein Domainname mit DNS-Eintrag auf Ihren Server ist für SSL-Zertifikate erforderlich. Empfohlene Mindestanforderungen sind 2 CPU-Kerne, 4 GB RAM und 50 GB Speicherplatz.

Verzeichnisstruktur anlegen

Erstellen Sie zunächst eine saubere Verzeichnisstruktur für Ihre Nextcloud-Installation:

# Projektverzeichnis erstellen
mkdir -p ~/nextcloud/{config,data,db}
cd ~/nextcloud

# Berechtigungen setzen (wichtig für www-data User)
sudo chown -R 33:33 data

Docker Compose Konfiguration

Die folgende docker-compose.yml enthält alle nötigen Services: Nextcloud, MariaDB als Datenbank, Redis für Caching und Nginx als Reverse Proxy mit automatischer SSL-Zertifikatserstellung.

# docker-compose.yml
version: '3.8'

services:
  db:
    image: mariadb:10.11
    container_name: nextcloud-db
    restart: unless-stopped
    command: --transaction-isolation=READ-COMMITTED --log-bin=binlog --binlog-format=ROW
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    healthcheck:
      test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    container_name: nextcloud-redis
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD}
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

  nextcloud:
    image: nextcloud:29-apache
    container_name: nextcloud-app
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - ./data:/var/www/html
      - ./config:/var/www/html/config
    environment:
      - MYSQL_HOST=db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - REDIS_HOST=redis
      - REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
      - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
      - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
      - NEXTCLOUD_TRUSTED_DOMAINS=${NEXTCLOUD_DOMAIN}
      - OVERWRITEPROTOCOL=https
      - OVERWRITEHOST=${NEXTCLOUD_DOMAIN}
      - PHP_MEMORY_LIMIT=1G
      - PHP_UPLOAD_LIMIT=16G
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.rule=Host(`${NEXTCLOUD_DOMAIN}`)"
      - "traefik.http.routers.nextcloud.entrypoints=websecure"
      - "traefik.http.routers.nextcloud.tls.certresolver=letsencrypt"
      - "traefik.http.services.nextcloud.loadbalancer.server.port=80"
      - "traefik.http.middlewares.nextcloud-headers.headers.customResponseHeaders.Strict-Transport-Security=max-age=31536000; includeSubDomains"
      - "traefik.http.routers.nextcloud.middlewares=nextcloud-headers"

  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./traefik/acme.json:/acme.json
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL}"
      - "--certificatesresolvers.letsencrypt.acme.storage=/acme.json"
      - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"

  cron:
    image: nextcloud:29-apache
    container_name: nextcloud-cron
    restart: unless-stopped
    depends_on:
      - nextcloud
    volumes:
      - ./data:/var/www/html
      - ./config:/var/www/html/config
    entrypoint: /cron.sh

Umgebungsvariablen konfigurieren

Erstellen Sie eine .env-Datei mit Ihren spezifischen Einstellungen. Verwenden Sie sichere, zufällig generierte Passwörter:

# .env
# Datenbank
MYSQL_ROOT_PASSWORD=sicheres_root_passwort_hier
MYSQL_PASSWORD=sicheres_db_passwort_hier

# Redis Cache
REDIS_PASSWORD=sicheres_redis_passwort_hier

# Nextcloud Admin
NEXTCLOUD_ADMIN_USER=admin
NEXTCLOUD_ADMIN_PASSWORD=sicheres_admin_passwort_hier

# Domain und SSL
NEXTCLOUD_DOMAIN=cloud.ihre-domain.de
ACME_EMAIL=ihre@email.de

Hinweis: Generieren Sie sichere Passwörter mit: openssl rand -base64 32

Traefik SSL-Zertifikate vorbereiten

Für die SSL-Zertifikatsspeicherung muss die acme.json-Datei mit korrekten Berechtigungen existieren:

# Traefik-Verzeichnis erstellen
mkdir -p traefik

# acme.json erstellen mit korrekten Berechtigungen
touch traefik/acme.json
chmod 600 traefik/acme.json

Nextcloud starten

Jetzt können Sie Nextcloud starten. Die erste Initialisierung kann einige Minuten dauern:

# Alle Services starten
docker compose up -d

# Logs verfolgen
docker compose logs -f nextcloud

# Status prüfen
docker compose ps

Nach dem Start ist Nextcloud unter https://cloud.ihre-domain.de erreichbar. Melden Sie sich mit den in der .env konfigurierten Admin-Zugangsdaten an.

Performance-Optimierung

Für optimale Performance sollten Sie einige Einstellungen in der config/config.php vornehmen. Diese Einstellungen können Sie über die occ-Kommandozeile oder direkt in der Datei anpassen:

# PHP Memory Limit erhöhen (bereits in docker-compose.yml)
# Zusätzliche Konfiguration über occ

# In den Container einsteigen
docker compose exec -u www-data nextcloud php occ

# Beispiel: Hintergrund-Jobs auf Cron umstellen
docker compose exec -u www-data nextcloud php occ background:cron

# Dateivorschau-Generierung aktivieren
docker compose exec -u www-data nextcloud php occ config:system:set enable_previews --value=true

# OPCache-Einstellungen prüfen
docker compose exec -u www-data nextcloud php occ config:system:get memcache.local

Empfohlene config.php Einstellungen

// config/config.php (Auszug)
<?php
$CONFIG = array (
  // ... bestehende Einstellungen ...

  // Redis für File Locking
  'memcache.locking' => '\\OC\\Memcache\\Redis',
  'memcache.local' => '\\OC\\Memcache\\Redis',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',

  'redis' => array(
    'host' => 'redis',
    'port' => 6379,
    'password' => 'ihr_redis_passwort',
  ),

  // Standard-Telefonregion
  'default_phone_region' => 'DE',

  // Maintenance Window für automatische Updates
  'maintenance_window_start' => 1,
);

Backup-Strategie

Ein regelmäßiges Backup ist essentiell. Sie müssen die Datenbank und die Dateien sichern:

#!/bin/bash
# backup.sh

# Konfiguration
BACKUP_DIR="/backup/nextcloud"
DATE=$(date +%Y-%m-%d_%H-%M-%S)
NC_DIR="/home/user/nextcloud"

# Verzeichnis erstellen
mkdir -p "${BACKUP_DIR}/${DATE}"

# Nextcloud in Maintenance-Modus versetzen
docker compose -f ${NC_DIR}/docker-compose.yml exec -u www-data nextcloud php occ maintenance:mode --on

# Datenbank-Backup
docker compose -f ${NC_DIR}/docker-compose.yml exec db mysqldump -u nextcloud -p${MYSQL_PASSWORD} nextcloud | gzip > "${BACKUP_DIR}/${DATE}/database.sql.gz"

# Dateien-Backup
tar -czf "${BACKUP_DIR}/${DATE}/data.tar.gz" -C ${NC_DIR} data config

# Maintenance-Modus deaktivieren
docker compose -f ${NC_DIR}/docker-compose.yml exec -u www-data nextcloud php occ maintenance:mode --off

# Alte Backups löschen (älter als 30 Tage)
find ${BACKUP_DIR} -type d -mtime +30 -exec rm -rf {} +

echo "Backup abgeschlossen: ${BACKUP_DIR}/${DATE}"

Praxis-Tipp: Richten Sie einen Cronjob ein, der das Backup-Skript täglich ausführt: 0 3 * * * /path/to/backup.sh

Updates durchführen

Docker macht Updates einfach. Erstellen Sie vor jedem Update ein Backup:

# Backup erstellen
./backup.sh

# Neue Images ziehen
docker compose pull

# Container neu starten
docker compose up -d

# Update-Status prüfen
docker compose exec -u www-data nextcloud php occ upgrade

# Alte Images aufräumen
docker image prune -f

Empfohlene Apps installieren

Nach der Grundinstallation können Sie Nextcloud mit nützlichen Apps erweitern:

AppFunktion
CalendarKalender mit CalDAV-Synchronisation
ContactsKontaktverwaltung mit CardDAV
TasksAufgabenverwaltung
NotesMarkdown-Notizen
DeckKanban-Board für Projektmanagement
TalkVideo- und Sprachanrufe
Collabora OnlineOffice-Dokumente bearbeiten
Two-Factor TOTPZwei-Faktor-Authentifizierung
# Apps über occ installieren
docker compose exec -u www-data nextcloud php occ app:install calendar
docker compose exec -u www-data nextcloud php occ app:install contacts
docker compose exec -u www-data nextcloud php occ app:install tasks
docker compose exec -u www-data nextcloud php occ app:install notes
docker compose exec -u www-data nextcloud php occ app:install deck

Sicherheitshinweise

  • Zwei-Faktor-Authentifizierung: Aktivieren Sie 2FA für alle Benutzer
  • Fail2ban einrichten: Schützt vor Brute-Force-Angriffen
  • Regelmäßige Updates: Halten Sie Nextcloud und Docker aktuell
  • Security Scan: Nutzen Sie den eingebauten Sicherheits-Check unter Einstellungen
  • Firewall: Öffnen Sie nur Port 80 und 443 nach außen

Fazit

Mit Docker und Docker Compose haben Sie in wenigen Schritten eine vollständige Nextcloud-Installation eingerichtet. Die Kombination aus Traefik für SSL-Terminierung, MariaDB als Datenbank und Redis für Caching bietet eine solide Grundlage für den produktiven Einsatz. Vergessen Sie nicht, regelmäßige Backups einzurichten und Ihre Installation aktuell zu halten. Mit den empfohlenen Apps wird Nextcloud zur vollwertigen Alternative für Google Workspace oder Microsoft 365.

Nextcloud-Setup für Ihr Unternehmen?