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: