Конфигурация каналов Django - Django / Docker / Gunicorn / Daphne / Nginx
Я развернул приложение, pypilot.app, используя django / nginx / docker / daphne / gunicorn на цифровом океанском дроплете. Daphne предназначен для Django Channels, который без проблем работает в разработке для отображения сообщений в консоли пользователя через websocket. Я также могу успешно подключиться к websocket при переходе на IP-адрес моего дроплета по http. Однако когда я пытаюсь подключиться к websocket через https на pypilot.app, я сталкиваюсь с проблемами. Я подозреваю, что что-то не так с моей ssl-настройкой, возможно? Пожалуйста, дайте мне знать, если вы заметите какие-либо очевидные проблемы в моей настройке, приведенной ниже.
docker compose
version: '3'
services:
web:
build: .
command: gunicorn unicorn_python.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/code
- .:/usr/src/app
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "8000:8000"
daphne:
build: .
volumes:
- .:/usr/src/app
- .:/code
ports:
- "8001:8001"
command: daphne -b 0.0.0.0 -p 8001 unicorn_python.asgi:application
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./config/nginx:/etc/nginx/conf.d
- /etc/letsencrypt:/etc/letsencrypt:ro
- ./static:/usr/src/app/static # Host path to static files mounted inside the container
- ./media:/usr/src/app/media # Host path to static files mounted inside the container
depends_on:
- web
- daphne # If Nginx is set to proxy to Daphne as well
celery:
build: .
command: celery -A unicorn_python worker --loglevel=info
volumes:
- .:/code
celerybeat:
build: .
command: celery -A unicorn_python beat --loglevel=info
volumes:
- .:/code
flower:
image: mher/flower
environment:
- CELERY_BROKER_URL=redis://redis:6379/0
- FLOWER_PORT=5555
ports:
- "5555:5555"
depends_on:
- redis
redis:
image: redis:latest
volumes:
postgres_data:
driver: local
nginx config
upstream web {
server web:8000;
}
upstream daphne {
server daphne:8001;
}
# HTTP Server Block
server {
listen 80;
server_name pypilot.app www.pypilot.app;
# Redirect HTTP requests to HTTPS
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS Server Block
server {
listen 443 ssl;
server_name pypilot.app;
ssl_certificate /etc/letsencrypt/live/pypilot.app/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pypilot.app/privkey.pem;
location / {
proxy_pass http://web;
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-Proto $scheme;
# WebSocket support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /static/ {
alias /usr/src/app/static/;
}
location /media/ {
alias /usr/src/app/media/;
}
location /ws/console/ {
proxy_pass http://daphne;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
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-Host $server_name;
}
}
Не знаю, какая еще информация была бы полезна, но я склонен полагать, что ошибка кроется где-то в этой настройке (или я пропустил какой-то другой шаг, который требуется).
Попробовал перенастроить оба docker compose & nginx config. Попробовал обновить команду daphne, чтобы привязать ее к ssl-сертификатам, но безрезультатно (ssl-команды, предоставленные chatgpt, не работали должным образом). Довольно много полностью застрял на этом этапе и расстроен, что все отлично работает в разработке.