Seafile is an open-source file sync and cloud storage system that replaces Dropbox with client-side encryption, virtual drives, and self-hosted control.
Seafile divides files into cryptographic blocks before transmission, borrowing the content-addressable storage model of Git to speed up transfers and track revisions. Its C-based core runs on lightweight home servers and private hardware, keeping files under direct personal custody. Users interact through desktop folder mirroring, an on-demand virtual drive, and client-side encrypted libraries where keys never touch the server.
Dropbox routes user documents, photos, and folders through commercial cloud infrastructure where storage quotas, pricing tiers, and terms remain outside personal control. Seafile places the entire storage engine on hardware that you control. It matches Dropbox on core file operations: changes sync across desktop folders automatically, interrupted transfers resume cleanly, and a virtual drive lets users browse multi-terabyte libraries without downloading everything locally. Where Dropbox indexes files on remote servers, Seafile offers client-side library encryption that scrambles content with AES-256 before upload, preventing server administrators or third parties from reading it.
The trade-off involves setup overhead and ecosystem breadth. Dropbox offers turn-key cloud convenience with zero server management and hundreds of third-party SaaS connectors. Seafile requires running a server or Docker container and maintaining local backups. In return, it eliminates per-seat subscription fees and keeps data transfers within your home network. For users prioritizing privacy and custody, Seafile trades managed cloud automation for complete control over personal files.
Seafile vs Dropbox — which is better for privacy and data control? Seafile keeps data on user-owned hardware with client-side encryption, whereas Dropbox hosts files on commercial infrastructure subject to corporate terms and recurring subscription fees.
What happens if I forget the password to an encrypted Seafile library? Because Seafile never sends or stores library encryption keys on the server, forgotten passwords cannot be recovered or reset by administrators.
Is Seafile free for commercial use? Yes. The open-source community edition carries no licensing fees and permits commercial use on self-hosted servers.
Seafile is an ideal solution for households and small organizations that want personal cloud storage while keeping physical custody of their data. Active maintenance with commits into August 2026 and a GPL-2.0 license ensure long-term stability and software freedom for self-hosted deployments. If your workflow demands turn-key SaaS setup without maintaining a server, Dropbox remains easier, but for sovereign file synchronization Seafile delivers dependable everyday operation.
These packages install the Seafile desktop client, not the server. Each package is matched to Seafile through the registry's own link to its source code or website.
winget install --id Seafile.Seafile -eWe started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through Seafile's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p seafile && cd seafile
curl -fsSL https://open-source.store/tools/seafile/compose.yml -o compose.ymlcat > .env <<EOF
MYSQL_ROOT_PASSWORD=$(openssl rand -hex 12)
DB_PASSWORD=$(openssl rand -hex 12)
REDIS_PASSWORD=$(openssl rand -hex 12)
JWT_PRIVATE_KEY=$(openssl rand -hex 32)
INIT_SEAFILE_ADMIN_PASSWORD=$(openssl rand -hex 12)
SEAFILE_SERVER_HOSTNAME=127.0.0.1
EOFMYSQL_ROOT_PASSWORD — Root password of the bundled MariaDB database. Generated above; keep it secret.DB_PASSWORD — Password for the seafile database user. Generated above; keep it secret.REDIS_PASSWORD — Password for the bundled Redis cache service. Generated above; keep it secret.JWT_PRIVATE_KEY — Secret key for signing internal tokens and session data. Generated above; keep it secret.INIT_SEAFILE_ADMIN_PASSWORD — Initial password for the default admin account. Generated above; keep it secret.SEAFILE_SERVER_HOSTNAME — Public domain or IP where Seafile is reached (e.g. seafile.example.com or your server IP); set this to your server's public domain or IP so file download and upload links resolve correctly.docker compose up -dservices:
db:
image: mariadb:10.11.19
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_LOG_CONSOLE=true
- MARIADB_AUTO_UPGRADE=1
volumes:
- db-data:/var/lib/mysql
networks:
- seafile-net
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--connect",
"--mariadbupgrade",
"--innodb_initialized",
]
interval: 10s
start_period: 20s
timeout: 5s
retries: 10
redis:
image: redis:7.4-alpine
restart: unless-stopped
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--save", "", "--appendonly", "no"]
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
networks:
- seafile-net
seafile:
image: seafileltd/seafile-mc:13.0.28
restart: unless-stopped
ports:
- "8080:80"
volumes:
- seafile-data:/shared
environment:
- SEAFILE_MYSQL_DB_HOST=db
- SEAFILE_MYSQL_DB_PORT=3306
- SEAFILE_MYSQL_DB_USER=seafile
- SEAFILE_MYSQL_DB_PASSWORD=${DB_PASSWORD}
- INIT_SEAFILE_MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- SEAFILE_MYSQL_DB_CCNET_DB_NAME=ccnet_db
- SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=seafile_db
- SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=seahub_db
- TIME_ZONE=Etc/UTC
- [email protected]
- INIT_SEAFILE_ADMIN_PASSWORD=${INIT_SEAFILE_ADMIN_PASSWORD}
- SEAFILE_SERVER_HOSTNAME=${SEAFILE_SERVER_HOSTNAME}
- SEAFILE_SERVER_PROTOCOL=http
- SITE_ROOT=/
- NON_ROOT=false
- JWT_PRIVATE_KEY=${JWT_PRIVATE_KEY}
- ENABLE_SEADOC=false
- CACHE_PROVIDER=redis
- REDIS_HOST=redis
- REDIS_PORT=6379
- REDIS_PASSWORD=${REDIS_PASSWORD}
- ENABLE_NOTIFICATION_SERVER=false
- ENABLE_SEAFILE_AI=false
- ENABLE_METADATA_MANAGEMENT=false
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:80/api2/ping/"]
interval: 10s
start_period: 30s
timeout: 5s
retries: 15
networks:
- seafile-net
networks:
seafile-net:
volumes:
db-data:
seafile-data:
Go, gRPC and Protobuf done right, LLM agents in production, and the hard parts of shipping a first product.
Show that Seafile is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 34 s: seafileltd/seafile-mc:13.0.28, mariadb:10.11.19, redis:7.4-alpine.
Based on the upstream setup. Official Seafile 13.0 CE compose. Images pinned to concrete tags (13.0.28, 10.11.19, 7.4-alpine); exposed web port directly without Caddy Docker proxy; disabled optional SeaDoc collaborative editor; replaced hard-coded localhost/127.0.0.1 with SEAFILE_SERVER_HOSTNAME in .env; moved database, redis, and admin passwords and JWT key to .env.
redis-1 | 2026-11-01T09:52:41.876614338Z 1:C 01 Nov 2026 09:52:41.875 * Configuration loaded
redis-1 | 2026-11-01T09:52:41.876615213Z 1:M 01 Nov 2026 09:52:41.876 * Increased maximum number of open files to 10032 (it was originally set to 1024).
redis-1 | 2026-11-01T09:52:41.876615880Z 1:M 01 Nov 2026 09:52:41.876 * monotonic clock: POSIX clock_gettime
redis-1 | 2026-11-01T09:52:41.876616463Z 1:M 01 Nov 2026 09:52:41.876 * Running mode=standalone, port=6379.
redis-1 | 2026-11-01T09:52:41.876726671Z 1:M 01 Nov 2026 09:52:41.876 * Server initialized
redis-1 | 2026-11-01T09:52:41.876774171Z 1:M 01 Nov 2026 09:52:41.876 * Ready to accept connections tcp
db-1 | 2026-11-01T09:52:44.300287714Z 2026-11-01 9:52:44 0 [Note] InnoDB: 128 rollback segments are active.
db-1 | 2026-11-01T09:52:44.300479547Z 2026-11-01 9:52:44 0 [Note] InnoDB: Setting file './ibtmp1' size to 12.000MiB. Physically writing the file full; Please wait ...
db-1 | 2026-11-01T09:52:44.300557964Z 2026-11-01 9:52:44 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
db-1 | 2026-11-01T09:52:44.300900589Z 2026-11-01 9:52:44 0 [Note] InnoDB: log sequence number 44776; transaction id 15
db-1 | 2026-11-01T09:52:44.300977339Z 2026-11-01 9:52:44 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
db-1 | 2026-11-01T09:52:44.301082672Z 2026-11-01 9:52:44 0 [Note] Plugin 'FEEDBACK' is disabled.
db-1 | 2026-11-01T09:52:44.301486339Z 2026-11-01 9:52:44 0 [Note] InnoDB: Buffer pool(s) load completed at 261101 9:52:44
db-1 | 2026-11-01T09:52:44.301531256Z 2026-11-01 9:52:44 0 [Warning] You need to use --log-bin to make --expire-logs-days or --binlog-expire-logs-seconds work.
db-1 | 2026-11-01T09:52:44.302018672Z 2026-11-01 9:52:44 0 [Note] Server socket created on IP: '0.0.0.0', port: '3306'.
db-1 | 2026-11-01T09:52:44.302072881Z 2026-11-01 9:52:44 0 [Note] Server socket created on IP: '::', port: '3306'.
db-1 | 2026-11-01T09:52:44.303379006Z 2026-11-01 9:52:44 0 [Note] mariadbd: ready for connections.
db-1 | 2026-11-01T09:52:44.303383172Z Version: '10.11.19-MariaDB-ubu2204' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
db-1 | 2026-11-01T09:52:47.548271757Z 2026-11-01 9:52:47 5 [Warning] Access denied for user 'seafile'@'172.18.0.4' (using password: YES)
seafile-1 | 2026-11-01T09:52:47.471576007Z *** Running /etc/my_init.d/01_create_data_links.sh...
seafile-1 | 2026-11-01T09:52:47.475807132Z *** Booting runit daemon...
seafile-1 | 2026-11-01T09:52:47.475938299Z *** Runit started as PID 11
seafile-1 | 2026-11-01T09:52:47.475994216Z *** Running /scripts/enterpoint.sh...
seafile-1 | 2026-11-01T09:52:47.484225299Z nginx: [warn] conflicting server name "" on 0.0.0.0:80, ignored
seafile-1 | 2026-11-01T09:52:47.485087091Z 2026-11-01 09:52:47 Nginx ready
seafile-1 | 2026-11-01T09:52:47.489142716Z 2026-11-01 09:52:47 This is an idle script (infinite loop) to keep container running.
seafile-1 | 2026-11-01T09:52:47.544271216Z nginx: [warn] conflicting server name "" on 0.0.0.0:80, ignored
seafile-1 | 2026-11-01T09:52:47.548984882Z [2026-11-01 09:52:47] Now running setup-seafile-mysql.py in auto mode.
seafile-1 | 2026-11-01T09:52:47.551446132Z Checking python on this machine ...
seafile-1 | 2026-11-01T09:52:47.552585716Z
seafile-1 | 2026-11-01T09:52:48.272152716Z
seafile-1 | 2026-11-01T09:52:48.272166424Z verifying password of user root ... done
seafile-1 | 2026-11-01T09:52:48.272167383Z
seafile-1 | 2026-11-01T09:52:48.272168049Z ---------------------------------
seafile-1 | 2026-11-01T09:52:48.272168633Z This is your configuration
seafile-1 | 2026-11-01T09:52:48.272169174Z ---------------------------------
seafile-1 | 2026-11-01T09:52:48.272169674Z
seafile-1 | 2026-11-01T09:52:48.272170174Z server name: seafile
seafile-1 | 2026-11-01T09:52:48.272170674Z server ip/domain: 127.0.0.1
seafile-1 | 2026-11-01T09:52:48.272171174Z
seafile-1 | 2026-11-01T09:52:48.272171633Z seafile data dir: /opt/seafile/seafile-data
seafile-1 | 2026-11-01T09:52:48.272172174Z fileserver port: 8082
seafile-1 | 2026-11-01T09:52:48.272172716Z
seafile-1 | 2026-11-01T09:52:48.272173174Z database: create new
seafile-1 | 2026-11-01T09:52:48.272173674Z ccnet database: ccnet_db
seafile-1 | 2026-11-01T09:52:48.272174174Z seafile database: seafile_db
seafile-1 | 2026-11-01T09:52:48.272174633Z seahub database: seahub_db
seafile-1 | 2026-11-01T09:52:48.272175133Z database user: seafile
seafile-1 | 2026-11-01T09:52:48.272175633Z
seafile-1 | 2026-11-01T09:52:48.272176091Z
seafile-1 | 2026-11-01T09:52:48.272176591Z Generating seafile configuration ...
seafile-1 | 2026-11-01T09:52:48.272177091Z
seafile-1 | 2026-11-01T09:52:48.272177549Z done
seafile-1 | 2026-11-01T09:52:48.272178049Z Generating seahub configuration ...
seafile-1 | 2026-11-01T09:52:48.272178549Z
seafile-1 | 2026-11-01T09:52:48.272179008Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272179508Z Now creating seafevents database tables ...
seafile-1 | 2026-11-01T09:52:48.272180008Z
seafile-1 | 2026-11-01T09:52:48.272180466Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272180966Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272184466Z Now creating ccnet database tables ...
seafile-1 | 2026-11-01T09:52:48.272185008Z
seafile-1 | 2026-11-01T09:52:48.272185466Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272185924Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272186424Z Now creating seafile database tables ...
seafile-1 | 2026-11-01T09:52:48.272186924Z
seafile-1 | 2026-11-01T09:52:48.272187383Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272187841Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272188341Z Now creating seahub database tables ...
seafile-1 | 2026-11-01T09:52:48.272188841Z
seafile-1 | 2026-11-01T09:52:48.272189258Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:48.272189758Z
seafile-1 | 2026-11-01T09:52:48.272190174Z creating seafile-server-latest symbolic link ... done
seafile-1 | 2026-11-01T09:52:48.272190716Z
seafile-1 | 2026-11-01T09:52:48.272191174Z
seafile-1 | 2026-11-01T09:52:48.272191591Z
seafile-1 | 2026-11-01T09:52:48.272192049Z
seafile-1 | 2026-11-01T09:52:48.272192508Z -----------------------------------------------------------------
seafile-1 | 2026-11-01T09:52:48.272193049Z Your seafile server configuration has been finished successfully.
seafile-1 | 2026-11-01T09:52:48.272193549Z -----------------------------------------------------------------
seafile-1 | 2026-11-01T09:52:48.272194091Z
seafile-1 | 2026-11-01T09:52:48.272194549Z run seafile server: ./seafile.sh { start | stop | restart }
seafile-1 | 2026-11-01T09:52:48.272195091Z run seahub server: ./seahub.sh { start <port> | stop | restart <port> }
seafile-1 | 2026-11-01T09:52:48.272195841Z
seafile-1 | 2026-11-01T09:52:48.272196299Z -----------------------------------------------------------------
seafile-1 | 2026-11-01T09:52:48.272201049Z If you are behind a firewall, remember to allow input/output of these tcp ports:
seafile-1 | 2026-11-01T09:52:48.272201758Z -----------------------------------------------------------------
seafile-1 | 2026-11-01T09:52:48.272202299Z
seafile-1 | 2026-11-01T09:52:48.272202758Z port of seafile fileserver: 8082
seafile-1 | 2026-11-01T09:52:48.272203258Z port of seahub: 8000
seafile-1 | 2026-11-01T09:52:48.272203758Z
seafile-1 | 2026-11-01T09:52:48.272204216Z When problems occur, Refer to
seafile-1 | 2026-11-01T09:52:48.272204674Z
seafile-1 | 2026-11-01T09:52:48.272205133Z https://download.seafile.com/published/seafile-manual/home.md
seafile-1 | 2026-11-01T09:52:48.272205674Z
seafile-1 | 2026-11-01T09:52:48.272206133Z for information.
seafile-1 | 2026-11-01T09:52:48.272206633Z
seafile-1 | 2026-11-01T09:52:48.272207174Z
seafile-1 | 2026-11-01T09:52:48.286217216Z [2026-11-01 09:52:48] Updating version stamp
seafile-1 | 2026-11-01T09:52:48.286766841Z
seafile-1 | 2026-11-01T09:52:48.294627299Z Starting seafile server, please wait ...
seafile-1 | 2026-11-01T09:52:51.300980509Z Seafile server started
seafile-1 | 2026-11-01T09:52:51.301001301Z
seafile-1 | 2026-11-01T09:52:51.301002426Z Done.
seafile-1 | 2026-11-01T09:52:51.301773384Z
seafile-1 | 2026-11-01T09:52:51.306195092Z Starting seahub at port 8000 ...
seafile-1 | 2026-11-01T09:52:51.334553884Z
seafile-1 | 2026-11-01T09:52:51.334571759Z
seafile-1 | 2026-11-01T09:52:51.334572884Z
seafile-1 | 2026-11-01T09:52:51.334573467Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:51.334574092Z Successfully created seafile admin
seafile-1 | 2026-11-01T09:52:51.334574634Z ----------------------------------------
seafile-1 | 2026-11-01T09:52:51.334575134Z
seafile-1 | 2026-11-01T09:52:51.334575592Z
seafile-1 | 2026-11-01T09:52:51.334576051Z
seafile-1 | 2026-11-01T09:52:56.342217136Z
seafile-1 | 2026-11-01T09:52:56.342351345Z Seahub is started
seafile-1 | 2026-11-01T09:52:56.342364553Z
seafile-1 | 2026-11-01T09:52:56.342365928Z Done.
seafile-1 | 2026-11-01T09:52:56.342366636Z