Кадди для https поверх работающего приложения django asgi предположительно нарушает связь по websocket
У меня есть работающее приложение django asgi, которое использует каналы для связи по веб-сокету с daphne и redis, и работает в докеризованной установке. Чтобы включить безопасный протокол https, я попытался найти решение с использованием caddy с самоподписанными сертификатами (приложение развернуто на сервере внутри моей организации).
У меня получилось настроить caddy так, что я могу получить доступ через https, но это, похоже, нарушает часть websocket. Например, при нажатии на некоторые кнопки, которые должны запускать взаимодействие через websocket, я получаю ошибки типа
Uncaught ReferenceError: can't access lexical declaration 'ws' before initialization
с указателем на то место, где я делаю ws.send(...)
в javascript. Websocket инициализируется с помощью
let ws = new WebSocket('ws://' + window.location.host + '/ws/validation/');
Вот мой docker-compose.yml
:
services:
mywebapp:
build:
context: .
dockerfile: Dockerfile.prod
ssh:
- default
command: daphne -b 0.0.0.0 -p 8080 mywebapp.asgi:application
ports:
- "8080:8080"
volumes:
- .:/app
depends_on:
- redis
env_file:
- .env
redis:
image: redis:latest
ports:
- "6379:6379"
caddy:
image: caddy:latest
ports:
- "8081:80"
- "8443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- /selfsigned.crt:/etc/ssl/certs/selfsigned.crt
- /selfsigned.key:/etc/ssl/private/selfsigned.key
depends_on:
- mywebapp
volumes:
caddy_data:
А это мой Caddyfile
:
example.com {
tls /etc/ssl/certs/selfsigned.crt /etc/ssl/private/selfsigned.key
reverse_proxy mywebapp:8080 {
header_up Host {host}
header_up X-Real-IP {remote}
header_up X-Forwarded-For {remote}
header_up X-Forwarded-Proto {scheme}
header_up Connection {>Connection}
header_up Upgrade {>Upgrade}
}
}
Я буду рад предоставить больше контекста, если это необходимо, в настоящее время я не уверен, в чем может быть проблема, и у меня мало опыта работы с инструментами. Мое приложение работало до добавления службы caddy в docker-compose.yml
и Caddyfile
; единственным изменением, которое я сделал, было добавление этого в settings.py
:
SECURE_SSL_REDIRECT = True
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
CSRF_COOKIE_SECURE = True
SESSION_COOKIE_SECURE = True
CSRF_TRUSTED_ORIGINS = [
'https://example.com:8443'
]