Замена 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