# Production deploy (контейнеры + прокси на хосте) ## Схема ```text [Прокси на хосте :80/:443] → frontend-контейнер (nginx, 127.0.0.1:8080) → backend-контейнер (gunicorn, 127.0.0.1:8000 — только при remote) ``` SPA-маршрутизация (`try_files` → `index.html`) — **внутри** frontend-контейнера (`frontend/nginx.conf`). ## 1. Клонирование и подготовка ```bash git clone /opt/social-graph cd /opt/social-graph git checkout main # или нужная ветка cp deploy/.env.prod.example deploy/.env.prod # отредактируйте deploy/.env.prod ``` `deploy/.env.prod` в git не коммитится (секреты и локальные порты). ## 2. Local-first (рекомендуется) Данные пользователя — в браузере (IndexedDB). Backend на сервере **не поднимать**. В `deploy/.env.prod`: ```env VITE_DATA_MODE=local ``` ```bash docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend ``` Проверка: ```bash curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/ # ожидается 200 ``` ## 3. Прокси на хосте ### Apache2 ```bash sudo a2enmod proxy proxy_http headers sudo cp deploy/apache/social-graph.conf /etc/apache2/sites-available/social-graph.conf ``` Отредактируйте `ServerName` и при необходимости порты (`FRONTEND_PORT` / `BACKEND_PORT` из `.env.prod`). ```bash sudo a2ensite social-graph.conf sudo apache2ctl configtest sudo systemctl reload apache2 ``` HTTPS: ```bash sudo certbot --apache -d your-domain.com ``` ### nginx на хосте См. `deploy/proxy/nginx-host.conf.example`. ## 4. Remote mode (frontend + backend) Общая БД на сервере. В `deploy/.env.prod`: ```env VITE_DATA_MODE=remote DJANGO_SECRET_KEY=длинный-случайный-ключ ALLOWED_HOSTS=your-domain.com,www.your-domain.com ``` Пересоберите frontend (режим зашивается при build) и поднимите оба сервиса: ```bash 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 ``` В `deploy/apache/social-graph.conf` раскомментируйте `ProxyPass /api ...` **выше** блока `ProxyPass /`. ```bash sudo a2enmod proxy proxy_http headers sudo systemctl reload apache2 ``` ## 5. Обновление ```bash 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 ``` ## Порты по умолчанию | Переменная | Значение | Назначение | |------------|----------|------------| | `FRONTEND_PORT` | 8080 | nginx в контейнере `sg_frontend` | | `BACKEND_PORT` | 8000 | gunicorn в контейнере `sg_backend` | | `FRONTEND_BIND` | 127.0.0.1 | только loopback на хосте | Наружу открыт только прокси (80/443). ## Миграция данных | Источник | Действие | |----------|----------| | CSV / JSON / **vCard (.vcf)** | UI → Импорт | | Старый Django SQLite | экспорт JSON → Импорт | | Локальный бэкап `.json` / `.sgpkg` | UI → «Импорт бэкапа» | ## Устранение неполадок ```bash docker compose -f docker-compose.prod.yml ps docker logs sg_frontend --tail 50 docker logs sg_backend --tail 50 # если поднят ``` Конфликт имени контейнера с dev: остановите `docker compose down` в том же каталоге перед prod-запуском.