Seafile12公网IP自定义端口映射的部署

同事觉得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文件和知识库文件正常,表示成功。

以上,祝大家使用快乐!

按这个方法还是不行,如果只改80的端口 ,还是会直接转到https,但是https的443端口占用了,改了别的,也不跳转到其他端口,导致http无法访问 :joy:这个该怎么处理啊。

你是新部署的Seafile吗?如果你的80和443端口已经被占用,可以做完第二步再启动Seafile;编辑“caddy.yml”修改80端口时,同时修改443的配置或注释掉;“.env”配置项“SEAFILE_SERVER_PROTOCOL”是HTTP时,初次启动Seafile是不会跳转到HTTPS的。
如果你是从旧版本升级,那建议你找个测试机,按照本帖步骤了解清楚12版本Caddy的HTTPS配置过程,再看正式环境如何配置。

:grinning:感谢感谢,我再试一试,是12的版本