diff --git a/README.md b/README.md index 0da5e271..0051e1c0 100644 --- a/README.md +++ b/README.md @@ -12,24 +12,27 @@ Acceptance criteria разбиты на 3 блока (функционально ## Текущий статус (26 апреля 2026) -**Инфраструктура: live.** Полный цикл автодеплоя из GitHub Actions работает. 26.04 прод полностью пересоздан (`down -v` + redeploy) — БД свежая, backend в multi-stage образе под non-root пользователем, healthcheck-и работают, ловит ошибки в Sentry. +**Инфраструктура: live на HTTPS.** Прод доступен по [https://gendsgn.ru/](https://gendsgn.ru/), Let's Encrypt cert получен. Полный цикл автодеплоя из GitHub Actions работает. 26.04 прод полностью пересоздан (`down -v` + redeploy) — БД свежая, backend в multi-stage образе под non-root пользователем, healthcheck-и работают, ловит ошибки в Sentry. | Что | Где | Статус | |---|---|---| +| **Production URL** | [https://gendsgn.ru/](https://gendsgn.ru/) | ✅ HTTP/2 + HTTP/3, валидный TLS | +| **Health endpoint** | [https://gendsgn.ru/health](https://gendsgn.ru/health) | ✅ `{"status":"ok","environment":"prod"}` | +| **www → apex** | https://www.gendsgn.ru/ | ✅ 301 redirect | | Production VPS | Beget Cloud, Москва, 2 vCPU / 4 GB / 40 GB NVMe | ✅ работает | | IP сервера | `46.173.16.127` | — | +| Домен | `gendsgn.ru` (Beget, до 26.04.2027, ЕСИА VERIFIED) | ✅ DNS на 8.8.8.8/1.1.1.1 | | Postgres + PostGIS 3.4 | Docker, в составе compose | ✅ Up (healthy) | | Redis 7 | Docker | ✅ Up (healthy, redis-cli ping) | | Backend FastAPI | Docker, multi-stage, non-root, 1.44 GB | ✅ Up (healthy, curl /health) | | Frontend Next.js 15 | Docker, multi-stage, npm ci | ✅ Up | -| Caddy reverse proxy | Docker, ports 80/443 | ✅ Up (TLS ждёт DNS-пропагации) | -| GitHub Actions deploy | `.github/workflows/deploy.yml` | ✅ build → push GHCR → ssh deploy | +| Caddy reverse proxy | Docker, ports 80/443 | ✅ Up + auto-TLS Let's Encrypt | +| GitHub Actions deploy | `.github/workflows/deploy.yml` | ✅ build → push GHCR → ssh deploy → git pull → caddy reload | | GHCR пакеты | `ghcr.io/lekss361/gendesign-{backend,frontend}` | приватные, сервер авторизуется через PAT | | UFW firewall | 22 / 80 / 443 | ✅ активен | | SSH hardening | root login off, password auth off | ✅ | -| **Домен** | `gendsgn.ru` (Beget, до 26.04.2027) | ⏳ DNS пропагируется к публичным резолверам | -| **Caddyfile с `gendsgn.ru`** | в `main` (commit 68e95aa) | ⏸ ждёт DNS чтобы накатить на VM (Let's Encrypt rate-limit) | -| **Sentry** | проект `gendesign-backend` (org `qqq`, free tier) | ✅ DSN на VM, тестовое событие прошло | +| Sentry | проект `gendesign-backend` (org `qqq`, free tier) | ✅ DSN на VM, события приходят | +| GitHub Issues / Milestones | 12 issues, 3 milestones (Stage 1 / Stage 2 / Infra Hardening) | ✅ backlog засеян | | Бэкапы pg_dump | `ops/backup.sh` готов | ⏸ S3-бакет не настроен (Selectel/Yandex) | **Решение по плану разработки: pending.** Антон (второй разработчик) сообщил о доступе к ДДУ-данным. Решается в понедельник 27.04.2026 — выбор между: @@ -207,15 +210,21 @@ make codegen # обновить TS-типы из OpenAPI ### Что осталось до «infra-ready» - [x] ~~Купить домен~~ — `gendsgn.ru` зарегистрирован в Beget 26.04.2026 (199₽/420₽). DNS на NS Beget, A-записи прописаны -- [ ] Дождаться пропагации DNS к публичным резолверам (30 мин – 4 ч), потом запушить **deploy.yml** с `git fetch + reset --hard + caddy reload` → Caddy сам выпустит Let's Encrypt cert для `gendsgn.ru` +- [x] ~~ЕСИА-верификация админа домена~~ — пройдено 26.04, статус `REGISTERED, DELEGATED, VERIFIED` +- [x] ~~Caddy TLS на `gendsgn.ru`~~ — Let's Encrypt cert получен, HTTPS живёт - [x] ~~Sentry DSN~~ — проект `gendesign-backend` создан в org `qqq`, DSN в `/opt/gendesign/backend/.env`, тестовое событие прошло -- [ ] Настроить ежесуточный `pg_dump` → Object Storage. Скрипт `ops/backup.sh` готов, осталось создать Selectel/Yandex bucket и положить креды в `/etc/default/gendesign-backup` на VM +- [x] ~~GitHub Issues / Milestones / Labels~~ — backlog засеян (см. [Issues](https://github.com/lekss361/-gendesign/issues)) +- [ ] Настроить ежесуточный `pg_dump` → Object Storage. Скрипт `ops/backup.sh` готов, осталось создать Selectel/Yandex bucket и положить креды в `/etc/default/gendesign-backup` на VM ([#3](https://github.com/lekss361/-gendesign/issues/3)) +- [ ] Прокинуть `SENTRY_RELEASE` в deploy.yml для tracking релизов в Sentry ([#4](https://github.com/lekss361/-gendesign/issues/4)) +- [ ] Подключить Антона к knowledge-graph ([#11](https://github.com/lekss361/-gendesign/issues/11)) - [ ] При следующем wipe `down -v` — TIGER/topology/fuzzystrmatch автоматом дропнутся (init-скрипт `backend/db/init/99_drop_unused_extensions.sql`) ### Sensitive операционные грабли - **`docker compose restart` НЕ перечитывает `env_file:`** — после правки `backend/.env` всегда `docker compose -f docker-compose.prod.yml up -d --force-recreate --no-deps backend` - **`deploy.yml` использует `git reset --hard origin/main`** — любые ручные правки в `/opt/gendesign` будут стёрты при следующем деплое. `.env` файлы переживут (в `.gitignore`) +- **`docker compose up` без `-f docker-compose.prod.yml`** на проде поднимет dev compose (с локальной сборкой образов и без Caddy). Признаки: `Image ... Built` в выводе и WARN про orphan caddy. Всегда указывай `-f` +- **`caddy reload` не сбрасывает retry-queue.** Если Caddy пытался получить cert для несуществующего hostname (например, плейсхолдера из старого Caddyfile), фоновые попытки могут переключить его в Let's Encrypt staging fallback. Рецепт чистого старта: `docker volume rm gendesign_caddy_data && docker compose up -d caddy` --- @@ -335,6 +344,7 @@ git push - `Domain_Setup_Apr26` — gendsgn.ru, Beget, DNS, ESIA-правило - `Sentry_Setup_Apr26` — проект, DSN, тестовое событие - `OpsBundle_Apr26` — Alembic + TIGER cleanup + pre-commit + pg_dump +- `HTTPS_Live_Apr26` — milestone: HTTPS прод заработал (включая lessons learned по ACME retry-state) **Процесс / правила:** - `Onboarding_Colleague_KG` — подключение нового участника к графу @@ -344,9 +354,16 @@ git push ## Полезные ссылки +- **🌐 Production:** https://gendsgn.ru/ +- **🩺 Health:** https://gendsgn.ru/health +- **📚 OpenAPI:** https://gendsgn.ru/openapi.json · [Swagger UI](https://gendsgn.ru/docs) - **Репо:** https://github.com/lekss361/-gendesign +- **Issues backlog:** https://github.com/lekss361/-gendesign/issues +- **Milestones:** https://github.com/lekss361/-gendesign/milestones - **GitHub Actions:** https://github.com/lekss361/-gendesign/actions - **GHCR пакеты:** https://github.com/lekss361?tab=packages +- **Sentry:** https://qqq-5y.sentry.io/insights/projects/gendesign-backend/ - **Production VPS:** Beget Cloud → `cp.beget.com/cloud/servers/jolly-yakov-3` +- **DNS-панель домена:** https://cp.beget.com/dns/14193206 - **Целевой регион Discovery:** Свердловская обл. (Екатеринбург, ПЗЗ, МСК-66) - **Конкуренты:** rTIM (только концепт-стадия, нет site-selection), TestFit (нет РФ-данных) diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index f8413d3d..acee5112 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -13,6 +13,10 @@ export default function HomePage() { Site Finder + {/* TODO: REMOVE BEFORE INVESTOR / CLIENT DEMO — internal easter egg for Anton */} +

+ антон ты пидр +

); } diff --git a/memory/memory-gendesign.jsonl b/memory/memory-gendesign.jsonl index 69d5f165..76f4f503 100644 --- a/memory/memory-gendesign.jsonl +++ b/memory/memory-gendesign.jsonl @@ -45,3 +45,7 @@ {"type": "relation", "from": "OpsBundle_Apr26", "to": "Stages_MVP_v1", "relationType": "prepares_for"} {"type": "relation", "from": "Production_Wipe_Apr26", "to": "Runbook_VPS_Setup_Beget", "relationType": "refreshed_state_of"} {"type": "relation", "from": "DockerOps_Apr26", "to": "Runbook_VPS_Setup_Beget", "relationType": "extends"} +{"type": "entity", "name": "HTTPS_Live_Apr26", "entityType": "milestone", "observations": ["Дата: 26.04.2026, ~14:41 MSK", "Прод официально живой на HTTPS: https://gendsgn.ru/ возвращает 200, https://gendsgn.ru/health → {\"status\":\"ok\",\"environment\":\"prod\"}, https://www.gendsgn.ru/ → 301 на apex", "Цепочка: ЕСИА-верификация в Beget → реестр .ru обновился → DNS пропагировался к 8.8.8.8/1.1.1.1 → push deploy.yml с git-pull+caddy-reload не делался (юзер сделал руками на VM) → пришлось вычищать caddy_data volume чтобы сбросить старый retry-state на gendesign.example.ru и Let's Encrypt staging fallback → Caddy перезагрузился чисто → cert получен с production Let's Encrypt", "Урок: при wipe `down -v` мы убрали весь caddy volume включая ACME-state. Если бы оставили — Caddy продолжал бы фоновые retry-задачи на старый плейсхолдер gendesign.example.ru, и accumulated failures могли бы триггернуть staging fallback. На будущее: `caddy reload` не сбрасывает retry queue — для чистого старта нужен `restart` или volume-wipe", "GitHub-issues #1 (ЕСИА) и #2 (push deploy.yml) можно закрывать как done", "Стек живет: HTTP/2 + HTTP/3 (alt-svc), Caddy reverse-proxy фронт+бэк, FastAPI корректно отвечает через /api/* префикс (handle вместо handle_path сработал)"]} +{"type": "relation", "from": "HTTPS_Live_Apr26", "to": "Domain_Setup_Apr26", "relationType": "completes"} +{"type": "relation", "from": "HTTPS_Live_Apr26", "to": "Phase0_DiscoveryMVP", "relationType": "infrastructure_milestone_for"} +{"type": "relation", "from": "HTTPS_Live_Apr26", "to": "Project_GenDesign", "relationType": "deploys"}