1

I'm developing a Django based web server which integrates a websocket for data visualizations in real time (my web server reads values from a PLC via OPCUA and displays them in real time on a web page).

The server works correctly in development mode while in production the websocket open and closes immediatly with no error.

To deploy I used Docker, Nginx as a proxy, and Daphne to handle both wsgi and asgi requests.

This is my first time creating a docker for a django server so I may have something wrong there as well.

My configuration is:

Django - settings.py

WSGI_APPLICATION = 'LCD_Data_Management.wsgi.application'
ASGI_APPLICATION = 'LCD_Data_Management.asgi.application'

CHANNEL_LAYERS = {
    'default': {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
                     "hosts": [("127.0.0.1", 8000)],
                  },
    },
}

Django - asgi.py

import os

import django
from django.core.asgi import get_asgi_application
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter

from myApp.routing import ws_urlpatterns

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myProject.settings')
django.setup()

application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': AuthMiddlewareStack(URLRouter(ws_urlpatterns))
})

Nginx - default.config

server {
    listen 8080;

    location /static {
        alias /vol/static;
    }

    location / {
        try_files $uri @proxy_to_app;
    }
    location @proxy_to_app {
        proxy_pass http://app:8000;

        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 - docker-compose.yml

version: '3.9'

services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  app:
    build:
      context: .
    volumes:
      - static_data:/vol/web
    environment:
      - SECRET_KEY=samplesecretkey123
      - ALLOWED_HOST=localhost:8080,127.0.0.1:8080
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - DEBUG=0
    depends_on:
      - db

  proxy:
    build:
      context: ./proxy
    volumes:
      - static_data:/vol/static
    ports:
      - "8080:8080"
    depends_on:
      - app

volumes:
  static_data:
Nikyde
  • 11
  • 1

0 Answers0