Self-host Seafile
File sync and share built around libraries: each one syncs separately with delta transfers and resumable uploads, and any library can be encrypted on the desktop client with a password the server never stores. The Community Edition server core is AGPL-3.0 with an Apache-2.0 web UI; the Professional Edition adds full-text search, file locking, audit logs and S3 storage, and is free for up to three users.
Key facts
Pick Seafile when file sync and share is the whole job and you want it done by a dedicated engine: files live in libraries that sync selectively, uploads "only transfer content delta to the server" and resume if interrupted, and any library can be encrypted on the desktop client with a password that "is not stored on the server". The Community Edition's server core is AGPL-3.0 and its Seahub web UI Apache-2.0; the official Docker setup is five containers — `seafileltd/seafile-mc`, MariaDB, Redis, the SeaDoc editor and a Caddy proxy that takes ports 80 and 443 and handles Let's Encrypt. Upstream's floor for the Community Edition is 2 GB of RAM and two cores. If you also want calendar, contacts and calls, Nextcloud is the fit; Seafile is the focused file server.
What you need
- Any VPS with at least 2048 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- About an afternoon — budget time for troubleshooting
Paid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# Seafile Community Edition — the official Docker setup: Seafile, MariaDB, Redis, SeaDoc and Caddy
mkdir /opt/seafile && cd /opt/seafile
wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env
wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml
wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml
wget https://manual.seafile.com/13.0/repo/docker/caddy.yml
# In .env set SEAFILE_SERVER_HOSTNAME, JWT_PRIVATE_KEY (32+ random characters; upstream suggests `pwgen -s 40 1`),
# SEAFILE_MYSQL_DB_PASSWORD, INIT_SEAFILE_MYSQL_ROOT_PASSWORD, and INIT_SEAFILE_ADMIN_EMAIL / _PASSWORD
# (the admin defaults are me@example.com / asecret). SEAFILE_SERVER_PROTOCOL=https gets a Let's Encrypt cert via Caddy.
nano .env
docker compose up -d
# Caddy listens on 80 and 443 → http(s)://SEAFILE_SERVER_HOSTNAMEWhat you take on
Seafile's manual is direct about how it stores data and what its encryption does not cover: