Support vCard import and multi-format export, bulk delete with reliable local persistence, Ctrl+link relation creation, cluster-colored graph visualization, and right-click context menus for node details. Co-authored-by: Cursor <cursoragent@cursor.com>
137 lines
4.1 KiB
Markdown
137 lines
4.1 KiB
Markdown
# 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 <repo-url> /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-запуском.
|