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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 01:54:03