Docker部署Streamlit应用配置https-portal实现HTTPS失败求助
排查steveltn/https-portal配置HTTPS失败的问题
根据你给出的报错信息,核心问题是Let's Encrypt无法完成域名example.go.ro的证书签发,根源大概率是DNS解析配置错误或未生效,再结合你的docker-compose配置,按以下步骤排查修复:
1. 先确认DNS解析正确性
- 在测试机上执行命令:
检查返回的IP是否是测试机的公网IP,如果不是,立刻去你的域名管理后台,把该域名的A记录(IPv4)或AAAA记录(IPv6)指向测试机的公网IP。nslookup example.go.ro # 或者用dig更详细查看 dig example.go.ro - DNS解析存在延迟,刚修改的记录可能需要10-30分钟才能全网生效,可通过
dig example.go.ro @8.8.8.8检查公共DNS的解析状态。
2. 修正docker-compose.yaml配置
你的配置存在两处关键错误:
- DOMAINS格式错误:不需要加
http://前缀,正确格式应为域名直接指向后端服务地址 - streamlit_app无需暴露端口:反向代理已经接管外部请求,后端容器不需要把8501端口暴露给外部,避免直接HTTP访问
修改后的完整配置:
services: https-portal: image: steveltn/https-portal:1 ports: - '80:80' - '443:443' networks: - app-network restart: always environment: WEBSOCKET: 'true' DOMAINS: 'example.go.ro -> http://streamlit_app:8501' STAGE: staging # 调试阶段先用测试环境,避免生产环境限流 volumes: - https-portal-data:/var/lib/https-portal streamlit_app: build: dockerfile: ./Dockerfile context: ./ volumes: - .:/ETCWebApp networks: - app-network restart: always networks: app-network: driver: bridge volumes: https-portal-data:
3. 检查端口与防火墙
- 确保测试机的80、443端口在本地防火墙(如ufw、iptables)和云服务商安全组中完全开放,Let's Encrypt的HTTP-01验证必须通过80端口完成。
- 关闭测试机上其他占用80/443端口的服务,避免端口冲突。
4. 重置证书缓存(可选)
如果之前有错误的证书缓存残留,执行以下命令重置:
docker-compose down -v docker-compose up -d
调试完成后,再把STAGE改回production即可获取正式的信任证书。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

