核心架构与部署思路
我们将采用目前最稳定、最推荐的“完全容器化”方案:
- Seafile服务套件:Seafile主程序、MariaDB数据库、Redis/Memcached缓存,这三个核心组件将全部运行在由
docker-compose
管理的独立容器中。这保证了服务的完整性、隔离性和可移植性。 - 宝塔面板Nginx:作为服务器的外部反向代理。它将监听公共的80/443端口,并将特定域名(如
cloud.fault.at
)的请求,安全地转发给内部的Seafile容器。同时我们也摒弃Seafile默认的caddy服务,防止服务器上的nginx服务收到影响(比如网站)。
第一步:准备工作
- 一台已安装宝塔面板的服务器。
- 通过宝塔“软件商店”安装最新版的
Docker管理器
和Docker-compose
。 - 一个解析到您服务器IP的域名(本文以
cloud.fault.at
为例)。 - SSH客户端(用宝塔的终端功能也可以,为了防止来回页面切换繁琐,也可以使用宝塔多机管理软件同时打开多个ssh终端和主机面板方便来回切换)。
第二步:彻底清理环境
这是最重要却最容易被忽略的一步。任何不成功的安装尝试都可能留下残留的配置文件、数据卷或容器,它们会严重干扰后续的部署。
警告:如果您是首次安装,可以跳过此步。如果您曾尝试过安装,请务必执行清理。
# 进入您之前尝试安装的目录,例如 /opt/seafile
cd /opt/seafile
# 关闭并移除所有相关容器、网络
sudo docker-compose down
# 回到上级目录
cd /opt
# 彻底删除安装目录
sudo rm -rf seafile/
# 登录宝塔面板,删除为Seafile创建的网站和数据库(如有)
第三步:部署Seafile Docker套件
-
获取配置文件
我们以当前最新的稳定版 Seafile 13.0 为例(此流程同样适用于12.0版本)。
# 创建安装目录(直接用宝塔面板文件管理找到根目录/opt手动管理更快) sudo mkdir -p /opt/seafile cd /opt/seafile # 下载 .env 配置文件模板 sudo wget -O .env https://manual.seafile.com/13.0/repo/docker/ce/env # 下载 seafile-server.yml 核心服务文件 sudo wget https://manual.seafile.com/13.0/repo/docker/ce/seafile-server.yml
踩坑提示 #1:
wget
SSL错误 如果下载时遇到SSL connection
错误,请在wget
命令中加入--no-check-certificate
参数。 - 配置
.env
文件(所有配置的核心)使用 宝塔面板文件管理器打开/opt/seafile/.env文件,并进行如下配置:
配置项 | 需要修改/确认为 | 说明与避坑指南 |
COMPOSE_FILE |
'seafile-server.yml' |
我们只部署核心服务,删除Caddy。 |
SEAFILE_SERVER_VERSION |
13.0.8 |
建议:使用具体的稳定版本号,避免latest 可能带来的不稳定。(可选) |
SEAFILE_SERVER_HOSTNAME |
cloud.fault.at |
必须修改为您想要部署的域名(须已经指向服务器)。 |
SEAFILE_SERVER_PROTOCOL |
https |
必须修改,因为我们将使用宝塔Nginx配置SSL。 |
INIT_SEAFILE_MYSQL_ROOT_PASSWORD |
<一个健壮的密码> |
必须修改。不要使用特殊符号! |
SEAFILE_MYSQL_DB_PASSWORD |
<与上面的root密码完全相同> |
必须修改。不要使用特殊符号! |
REDIS_PASSWORD |
<为Redis设置一个强密码> |
建议修改。不要使用特殊符号! |
INIT_SEAFILE_ADMIN_EMAIL |
seafile@gmail.com |
必须修改为您的管理员邮箱。 |
INIT_SEAFILE_ADMIN_PASSWORD |
seafile_admin_pass |
必须修改为您的管理员密码。 |
ENABLE_SEADOC |
true |
改为false可以禁用seadoc以简化初次部署。 |
踩坑提示 #2: 密码中的“隐形杀手” 我们在排错中发现,
Access denied
错误反复出现,最终原因是密码中含有$
,!
,&
等特殊字符,导致.env
文件解析错误。强烈建议您在首次部署时,为数据库和Redis设置一个仅包含大小写字母和数字的强密码,以100%排除此问题。
3.修改 opt/seafile/seafile-server.yml
和seadoc.yml
文件
我们需要修改此文件,为Nginx反向代理“搭桥”。使用宝塔面板文件管理器双击 seafile-server.yml
打开文件。
-
找到
seafile:
服务,在其下添加ports:
块,并删除labels:
块。
踩坑提示 #3: 端口映射的大坑 官方文档和网上的资料在不同页面对Seafile内部端口的描述相互矛盾(有的写80,有的写8000)。经过反复验证,事实是:
- Seafile网页服务和seadoc都在监听在容器的 80 端口。
请将seafile:
服务块修改为如下结构:
seafile:
image: seafileltd/seafile-mc:${SEAFILE_SERVER_VERSION}
container_name: seafile
# !! 添加以下完整的 ports 映射 !!
ports:
- "127.0.0.1:8000:80" # 映射Web界面服务,使用本机8000端口防止和其他网站端口冲突
restart: always
volumes:
- ${SEAFILE_VOLUME}:/shared
environment:
# ... environment内容保持不变 ...
# !! 删除下面的 labels 块 (它仅用于Caddy) !!也可以用#备注掉
# labels:
# caddy: ...
# caddy.reverse_proxy: ...
depends_on:
# ... depends_on后面内容保持不变 ...
请将seadoc.yml
服务块修改为如下结构:
services:
seadoc:
image: ${SEADOC_IMAGE:-seafileltd/sdoc-server:2.0-latest}
container_name: seadoc
volumes:
- ${SEADOC_VOLUME:-/opt/seadoc-data/}:/shared
ports:
- "127.0.0.1:8888:80" #映射seadoc到8888端口
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:-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: 从labels开始到depends前全备注
# 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
4.启动服务
cd /opt/seafile
sudo docker-compose up -d
第四步:配置宝塔Nginx反向代理(最后一道关)
-
在宝塔面板为
cloud.fault.at
创建一个纯静态站点,并申请部署Let’s Encrypt SSL证书,开启强制https; -
进入该站点设置,左侧“反向代理”标签页,点击“添加反向代理”,输入代理名称比如“seafile”,目标URL填入“http://172.0.0.1:8000”(我们选的映射端口),其他默认,然后点击添加。
- 在新出现的反向代理清单中看见新的“seafile”,点击“配置文件”;
- 用下面的配置文件替换原有所有内容并“保存”。
#PROXY-START/
location / {
proxy_pass http://127.0.0.1:8000;
proxy_read_timeout 310s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection "";
proxy_http_version 1.1;
client_max_body_size 0;
}
location /sdoc-server/ {
proxy_pass http://127.0.0.1:8888/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 100m;
}
location /socket.io {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_redirect off;
proxy_buffers 8 32k;
proxy_buffer_size 64k;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Forwarded-Proto $scheme;
}
#PROXY-END/
踩坑提示 #4: 登录后403 Forbidden (CSRF)错误 这是因为官方的Nginx案例规则没有正确地将用户的真实协议(HTTPS)告知后端的Seafile服务,导致Seafile的安全验证失败。下面的配置包含了
X-Forwarded-Proto $scheme
等关键头信息,可以完美解决此问题。
结语
至此,您应该可以通过 https://cloud.fault.at
正常访问并登录您的Seafile私有云了。从端口冲突到数据库权限,再到CSRF验证,我们一一解决了Seafile与宝塔环境集成中的每一个“坑”。希望这篇凝聚了我们排错血泪史的终极指南,能帮助您顺利完成部署。同时你可以下载PC端客户端,进行文件同步了!
有任何其他问题欢迎留言交流。