Seafile 13.0 + SeaDoc selbst hosten – Dropbox-Alternative mit Docker Compose

Was ist Seafile?

Seafile ist eine leistungsstarke Open-Source-Dateisynchronisation und -Freigabeplattform – die ideale selbst-gehostete Alternative zu Dropbox, Nextcloud oder Google Drive. Anders als Nextcloud ist Seafile speziell auf Performance bei vielen Dateien optimiert und bietet differenzielle Synchronisation – perfekt für große Verzeichnisstrukturen.

SeaDoc ist der dazugehörige Echtzeit-Kollaborationseditor – ähnlich wie Google Docs, aber komplett unter eigener Kontrolle.

Architektur

                  ┌─────────────────────────┐
                  │      Nginx (SSL:443)     │
                  │   cloud.example.com      │
                  └────────────┬────────────┘
                               │
                  ┌────────────▼────────────┐
                  │      Seafile (Docker)    │
                  │      Port 127.0.0.1:9200 │
                  └────────┬────────────────┘
                           │
          ┌────────────────┼─────────────────┐
          │                │                  │
    ┌─────▼─────┐   ┌─────▼──────┐   ┌──────▼───────┐
    │  MariaDB  │   │   Redis    │   │   Memcached   │
    │   :3306   │   │  :6379     │   │   :11211      │
    └───────────┘   └────────────┘   └───────────────┘

    Seadoc (Port 127.0.0.1:8899) ── optionaler Editor

Alle 5 Container

Container Image Port RAM-Limit Funktion
seafile seafileltd/seafile-mc:13.0-latest 9200 2 GB Hauptanwendung (Web + Sync)
seafile-mysql mariadb:10.11 3306 512 MB Datenbank
seafile-redis redis:7-alpine 6379 128 MB Session-Cache + Queue
seafile-memcached memcached:1.6-alpine 11211 384 MB Object Cache
seafile-seadoc seafileltd/sdoc-server:2.0-latest 8899 512 MB Echtzeit-Editor (optional)

1. docker-compose.yml

services:
  db:
    image: mariadb:10.11
    container_name: seafile-mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${INIT_SEAFILE_MYSQL_ROOT_PASSWORD}
      MYSQL_LOG_CONSOLE: "true"
    volumes:
      - ${SEAFILE_MYSQL_VOLUME}:/var/lib/mysql
    networks:
      - seafile-net
    healthcheck:
      test: ["CMD", "/usr/local/bin/healthcheck.sh", "--connect", "--mariadbupgrade"]
      interval: 20s
      retries: 10
      start_period: 30s
    deploy:
      resources:
        limits:
          memory: 512m

  redis:
    image: redis:7-alpine
    container_name: seafile-redis
    restart: unless-stopped
    environment:
      REDIS_PASSWORD: ${REDIS_PASSWORD}
    command:
      - /bin/sh
      - -c
      - redis-server --requirepass "$$REDIS_PASSWORD"
    networks:
      - seafile-net
    healthcheck:
      test: ["CMD-SHELL", "redis-cli -a "$REDIS_PASSWORD" --no-auth-warning ping | grep -q PONG"]
      interval: 10s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 128m

  memcached:
    image: memcached:1.6-alpine
    container_name: seafile-memcached
    restart: unless-stopped
    command: memcached -m 256
    networks:
      - seafile-net
    healthcheck:
      test: ["CMD", "nc", "-z", "127.0.0.1", "11211"]
      interval: 10s
      retries: 5
    deploy:
      resources:
        limits:
          memory: 384m

  seafile:
    image: seafileltd/seafile-mc:13.0-latest
    container_name: seafile
    restart: unless-stopped
    ports:
      - "127.0.0.1:9200:80"
    volumes:
      - ${SEAFILE_VOLUME}:/shared
    environment:
      SEAFILE_SERVER_HOSTNAME: ${SEAFILE_SERVER_HOSTNAME}
      SEAFILE_SERVER_PROTOCOL: https
      TIME_ZONE: Europe/Berlin

      # Admin (nur erster Start)
      INIT_SEAFILE_ADMIN_EMAIL: ${INIT_SEAFILE_ADMIN_EMAIL}
      INIT_SEAFILE_ADMIN_PASSWORD: ${INIT_SEAFILE_ADMIN_PASSWORD}

      # DB
      SEAFILE_MYSQL_DB_HOST: db
      SEAFILE_MYSQL_DB_PORT: 3306
      SEAFILE_MYSQL_DB_USER: seafile
      SEAFILE_MYSQL_DB_PASSWORD: ${SEAFILE_MYSQL_DB_PASSWORD}
      INIT_SEAFILE_MYSQL_ROOT_PASSWORD: ${INIT_SEAFILE_MYSQL_ROOT_PASSWORD}

      # Redis
      CACHE_PROVIDER: redis
      REDIS_HOST: redis
      REDIS_PORT: 6379
      REDIS_PASSWORD: ${REDIS_PASSWORD}

      # Memcached
      MEMCACHED_HOST: memcached
      MEMCACHED_PORT: 11211

      # Email
      EMAIL_HOST: ${EMAIL_HOST}
      EMAIL_PORT: ${EMAIL_PORT}
      EMAIL_HOST_USER: ${EMAIL_HOST_USER}
      EMAIL_HOST_PASSWORD: ${EMAIL_HOST_PASSWORD}
      DEFAULT_FROM_EMAIL: ${DEFAULT_FROM_EMAIL}
      EMAIL_FROM_NAME: Seafile

      # Features
      JWT_PRIVATE_KEY: ${JWT_PRIVATE_KEY}
      ENABLE_GO_FILESERVER: "true"
      MAX_UPLOAD_FILE_SIZE: 5368709120
      ENABLE_AUDIT_LOG: "true"
      ENABLE_SHARE_TO_ALL_GROUPS: "false"
      TRASH_KEEP_DAYS: 30

    depends_on:
      db: { condition: service_healthy }
      redis: { condition: service_healthy }
      memcached: { condition: service_healthy }
    networks:
      - seafile-net
    deploy:
      resources:
        limits:
          memory: 2g

  seadoc:
    image: seafileltd/sdoc-server:2.0-latest
    container_name: seafile-seadoc
    restart: unless-stopped
    ports:
      - "127.0.0.1:8899:80"
    volumes:
      - ${SEADOC_VOLUME}:/data
    environment:
      SEAFILE_URL: "http://seafile:80"
      REDIS_URL: "redis://:${REDIS_PASSWORD}@redis:6379"
    depends_on:
      seafile: { condition: service_started }
      redis: { condition: service_healthy }
    networks:
      - seafile-net
    deploy:
      resources:
        limits:
          memory: 512m

