pydanny-cookiecutter部署Django如何通过DigitalOcean Droplet公网IP访问
问题根因
你目前的配置存在4个核心错误:
- Let's Encrypt 不支持为公网IP地址颁发SSL证书,你当前Traefik路由中配置的
certResolver: letsencrypt会直接校验失败,导致路由无法正常生效 - 你在DigitalOcean Droplet开放的5000端口是Django容器内部的服务端口,并未直接映射到宿主机公网,Traefik默认监听的入口端口是80、443、5555,你没有开放80、443端口的公网访问权限
- 你没有修改Django配置中的
ALLOWED_HOSTS和CSRF_TRUSTED_ORIGINS参数,公网IP的访问请求会被Django直接拦截 - 针对固定IP的路由规则不需要使用
HostRegexp,直接用Host规则即可,多余的正则匹配可能导致路由规则不生效
修复步骤
1. 调整Traefik配置
因为IP无法申请公网可信SSL证书,我们临时改为HTTP访问,后续如果绑定域名再切回HTTPS即可,修改后的traefik.yml如下:
log: level: INFO entryPoints: web: # http address: ":80" flower: address: ":5555" http: routers: web-router: rule: "Host(`<你的公网WAN IP>`)" entryPoints: - web middlewares: - csrf service: django flower-router: rule: "Host(`<你的公网WAN IP>`)" entryPoints: - flower service: flower middlewares: csrf: headers: hostsProxyHeaders: ["X-CSRFToken"] services: django: loadBalancer: servers: - url: http://django:5000 flower: loadBalancer: servers: - url: http://flower:5555 providers: file: filename: /etc/traefik/traefik.yml watch: true
如果需要用HTTPS访问,自行生成自签名证书配置到Traefik即可,访问时接受浏览器的不安全提示就能正常打开。
2. 调整DigitalOcean Droplet防火墙规则
关闭5000端口的公网访问,新增80、443、5555端口的公网入站规则。
3. 调整Django配置
在settings/base.py中修改以下参数:
# 把你的公网IP加进去 ALLOWED_HOSTS = ["<你的公网WAN IP>", "localhost", "127.0.0.1"] # Django 4.0+ 必须配置这个参数,否则跨域POST请求会被拦截 CSRF_TRUSTED_ORIGINS = ["http://<你的公网WAN IP>"]
确认SITE_ID = 2配置正确,postgres的django_sites表中ID为2的记录domain字段确实是你的公网IP。
4. 重启服务生效
重启所有相关容器让配置生效:
docker-compose restart traefik django flower
配置生效后直接在浏览器访问http://<你的公网IP>即可打开Django站点,访问http://<你的公网IP>:5555即可打开Flower控制台。
内容的提问来源于stack exchange,提问作者Ethanopp
相关产品推荐
相关产品推荐

