Cleanup: remove tracked pycache and db.sqlite3; add map membership backfill, new components, backups, docs
This commit is contained in:
@@ -9,4 +9,5 @@ BACKEND_PORT=8000
|
||||
|
||||
# Только при profile with-backend (VITE_DATA_MODE=remote)
|
||||
DJANGO_SECRET_KEY=replace-with-long-random-string
|
||||
ALLOWED_HOSTS=your-domain.com,www.your-domain.com
|
||||
ALLOWED_HOSTS=social.deepfishing.ru
|
||||
USE_JWT_AUTH=true
|
||||
|
||||
+295
-85
@@ -1,87 +1,130 @@
|
||||
# Production deploy (контейнеры + прокси на хосте)
|
||||
# Развёртывание Social Graph на сервере
|
||||
|
||||
Инструкция для Linux-сервера (Ubuntu/Debian). Приложение публикуется через Docker; снаружи доступен только веб-прокси (80/443).
|
||||
|
||||
> **Production:** [deploy/social.deepfishing.ru.md](./social.deepfishing.ru.md) — инструкция для https://social.deepfishing.ru
|
||||
|
||||
## Схема
|
||||
|
||||
```text
|
||||
[Прокси на хосте :80/:443]
|
||||
→ frontend-контейнер (nginx, 127.0.0.1:8080)
|
||||
→ backend-контейнер (gunicorn, 127.0.0.1:8000 — только при remote)
|
||||
Интернет :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 │
|
||||
└───────────────────────────────────────┘
|
||||
```
|
||||
|
||||
SPA-маршрутизация (`try_files` → `index.html`) — **внутри** frontend-контейнера (`frontend/nginx.conf`).
|
||||
| Режим | Где данные | Backend на сервере |
|
||||
|-------|------------|--------------------|
|
||||
| **local** (по умолчанию) | IndexedDB в браузере каждого пользователя | не нужен |
|
||||
| **remote** | SQLite на сервере, общая БД | обязателен |
|
||||
|
||||
## 1. Клонирование и подготовка
|
||||
Режим задаётся при **сборке** фронтенда (`VITE_DATA_MODE`).
|
||||
|
||||
---
|
||||
|
||||
## 1. Требования к серверу
|
||||
|
||||
- Linux (Ubuntu 22.04+ / Debian 12+)
|
||||
- Docker Engine + Docker Compose plugin
|
||||
- Git
|
||||
- Домен, указывающий на IP сервера (для HTTPS)
|
||||
- Apache2 **или** nginx на хосте (reverse proxy)
|
||||
|
||||
Установка Docker (если ещё нет):
|
||||
|
||||
```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
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
sudo usermod -aG docker "$USER"
|
||||
# перелогиньтесь, чтобы группа docker применилась
|
||||
docker compose version
|
||||
```
|
||||
|
||||
`deploy/.env.prod` в git не коммитится (секреты и локальные порты).
|
||||
---
|
||||
|
||||
## 2. Local-first (рекомендуется)
|
||||
## 2. Клонирование проекта
|
||||
|
||||
Данные пользователя — в браузере (IndexedDB). Backend на сервере **не поднимать**.
|
||||
```bash
|
||||
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 # или нужная ветка
|
||||
```
|
||||
|
||||
В `deploy/.env.prod`:
|
||||
---
|
||||
|
||||
## 3. Конфигурация окружения
|
||||
|
||||
```bash
|
||||
cp deploy/.env.prod.example deploy/.env.prod
|
||||
nano deploy/.env.prod
|
||||
```
|
||||
|
||||
### Вариант A — local-first (данные только в браузере)
|
||||
|
||||
Подходит, если сервер — просто «хостинг интерфейса», без общей базы.
|
||||
|
||||
```env
|
||||
VITE_DATA_MODE=local
|
||||
|
||||
FRONTEND_BIND=127.0.0.1
|
||||
FRONTEND_PORT=8080
|
||||
```
|
||||
|
||||
Backend **не поднимается**. Каждый пользователь хранит данные локально; при смене браузера или устройства данные не переносятся автоматически (экспорт/импорт — через UI → Импорт).
|
||||
|
||||
### Вариант B — remote (данные на сервере, вход по логину)
|
||||
|
||||
Подходит для команды или одного аккаунта с доступом с разных устройств.
|
||||
|
||||
```env
|
||||
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
|
||||
```
|
||||
|
||||
Сгенерировать секретный ключ:
|
||||
|
||||
```bash
|
||||
python3 -c "import secrets; print(secrets.token_urlsafe(50))"
|
||||
```
|
||||
|
||||
Файл `deploy/.env.prod` **не коммитить** — в нём секреты.
|
||||
|
||||
---
|
||||
|
||||
## 4. Сборка и запуск контейнеров
|
||||
|
||||
Перейдите в каталог проекта:
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
```
|
||||
|
||||
### Только frontend (режим 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) и поднимите оба сервиса:
|
||||
### Frontend + backend (режим remote)
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build
|
||||
@@ -89,48 +132,215 @@ docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --bu
|
||||
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
|
||||
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`).
|
||||
|
||||
Логи:
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```apache
|
||||
ProxyPass /api http://127.0.0.1:8000/api
|
||||
ProxyPassReverse /api http://127.0.0.1:8000/api
|
||||
```
|
||||
|
||||
Включите сайт:
|
||||
|
||||
```bash
|
||||
sudo a2ensite social-graph.conf
|
||||
sudo a2dissite 000-default.conf # опционально
|
||||
sudo apache2ctl configtest
|
||||
sudo systemctl reload apache2
|
||||
```
|
||||
|
||||
## 5. Обновление
|
||||
HTTPS:
|
||||
|
||||
```bash
|
||||
sudo apt install certbot python3-certbot-apache
|
||||
sudo certbot --apache -d your-domain.com -d www.your-domain.com
|
||||
```
|
||||
|
||||
### nginx на хосте
|
||||
|
||||
```bash
|
||||
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/`.
|
||||
|
||||
```bash
|
||||
sudo ln -s /etc/nginx/sites-available/social-graph /etc/nginx/sites-enabled/
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
```
|
||||
|
||||
HTTPS:
|
||||
|
||||
```bash
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
sudo certbot --nginx -d your-domain.com -d www.your-domain.com
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Первый вход (режим remote)
|
||||
|
||||
1. Откройте `https://your-domain.com`
|
||||
2. Перейдите на **Регистрация** (`/register`) и создайте аккаунт
|
||||
3. Либо войдите под существующим пользователем
|
||||
|
||||
Если на сервере уже есть данные от пользователя `legacy` (миграция), задайте ему пароль:
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py shell
|
||||
```
|
||||
|
||||
```python
|
||||
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. Обновление версии
|
||||
|
||||
```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
|
||||
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`).
|
||||
|
||||
| Переменная | Значение | Назначение |
|
||||
|------------|----------|------------|
|
||||
| `FRONTEND_PORT` | 8080 | nginx в контейнере `sg_frontend` |
|
||||
| `BACKEND_PORT` | 8000 | gunicorn в контейнере `sg_backend` |
|
||||
| `FRONTEND_BIND` | 127.0.0.1 | только loopback на хосте |
|
||||
---
|
||||
|
||||
Наружу открыт только прокси (80/443).
|
||||
## 8. Резервное копирование (remote)
|
||||
|
||||
## Миграция данных
|
||||
|
||||
| Источник | Действие |
|
||||
|----------|----------|
|
||||
| CSV / JSON / **vCard (.vcf)** | UI → Импорт |
|
||||
| Старый Django SQLite | экспорт JSON → Импорт |
|
||||
| Локальный бэкап `.json` / `.sgpkg` | UI → «Импорт бэкапа» |
|
||||
|
||||
## Устранение неполадок
|
||||
База — SQLite в Docker volume `sqlite_data`.
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml ps
|
||||
docker logs sg_frontend --tail 50
|
||||
docker logs sg_backend --tail 50 # если поднят
|
||||
docker compose -f docker-compose.prod.yml --profile with-backend exec backend \
|
||||
python manage.py dumpdata contacts --indent 2 > backup-contacts-$(date +%F).json
|
||||
```
|
||||
|
||||
Конфликт имени контейнера с dev: остановите `docker compose down` в том же каталоге перед prod-запуском.
|
||||
Полный дамп через UI: **Импорт** → экспорт бэкапа (если включён в интерфейсе).
|
||||
|
||||
Копия файла БД (осторожно — только при остановленном backend):
|
||||
|
||||
```bash
|
||||
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 |
|
||||
|
||||
Рекомендуется:
|
||||
|
||||
```bash
|
||||
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` |
|
||||
|
||||
Полезные команды:
|
||||
|
||||
```bash
|
||||
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):**
|
||||
|
||||
```bash
|
||||
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 (серверная БД + авторизация):**
|
||||
|
||||
```bash
|
||||
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](../README.md), разработка — `docker compose up --build` (порты 5173 и 8000).
|
||||
|
||||
@@ -0,0 +1,359 @@
|
||||
# Развёртывание Social Graph на [social.deepfishing.ru](https://social.deepfishing.ru)
|
||||
|
||||
Инструкция для production-сервера **social.deepfishing.ru**. Приложение публикуется через Docker; снаружи доступен только веб-прокси (80/443).
|
||||
|
||||
**Адрес приложения:** https://social.deepfishing.ru
|
||||
|
||||
---
|
||||
|
||||
## Схема
|
||||
|
||||
```text
|
||||
https://social.deepfishing.ru (: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 на сервере | обязателен |
|
||||
|
||||
Для **social.deepfishing.ru** рекомендуется **remote** + `USE_JWT_AUTH=true` (регистрация, вход, общая база).
|
||||
|
||||
---
|
||||
|
||||
## 1. Требования
|
||||
|
||||
- Linux (Ubuntu 22.04+ / Debian 12+)
|
||||
- Docker Engine + Docker Compose
|
||||
- Git
|
||||
- DNS: запись **A** (или **AAAA**) `social.deepfishing.ru` → IP сервера
|
||||
- Apache2 **или** nginx на хосте
|
||||
|
||||
Установка Docker:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
sudo usermod -aG docker "$USER"
|
||||
# перелогиньтесь
|
||||
docker compose version
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Клонирование
|
||||
|
||||
```bash
|
||||
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. Конфигурация `deploy/.env.prod`
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
cp deploy/.env.prod.example deploy/.env.prod
|
||||
nano deploy/.env.prod
|
||||
```
|
||||
|
||||
### Рекомендуемый конфиг для social.deepfishing.ru (remote)
|
||||
|
||||
```env
|
||||
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=social.deepfishing.ru
|
||||
USE_JWT_AUTH=true
|
||||
```
|
||||
|
||||
Сгенерировать `DJANGO_SECRET_KEY`:
|
||||
|
||||
```bash
|
||||
python3 -c "import secrets; print(secrets.token_urlsafe(50))"
|
||||
```
|
||||
|
||||
### Альтернатива — только UI (local)
|
||||
|
||||
Если backend не нужен, данные останутся в браузере каждого пользователя:
|
||||
|
||||
```env
|
||||
VITE_DATA_MODE=local
|
||||
FRONTEND_BIND=127.0.0.1
|
||||
FRONTEND_PORT=8080
|
||||
```
|
||||
|
||||
Файл `deploy/.env.prod` **не коммитить**.
|
||||
|
||||
---
|
||||
|
||||
## 4. Запуск контейнеров
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
```
|
||||
|
||||
### Remote (frontend + backend)
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
### Только frontend (local)
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d --build frontend
|
||||
```
|
||||
|
||||
### Проверка на сервере
|
||||
|
||||
```bash
|
||||
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/
|
||||
curl -s -o /dev/null -w "public: %{http_code}\n" https://social.deepfishing.ru/
|
||||
```
|
||||
|
||||
Логи:
|
||||
|
||||
```bash
|
||||
docker logs sg_frontend --tail 50
|
||||
docker logs sg_backend --tail 50
|
||||
```
|
||||
|
||||
> Перед prod-запуском остановите dev-контейнеры: `docker compose down`
|
||||
|
||||
---
|
||||
|
||||
## 5. Прокси на хосте
|
||||
|
||||
Контейнеры слушают **только** `127.0.0.1`. Снаружи — прокси на 80/443.
|
||||
|
||||
### Apache2
|
||||
|
||||
```bash
|
||||
sudo apt install apache2
|
||||
sudo a2enmod proxy proxy_http headers rewrite ssl
|
||||
sudo cp deploy/apache/social-graph.conf /etc/apache2/sites-available/social-graph.conf
|
||||
sudo nano /etc/apache2/sites-available/social-graph.conf
|
||||
```
|
||||
|
||||
Пример VirtualHost:
|
||||
|
||||
```apache
|
||||
<VirtualHost *:80>
|
||||
ServerName social.deepfishing.ru
|
||||
|
||||
ProxyPreserveHost On
|
||||
RequestHeader set X-Forwarded-Proto "https"
|
||||
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
|
||||
|
||||
# API (режим remote)
|
||||
ProxyPass /api http://127.0.0.1:8000/api
|
||||
ProxyPassReverse /api http://127.0.0.1:8000/api
|
||||
|
||||
# Frontend SPA
|
||||
ProxyPass / http://127.0.0.1:8080/
|
||||
ProxyPassReverse / http://127.0.0.1:8080/
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/social-graph-error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/social-graph-access.log combined
|
||||
</VirtualHost>
|
||||
```
|
||||
|
||||
```bash
|
||||
sudo a2ensite social-graph.conf
|
||||
sudo a2dissite 000-default.conf
|
||||
sudo apache2ctl configtest
|
||||
sudo systemctl reload apache2
|
||||
```
|
||||
|
||||
HTTPS (Let's Encrypt):
|
||||
|
||||
```bash
|
||||
sudo apt install certbot python3-certbot-apache
|
||||
sudo certbot --apache -d social.deepfishing.ru
|
||||
```
|
||||
|
||||
После certbot сайт будет доступен по https://social.deepfishing.ru .
|
||||
|
||||
### nginx на хосте
|
||||
|
||||
```bash
|
||||
sudo apt install nginx
|
||||
sudo nano /etc/nginx/sites-available/social-graph
|
||||
```
|
||||
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name social.deepfishing.ru;
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://127.0.0.1:8000/api/;
|
||||
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 / {
|
||||
proxy_pass http://127.0.0.1:8080;
|
||||
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;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```bash
|
||||
sudo ln -s /etc/nginx/sites-available/social-graph /etc/nginx/sites-enabled/
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
sudo certbot --nginx -d social.deepfishing.ru
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. Первый вход
|
||||
|
||||
1. Откройте https://social.deepfishing.ru
|
||||
2. **Регистрация:** https://social.deepfishing.ru/register
|
||||
3. Или **вход:** https://social.deepfishing.ru/login
|
||||
|
||||
Если на сервере есть пользователь `legacy` (данные после миграции), задайте пароль:
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
docker compose -f docker-compose.prod.yml --profile with-backend exec backend python manage.py shell
|
||||
```
|
||||
|
||||
```python
|
||||
from django.contrib.auth import get_user_model
|
||||
User = get_user_model()
|
||||
u = User.objects.get(username='legacy')
|
||||
u.set_password('ваш-надёжный-пароль')
|
||||
u.save()
|
||||
exit()
|
||||
```
|
||||
|
||||
Вход: https://social.deepfishing.ru/login → логин `legacy`.
|
||||
|
||||
---
|
||||
|
||||
## 7. Обновление
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
git pull
|
||||
|
||||
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
|
||||
|
||||
sudo systemctl reload apache2 # или: sudo nginx -s reload
|
||||
```
|
||||
|
||||
Проверка: https://social.deepfishing.ru
|
||||
|
||||
---
|
||||
|
||||
## 8. Резервное копирование
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
docker compose -f docker-compose.prod.yml --profile with-backend exec backend \
|
||||
python manage.py dumpdata contacts --indent 2 \
|
||||
> backup-social-deepfishing-$(date +%F).json
|
||||
```
|
||||
|
||||
Копия SQLite (backend должен быть остановлен):
|
||||
|
||||
```bash
|
||||
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-social-deepfishing-$(date +%F).sqlite3
|
||||
docker compose -f docker-compose.prod.yml --profile with-backend start backend
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. Безопасность
|
||||
|
||||
```bash
|
||||
sudo ufw allow OpenSSH
|
||||
sudo ufw allow 'Apache Full' # или 'Nginx Full'
|
||||
sudo ufw enable
|
||||
```
|
||||
|
||||
| Порт | Доступ |
|
||||
|------|--------|
|
||||
| 443, 80 | открыт (прокси) |
|
||||
| 8080, 8000 | только 127.0.0.1 |
|
||||
|
||||
---
|
||||
|
||||
## 10. Устранение неполадок
|
||||
|
||||
| Симптом | Решение |
|
||||
|---------|---------|
|
||||
| 502 на https://social.deepfishing.ru | `docker ps`, логи `sg_frontend` / `sg_backend` |
|
||||
| Страница открывается, API 404 | В прокси включён `ProxyPass /api` → `:8000` |
|
||||
| 401 / не пускает | `USE_JWT_AUTH=true` в `.env.prod`, пересобрать backend |
|
||||
| Данные не сохраняются между устройствами | `VITE_DATA_MODE=remote`, пересобрать frontend |
|
||||
| Белый экран | `docker logs sg_frontend`, пересборка с `--build` |
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
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. Шпаргалка (social.deepfishing.ru, remote)
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
cp deploy/.env.prod.example deploy/.env.prod
|
||||
# ALLOWED_HOSTS=social.deepfishing.ru
|
||||
# VITE_DATA_MODE=remote
|
||||
# USE_JWT_AUTH=true
|
||||
# DJANGO_SECRET_KEY=...
|
||||
|
||||
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
|
||||
|
||||
# Apache: ServerName social.deepfishing.ru
|
||||
# ProxyPass /api → 127.0.0.1:8000
|
||||
# ProxyPass / → 127.0.0.1:8080
|
||||
# certbot --apache -d social.deepfishing.ru
|
||||
```
|
||||
|
||||
**Проверка:** https://social.deepfishing.ru
|
||||
Reference in New Issue
Block a user