networks:
  seafile-net:
    name: seafile-net

2. .env (Umgebungsvariablen)

#################################
# Docker images                 #
#################################
SEAFILE_IMAGE=seafileltd/seafile-mc:13.0-latest
SEAFILE_DB_IMAGE=mariadb:10.11
SEAFILE_REDIS_IMAGE=redis:7-alpine
SEADOC_IMAGE=seafileltd/sdoc-server:2.0-latest

#################################
# Persistent storage            #
#################################
BASIC_STORAGE_PATH=/opt/containers/seafile
SEAFILE_VOLUME=${BASIC_STORAGE_PATH}/seafile-data
SEAFILE_MYSQL_VOLUME=${BASIC_STORAGE_PATH}/seafile-mysql/db
SEADOC_VOLUME=${BASIC_STORAGE_PATH}/seadoc-data

#################################
# Server                        #
#################################
SEAFILE_SERVER_HOSTNAME=cloud.example.com
SEAFILE_SERVER_PROTOCOL=https
TIME_ZONE=Europe/Berlin

#################################
# Security                      #
#################################
JWT_PRIVATE_KEY="DEIN_GEHEIMER_JWT_KEY"
CSRF_TRUSTED_ORIGINS=https://cloud.example.com
ALLOWED_HOSTS=cloud.example.com

#################################
# Database                      #
#################################
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_PASSWORD=DEIN_DB_PASSWORT
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=DEIN_ROOT_PASSWORT

#################################
# Redis                         #
#################################
REDIS_PASSWORD=DEIN_REDIS_PASSWORT

#################################
# Admin Account (first run)     #
#################################
INIT_SEAFILE_ADMIN_EMAIL=admin@example.com
INIT_SEAFILE_ADMIN_PASSWORD=DEIN_ADMIN_PASSWORT

#################################
# Email                         #
#################################
EMAIL_HOST=mail.example.com
EMAIL_PORT=587
EMAIL_HOST_USER=seafile@example.com
EMAIL_HOST_PASSWORD=DEIN_EMAIL_PASSWORT
DEFAULT_FROM_EMAIL=seafile@example.com
EMAIL_FROM_NAME=Seafile

#################################
# SeaDoc                        #
#################################
ENABLE_SEADOC=true
SEADOC_SERVER_URL=https://cloud.example.com/sdoc-server

