May 15, 2020 - Patrick Kerwood
A Docker Compose configuration example on deploying Seafile. In this example I'll deploy it in a Traefik proxy network and with the appropriate Traefik labels.
There are 3 services that make up Seafile. A MariaDB, Memcached key-value store and Seafile itsself. If you look closely, you can see that there are two networks,
traefik-proxy which should exist and
seafile which Docker Compose will create. All 3 services are added to the
seafile network and the
seafile service is also added to the already existing
traefik-proxy network, for enabling Traefik to proxy traffic to the service.
You need to change the environment variables highlighted in the code below. Notice that
SEAFILE_SERVER_LETSENCRYPT is set to
false. That's because Traefik handles my LE certificates, not Seafile.
Change Traefik labels on the
seafile service to fit your needs. Remember, if your Traefik network is different to
traefik-proxy, change the
traefik.docker.network label aswell.
version: '3.7' services: db: image: mariadb:10.1 container_name: seafile-mysql restart: unless-stopped environment: - MYSQL_ROOT_PASSWORD=<db-password> # Required, set the root's password of MySQL service. - MYSQL_LOG_CONSOLE=true volumes: - seafile-db:/var/lib/mysql # Required, specifies the path to MySQL data persistent store. networks: - seafile memcached: image: memcached:1.5.6 container_name: seafile-memcached restart: unless-stopped entrypoint: memcached -m 256 networks: - seafile seafile: image: seafileltd/seafile-mc:latest container_name: seafile restart: unless-stopped expose: - 80 - 443 volumes: - seafile-data:/shared # Required, specifies the path to Seafile data persistent store. networks: - traefik-proxy - seafile environment: - DB_HOST=db - DB_ROOT_PASSWD=<db-password> # Required, the value shuold be root's password of MySQL service. - TIME_ZONE=Europe/Copenhagen # Optional, default is UTC. Should be uncomment and set to your local time zone. - SEAFILE_ADMIN_EMAILfirstname.lastname@example.org # Specifies Seafile admin user, default is 'email@example.com'. - SEAFILE_ADMIN_PASSWORD=asecret # Specifies Seafile admin password, default is 'asecret'. - SEAFILE_SERVER_LETSENCRYPT=false # Whether to use https or not. - SEAFILE_SERVER_HOSTNAME=cloud.example.org # Specifies your domainname labels: - traefik.enable=true - traefik.http.services.seafile.loadbalancer.server.port=80 - traefik.http.routers.seafile.rule=Host(`cloud.example.org`) - traefik.http.routers.seafile.tls.certresolver=le - traefik.http.routers.seafile.entrypoints=websecure - traefik.docker.network=traefik-proxy networks: traefik-proxy: external: true seafile: volumes: seafile-db: seafile-data:
After deploying above Docker Compose file, there is just one more thing you need to fix. Personally I would call it a bug, but according to the developer, its by design. The issue is that a couple of variable needs to be fixed for Seafile to get content.
Open a shell in the
docker exec -it seafile bash
/opt/seafile/conf/ccnet.conf file with
vi. (Sorry peeps, only the
vi editor is available in the container)
[General] SERVICE_URL = http://cloud.example.org:8000 ...
SERVICE_URL variable to fit your needs. If you are using SSL, remember to change
https. And of course if you are using port
443, just delete the port section.
[General] SERVICE_URL = https://cloud.example.org
The same thing goes for the
FILE_SERVER_ROOT variable in
/opt/seafile/conf/seahub_settings.py, if you are using SSL/HTTPS.
... FILE_SERVER_ROOT = "https://cloud.example.org/seafhttp"
Restart all Docker Compose services and you are good to go.
An issue has been raised with the developer about this "design". https://github.com/haiwen/seafile-docker/issues/182 (opens new window)