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.