Перейти к содержанию

Развёртывание

GitHub Actions → VPS (авто-деплой)

После успешного CI на main workflow .github/workflows/deploy.yml подключается по SSH к VPS и разворачивает приложение в /home/valera/agentbi (agentbi.com.ru).

Необходимые secrets репозитория: VPS_HOST, VPS_USER, VPS_SSH_KEY.
Опциональная variable: AGENTBI_DEPLOY_DIR (по умолчанию /home/valera/agentbi).
Настройка secrets: ./scripts/vps/configure_github_deploy_secrets.sh.

Production-стек (docker-compose.prod.yml):

  • Нет публичных host-портов для API/UI/DB/Redis
  • Frontend подключается к сети Traefik agentops-edge
  • HTTPS через file route в $TRAEFIK_DIR/agentbi.yml при заданном AGENTBI_DOMAIN
  • Образы с тегами agentbi-api:<git-sha> / agentbi-frontend:<git-sha> (IMAGE_TAG)

Ручной запуск: Actions → Deploy to VPS → Run workflow.

Первоначальная настройка VPS

```bash

Первый раз на VPS (prod без демо):

bash scripts/vps/bootstrap_prod_vps.sh

или вручную:

cd /home/valera/agentbi cp .env.production.example .env

Задайте надёжные POSTGRES_PASSWORD, REDIS_PASSWORD, SECRET_KEY, ADMIN_PASSWORD

AGENTBI_DOMAIN=agentbi.com.ru и CORS_ORIGINS=https://agentbi.com.ru

AGENTBI_DEMO_DOMAIN оставьте пустым

DNS A-record → 185.106.95.16 (см. deploy/DNS.md)

chmod +x deploy.sh scripts/.sh scripts/vps/.sh export COMPOSE_FILE=docker-compose.prod.yml ./deploy.sh ```

Фазы deploy.sh:

  1. Pre-checks — чистый git (или SKIP_GIT_CLEAN=1 в Actions), requirements-lock.txt
  2. Сборка API до migrate (чтобы Alembic видел новые revisions)
  3. Pre-migrate бэкап Postgres (gzip, хранить последние 7) — прерывание при ошибке бэкапа
  4. alembic upgrade head + проверка schema head
  5. Запуск стека с SHA-тегами образов, запись VERSION, health + /api/v1/version

Полезные флаги: ./deploy.sh --help, --skip-backup, --run-tests, --allow-dirty.

Изолированный demo-стенд (паттерн AgentOps)

Demo-данные никогда не должны попадать в production Postgres. AgentBI следует паттерну AgentOps:

Поверхность Стек
https://agentbi.online apitimescaledb (prod)
https://demo.agentbi.online api-demopostgres-demo (изолированный volume)

```bash

В .env на VPS — объедините с .env.demo (SEED_DEMO_DATA=false для prod)

AGENTBI_DEMO_DOMAIN=demo.agentbi.online CORS_ORIGINS=https://agentbi.online,https://demo.agentbi.online

DNS A-record demo.agentbi.online → VPS

COMPOSE_FILE=docker-compose.prod.yml ./deploy.sh COMPOSE_FILE=docker-compose.prod.yml ./scripts/run_demo_data.sh ```

docker-compose.prod.yml жёстко отключает DEMO_USER_ENABLED / DEMO_SEED_ON_START на prod-сервисе api. Overlay docker-compose.demo.yml включает их только на api-demo.

Проверка:

```bash curl -sf https://$AGENTBI_DOMAIN/api/v1/health/ready curl -sf https://$AGENTBI_DOMAIN/api/v1/version

или без DNS:

docker exec agentbi-api curl -sf http://localhost:8000/api/v1/health/ready ```

Бэкапы и восстановление

Pre-migrate бэкапы выполняются автоматически из deploy.sh. Вручную / cron:

```bash ./scripts/backup_postgres.sh --help

cron (ежедневно 02:15):

15 2 * * * cd /home/smdg/agentbi && ./scripts/backup_postgres.sh >>/var/log/agentbi-backup.log 2>&1

```

Файлы: ./backups/backup_YYYYMMDD_HHMMSS[_SHA].dump.gz (pg_dump -Fc + gzip). Ротация хранит последние 7. Копируйте off-host (например, /home/smdg/backups-offsite).

```bash ./scripts/restore_postgres.sh --file backups/backup_YYYYMMDD_HHMMSS.dump.gz

введите "restore" для подтверждения

```

Откат

bash ./scripts/rollback.sh --sha "$(cat VERSION.prev)" # предыдущие image tags ./scripts/rollback.sh --sha <sha> --restore backups/….gz # image + DB

Требуются локальные образы agentbi-api:<sha> / agentbi-frontend:<sha> от предыдущего деплоя.

VPS ops (общий хост)

На той же VM также работают AgentOps / AegisAI. Хостовые утилиты находятся в scripts/vps/:

```bash

Установка docker prune cron (пользователь smdg, группа docker — без root)

./scripts/vps/install_vps_ops.sh

Cron (пример):

15 2 * * * agentbi backup

15 3 * * * /home/smdg/bin/docker-prune-safe

Безопасный prune: остановленные контейнеры, dangling images, старый build cache — volumes не трогаем

/home/smdg/bin/docker-prune-safe

Одноразовый swapfile 2G (swappiness=10) — нужен sudo:

sudo /home/smdg/bin/setup-swapfile swapon --show && free -h ```

Домены tenant

Два разных поля в tenants:

Поле Назначение UI
allowed_email_domains Сопоставление email Google SSO → tenant (уникально между tenants) Users → Organizations
custom_domain Vanity hostname для будущей маршрутизации (уникально, опционально) Settings → Domain

custom_domain только в БД — DNS / Traefik / Let's Encrypt настраиваются вручную.

Return URLs биллинга

bash BILLING_SUCCESS_URL=https://$AGENTBI_DOMAIN/src/pages/settings.html?billing=success BILLING_CANCEL_URL=https://$AGENTBI_DOMAIN/src/pages/settings.html?billing=cancel

Платные планы (pro / business) разблокируют функции, пока subscription_status active или trialing и current_period_end в будущем; иначе entitlements возвращаются к free. enterprise назначается super_admin.

Sentry и алерты

  1. Задайте SENTRY_DSN (+ опционально SENTRY_SEND_DEFAULT_PII, SENTRY_TRACES_SAMPLE_RATE).
  2. События с тегами release=agentbi@<GIT_SHA>, environment=<APP_ENV>.
  3. Необработанные исключения и HTTP 5xx перехватываются.

Рекомендуемые алерты Sentry: всплеск ошибок, новая issue → Slack/email, регрессия после нового release. Опционально uptime check на GET /api/v1/health/ready.

Зависимости и CI

  • Production/CI устанавливают из requirements-lock.txt (uv pip compile requirements.txt -o requirements-lock.txt).
  • ./scripts/check_lockfile.sh должен проходить в CI.
  • Порог coverage: ≥ 55% (--cov-fail-under=55); HTML-артефакт загружается из CI. Stretch goal: 70%.

Локальная разработка

bash cp .env.example .env docker compose up --build -d curl http://localhost:8000/api/v1/health/ready curl http://localhost:8000/api/v1/version

TimescaleDB

Образы по умолчанию используют PostgreSQL 15. Hypertables включаются только при наличии расширения Timescale.

yaml image: timescale/timescaledb:latest-pg15

Иначе AgentBI работает на обычном Postgres (поддерживается для production SaaS).