Seafile12服务内网自签发证书Docker部署方式总结分享

Seafile12服务内网自签发证书Docker部署方式总结分享

部署环境需要,测试了Seafile12服务在内网使用自签发证书的Docker部署方式,遇到并解决了一些问题,因此做个总结分享。

证书文件准备

自签发证书

使用证书工具用自己的根证书书签发服务证书。

注意:服务证书可选名称应包括Seafile服务的域名(本文seafile12test.example.com)、部署Seafile服务的主机IP(本文192.168.1.2)、Caddy容器可能使用的IP(Docker seafile-net网络前几个IP,比如:172.18.0.2~6)。

复制证书到目录

将根证书公钥(本文root.crt)和服务证书公钥(本文server.crt)和私钥(server.key)复制到部署Seafile服务主机“/opt”下对应目录。复制完成效果如下:

/opt/
├── seadoc-data
│   └── root.crt
├── seafile-caddy
│   └── certificates
│       └── local
│           └── seafile12test.example.com
│               ├── root.crt
│               ├── server.crt
│               └── server.key
└── seafile-data
    └── root.crt

注意:服务证书应在“seafile-caddy/certificates/local/服务域名/”目录下,以免Caddy启动初始化目录时把文件删除了。

配置文件修改

.env文件

COMPOSE_FILE='seafile-server.yml,caddy.yml,seadoc.yml'
SEAFILE_SERVER_HOSTNAME=seafile12test.example.com
SEAFILE_SERVER_PROTOCOL=https
ENABLE_SEADOC=true
SEADOC_SERVER_URL=https://seafile12test.example.com/sdoc-server
# 其他配置项略,请自行配置

caddy.yml更改

添加“labels”段,不使用Caddy自动签发域名证书;其他不变。

......
    environment:
      - CADDY_INGRESS_NETWORKS=seafile-net
    labels:
      #caddy.debug:
      caddy.auto_https: "disable_certs"
    volumes:
......

如有调试需要,可以取消“caddy.debug”的注释,输出更详细的日志。

seafile-server.yml更改

添加Seafile容器本地域名解析、python证书信任,配置Caddy同时启用域名和IP转发及调用服务证书;其他不变。

......
    container_name: seafile
    command: /bin/bash -c "echo '192.168.1.2 seafile12test.example.com' >>/etc/hosts; cat /shared/root.crt >>/opt/seafile/seafile-server-12.0.4/seahub/thirdpart/certifi/cacert.pem; /sbin/my_init -- /scripts/enterpoint.sh "
......
    labels:
      caddy: "${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty} https://192.168.1.2"
      caddy.reverse_proxy: "{{upstreams 80}}"
      caddy.tls: /data/caddy/certificates/local/seafile12test.example.com/server.crt /data/caddy/certificates/local/seafile12test.example.com/server.key
      caddy.tls.ca_root: /data/caddy/certificates/local/seafile12test.example.com/root.crt
......

注:配置Caddy的IP转发不是必须的;配置了因为跨域问题,也不能用于在内网访问使用。但是,如果在Seafile主机外的前端还有代理时,就需要配置IP转发。

seadoc.yml

添加Seadoc容器本地域名解析、node证书信任,配置Caddy转发与“seafile-server.yml”配置一致;其他不变。

......
    container_name: seadoc
    command: /bin/bash -c "echo '192.168.1.2 seafile12test.example.com' >>/etc/hosts; /sbin/my_init -- /scripts/enterpoint.sh "
......
    environment:
      - NODE_EXTRA_CA_CERTS=/shared/root.crt
......
    labels:
      caddy: "${SEAFILE_SERVER_PROTOCOL:-http}://${SEAFILE_SERVER_HOSTNAME:?Variable is not set or empty} https://192.168.1.2"
......

启动后配置

当首次“docker compose up -d”启动Seafile服务后,需要修改“seahub_settings.py”文件,添加“CSRF_TRUSTED_ORIGINS”配置,然后重启“seahub”。

echo 'CSRF_TRUSTED_ORIGINS = [ "https://seafile12test.example.com", "https://192.168.1.2" ]' >>/opt/seafile-data/seafile/conf/seahub_settings.py
docker exec -it seafile /opt/seafile/seafile-server-latest/seahub.sh stop
sleep 2
docker exec -it seafile /opt/seafile/seafile-server-latest/seahub.sh start

至此,如果你的内网DNS可以解析你的Seafile域名,或添加域名解析到本地host文件,就可以正常使用Seafile12服务了。

另,测试中如果Seafile服务主机重启,因容器启动快慢问题,可能存在Caddy没有收到Seafile的转发配置,需要“docker compose down”再“docker compose up -d”重启一次。

2 个赞

补充内容
调试Caddy,除启用debug日志输出外,还可以修改caddy.yml文件,将配置目录外挂:

......
    volumes:
      - /opt/seafile-caddy:/data/caddy
      - /opt/seafile-caddy/config:/config/caddy
......

启动后,Caddy会在配置目录写入配置文件“Caddyfile.autosave”;对于本文,文件内容如下:

cat /opt/seafile-caddy/config/Caddyfile.autosave 
{
        auto_https disable_certs
}
https://seafile12test.example.com https://192.168.1.2 {
        @ws {
                header Connection *Upgrade*
                header Upgrade websocket
        }
        reverse_proxy @ws 172.18.0.5:80
        handle_path /socket.io/* {
                rewrite * /socket.io{uri}
                reverse_proxy 172.18.0.5:80
        }
        handle_path /sdoc-server/* {
                rewrite * {uri}
                reverse_proxy 172.18.0.5:80
        }
        reverse_proxy 172.18.0.4:80
        tls /data/caddy/certificates/local/seafile12test.example.com/server.crt /data/caddy/certificates/local/seafile12test.example.com/server.key {
                ca_root /data/caddy/certificates/local/seafile12test.example.com/root.crt
        }
}