Развёртывание Social Graph на сервере
Инструкция для Linux-сервера (Ubuntu/Debian). Приложение публикуется через Docker; снаружи доступен только веб-прокси (80/443).
Production: deploy/social.deepfishing.ru.md — инструкция для https://social.deepfishing.ru
Схема
Интернет :80 / :443
↓
Прокси на хосте (Apache или nginx)
↓
┌───────────────────────────────────────┐
│ frontend-контейнер (nginx) │
│ 127.0.0.1:8080 → SPA + статика │
└───────────────────────────────────────┘
↓ (только в режиме remote)
┌───────────────────────────────────────┐
│ backend-контейнер (gunicorn) │
│ 127.0.0.1:8000 → Django API │
│ SQLite в Docker volume │
└───────────────────────────────────────┘
| Режим | Где данные | Backend на сервере |
|---|---|---|
| local (по умолчанию) | IndexedDB в браузере каждого пользователя | не нужен |
| remote | SQLite на сервере, общая БД | обязателен |
Режим задаётся при сборке фронтенда (VITE_DATA_MODE).
1. Требования к серверу
- Linux (Ubuntu 22.04+ / Debian 12+)
- Docker Engine + Docker Compose plugin
- Git
- Домен, указывающий на IP сервера (для HTTPS)
- Apache2 или nginx на хосте (reverse proxy)
Установка Docker (если ещё нет):
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker "$USER"
# перелогиньтесь, чтобы группа docker применилась
docker compose version
2. Клонирование проекта
sudo mkdir -p /opt/social-graph
sudo chown "$USER:$USER" /opt/social-graph
git clone <URL-репозитория> /opt/social-graph
cd /opt/social-graph
git checkout main # или нужная ветка
3. Конфигурация окружения
cp deploy/.env.prod.example deploy/.env.prod
nano deploy/.env.prod
Вариант A — local-first (данные только в браузере)
Подходит, если сервер — просто «хостинг интерфейса», без общей базы.
VITE_DATA_MODE=local
FRONTEND_BIND=127.0.0.1
FRONTEND_PORT=8080
Backend не поднимается. Каждый пользователь хранит данные локально; при смене браузера или устройства данные не переносятся автоматически (экспорт/импорт — через UI → Импорт).
Вариант B — remote (данные на сервере, вход по логину)
Подходит для команды или одного аккаунта с доступом с разных устройств.
VITE_DATA_MODE=remote
FRONTEND_BIND=127.0.0.1
FRONTEND_PORT=8080
BACKEND_BIND=127.0.0.1
BACKEND_PORT=8000
DJANGO_SECRET_KEY=сгенерируйте-длинную-случайную-строку
ALLOWED_HOSTS=your-domain.com,www.your-domain.com
USE_JWT_AUTH=true
Сгенерировать секретный ключ:
python3 -c "import secrets; print(secrets.token_urlsafe(50))"
Файл deploy/.env.prod не коммитить — в нём секреты.
4. Сборка и запуск контейнеров
Перейдите в каталог проекта:
cd /opt/social-graph
Только frontend (режим local)
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend
Frontend + backend (режим remote)
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend
Проверка:
docker compose -f docker-compose.prod.yml ps
curl -s -o /dev/null -w "frontend: %{http_code}\n" http://127.0.0.1:8080/
curl -s -o /dev/null -w "backend: %{http_code}\n" http://127.0.0.1:8000/api/v1/meta/choices/
Ожидается 200 (backend в режиме remote с JWT может вернуть 401 без токена — это нормально, главное не 502).
Логи:
docker logs sg_frontend --tail 50
docker logs sg_backend --tail 50
Конфликт с dev: если в том же каталоге запускали
docker compose up, сначала выполнитеdocker compose down.
5. Прокси на хосте
Контейнеры слушают только 127.0.0.1. Наружу открывается прокси.
Apache2
sudo apt install apache2
sudo a2enmod proxy proxy_http headers rewrite
sudo cp deploy/apache/social-graph.conf /etc/apache2/sites-available/social-graph.conf
sudo nano /etc/apache2/sites-available/social-graph.conf
Измените ServerName / ServerAlias на ваш домен.
При VITE_DATA_MODE=remote раскомментируйте блок API выше блока frontend:
ProxyPass /api http://127.0.0.1:8000/api
ProxyPassReverse /api http://127.0.0.1:8000/api
Включите сайт:
sudo a2ensite social-graph.conf
sudo a2dissite 000-default.conf # опционально
sudo apache2ctl configtest
sudo systemctl reload apache2
HTTPS:
sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d your-domain.com -d www.your-domain.com
nginx на хосте
sudo apt install nginx
sudo cp deploy/proxy/nginx-host.conf.example /etc/nginx/sites-available/social-graph
sudo nano /etc/nginx/sites-available/social-graph
Укажите server_name и при remote-режиме раскомментируйте location /api/.
sudo ln -s /etc/nginx/sites-available/social-graph /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
HTTPS:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
6. Первый вход (режим remote)
- Откройте
https://your-domain.com - Перейдите на Регистрация (
/register) и создайте аккаунт - Либо войдите под существующим пользователем
Если на сервере уже есть данные от пользователя legacy (миграция), задайте ему пароль:
docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py shell
from django.contrib.auth import get_user_model
User = get_user_model()
u = User.objects.get(username='legacy')
u.set_password('ваш-пароль')
u.save()
exit()
7. Обновление версии
cd /opt/social-graph
git pull
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend
# при remote:
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend
sudo systemctl reload apache2 # или: sudo nginx -s reload
При изменении VITE_DATA_MODE нужна пересборка frontend (--build).
8. Резервное копирование (remote)
База — SQLite в Docker volume sqlite_data.
docker compose -f docker-compose.prod.yml --profile with-backend exec backend \
python manage.py dumpdata contacts --indent 2 > backup-contacts-$(date +%F).json
Полный дамп через UI: Импорт → экспорт бэкапа (если включён в интерфейсе).
Копия файла БД (осторожно — только при остановленном backend):
docker compose -f docker-compose.prod.yml --profile with-backend stop backend
docker run --rm -v social-graph_sqlite_data:/data -v "$PWD":/backup alpine \
cp /data/db.sqlite3 /backup/db.sqlite3-$(date +%F)
docker compose -f docker-compose.prod.yml --profile with-backend start backend
9. Порты и безопасность
| Переменная | По умолчанию | Назначение |
|---|---|---|
FRONTEND_PORT |
8080 | nginx в контейнере |
BACKEND_PORT |
8000 | gunicorn |
FRONTEND_BIND |
127.0.0.1 | только localhost |
Рекомендуется:
sudo ufw allow OpenSSH
sudo ufw allow 'Apache Full' # или 'Nginx Full'
sudo ufw enable
Порты 8080 и 8000 не открывать наружу — только через прокси.
10. Устранение неполадок
| Симптом | Что проверить |
|---|---|
| 502 Bad Gateway | Контейнеры запущены? docker ps, логи sg_frontend / sg_backend |
| Белая страница после деплоя | Пересобран frontend? VITE_DATA_MODE совпадает с ожиданиями |
| API не отвечает в remote | Раскомментирован ProxyPass /api в Apache/nginx; backend в profile with-backend |
| «Сессия истекла» / 401 | USE_JWT_AUTH=true на backend; перелогин |
| Данные не общие между ПК | Нужен VITE_DATA_MODE=remote, не local |
Полезные команды:
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod ps
docker logs sg_frontend --tail 100
docker logs sg_backend --tail 100
docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py migrate
11. Краткая шпаргалка
Local (только UI):
cd /opt/social-graph
cp deploy/.env.prod.example deploy/.env.prod # VITE_DATA_MODE=local
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend
# настроить Apache/nginx → 127.0.0.1:8080
Remote (серверная БД + авторизация):
cd /opt/social-graph
cp deploy/.env.prod.example deploy/.env.prod
# VITE_DATA_MODE=remote, DJANGO_SECRET_KEY, ALLOWED_HOSTS, USE_JWT_AUTH=true
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d --build backend
# прокси: / → :8080, /api → :8000
Дополнительно: README.md, разработка — docker compose up --build (порты 5173 и 8000).