You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose无法读取本地证书,Django后端SSL配置失败

解决Gunicorn找不到SSL证书的问题

核心问题定位

Gunicorn报错找不到/etc/letsencrypt/live/api.my-table.it/fullchain.pem,但你的VPS证书实际路径是/etc/letsencrypt/live/domain.it/,且Docker卷映射存在以下关键问题:

  • 容器内证书路径与Gunicorn配置不匹配
  • 仅映射live目录下单个文件,忽略了Let's Encrypt证书的符号链接依赖
  • 容器内证书文件权限不足

具体修复步骤

1. 统一证书路径配置

更新Gunicorn配置(gunicorn.conf.py)

确保配置中的证书路径和容器内映射的路径完全一致:

  • 如果你的VPS证书对应域名是domain.it,修改Gunicorn配置:
# gunicorn.conf.py
bind = "0.0.0.0:443"
certfile = "/etc/letsencrypt/live/domain.it/fullchain.pem"
keyfile = "/etc/letsencrypt/live/domain.it/privkey.pem"
  • 如果服务实际域名是api.my-table.it,需先在VPS上为该子域名生成对应的Let's Encrypt证书,再同步调整路径。

2. 修正Docker Compose卷映射

Let's Encrypt的live目录下证书是符号链接,指向/etc/letsencrypt/archive/内的实际文件,仅映射单个文件会导致链接失效。需挂载整个/etc/letsencrypt目录:

# docker-compose.yml
services:
  my_table:
    # 其他原有配置...
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt:ro
    ports:
      - "443:443"

添加:ro以只读模式挂载,提升容器安全性。

3. 解决容器内权限问题

Let's Encrypt证书目录默认权限为root:root(权限值700),容器内Gunicorn进程可能无读取权限,可通过以下方式修复:

  • 临时测试方案:以root用户运行容器
    在docker-compose.yml中添加:
    services:
      my_table:
        user: root
        # 其他配置...
    
  • 生产环境方案:调整VPS证书目录权限
    给其他用户添加读取和执行权限:
    sudo chmod -R o+r /etc/letsencrypt/live/ /etc/letsencrypt/archive/
    sudo chmod -R o+x /etc/letsencrypt/live/ /etc/letsencrypt/archive/
    
    或修改Dockerfile,将容器运行用户加入root组:
    RUN usermod -aG root <你的容器运行用户名>
    

4. 验证配置并重启服务

完成修改后,重启Docker Compose服务:

docker-compose down && docker-compose up -d

查看Gunicorn日志确认启动状态:

docker-compose logs my_table

内容的提问来源于stack exchange,提问作者Matteo Possamai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 13:32:48