Развёртывание¶
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:
- Pre-checks — чистый git (или
SKIP_GIT_CLEAN=1в Actions),requirements-lock.txt - Сборка API до migrate (чтобы Alembic видел новые revisions)
- Pre-migrate бэкап Postgres (gzip, хранить последние 7) — прерывание при ошибке бэкапа
alembic upgrade head+ проверка schema head- Запуск стека с 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 |
api → timescaledb (prod) |
https://demo.agentbi.online |
api-demo → postgres-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 и алерты¶
- Задайте
SENTRY_DSN(+ опциональноSENTRY_SEND_DEFAULT_PII,SENTRY_TRACES_SAMPLE_RATE). - События с тегами
release=agentbi@<GIT_SHA>,environment=<APP_ENV>. - Необработанные исключения и 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).