Add local-first SPA architecture and containerized production deploy.
Move data access to use-cases and IndexedDB repositories with optional remote fallback, changelog/sync ports, and encrypted local backup. Add production Docker Compose (nginx frontend + optional backend) and Apache host proxy configuration for deployment. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,12 @@
|
||||
# Режим данных при сборке фронта: local | remote | hybrid
|
||||
VITE_DATA_MODE=local
|
||||
|
||||
# Порты на хосте (для прокси-сервера)
|
||||
FRONTEND_BIND=127.0.0.1
|
||||
FRONTEND_PORT=8080
|
||||
BACKEND_BIND=127.0.0.1
|
||||
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
|
||||
@@ -0,0 +1,91 @@
|
||||
# Production deploy (контейнеры + прокси на хосте)
|
||||
|
||||
Схема:
|
||||
|
||||
```text
|
||||
[Прокси на хосте :80/:443]
|
||||
→ frontend-контейнер (nginx :8080 на хосте)
|
||||
→ backend-контейнер (gunicorn :8000, только при remote)
|
||||
```
|
||||
|
||||
SPA-маршрутизация (`try_files` → `index.html`) выполняется **внутри** frontend-контейнера.
|
||||
|
||||
## 1. Подготовка
|
||||
|
||||
```bash
|
||||
cd /opt/social-graph
|
||||
cp deploy/.env.prod.example deploy/.env.prod
|
||||
# отредактируйте deploy/.env.prod при необходимости
|
||||
```
|
||||
|
||||
## 2. Local-first (только frontend)
|
||||
|
||||
Рекомендуется для конфиденциальности — данные в браузере (IndexedDB).
|
||||
|
||||
```bash
|
||||
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build frontend
|
||||
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d 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 и порты (8080 / 8000) — по вашему .env.prod
|
||||
sudo a2ensite social-graph.conf
|
||||
sudo apache2ctl configtest
|
||||
sudo systemctl reload apache2
|
||||
```
|
||||
|
||||
### 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
|
||||
```
|
||||
|
||||
Пересоберите 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 frontend
|
||||
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod --profile with-backend up -d backend
|
||||
```
|
||||
|
||||
В `deploy/apache/social-graph.conf` раскомментируйте блок `ProxyPass /api ...` **перед** `ProxyPass /`.
|
||||
|
||||
## 5. Обновление
|
||||
|
||||
```bash
|
||||
git pull
|
||||
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod build frontend
|
||||
docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d frontend
|
||||
# при remote — также build/up backend
|
||||
sudo systemctl reload apache2 # или nginx -s reload
|
||||
```
|
||||
|
||||
## Порты по умолчанию
|
||||
|
||||
| Сервис | Хост (loopback) | Внутри контейнера |
|
||||
|----------|-----------------|-------------------|
|
||||
| frontend | 127.0.0.1:8080 | nginx :80 |
|
||||
| backend | 127.0.0.1:8000 | gunicorn :8000 |
|
||||
|
||||
Наружу открыт только прокси на хосте (80/443).
|
||||
@@ -0,0 +1,31 @@
|
||||
# Прокси на хосте → контейнеры Docker.
|
||||
# Скопировать:
|
||||
# sudo cp deploy/apache/social-graph.conf /etc/apache2/sites-available/social-graph.conf
|
||||
#
|
||||
# Перед включением поднимите контейнеры:
|
||||
# docker compose -f docker-compose.prod.yml --env-file deploy/.env.prod up -d frontend
|
||||
# # при remote: ... --profile with-backend up -d
|
||||
#
|
||||
# sudo a2enmod proxy proxy_http headers rewrite
|
||||
# sudo a2ensite social-graph.conf
|
||||
# sudo apache2ctl configtest && sudo systemctl reload apache2
|
||||
|
||||
<VirtualHost *:80>
|
||||
ServerName your-domain.com
|
||||
ServerAlias www.your-domain.com
|
||||
|
||||
ProxyPreserveHost On
|
||||
RequestHeader set X-Forwarded-Proto "http"
|
||||
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
|
||||
|
||||
# Backend API (раскомментируйте при VITE_DATA_MODE=remote и profile with-backend)
|
||||
# ProxyPass /api http://127.0.0.1:8000/api
|
||||
# ProxyPassReverse /api http://127.0.0.1:8000/api
|
||||
|
||||
# Frontend SPA (nginx в контейнере sg_frontend)
|
||||
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>
|
||||
@@ -0,0 +1,24 @@
|
||||
# Пример для nginx на хосте (не в контейнере).
|
||||
# Порты должны совпадать с deploy/.env.prod (FRONTEND_PORT, BACKEND_PORT).
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com;
|
||||
|
||||
# Раскомментируйте при VITE_DATA_MODE=remote
|
||||
# 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user