Как изменить конфигурацию docker и nginx для поддержки asgi WebSocket wss в Django?

Я работаю над небольшим Django проектом, связанным с чатом, где я должен использовать WebSocket для real0time cominucation, я развернул свой проект, используя wsgi и он работал, но когда я достиг точки использования websockt я обнаружил, что я должен изменить конфигурацию на asgi или что-то еще, не могли бы вы мне помочь

Это архитектура моего проекта:

-myproject
    -docker(folder)
       -certbot(folder)
       -proxy(folder)
          -nginx (folder)
             -default-ssl.conf.tpl
             -uwsgi_params
          -Dockerfile (file2)
    -Dockerfile (file1)
    -Docker-compose-delpoy.yml

Это мой Dockerfile (file1)

FROM python:3.10-alpine3.16

ENV PYTHONUNBUFFERED 1

COPY requirements.txt /requirements.txt
RUN apk add --upgrade --no-cache build-base linux-headers && \
pip install --upgrade pip && \
pip install -r /requirements.txt

COPY app/ /app
WORKDIR /app

RUN adduser --disabled-password --no-create-home django

USER django
CMD ["uwsgi", "--socket", ":9000", "--workers", "4", "--master", "--enable-threads", "--module", "myproject.wsgi"]

Это мой производственный Docker-compose-delpoy.yml

version: '3.9'
services:
db:
   image: postgres

   volumes:
     - ./data/db:/var/lib/postgresql/data
     - ./init.sql:/docker-entrypoint-initdb.d/init.sql
   environment:
     - POSTGRES_DB=xxx
     - POSTGRES_USER=xxx
     - POSTGRES_PASSWORD=xx

app:
  build:
    context: .
  restart: always
  volumes:
    - .:/app
  environment:
    - DJANGO_DEBUG=0
    - POSTGRES_NAME=xxx
    - POSTGRES_USER=xxx
    - POSTGRES_PASSWORD=xxx
    - DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
    - DJANGO_ALLOWED_HOSTS=${DOMAIN}
  depends_on:
    - db


redis:
  image: redis:alpine

proxy:
  build:
    context: ./docker/proxy
  restart: always
  depends_on:
    - app
  ports:
    - 80:80
    - 443:443
  volumes:
    - certbot-web:/vol/www
    - proxy-dhparams:/vol/proxy
    - certbot-certs:/etc/letsencrypt
  environment:
    - DOMAIN=${DOMAIN}

certbot:
  build:
    context: ./docker/certbot
  command: echo "Skipping..."
  environment:
    - EMAIL=${ACME_DEFAULT_EMAIL}
    - DOMAIN=${DOMAIN}
  volumes:
    - certbot-web:/vol/www
    - certbot-certs:/etc/letsencrypt/
  depends_on:
    - proxy

volumes:
  certbot-web:
  proxy-dhparams:
  certbot-certs:

и это мой default-ssl.conf.tpl

server {
listen 80;
server_name ${DOMAIN} www.${DOMAIN};

location /.well-known/acme-challenge/ {
    root /vol/www/;
}

location / {
    return 301 https://$host$request_uri;
 }
}

server {
 listen      443 ssl;
 server_name ${DOMAIN} www.${DOMAIN};

ssl_certificate     /etc/letsencrypt/live/${DOMAIN}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/${DOMAIN}/privkey.pem;

include     /etc/nginx/options-ssl-nginx.conf;

ssl_dhparam /vol/proxy/ssl-dhparams.pem;

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

location /static {
    alias /vol/static;
}

location / {
    uwsgi_pass           ${APP_HOST}:${APP_PORT};
    include              /etc/nginx/uwsgi_params;
    client_max_body_size 10M;
}
}
Вернуться на верх