Замена Nginx на Traefik привела к тому, что Django использовал файлы администратора через HTTP вместо HTTPS, нарушая функциональность

У меня была совершенно прекрасная установка Django CMS 3.4.1, работающая за Nginx в качестве edge-сервера с SSL завершением. Полная цепочка была следующей:

nginx (SSL) → nginx (django server) → gunicorn → django

Все, что я сделал, это заменил первый обратный прокси nginx на traefik, для лучшей интеграции других сервисов. Все запускается с помощью docker (compose)

Проблема в том, что Django теперь хочет перенаправить HTTPS вызовы к админским файлам (и ajax вызовы) на HTTP, нарушая функциональность, потому что эти файлы блокируются браузером. Я ничего не менял в установке django. На самом деле, это даже тот же образ docker, что и раньше.

Поскольку это работало со старой установкой, я не думаю, что это проблема с кодом Django CMS, использующим жестко закодированный http://. SSL был прекращен перед обратным прокси django, также.

Кто-нибудь видит что-то, что я упустил?

Вот некоторые конфигурационные файлы, сверху вниз:

traefic.yml:

global:
  sendAnonymousUsage: false

api:
  dashboard: true
  insecure: true

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    watch: true
    exposedByDefault: false

log:
  level: INFO
  format: common

entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"

certificatesResolvers:
  letsencrypt:
    acme:
      email: ***
      storage: /etc/acme/acme.json
      httpChallenge:
        entryPoint: http

релевантные части файла django-server docker-compose:

# ...
services:

  cms-nginx:
    build: "./nginx"
    depends_on:
      - postgres
    networks:
      - proxy
      - cms
    volumes:
      - cms_static:/usr/src/app/static
      - cms_media:/usr/src/app/media
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.cms.rule=Host(`***`)"
      - "traefik.http.routers.cms.tls=true"
      - "traefik.http.routers.cms.tls.certresolver=letsencrypt"

  cms:
    restart: always
    build: ./cms
    links:
      - postgres:postgres
      - static:static
    expose:
      - "8000"
    volumes:
      - ./cms:/usr/src/app
      - static_out:/usr/src/app/data/generated
      - cms_static:/usr/src/app/data/static
      - cms_media:/usr/src/app/data/media
    depends_on:
      - static
    env_file:
      - .env
      - ./cms/.env
    command: /bin/sh -c "./docker-init.sh"
    networks:
      - cms

django server nginx conf:

server {

    listen 80;
    server_name *** default_server;
    charset utf-8;

    client_max_body_size 75M;

    location ^~ /static/ {
        alias /usr/src/app/static/;
    }

    location ^~ /media/ {
        alias /usr/src/app/media/;
    }

    location / {
        proxy_pass http://cms:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Protocol $scheme;
    }

    error_log /var/log/nginx/deckel_error.log;
}

команда запуска gunicorn:

/usr/local/bin/gunicorn cms.wsgi:application -w 2 -b :8000

часть настроек джанго:

SESSION_COOKIE_SECURE = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTOCOL', 'https')
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True
Вернуться на верх