OpenSign Docker自托管求助:邮件附件显示为0KB问题排查
嗨,我仔细看了你的问题描述和配置文件,发现几个核心问题,应该能解决邮件附件变成0KB的问题,咱们一步步来:
一、定位核心错误:网络隔离+地址解析失败
你日志里的 error connect ECONNREFUSED 127.0.0.1:3001 是关键线索——这说明OpenSign的后端(server容器)在尝试访问127.0.0.1:3001拉取PDF文件,但在Docker容器的网络环境中,127.0.0.1指向容器自身,而不是你的Caddy反向代理服务,自然连接会被拒绝,最终导致附件无法获取变成0KB。
再看你的配置,还有一个隐藏的大问题:Caddy容器和其他服务不在同一个Docker网络里,这直接导致server容器根本找不到Caddy服务。
二、具体修复步骤
1. 给Caddy容器加入内部网络
你的docker-compose.yml里,caddy服务没有配置networks,默认用了Docker的default网络,而server/client/mongo都在app-network里,两边完全隔离。给caddy服务添加网络配置:
caddy: image: caddy:latest container_name: caddy-container ports: - "3001:3001" - "80:80" - "443:443" - "443:443/udp" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data - caddy_config:/config # 新增这一段,把Caddy加入app-network networks: - app-network environment: - HOST_URL=${HOST_URL:-https://192.168.10.19:3001}
2. 修正内部服务的访问地址
OpenSign的后端生成邮件附件时,会用PUBLIC_URL构建文件链接并自己去拉取,这个地址必须是server容器能在内部网络访问到的。更新你的.env.prod:
# .env.prod # 后端内部API调用地址,用Docker服务名直接访问(不需要走公网) SERVER_URL=http://server:8080/app # 后端拉取PDF用的内部地址,指向同一网络的Caddy服务 PUBLIC_URL=http://caddy:3001 # 外部用户访问的公网地址,保持你原来的配置即可 HOST_URL=https://your-public-domain-or-ip:3001
同时确保server服务的环境变量正确加载这些配置(你的docker-compose.yml里已经用了env_file: .env.prod,这点没问题,如果之前有注释的配置,直接取消注释并引用环境变量即可)。
3. 验证Caddy反向代理规则
你的Caddyfile配置是对的,不过再确认下:/api/*反向代理到server:8080,主域名反向代理到client:3000——因为现在所有服务都在同一个网络里,用服务名就能直接访问,不需要IP。
4. 干净重启容器
执行命令重启所有容器,确保配置完全生效:
# 停止现有容器并清理卷(可选,确保没有旧配置残留) docker-compose down -v # 重新构建并启动容器 docker-compose up -d --build
三、为什么之前的尝试会出问题?
- 你之前用公网IP作为
HOST_URL时,client容器在内部网络访问公网IP需要走宿主机NAT,可能遇到网络限制或HTTPS证书问题,导致无法加载上传的文件; - 而
127.0.0.1在Docker容器里只指向自身,根本无法访问到宿主机或其他容器的服务,这就是连接被拒绝的原因。
现在再测试发送带附件的邮件,应该就能正常获取PDF文件了,你可以看看server容器的日志,确认没有ECONNREFUSED错误。
内容来源于stack exchange

