Конфигурация каналов 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, не работали должным образом). Довольно много полностью застрял на этом этапе и расстроен, что все отлично работает в разработке.

Вернуться на верх