Технический администратор
Сервер, БД, бот, CI и версия продукта. Документы: docs/deploy-staging.md, docs/infrastructure.md, docs/tech-debt.md.
О системе
- Версия
- v0.6.0
- Коммит
- 82121b3
- Сборка
- 11 июн. 2026 г., 16:21
- Строка версии
- v0.6.0 · 82121b3 · 11 июн. 2026 г., 16:21
- Release notes
- Sprint 7–8: migrate deploy + baseline, smoke-prod, prod env checklist, Turnstile, Upstash rate limit, vitest+, школьная воронка.
Полная история: docs/RELEASES.md. Мониторинг: /admin/monitoring. Health: /api/health.
CI/CD
GitHub Actions (.github/workflows/ci.yml): при push/PR в main — npm ci, prisma generate, npm run lint, npm run build. Staging-деплой — вручную ./deploy/sync_to_staging.sh (передаёт BUILD_COMMIT).
Cron jobs
Все маршруты требуют CRON_SECRET (заголовок Authorization: Bearer … или query ?secret=…).
| Маршрут | Расписание | Назначение |
|---|---|---|
| /api/cron/reminders | ежедневно ~09:00 | Напоминания за N дней до старта похода (days=3 по умолчанию). |
| /api/cron/health-alerts | каждый час | Алерт в Telegram при превышении FAILED уведомлений. |
| /api/cron/post-event-reviews | ежедневно | Запрос отзыва в Telegram после завершённого похода. |
| /api/cron/admin-digest | ежедневно ~09:00 | Дайджест админу: NEW-заявки, ближайшие походы, FAILED за сутки. |
| /api/cron/generate-articles | ежедневно ~06:00 | Генерация статьи через DeepSeek + публикация на сайте + уведомление админу. |
Tech debt (кратко)
- [High]HTTP staging, DNS на парковку reg.ru — HTTPS не активен (см. domains-and-tls.md)
- [High]Production VPS не выделен — только staging 46.19.68.241
- [Medium]Rate limit in-memory (не Redis)
- [Medium]next build падает локально (Next.js 15.5.19 + bundler moduleResolution) — в Docker работает
- [Low]Vitest: status-labels, rate-limit, cron-auth, yookassa, zod; E2E — позже
- [Resolved]VPS OOM / offline после reboot — sequential deploy + smoke (v0.4.0)
Полный реестр: docs/tech-debt.md
Яндекс.Метрика
Задайте NEXT_PUBLIC_METRIKA_ID в .env на сервере и пересоберите образ web. Цели: отправка заявки, открытие ИИ-чата. В админке без ID — подсказка на странице «Аналитика».
Переменные окружения
Шаблоны: .env.example, .env.staging.example.
| Переменная | Обязательно | Назначение | Пример |
|---|---|---|---|
| DATABASE_URL | да | Строка подключения PostgreSQL (локально — docker-compose, staging — контейнер postgres). | postgresql://user:pass@localhost:5432/vpohoadsnami |
| POSTGRES_PASSWORD | да | Пароль PostgreSQL для docker-compose.staging.yml на VPS (в .env на сервере, не в git). | — |
| NEXTAUTH_SECRET | да | Секрет для iron-session (сессия админки). Сгенерируйте случайную строку. | — |
| NEXTAUTH_URL | нет | Публичный URL сайта на staging/production (для cookie и ссылок). | http://46.19.68.241 |
| APP_ENV | нет | staging — cookie без Secure на HTTP; production — политика строже. | staging |
| TELEGRAM_BOT_TOKEN | нет | Токен бота от @BotFather. Без него webhook не обработает сообщения. | — |
| TELEGRAM_WEBHOOK_SECRET | нет | Секрет в URL webhook: POST /api/telegram/webhook?secret=... | — |
| ADMIN_TELEGRAM_CHAT_ID | нет | Chat ID администратора для уведомлений о новых заявках. | — |
| NEXT_PUBLIC_SITE_URL | нет | Базовый URL для ссылок в боте (запись на поход, каталог). | http://localhost:3000 |
| NEXT_PUBLIC_METRIKA_ID | нет | ID счётчика Яндекс.Метрики; цели submit_application, open_chat. | — |
| CRON_SECRET | нет | Секрет для всех /api/cron/* (Bearer или ?secret=). | — |
| YOOKASSA_SHOP_ID / YOOKASSA_SECRET_KEY | нет | ЮKassa sandbox/prod; приоритет SiteSetting из /admin/settings/payments. | — |
| AWS_S3_* | нет | S3/CDN для медиа; без них — public/media/uploads (local). | — |
| HEALTH_ALERT_FAILED_THRESHOLD | нет | Порог FAILED NotificationDelivery за час для алерта в Telegram админу. | 5 |
| SMTP_HOST / SMTP_USER / SMTP_PASS | нет | Почта для уведомлений заявителю при смене статуса. Без SMTP письма пропускаются (лог в консоли). | — |
| DEEPSEEK_API_KEY | нет | Ключ API DeepSeek для ИИ-генерации текстов и ассистента (lib/llm). | — |
| S3_BUCKET / S3_ACCESS_KEY / S3_SECRET_KEY | нет | S3-хранилище медиа на production (MVP использует public/media/). | — |
Seed и база данных
npm run db:push— схема на staging (контейнер migrate).npm run db:seed— демо-данные (вручную, не в auto-deploy).- Production:
prisma migrate deployвupdate_prod.sh.
Деплой на staging
- Локально: cp .env.example .env, docker compose up -d, npm install, npm run db:push, npm run db:seed.
- Staging: /opt/VpohoadSNami/.env по шаблону .env.staging.example.
- После перезагрузки VPS: ssh vpohoad → free -h, docker ps; при OOM — docker system prune -f && docker builder prune -f (не трогать rzdbadminton_bot).
- Деплой с WSL: ./deploy/sync_to_staging.sh — последовательно: build web (NODE_OPTIONS=1536) → db push → up web caddy.
- Smoke: STAGING_URL=http://46.19.68.241 ./scripts/smoke-staging.sh
- Production: .env.prod + ./deploy/update_prod.sh (prisma migrate deploy).
- CI: push в main → GitHub Actions lint + build (.github/workflows/ci.yml).
- Бэкап: deploy/backup_db.sh (см. infrastructure.md §6).
- Проверка: /api/health, footer vX.Y.Z, /admin/monitoring.
Telegram webhook
- Создайте бота в @BotFather, скопируйте TELEGRAM_BOT_TOKEN в .env.
- Задайте TELEGRAM_WEBHOOK_SECRET (любая длинная случайная строка).
- Установите webhook (HTTPS в production; на staging HTTP — по инструкции в docs/deploy-staging.md):
- POST https://api.telegram.org/bot<TOKEN>/setWebhook?url=<SITE_URL>/api/telegram/webhook?secret=<SECRET>
- Проверьте: напишите боту /start — должно появиться главное меню.
Ключ DeepSeek (ИИ)
DEEPSEEK_API_KEY в .env. Модель — SiteSetting llm_config, UI /admin/settings/ai.