#################################
# File Server                   #
#################################
MAX_UPLOAD_FILE_SIZE=5368709120  # 5 GB
ENABLE_THUMBNAIL=true
ENABLE_GO_FILESERVER=true

3. Nginx Reverse-Proxy

server {
    listen 443 ssl http2;
    server_name cloud.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    client_max_body_size 5G;

    location / {
        proxy_pass http://127.0.0.1:9200;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 600;
        proxy_connect_timeout 90;
        proxy_redirect off;
    }

    location /sdoc-server {
        rewrite ^/sdoc-server/(.*) /$1 break;
        proxy_pass http://127.0.0.1:8899;
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }
}

4. Besondere Sicherheits-Hinweise

JWT Private Key

Generiere einen sicheren Schlüssel mit OpenSSL:

openssl rand -base64 32

Datei-Upload-Limit

In Nginx client_max_body_size 5G setzen und in der .env MAX_UPLOAD_FILE_SIZE=5368709120. Beide Werte müssen übereinstimmen!

Passwörter

In der .env müssen folgende Passwörter identisch sein:

  • SEAFILE_MYSQL_DB_PASSWORD = Datenbank-Passwort (Seafile-User)
  • INIT_SEAFILE_MYSQL_ROOT_PASSWORD = Datenbank-Root-Passwort

Empfehlung: unterschiedliche, aber sichere Passwörter verwenden.

5. Schnellstart

# Verzeichnis
mkdir -p /opt/containers/seafile && cd /home/seafile

# docker-compose.yml + .env bereitstellen
# .env mit eigenen Werten anpassen
nano .env

# Service starten
docker compose up -d

# Status prüfen
docker compose ps
docker compose logs seafile --tail 30

# Warte 1-2 Minuten für den ersten Start (DB-Init + Admin-Konto)
# Fertig!

6. E-Mail-Konfiguration nachträglich fixen

Falls die E-Mail-Konfiguration beim ersten Start nicht gesetzt wurde (z.B. weil die .env nicht korrekt war), hilft dieses Skript:

#!/bin/bash
docker exec seafile bash -c "cat >> /opt/seafile/conf/seahub_settings.py << EOF

EMAIL_USE_TLS = True
EMAIL_HOST = "mail.example.com"
EMAIL_HOST_USER = "seafile@example.com"
EMAIL_HOST_PASSWORD = "DEIN_PASSWORT"
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = "seafile@example.com"
EOF"

docker compose restart seafile
sleep 10
echo "E-Mail-Konfiguration angewendet."

7. Performance-Tuning

Sync großer Verzeichnisse

Seafile nutzt differenzielle Synchronisation: nur geänderte Dateiblöcke werden übertragen. Das macht es deutlich schneller als Nextcloud bei großen Dateien oder vielen kleinen Dateien.

SeaDoc Echtzeit-Editor

SeaDoc ist ein Google-Docs-ähnlicher Editor für Markdown-Dokumente. Änderungen werden in Echtzeit über WebSocket synchronisiert. Der Nginx-Proxy benötigt dafür proxy_set_header Upgrade $http_upgrade und Connection "upgrade".

Datei-Upload bis 5 GB

Mit MAX_UPLOAD_FILE_SIZE=5368709120 sind Uploads bis 5 GB möglich – ideal für große Videos, Backups oder Disk-Images.

8. Backup & Restore

# Datenbank dump
docker exec seafile-mysql mysqldump -u root -p"$DB_ROOT_PW" --all-databases > seafile-db.sql

# Dateien sichern
tar -czf seafile-backup-$(date +%Y%m%d).tar.gz 
    /opt/containers/seafile/seafile-data 
    /opt/containers/seafile/seadoc-data 
    seafile-db.sql

9. Wichtige Ports

Port Service Notiz
9200 Seafile Web UI Nur localhost
8899 SeaDoc Editor Nur localhost
443 Nginx (SSL) Zum Internet hin offen

Fazit

Seafile 13.0 mit SeaDoc ist eine extrem leistungsstarke, selbst-gehostete Dateisynchronisations-Plattform. Mit 5 Docker-Containern, MariaDB, Redis und Memcached läuft sie stabil und schnell – selbst bei tausenden Dateien.

🔗 Seafile Offizielle Seite | Weitere Projekte

X

Basti

Entwickler und Smart-Home-Enthusiast aus Deutschland. Ich entwickle Open-Source-Integrationen für Home Assistant (IDM Wärmepumpe, Violet Pool Controller), Modbus-Tools (ModBridge) und betreibe verschiedene Server-Dienste (Matrix, Seafile, SOGo).

GitHub →

Schreibe einen Kommentar