同事觉得Seafile很好用,想在自己家里装一个。他家的宽带有一个公网IP,但是没有DNS解析,而且公网IP不能使用80、443端口,只能自签发证书在公网IP映射一个其他端口来部署。
昨天,基于内网自签发证书部署的经验(见“Seafile12服务内网自签发证书Docker部署方式总结分享”),调试部署完成。不过,那个分享贴直接写的结果,不太利于阅读;看到论坛有朋友也有类似的需求,现将部署详细过程分享在此。
步骤1. 内网IP(192.168.1.11)HTTP 80端口部署
这是Seafile最基本的部署方式,后面的配置步骤需要以这种方式启动成功为基础。
如果以这种方式部署后都不能正常使用,那一般都是操作系统或Docker程序安装存在问题,还是找个干净的操作系统按照Docker官方文档安装后再试吧。
# 下载配置文件
wget -c https://manual.seafile.com/12.0/docker/ce/env -O .env
wget -c https://manual.seafile.com/12.0/docker/caddy.yml -O caddy.yml
wget -c https://manual.seafile.com/12.0/docker/ce/seafile-server.yml -O seafile-server.yml
wget -c https://manual.seafile.com/12.0/docker/seadoc.yml -O seadoc.yml
# 设置变量
SEAFILE_SERVER_HOSTNAME=192.168.1.11
TIME_ZONE='Asia/Shanghai'
SEAFILE_MYSQL_ROOT_PASSWORD=$(cat /dev/urandom |tr -dc [:alnum:] |head -c 16)
SEAFILE_MYSQL_DB_PASSWORD=$(cat /dev/urandom |tr -dc [:alnum:] |head -c 16)
JWT_PRIVATE_KEY=$(cat /dev/urandom |tr -dc [:alnum:] |head -c 32)
SEAFILE_ADMIN_PASSWORD=$(cat /dev/urandom |tr -dc [:alnum:] |head -c 12)
# 编辑.env文件
sed -e "s/\(COMPOSE_FILE='seafile-server.yml,caddy.yml\)\S\+/\1,seadoc.yml'/g" \
-e "s/\(ENABLE_SEADOC=\)\S\+/\1true/g" \
-e "s/seafile.example.com/${SEAFILE_SERVER_HOSTNAME}/g" \
-e "s/\(INIT_SEAFILE_MYSQL_ROOT_PASSWORD=\)\S\+/\1${SEAFILE_MYSQL_ROOT_PASSWORD}/g" \
-e "s/\(SEAFILE_MYSQL_DB_PASSWORD=\)\S\+/\1${SEAFILE_MYSQL_DB_PASSWORD}/g" \
-e "s,\(TIME_ZONE=\)\S\+,\1${TIME_ZONE},g" \
-e "s/\(JWT_PRIVATE_KEY=\)\S*/\1${JWT_PRIVATE_KEY}/g" \
-e "s/\(INIT_SEAFILE_ADMIN_PASSWORD=\)\S\+/\1${SEAFILE_ADMIN_PASSWORD}/g" \
-i .env
# 启动Seafile
docker compose up -d
# 查看Seafile启动日志
docker compose logs -f
待Seafile启动成功,使用浏览器访问“http://192.168.1.11”,登录测试编辑seadoc文件和知识库文件正常,表示部署成功。
另外,为方便后面调试,建议开启Caddy的debug日志,并将配置目录外置:
创建外置配置目录“mkdir -p /opt/seafile-caddy/config
”,
然后,编辑caddy.yml文件:
......
labels:
caddy.debug:
volumes:
- ${SEAFILE_CADDY_VOLUME:-/opt/seafile-caddy}/config:/config/caddy
......
重启后生效。后面调试,在需要查看Caddy配置时,执行“cat /opt/seafile-caddy/config/Caddyfile.autosave
”
步骤2.内网IP(192.168.1.11)HTTP 51480端口部署
如果你的公网IP在配置端口映射时,可以设置内外的端口号不同,此步骤就不是必须的。
编辑“.env”:
SEAFILE_SERVER_HOSTNAME=192.168.1.11:51480
SEADOC_SERVER_URL=http://192.168.1.11:51480/sdoc-server
编辑“/data/opt/seafile-data/seafile/conf/seahub_settings.py
”:
FILE_SERVER_ROOT = 'http://192.168.1.11:51480/seafhttp'
编辑“caddy.yml”:
ports:
- 51480:80
编辑“seafile-server.yml”和“seadoc.yml”:
labels:
#caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
caddy: http://192.168.1.11
这里必须要改,因为“.env”配置的“SEAFILE_SERVER_HOSTNAME”值带有端口号,不被Caddy接受。
重新启动Seafile:
docker compose down
docker compose up -d
docker compose logs -f
启动后使用浏览器访问“http://192.168.1.11:51480”,登录测试编辑seadoc文件和知识库文件正常,表示成功。
步骤3.公网IP(1.2.3.4)HTTP 51480端口部署
配置公网IP(1.2.3.4)的端口映射,将51480端口指向内网IP(192.168.1.111)的80端口(未做步骤2)或51480端口(已做步骤2)。
另外,配置启用公网IP后,从本地内网也必须用公网IP端口访问Seafile,因此公网映射要支持本地自反访问。
编辑“.env”:
SEAFILE_SERVER_HOSTNAME=1.2.3.4:51480
SEADOC_SERVER_URL=http://1.2.3.4:51480/sdoc-server
编辑“/data/opt/seafile-data/seafile/conf/seahub_settings.py”:
FILE_SERVER_ROOT = 'http://1.2.3.4:51480/seafhttp'
编辑“seafile-server.yml”和“seadoc.yml”:
labels:
#caddy: ${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty}
caddy: http://1.2.3.4
同步骤2,这里也必须要改为公网IP,无端口。
重新启动Seafile:
docker compose down
docker compose up -d
docker compose logs -f
启动后使用浏览器访问“http://1.2.3.4:51480”,登录测试编辑seadoc文件和知识库文件正常,表示成功。
如果你不介意你的Seafile数据泄露,已经可以从公网使用Seafile服务了。
步骤4.制作自签发证书
注意:自签发证书的使用者可选名称必须包括“seafile-caddy”的容器IP,否则不被caddy接受,导致启用HTTPS后服务不可访问。
Caddy也有自签发证书功能,但因测试使用未能成功,未予使用。
制作证书前,执行“docker inspect seafile-caddy |grep '"IPAddress"'
”,输出结果本人是:
$ docker inspect seafile-caddy |grep '"IPAddress"'
"IPAddress": "",
"IPAddress": "172.18.0.2",
一般上,这表示本人部署的“seafile-caddy”可能会使用的IP是:172.18.0.2 至 172.18.0.6
使用证书工具自签发服务端证书,证书使用者可选名称要包括的IP地址为:192.168.1.11,1.2.3.4,172.18.0.2,172.18.0.3,172.18.0.4,172.18.0.5,172.18.0.6
如果你的网段不是“172.18.0.”,一般就选你的网段第二到第六个IP。
使用证书制作工具制作出服务端证书,后面启用HTTPS需要使用根证书、服务端证书公钥和服务端证书私钥。
步骤5.部署启用HTTPS
未做步骤2的,需要配置公网IP(1.2.3.4)的端口映射,将51480端口指向内网IP(192.168.1.111)的443端口;做了步骤2的下面会配置将51480端口换到Caddy的443端口。
编辑“.env”:
SEAFILE_SERVER_PROTOCOL=https
SEADOC_SERVER_URL=https://1.2.3.4:51480/sdoc-server
编辑“/data/opt/seafile-data/seafile/conf/seahub_settings.py”:
FILE_SERVER_ROOT = 'https://1.2.3.4:51480/seafhttp'
CSRF_TRUSTED_ORIGINS = [ 'https://1.2.3.4' ]
编辑“caddy.yml”(注:未做步骤2的不用修改端口;做了步骤2点需要修改端口):
ports:
#- 51480:80
- 51480:443
labels:
caddy.auto_https: "disable_certs"
复制证书到Caddy目录:
mkdir -p /opt/seafile-caddy/certificates/local/1.2.3.4/
cp root.crt /opt/seafile-caddy/certificates/local/1.2.3.4/
cp server.crt /opt/seafile-caddy/certificates/local/1.2.3.4/
cp server.key /opt/seafile-caddy/certificates/local/1.2.3.4/
复制证书到Seafile目录:
cp root.crt /opt/seafile-data/
编辑“seafile-server.yml”:
......
command: /bin/bash -c "cat /shared/root.crt >>/opt/seafile/seafile-server-*/seahub/thirdpart/certifi/cacert.pem; /sbin/my_init -- /scripts/enterpoint.sh"
......
labels:
caddy: https://1.2.3.4
caddy.tls: /data/caddy/certificates/local/1.2.3.4/server.crt /data/caddy/certificates/local/1.2.3.4/server.key
caddy.tls.ca_root: /data/caddy/certificates/local/1.2.3.4/root.crt
......
复制证书到Seadoc目录:
cp root.crt /opt/seadoc-data/
编辑“seadoc.yml”:
......
environment:
- NODE_EXTRA_CA_CERTS=/shared/root.crt
......
labels:
caddy: https://1.2.3.4
......
重新启动Seafile:
docker compose down
docker compose up -d
docker compose logs -f
启动后使用浏览器访问“https://1.2.3.4:51480”,登录测试编辑seadoc文件和知识库文件正常,表示成功。
以上,祝大家使用快乐!