- FastAPI backend: PostGIS estimator + 3 scrapers (Avito/Cian/Yandex)
- Next.js 15 frontend: tradein.html mockup design, basePath=/trade-in
- WeasyPrint PDF (Брусника-style 4-page report)
- Address autocomplete с typo-tolerance + 6 EKB presets
- Изолированный docker stack gendesign-tradein (отдельная postgres БД)
- Caddy inline routes: gendsgn.ru/trade-in/* и /trade-in/api/v1/*
- Forgejo Actions: .forgejo/workflows/deploy-tradein.yml (shell-based GHCR login)
- Триггер только по paths: tradein-mvp/** (не пересекается с deploy.yml)
- Образы: ghcr.io/lekss361/gendesign-tradein-{backend,frontend}:latest
Первый запуск на сервере (вручную, один раз):
- создать /opt/gendesign/tradein-mvp/.env.runtime (postgres pwd, contact email)
- docker network create gendesign_shared (если нет)
- docker compose -p gendesign-tradein up -d
- docker compose -p gendesign exec caddy caddy reload
147 lines
6 KiB
Markdown
147 lines
6 KiB
Markdown
# Trade-In MVP — деплой в gendesign репо
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
lekss361/-gendesign/
|
||
├── backend/ ← gendesign Python backend (НЕ ТРОГАЕМ)
|
||
├── frontend/ ← gendesign Next.js (НЕ ТРОГАЕМ)
|
||
├── docker-compose.prod.yml ← gendesign-стек
|
||
├── Caddyfile ← основной Caddy → ВКЛЮЧАЕТ tradein-mvp/deploy/Caddyfile.tradein-fragment
|
||
├── .github/workflows/
|
||
│ ├── deploy.yml ← существующий gendesign deploy
|
||
│ └── deploy-tradein.yml ← НАШ новый, триггерится только на tradein-mvp/**
|
||
└── tradein-mvp/ ← НАША подпапка (изолированный subproject)
|
||
├── backend/
|
||
├── frontend/
|
||
├── deploy/
|
||
│ ├── Caddyfile.tradein-fragment ← импортится в основной Caddyfile
|
||
│ └── cron-scrape.sh
|
||
├── docker-compose.yml ← локальный dev
|
||
├── docker-compose.prod.yml ← production overlay (использует GHCR images)
|
||
└── .github/workflows/deploy-tradein.yml
|
||
```
|
||
|
||
## Прод URL routes
|
||
|
||
| URL | Сервис |
|
||
|----------------------------------|-------------------------|
|
||
| `gendsgn.ru/trade-in/` | tradein-frontend:3000 |
|
||
| `gendsgn.ru/trade-in/api/v1/...` | tradein-backend:8000 |
|
||
|
||
Caddy в gendesign-стеке проксирует через `handle_path /trade-in/api/*` (вырезает префикс) и `handle /trade-in/*` (Next.js basePath).
|
||
|
||
## Прод docker stacks
|
||
|
||
- `docker compose -p gendesign` — основной gendesign (postgres + backend + frontend + caddy + couchdb)
|
||
- `docker compose -p gendesign-tradein` — наш (tradein-postgres + tradein-backend + tradein-frontend)
|
||
|
||
Оба подключены к `gendesign_shared` external network — туда смотрит Caddy.
|
||
|
||
## Что нужно положить в основной Caddyfile gendesign
|
||
|
||
В блок `gendsgn.ru { ... }` **ПЕРЕД** универсальным `handle { reverse_proxy frontend:3000 }`:
|
||
|
||
```caddyfile
|
||
import /opt/gendesign/tradein-mvp/deploy/Caddyfile.tradein-fragment
|
||
```
|
||
|
||
Или вставить содержимое фрагмента inline.
|
||
|
||
## Что нужно положить в `.env.runtime` (на сервере, НЕ в git)
|
||
|
||
```bash
|
||
# /opt/gendesign/tradein-mvp/.env.runtime
|
||
TRADEIN_POSTGRES_USER=tradein
|
||
TRADEIN_POSTGRES_PASSWORD=<сгенерировать openssl rand -hex 32>
|
||
TRADEIN_CONTACT_EMAIL=tradein@gendsgn.ru
|
||
YANDEX_GEOCODER_KEY= # пусто пока, Nominatim fallback работает
|
||
```
|
||
|
||
Файл создаётся вручную при первом деплое.
|
||
|
||
## GitHub Secrets (уже должны быть от gendesign deploy)
|
||
|
||
- `DEPLOY_HOST` — IP сервера (94.228.121.73)
|
||
- `DEPLOY_USER` — root
|
||
- `DEPLOY_SSH_KEY` — приватный SSH ключ
|
||
- `DEPLOY_PORT` — 22 (или другой если меняли)
|
||
|
||
## Первый деплой — пошагово
|
||
|
||
### 1. На анто́новой машине: подготовить tradein-mvp/ к слиянию
|
||
|
||
```bash
|
||
# clone gendesign репо (с PAT)
|
||
git clone https://<PAT>@github.com/lekss361/-gendesign.git
|
||
cd -gendesign
|
||
|
||
# скопировать tradein-mvp/ как подпапку
|
||
cp -r /Users/anton/Птица/tradein-mvp ./tradein-mvp
|
||
rm -rf ./tradein-mvp/postgres-data # на всякий
|
||
rm -rf ./tradein-mvp/.git # не нужен внутри monorepo
|
||
|
||
# скопировать workflow в правильное место
|
||
mkdir -p .github/workflows
|
||
cp ./tradein-mvp/.github/workflows/deploy-tradein.yml .github/workflows/
|
||
|
||
git add tradein-mvp/ .github/workflows/deploy-tradein.yml
|
||
git commit -m "feat: add tradein-mvp subproject + deploy workflow"
|
||
git push origin main
|
||
```
|
||
|
||
### 2. На сервере: первый раз вручную добавить Caddy include
|
||
|
||
```bash
|
||
ssh -i ~/.ssh/id_bot_server root@94.228.121.73
|
||
|
||
cd /opt/gendesign
|
||
# git reset --hard origin/main подтянет tradein-mvp/ автоматически
|
||
|
||
# Добавить в Caddyfile (ровно одну строку в блок gendsgn.ru { ... })
|
||
nano Caddyfile
|
||
# вставить ПЕРЕД последним handle { ... }:
|
||
# import /opt/gendesign/tradein-mvp/deploy/Caddyfile.tradein-fragment
|
||
|
||
# Создать .env.runtime
|
||
cat > tradein-mvp/.env.runtime <<EOF
|
||
TRADEIN_POSTGRES_USER=tradein
|
||
TRADEIN_POSTGRES_PASSWORD=$(openssl rand -hex 32)
|
||
TRADEIN_CONTACT_EMAIL=tradein@gendsgn.ru
|
||
YANDEX_GEOCODER_KEY=
|
||
EOF
|
||
chmod 600 tradein-mvp/.env.runtime
|
||
|
||
# Запустить stack первый раз вручную (после этого GitHub Actions сам)
|
||
docker network inspect gendesign_shared >/dev/null 2>&1 || docker network create gendesign_shared
|
||
cd tradein-mvp
|
||
set -a; source .env.runtime; set +a
|
||
docker compose -p gendesign-tradein -f docker-compose.prod.yml pull
|
||
docker compose -p gendesign-tradein -f docker-compose.prod.yml up -d
|
||
|
||
# Reload Caddy
|
||
cd /opt/gendesign
|
||
docker compose -p gendesign -f docker-compose.prod.yml exec -T caddy caddy reload --config /etc/caddy/Caddyfile
|
||
|
||
# Проверить
|
||
curl -sS https://gendsgn.ru/trade-in/api/health
|
||
curl -sI https://gendsgn.ru/trade-in/
|
||
```
|
||
|
||
### 3. Дальше — автодеплой
|
||
|
||
После первого ручного запуска все следующие `git push origin main` с изменениями в `tradein-mvp/**` будут:
|
||
1. Триггерить `.github/workflows/deploy-tradein.yml`
|
||
2. Билдить и пушить новые образы в `ghcr.io/lekss361/gendesign-tradein-*`
|
||
3. SSH в сервер → `docker compose pull` → `up -d` → Caddy reload
|
||
4. Health check
|
||
|
||
## Откат
|
||
|
||
```bash
|
||
ssh root@94.228.121.73
|
||
cd /opt/gendesign/tradein-mvp
|
||
# Откатиться на предыдущий SHA-тег
|
||
docker compose -p gendesign-tradein -f docker-compose.prod.yml down
|
||
IMAGE_TAG=<previous-sha> docker compose -p gendesign-tradein -f docker-compose.prod.yml up -d
|
||
```
|