使用Docker安装Seafile服务器社区版
系统要求
请参阅此处了解 Seafile CE 的系统要求。一般来说,我们建议您至少配备 2G 内存和双核 CPU(频率高于 2GHz)。
开始使用
本文档的其余部分使用以下假设和约定:
-
/opt/seafile是存储 Seafile Docker Compose 文件的目录。如果您决定将 Seafile 放在其他目录——这是完全可以的——请相应地调整所有路径。 -
Seafile 使用两个 Docker 卷 来持久化其数据库和 Seafile Docker 容器中生成的数据。这些卷的主机路径 分别为
/opt/seafile-mysql和/opt/seafile-data。不建议更改这些路径。如果确实需要更改,请在按照本说明操作时予以考虑。 -
Seafile 和 Web 服务器 Nginx 的所有配置文件和日志文件都存储在 Seafile 容器的卷中。
安装 Docker
使用适用于您操作系统的[官方安装指南]安装 Docker。(https://docs.docker.com/engine/install/)
下载并修改 .env
要使用 Docker 部署 Seafile,您需要在某个目录(例如 /opt/seafile)中放置 .env、seafile-server.yml 和 caddy.yml 文件:
mkdir /opt/seafile
cd /opt/seafile
wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env
Show Code
#################################
Docker compose configurations
#################################
COMPOSE_FILE='seafile-server.yml,caddy.yml,seadoc.yml'
COMPOSE_PATH_SEPARATOR=','
Images
SEAFILE_IMAGE=docker.1ms.run/seafileltd/seafile-mc:13.0-latest
SEAFILE_DB_IMAGE=docker.1ms.run/mariadb:10.11
SEAFILE_REDIS_IMAGE=docker.1ms.run/redis
SEAFILE_CADDY_IMAGE=docker.1ms.run/lucaslorentz/caddy-docker-proxy:2.9-alpine
SEADOC_IMAGE=docker.1ms.run/seafileltd/sdoc-server:2.0-latest
NOTIFICATION_SERVER_IMAGE=docker.1ms.run/seafileltd/notification-server:13.0-latest
MD_IMAGE=docker.1ms.run/seafileltd/seafile-md-server:13.0-latest
Persistent Storage
BASIC_STORAGE_PATH=/opt
SEAFILE_VOLUME=BASIC_STORAGE_PATH/seafile-data
SEAFILE_MYSQL_VOLUME=BASIC_STORAGE_PATH/seafile-mysql/db
SEAFILE_CADDY_VOLUME=BASIC_STORAGE_PATH/seafile-caddy
SEADOC_VOLUME=BASIC_STORAGE_PATH/seadoc-data
#################################
Startup parameters
#################################
SEAFILE_SERVER_HOSTNAME=seafile.example.com
SEAFILE_SERVER_PROTOCOL=http
TIME_ZONE=Etc/UTC
JWT_PRIVATE_KEY=
#####################################
Third-party service configuration
#####################################
Database
SEAFILE_MYSQL_DB_HOST=db
SEAFILE_MYSQL_DB_USER=seafile
SEAFILE_MYSQL_DB_PASSWORD=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
Cache
CACHE_PROVIDER=redis # or memcached
Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=
Memcached
MEMCACHED_HOST=memcached
MEMCACHED_PORT=11211
######################################
Initial variables
(Only valid in first-time startup)
######################################
Database root password, Used to create Seafile users
INIT_SEAFILE_MYSQL_ROOT_PASSWORD=ROOT_PASSWORD
Seafile admin user
INIT_SEAFILE_ADMIN_EMAIL=me@example.com
INIT_SEAFILE_ADMIN_PASSWORD=asecret
############################################
Additional configurations for extensions
############################################
SeaDoc service
ENABLE_SEADOC=true
Notification
ENABLE_NOTIFICATION_SERVER=false
NOTIFICATION_SERVER_URL=
Seafile AI
ENABLE_SEAFILE_AI=false
SEAFILE_AI_LLM_TYPE=openai
SEAFILE_AI_LLM_URL=
SEAFILE_AI_LLM_KEY= # your llm key
SEAFILE_AI_LLM_MODEL=gpt-4o-mini
Metadata server
MD_FILE_COUNT_LIMIT=100000
wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml
Show Code
# 13.0 cat seafile-server.yml services: db: image: ${SEAFILE_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 - MARIADB_AUTO_UPGRADE=1 volumes: - "${SEAFILE_MYSQL_VOLUME:-/opt/seafile-mysql/db}:/var/lib/mysql" networks: - seafile-net healthcheck: test: [ "CMD", "/usr/local/bin/healthcheck.sh", "--connect", "--mariadbupgrade", "--innodb_initialized", ] interval: 20s start_period: 30s timeout: 5s retries: 10redis:
image: {SEAFILE_REDIS_IMAGE:-redis} container_name: seafile-redis restart: unless-stopped command: - /bin/sh - -c - redis-server --requirepass "$$REDIS_PASSWORD" environment: - REDIS_PASSWORD={REDIS_PASSWORD:-}
networks:
- seafile-netseafile:
image: {SEAFILE_IMAGE:-seafileltd/seafile-mc:13.0-latest} container_name: seafile restart: unless-stopped # ports: # - "80:80" volumes: - {SEAFILE_VOLUME:-/opt/seafile-data}:/shared
environment:
- SEAFILE_MYSQL_DB_HOST={SEAFILE_MYSQL_DB_HOST:-db} - SEAFILE_MYSQL_DB_PORT={SEAFILE_MYSQL_DB_PORT:-3306}
- SEAFILE_MYSQL_DB_USER={SEAFILE_MYSQL_DB_USER:-seafile} - SEAFILE_MYSQL_DB_PASSWORD={SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty}
- INIT_SEAFILE_MYSQL_ROOT_PASSWORD={INIT_SEAFILE_MYSQL_ROOT_PASSWORD:-} - SEAFILE_MYSQL_DB_CCNET_DB_NAME={SEAFILE_MYSQL_DB_CCNET_DB_NAME:-ccnet_db}
- SEAFILE_MYSQL_DB_SEAFILE_DB_NAME={SEAFILE_MYSQL_DB_SEAFILE_DB_NAME:-seafile_db} - SEAFILE_MYSQL_DB_SEAHUB_DB_NAME={SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db}
- TIME_ZONE={TIME_ZONE:-Etc/UTC} - INIT_SEAFILE_ADMIN_EMAIL={INIT_SEAFILE_ADMIN_EMAIL:-me@example.com}
- INIT_SEAFILE_ADMIN_PASSWORD={INIT_SEAFILE_ADMIN_PASSWORD:-asecret} - SEAFILE_SERVER_HOSTNAME={SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
- SEAFILE_SERVER_PROTOCOL={SEAFILE_SERVER_PROTOCOL:-http} - SITE_ROOT={SITE_ROOT:-/}
- NON_ROOT={NON_ROOT:-false} - JWT_PRIVATE_KEY={JWT_PRIVATE_KEY:?Variable is not set or empty}
- SEAFILE_LOG_TO_STDOUT={SEAFILE_LOG_TO_STDOUT:-false} - ENABLE_GO_FILESERVER={ENABLE_GO_FILESERVER:-true}
- ENABLE_SEADOC={ENABLE_SEADOC:-true} - SEADOC_SERVER_URL={SEAFILE_SERVER_PROTOCOL:-http}://{SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}/sdoc-server - CACHE_PROVIDER={CACHE_PROVIDER:-redis}
- REDIS_HOST={REDIS_HOST:-redis} - REDIS_PORT={REDIS_PORT:-6379}
- REDIS_PASSWORD={REDIS_PASSWORD:-} - MEMCACHED_HOST={MEMCACHED_HOST:-memcached}
- MEMCACHED_PORT={MEMCACHED_PORT:-11211} - ENABLE_NOTIFICATION_SERVER={ENABLE_NOTIFICATION_SERVER:-false}
- INNER_NOTIFICATION_SERVER_URL={INNER_NOTIFICATION_SERVER_URL:-http://notification-server:8083} - NOTIFICATION_SERVER_URL={NOTIFICATION_SERVER_URL:-{SEAFILE_SERVER_PROTOCOL:-http}://{SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}/notification}
- ENABLE_SEAFILE_AI={ENABLE_SEAFILE_AI:-false} - SEAFILE_AI_SERVER_URL={SEAFILE_AI_SERVER_URL:-http://seafile-ai:8888}
- SEAFILE_AI_SECRET_KEY={JWT_PRIVATE_KEY:?Variable is not set or empty} - MD_FILE_COUNT_LIMIT={MD_FILE_COUNT_LIMIT:-100000}
labels:
caddy: {SEAFILE_SERVER_PROTOCOL:-http}://{SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
caddy.reverse_proxy: "{{upstreams 80}}"
healthcheck:
test: ["CMD-SHELL", "curl -f http://localhost:80 || exit 1"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
networks:
- seafile-net
networks:
seafile-net:
name: seafile-net
wget https://manual.seafile.com/13.0/repo/docker/seadoc.yml
Show Code
#13.0 cat seadoc.yml
services:seadoc:
image: {SEADOC_IMAGE:-seafileltd/sdoc-server:2.0-latest} container_name: seadoc restart: unless-stopped volumes: - {SEADOC_VOLUME:-/opt/seadoc-data/}:/shared
# ports:
# - "80:80"
environment:
- DB_HOST={SEAFILE_MYSQL_DB_HOST:-db} - DB_PORT={SEAFILE_MYSQL_DB_PORT:-3306}
- DB_USER={SEAFILE_MYSQL_DB_USER:-seafile} - DB_PASSWORD={SEAFILE_MYSQL_DB_PASSWORD:?Variable is not set or empty}
- DB_NAME={SEADOC_MYSQL_DB_NAME:-{SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db}}
- TIME_ZONE={TIME_ZONE:-Etc/UTC} - JWT_PRIVATE_KEY={JWT_PRIVATE_KEY:?Variable is not set or empty}
- NON_ROOT={NON_ROOT:-false} - SEAHUB_SERVICE_URL={SEAFILE_SERVICE_URL:-http://seafile}
labels:
caddy: {SEAFILE_SERVER_PROTOCOL:-http}://{SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
caddy.@ws.0_header: "Connection Upgrade"
caddy.@ws.1_header: "Upgrade websocket"
caddy.0_reverse_proxy: "@ws {{upstreams 80}}"
caddy.1_handle_path: "/socket.io/"
caddy.1_handle_path.0_rewrite: " /socket.io{uri}"
caddy.1_handle_path.1_reverse_proxy: "{{upstreams 80}}"
caddy.2_handle_path: "/sdoc-server/"
caddy.2_handle_path.0_rewrite: " {uri}"
caddy.2_handle_path.1_reverse_proxy: "{{upstreams 80}}"
depends_on:
db:
condition: service_healthy
networks:
- seafile-net
networks:
seafile-net:
name: seafile-net
wget https://manual.seafile.com/13.0/repo/docker/caddy.yml
Show Code
# 13.0 cat caddy.yml services:caddy:
image: {SEAFILE_CADDY_IMAGE:-lucaslorentz/caddy-docker-proxy:2.9-alpine} restart: unless-stopped container_name: seafile-caddy ports: - 80:80 - 443:443 environment: - CADDY_INGRESS_NETWORKS=seafile-net volumes: - /var/run/docker.sock:/var/run/docker.sock - {SEAFILE_CADDY_VOLUME:-/opt/seafile-caddy}:/data/caddy
networks:
- seafile-net
healthcheck:
test: ["CMD-SHELL", "curl --fail http://localhost:2019/metrics || exit 1"]
start_period: 20s
interval: 20s
timeout: 5s
retries: 3
networks:
seafile-net:
name: seafile-net
nano .env
以下字段值得特别关注:
| 变量 | 描述 | 默认值 |
|---|---|---|
SEAFILE_VOLUME | Seafile 数据的卷目录 | /opt/seafile-data |
SEAFILE_MYSQL_VOLUME | MySQL数据的卷目录 | /opt/seafile-mysql/db |
SEAFILE_CADDY_VOLUME | 用于存储从Let's Encrypt获取的证书的Caddy数据卷目录 | /opt/seafile-caddy |
INIT_SEAFILE_MYSQL_ROOT_PASSWORD | MySQL 的 root 密码 | (仅首次部署时需要) |
SEAFILE_MYSQL_DB_HOST | MySQL 的主机 | db |
SEAFILE_MYSQL_DB_PORT | MySQL端口 | 3306 |
SEAFILE_MYSQL_DB_USER | MySQL 的用户(可在 conf/seafile.conf 中找到 database - user) | seafile |
SEAFILE_MYSQL_DB_PASSWORD | MySQL 用户 seafile 的密码 | (必填) |
SEAFILE_MYSQL_DB_CCNET_DB_NAME | ccnet 的数据库名称 | ccnet_db |
SEAFILE_MYSQL_DB_SEAFILE_DB_NAME | Seafile 的数据库名称 | seafile_db |
SEAFILE_MYSQL_DB_SEAHUB_DB_NAME | seahub 的数据库名称 | seahub_db |
JWT_PRIVATE_KEY | JWT_PRIVATE_KEY,Seafile 需要一个长度不小于 32 个字符的随机字符串,可使用 pwgen -s 40 1 生成 | (必填) |
SEAFILE_SERVER_HOSTNAME | Seafile 服务器主机名或域名 | (必填) |
SEAFILE_SERVER_PROTOCOL | Seafile 服务器协议(http 或 https) | http |
CACHE_PROVIDER | 用于Seafile的缓存服务器类型。可用选项为redis和memcached。自Seafile 13起,建议使用redis作为缓存服务以支持新功能,而memcached将不再默认集成到Seafile Docker中。 | redis |
REDIS_HOST | Redis服务器主机 | redis |
REDIS_PORT | Redis服务器端口 | 6379 |
REDIS_PASSWORD | Redis服务器密码 | (无) |
MEMCACHED_HOST | Memcached 服务器主机 | memcached |
MEMCACHED_PORT | Memcached 服务器端口 | 11211 |
TIME_ZONE | 时区 | UTC |
ENABLE_NOTIFICATION_SERVER | 为 Seafile 启用(true)或禁用(false)通知功能 | false |
NOTIFICATION_SERVER_URL | 通知服务器的 URL | (无) |
MD_FILE_COUNT_LIMIT | (仅在部署元数据服务器时有效)。元数据功能允许的仓库中文件的最大数量。如果仓库中的文件数量超过此值,则不会为该仓库启用元数据管理功能。对于已启用元数据管理的仓库,如果其中的记录数量达到此值,但仍有一些文件未在元数据服务器中记录,则未记录文件的元数据管理将被跳过。 | 100000 |
INIT_SEAFILE_ADMIN_EMAIL | 管理员用户名 | me@example.com(建议修改) |
INIT_SEAFILE_ADMIN_PASSWORD | 管理员密码 | asecret(建议修改) |
NON_ROOT | 不使用根用户运行 Seafile 容器 | false |
启动 Seafile 服务器
使用以下命令启动Seafile服务器
docker compose up -d
!!! 警告“错误:命名卷‘xxx’在服务‘xxx’中被使用,但在 volumes 部分未找到声明”
当您的Docker(或docker-compose)版本过旧时,可能会遇到此问题。您可以根据Docker官方文档升级或重新安装Docker服务以解决此问题。
!!! 注意
您必须在包含 .env 文件的目录中运行上述命令。如果 .env 文件位于其他位置,请运行:
docker compose --env-file /path/to/.env up -d
This is your configuration
server name: seafile
server ip/domain: seafile.example.com
seafile data dir: /opt/seafile/seafile-data
fileserver port: 8082
database: create new
ccnet database: ccnet_db
seafile database: seafile_db
seahub database: seahub_db
database user: seafile
Generating seafile configuration ...
done
Generating seahub configuration ...
Now creating seafevents database tables ...
Now creating ccnet database tables ...
Now creating seafile database tables ...
Now creating seahub database tables ...
creating seafile-server-latest symbolic link ... done
Your seafile server configuration has been finished successfully.
然后,您可以看到以下消息,表明Seafile服务器已成功启动:
Starting seafile server, please wait ...
Seafile server started
Done.
Starting seahub at port 8000 ...
Successfully created seafile admin
Seahub is started
Done.
最后,您可以访问 `http://seafile.example.com` 来使用 Seafile。
## Seafile 目录结构
### 路径 `/opt/seafile-data`
共享卷的占位符位置。您可以选择将某些持久性信息存储在容器之外;在我们的案例中,我们将各种日志文件和上传目录保存在容器外。这样,您便能轻松重建容器,而不会丢失重要信息。
* /opt/seafile-data/seafile:这是SeaFile服务器配置和数据的目录。
* /opt/seafile-data/seafile/logs:此目录用于存放SeaFile服务器进程的日志文件。例如,您可以在/opt/seafile-data/seafile/logs/seafile.log中找到seaf-server日志。
* /opt/seafile-data/logs:这是操作系统使用的目录。
* /opt/seafile-data/logs/var-log:此目录将被挂载为容器内的 `/var/log`。/opt/seafile-data/logs/var-log/nginx 包含 Seafile 容器中 Nginx 的日志。
### 查找日志
要监控容器日志(从容器外部),请使用以下命令:
```bash
# 如果 `.env` 文件位于当前目录:
docker compose logs --follow
# 如果 `.env` 文件在其他位置:
docker compose --env-file /path/to/.env logs --follow
# 你也可以指定容器名称:
docker compose logs seafile --follow
# 或者,如果 `.env` 文件位于其他位置:
docker compose --env-file /path/to/.env logs seafile --follow
Seafile 日志位于 Docker 中的 /shared/logs/seafile,或运行 Docker 的服务器中的 /opt/seafile-data/logs/seafile。
系统日志位于运行 Docker 的服务器上的 /shared/logs/var-log,或 /opt/seafile-data/logs/var-log。
要同时监控所有 Seafile 日志(从容器外部),请运行
sudo tail -f $(find /opt/seafile-data/ -type f -name *.log 2>/dev/null)
更多配置选项
配置文件位于 /opt/seafile-data/seafile/conf。您可以根据配置章节修改相关配置。
添加新管理员
确保容器正在运行,然后输入此命令:
docker exec -it seafile /opt/seafile/seafile-server-latest/reset-admin.sh
根据提示输入用户名和密码。您现在拥有了一个新的管理员账户。
备份与恢复
请遵循Seafile Docker 备份与恢复中的说明。
垃圾回收
当文件被删除时,构成这些文件的块并不会立即被移除,因为可能还有其他文件引用了这些块(这得益于重复数据删除技术的神奇之处)。为了彻底清除这些不再使用的块,Seafile 需要运行一个【垃圾回收】(../administration/seafile_gc.md)过程,该过程会检测哪些块已不再被使用并将其彻底清除。
常见问题
Seafile 服务与容器维护
问:如果我想进入 Docker 容器,可以使用哪个命令?
A:你可以使用以下命令进入 Docker 容器:
docker exec -it seafile /bin/bash
问:我忘记了Seafile管理员的邮箱地址/密码,如何创建一个新的管理员账号?
A:你可以通过运行以下命令创建一个新的管理员账户:
docker exec -it seafile /opt/seafile/seafile-server-latest/reset-admin.sh
运行超级用户命令时,Seafile 服务必须处于启动状态。
问:如果由于某种原因安装失败,我该如何从头开始重新来过?
A:删除目录 /opt/seafile、/opt/seafile-data 和 /opt/seafile-mysql,然后重新启动。
问:容器启动时出现了一些问题。我该如何进一步了解情况?
A:你可以使用此命令查看 Docker 日志:docker compose logs -f。
关于缓存
问:Seafile如何使用缓存?
A:Seafile 在许多情况下会使用缓存来提升性能。这些内容包括但不限于用户会话信息、头像、个人资料以及数据库记录等。自 Seafile Docker 13 起,Redis 将作为默认缓存服务器,以支持新功能(请参阅升级说明)。Redis 已集成到 Seafile Docker 13 中,可直接通过 .env 文件中的环境变量进行配置(默认情况下无需额外设置)。
问:Seafile Docker 中集成的 Redis 安全吗?它有访问密码吗?
A:尽管Seafile Docker集成的Redis默认未设置密码,但该Redis仅可通过Docker私有网络访问,不会对外暴露服务端口。当然,如有需要,您也可以为其设置密码。您可以在.env文件中设置REDIS_PASSWORD,并删除seafile-server.yml文件中的以下注释标记,以设置集成Redis的密码:
services:
...
redis:
image: ${SEAFILE_REDIS_IMAGE:-redis}
container_name: seafile-redis
# remove the following comment markers
command:
- /bin/sh
- -c
- redis-server --requirepass "$${REDIS_PASSWORD:?Variable is not set or empty}"
networks:
- seafile-net
问:出于某种原因,我仍然不得不使用Memcached作为我的缓存服务器。我该如何实现呢?
A:如果您仍想使用Memcached(Seafile Docker 13 不提供该服务),请按照以下步骤操作:
-
将
CACHE_PROVIDER设置为memcached,并修改.env中的MEMCACHED_xxx -
删除
seafile-server.yml中seafile服务部分的redis部分及redis依赖。
顺便一提,服务启动后,您可以通过在.env文件中设置环境变量来更改缓存服务器,但相应的配置文件并不会自动更新(例如:seahub_settings.py、seafile.conf 和 seafevents.conf)。为避免产生歧义,我们建议您也同步更新这些配置文件。
参考链接:
https://manual.seafile.com/latest/setup/setup_ce_by_docker/
https://github.com/haiwen/seafile-admin-docs/blob/master/manual/setup/setup_ce_by_docker.md
关注我们,获取更多DevOps和安全更新资讯!
本文作者:运维技术团队:辣个男人Devin
发布日期:2026年01月19日
适用系统:Linux