Files
kvarta_project/docs/deploy.md
T
nunuchek c1d64f6a79 chore(deploy): адреса серверов из deploy/.env.local, а не из репозитория
DEPLOY_HOST, RELAY_HOST и TELEGRAM_BOT_ID обязательны и читаются из
неотслеживаемого deploy/.env.local (образец — .env.local.example).
2026-10-17 17:53:18 +03:00

4.2 KiB
Raw Blame History

Деплой и эксплуатация

Интернет → nginx на VPS (kvarta.unuchak.com, certbot)
             /      → 127.0.0.1:13120  kvarta-landing (Next.js standalone)
             /api/  → 127.0.0.1:13121  kvarta-api (Hono + SQLite в volume kvarta-data)
kvarta-api → Tailscale → домашний сервер :8788 kvarta-tg-relay (nginx) → api.telegram.org

С VPS api.telegram.org недоступен, поэтому Bot API идёт через ретранслятор на домашнем сервере (deploy/tg-relay). Он пропускает только запросы нашего бота и только из tailnet; токена на домашнем сервере нет.

Первый запуск

  1. cp deploy/.env.local.example deploy/.env.local и вписать ssh-адреса VPS и домашнего сервера и id бота — в репо адресов нет.
  2. CERTBOT_EMAIL=… deploy/setup-nginx.sh — конфиг nginx, nginx -t, reload, сертификат. Повторный запуск безопасен.
  3. deploy/deploy.sh — сборка образов linux/amd64 локально (JS собирается нативно, нативные модули — под целевую платформу), docker save | ssh docker load, docker-compose up -d, проверка /api/health. Требует чистого дерева git.
  4. На VPS заполнить /root/kvarta_site/api.env (chmod 600, скрипты его не трогают): TELEGRAM_BOT_TOKEN, TELEGRAM_ADMIN_ID, TELEGRAM_API_BASE=http://<tailscale-ip-домашнего>:8788.
  5. deploy/tg-relay/deploy.sh — ретранслятор на домашнем сервере (оба узла должны быть в Tailscale; на VPS — tailscale up --accept-dns=false, чтобы не задеть DNS соседних сайтов).
  6. Telegram: администратор пишет боту /start; в группе включить «Темы», сделать бота админом с правом «Управление темами»; написать в группе /setup. Бот создаст «Kvarta Cafe: Заявки» и «Kvarta Cafe: Система» и пришлёт в личку TELEGRAM_CHAT_ID, TELEGRAM_LEADS_THREAD_ID, TELEGRAM_SYSTEM_THREAD_ID — вписать в api.env и перезапустить api:
cd /root/kvarta_site && KVARTA_TAG=$(sed -n 's/^current=//p' .deployed) \
  docker-compose -f docker-compose_vps.yml -p kvarta up -d --force-recreate api

Пока Telegram не настроен, заявки копятся в базе со статусом pending и уходят после настройки.

Обновление и откат

  • deploy/deploy.sh — новая версия; на сервере остаются текущий и предыдущий образы kvarta-*, чужие образы не трогаются.
  • deploy/deploy.sh --rollback — вернуть предыдущую версию.

Бэкапы

  • Каждый день в 03:00 по Минску и при старте, если за сегодня копии нет: db.backup() → gzip → /data/backups/ в volume, 14 копий. Каждая копия уходит администратору в личку, итог — в «Систему».
  • Бот в личке администратора: /backups — список с кнопками восстановления, /backup — копия сейчас, присланный .sqlite.gz — восстановление из файла. Перед восстановлением бот показывает, какие заявки пропадут, и сохраняет текущую базу как pre-restore-….

Где смотреть, если что-то не так

  • docker-compose -f docker-compose_vps.yml -p kvarta logs api — в том числе сбои связи с Telegram (раз в 10 минут).
  • Тема «Kvarta Cafe: Система» — 500, неотправленные после 10 попыток заявки, ошибки Telegram, старт и бэкапы.