侧边栏壁纸
博主头像
Awesome Devin 博主等级

行动起来,活在当下

  • 累计撰写 345 篇文章
  • 累计创建 26 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

使用Docker安装Seafile服务器社区版

Administrator
2026-01-19 / 0 评论 / 0 点赞 / 11 阅读 / 0 字

使用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)中放置 .envseafile-server.ymlcaddy.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: 10

redis:
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-net

seafile:
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_VOLUMESeafile 数据的卷目录/opt/seafile-data
SEAFILE_MYSQL_VOLUMEMySQL数据的卷目录/opt/seafile-mysql/db
SEAFILE_CADDY_VOLUME用于存储从Let's Encrypt获取的证书的Caddy数据卷目录/opt/seafile-caddy
INIT_SEAFILE_MYSQL_ROOT_PASSWORDMySQL 的 root 密码(仅首次部署时需要)
SEAFILE_MYSQL_DB_HOSTMySQL 的主机db
SEAFILE_MYSQL_DB_PORTMySQL端口3306
SEAFILE_MYSQL_DB_USERMySQL 的用户(可在 conf/seafile.conf 中找到 database - userseafile
SEAFILE_MYSQL_DB_PASSWORDMySQL 用户 seafile 的密码(必填)
SEAFILE_MYSQL_DB_CCNET_DB_NAMEccnet 的数据库名称ccnet_db
SEAFILE_MYSQL_DB_SEAFILE_DB_NAMESeafile 的数据库名称seafile_db
SEAFILE_MYSQL_DB_SEAHUB_DB_NAMEseahub 的数据库名称seahub_db
JWT_PRIVATE_KEYJWT_PRIVATE_KEY,Seafile 需要一个长度不小于 32 个字符的随机字符串,可使用 pwgen -s 40 1 生成(必填)
SEAFILE_SERVER_HOSTNAMESeafile 服务器主机名或域名(必填)
SEAFILE_SERVER_PROTOCOLSeafile 服务器协议(http 或 https)http
CACHE_PROVIDER用于Seafile的缓存服务器类型。可用选项为redismemcached。自Seafile 13起,建议使用redis作为缓存服务以支持新功能,而memcached将不再默认集成到Seafile Docker中。redis
REDIS_HOSTRedis服务器主机redis
REDIS_PORTRedis服务器端口6379
REDIS_PASSWORDRedis服务器密码(无)
MEMCACHED_HOSTMemcached 服务器主机memcached
MEMCACHED_PORTMemcached 服务器端口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.ymlseafile 服务部分的 redis 部分及 redis 依赖。

顺便一提,服务启动后,您可以通过在.env文件中设置环境变量来更改缓存服务器,但相应的配置文件并不会自动更新(例如:seahub_settings.pyseafile.confseafevents.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

0
博主关闭了所有页面的评论