CHAT: ТЕХНИЧЕСКАЯ СПЕЦИФИКАЦИЯ
Техническая спецификация: производственное окружение Django Channels
1
Сводка системы
Техническая спецификация: производственное окружение Django Channels
Идентификатор документа: DEPLOY-SPEC-AION-001 Версия: 1.0 Документ описывает архитектуру и производственную конфигурацию веб-приложения, развернутого на выделенном сервере. Приложение построено на основе фреймворка Django 3.2 с расширением Channels 3.0.4 для поддержки двусторонней связи в реальном времени через WebSocket. Компоненты окружения:- Асинхронный сервер приложений Daphne 3.0.2
- Брокер сообщений Redis 5+ в качестве Channel Layer
- Веб-сервер Nginx в роли обратного прокси и терминатора SSL
2
Технический стек и версии
2.1
Системное ПО
2.2
Зависимости Python
Зависимости Python (ключевые)
# Основные компоненты стека Channels
Django==3.2
channels==3.0.4
channels-redis==3.3.0
daphne==3.0.2
# Асинхронный стек и Redis-клиент
aioredis==1.3.1
Twisted==22.4.0
autobahn==19.3.3
# Драйвер БД и утилиты
psycopg2-binary>=2.9.3
# Дополнительный функционал проекта
django-ckeditor>=5.7.0
bootstrap4>=0.1.0
pyTelegramBotAPI>=3.7.3
Примечание о совместимости: Стек aioredis==1.3.1 и Twisted==22.4.0 совместим с Python 3.7. Обновление Python может потребовать обновления этих пакетов.
3
Архитектура и схема взаимодействия
[КЛИЕНТ]
│ (wss://domain.com/ws)
▼
[NGINX]
(SSL, прокси)
│
┌─────┴─────┐
│ │
(HTTP) (WebSocket)
│ │
▼ ▼
[Django Views] [DAPHNE]
│ │ (Маршрутизация в ASGI)
│ ▼
│ [Channels Consumers]
│ │
▼ │ (Отправка/публикация)
[База данных] │
│ ▼
│ [REDIS]
│ (Channel Layer)
│ │
│ │ (Синхронизация)
▼ ▼
[Ответ] ← [Другие процессы/серверы]
Описание потока:
1. Клиент устанавливает защищенное (WSS) соединение.
2. Nginx терминалирует SSL и проксирует трафик на Daphne.
3. Daphne направляет HTTP-запросы в Django Views, а WebSocket — в Channels Consumers.
4. Для связи между Consumers используется Redis Channel Layer.
4
Конфигурация сервисов
4.1
Daphne.service
Системный сервис: daphne.service
Файл: /etc/systemd/system/daphne.service
ini
[Unit]
Description=Daphne ASGI Server for PROJECT_NAME
After=network.target redis.service
Requires=redis.service
[Service]
Type=simple
User=APP_USER
Group=APP_GROUP
WorkingDirectory=/path/to/PROJECT_ROOT
Environment="PYTHONPATH=/path/to/PROJECT_ROOT"
# Вариант A: SSL-терминация в Daphne (используется, если Nginx проксирует TCP)
ExecStart=/path/to/venv/bin/daphne -e ssl:SSL_PORT:privateKey=/path/to/ssl/privkey.pem:certKey=/path/to/ssl/cert.pem ASGI_APPLICATION --port ASGI_PORT --bind 127.0.0.1
# Вариант B: Стандартная конфигурация (SSL в Nginx)
# ExecStart=/path/to/venv/bin/daphne -b 127.0.0.1 -p ASGI_PORT ASGI_APPLICATION
Restart=always
RestartSec=10s
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Переменные для подстановки:
- PROJECT_NAME — название проекта (например, chat-2.0)
- PROJECT_ROOT — абсолютный путь к корню проекта (например, /var/www/chat-2.0)
- APP_USER/APP_GROUP — пользователь и группа для запуска (например, djangoapp)
- ASGI_APPLICATION — путь к ASGI-приложению (например, ch_test1.asgi:application)
- ASGI_PORT — порт для внутреннего HTTP (например, 8000)
- SSL_PORT — порт для SSL в Daphne (например, 8443)
- /path/to/venv/bin/daphne — путь к исполняемому файлу Daphne в виртуальном окружении
- /path/to/ssl/ — путь к SSL-сертификатам
4.2
Nginx
Конфигурация Nginx
Файл: /etc/nginx/sites-available/project_namenginx
upstream django_asgi {
server 127.0.0.1:ASGI_PORT;
}
server {
listen 443 ssl http2;
server_name DOMAIN_NAME www.DOMAIN_NAME;
ssl_certificate /etc/letsencrypt/live/DOMAIN_NAME/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/DOMAIN_NAME/privkey.pem;
location / {
proxy_pass http://django_asgi;
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;
}
location /ws/ {
proxy_pass http://django_asgi;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location /static/ {
alias /path/to/PROJECT_ROOT/static/;
expires 30d;
}
}
server {
listen 80;
server_name DOMAIN_NAME www.DOMAIN_NAME;
return 301 https://$server_name$request_uri;
}
4.3
Redis
Конфигурация Redis
Файл: /etc/redis/redis.confbash
bind 127.0.0.1 ::1
protected-mode yes
maxmemory 256mb
maxmemory-policy allkeys-lru
5
Процедура развертывания
5.1
Базовые настройки
Подготовка сервера: базовые настройки
bash
# 1. Базовые обновления и утилиты
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential curl git ufw
# 2. Установка Python 3.7 и инструментов
sudo apt install -y python3.7 python3.7-venv python3.7-dev
# 3. Установка системных сервисов
sudo apt install -y redis-server nginx postgresql libpq-dev
# 4. Настройка брандмауэра
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw --force enable
5.2
Django
Развертывание приложения
bash
# 1. Создание системного пользователя
sudo adduser --system --group --no-create-home djangoapp
# 2. Клонирование/копирование кода
sudo mkdir -p /var/www/PROJECT_NAME
sudo chown -R djangoapp:djangoapp /var/www/PROJECT_NAME
# 3. Настройка виртуального окружения
sudo -u djangoapp python3.7 -m venv /var/www/PROJECT_NAME/venv
sudo -u djangoapp /var/www/PROJECT_NAME/venv/bin/pip install -r /var/www/PROJECT_NAME/requirements.txt
# 4. Настройка базы данных и переменных окружения
# ... (инструкции по настройке .env, миграциям)
# 5. Применение конфигураций
sudo systemctl daemon-reload
sudo systemctl restart redis nginx
sudo systemctl enable --now daphne.service
5.3
Мониторинг и отладка
Статус сервисов
bash
sudo systemctl status redis.service nginx daphne.service
Просмотр логов
bash
# Логи Daphne
sudo journalctl -u daphne.service -f -n 50
# Логи Nginx
sudo tail -f /var/log/nginx/error.log
# Логи Redis
sudo journalctl -u redis-server -f
Проверка соединений
bash
# Проверка открытых портов Daphne
sudo ss -tlnp | grep ':ASGI_PORT'
# Проверка подключений к Redis
redis-cli info clients | grep connected_clients
6
Резервное копирование
Критические данные для резервного копирования:
- База данных PostgreSQL (если используется)
- Медиафайлы (/path/to/PROJECT_ROOT/media/)
- Файлы конфигурации ◦ /etc/systemd/system/daphne.service ◦ /etc/nginx/sites-available/project_name ◦ /etc/redis/redis.conf ◦ Файл переменных окружения проекта (.env)
7
Обновления
Матрица обновлений
| Компонент | Процедура обновления | Оценка риска |
|---|---|---|
| Зависимости Python | pip install -U -r requirements.txt + перезапуск Daphne | Средний |
| Код приложения | Deploy новой версии + systemctl restart daphne | Низкий |
| Nginx/Redis | apt update && apt upgrade + перезапуск сервиса | Низкий |
| Python 3.7 → 3.8+ | Создание нового виртуального окружения, тестирование совместимости | Высокий |
