← Помощь

Технический администратор

Сервер, БД, бот, 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 в mainnpm 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

  1. Локально: cp .env.example .env, docker compose up -d, npm install, npm run db:push, npm run db:seed.
  2. Staging: /opt/VpohoadSNami/.env по шаблону .env.staging.example.
  3. После перезагрузки VPS: ssh vpohoad → free -h, docker ps; при OOM — docker system prune -f && docker builder prune -f (не трогать rzdbadminton_bot).
  4. Деплой с WSL: ./deploy/sync_to_staging.sh — последовательно: build web (NODE_OPTIONS=1536) → db push → up web caddy.
  5. Smoke: STAGING_URL=http://46.19.68.241 ./scripts/smoke-staging.sh
  6. Production: .env.prod + ./deploy/update_prod.sh (prisma migrate deploy).
  7. CI: push в main → GitHub Actions lint + build (.github/workflows/ci.yml).
  8. Бэкап: deploy/backup_db.sh (см. infrastructure.md §6).
  9. Проверка: /api/health, footer vX.Y.Z, /admin/monitoring.

Telegram webhook

  1. Создайте бота в @BotFather, скопируйте TELEGRAM_BOT_TOKEN в .env.
  2. Задайте TELEGRAM_WEBHOOK_SECRET (любая длинная случайная строка).
  3. Установите webhook (HTTPS в production; на staging HTTP — по инструкции в docs/deploy-staging.md):
  4. POST https://api.telegram.org/bot<TOKEN>/setWebhook?url=<SITE_URL>/api/telegram/webhook?secret=<SECRET>
  5. Проверьте: напишите боту /start — должно появиться главное меню.

Ключ DeepSeek (ИИ)

DEEPSEEK_API_KEY в .env. Модель — SiteSetting llm_config, UI /admin/settings/ai.