Skip to content

Деплой приложения

Деплой приложения

Предварительные требования


1. Клонирование репозитория

Окно терминала
cd /opt/terma-grand
git clone git@github.com:<org>/terma-grand.git repo
cd repo

2. Настройка .env.prod

Окно терминала
cp scripts/deploy/.env.example .env.prod
nano .env.prod

Обязательные переменные:

ПеременнаяОписание
POSTGRES_PASSWORDПароль PostgreSQL (min 20 символов)
DATABASE_URLpostgresql://terma:<pass>@postgres:5432/terma_prod
REDIS_PASSWORDПароль Redis
REDIS_URLredis://:<pass>@redis:6379
BOT_TOKENТокен бота от @BotFather
BOT_WEBHOOK_URLhttps://termagrand.ru/bot/webhook
YC_ACCESS_KEY_IDКлюч сервисного аккаунта YC
YC_SECRET_ACCESS_KEYСекрет сервисного аккаунта YC
BACKUP_GPG_PASSPHRASEПароль шифрования бэкапов
IMAGE_TAGТег Docker-образа (например, v1.0.0)

.env.prod добавлен в .gitignore. Никогда не коммитить в git.

Сервисный аккаунт YC для Object Storage

Окно терминала
# Создать сервисный аккаунт
yc iam service-account create --name terma-grand-sa
# Выдать роль storage.editor
yc resource-manager folder add-access-binding <folder_id> \
--role storage.editor \
--subject serviceAccount:<sa_id>
# Создать ключ доступа (access key)
yc iam access-key create --service-account-name terma-grand-sa
# Скопировать key_id и secret в .env.prod

3. Сборка Docker-образа

Окно терминала
cd /opt/terma-grand/repo
# Сборка с тегом версии
docker build -t terma-grand:v1.0.0 .
docker tag terma-grand:v1.0.0 terma-grand:latest

Проверить:

Окно терминала
docker images | grep terma-grand

4. Сборка статики документации

Окно терминала
# Если pnpm не установлен
npm install -g pnpm
# Установить зависимости и собрать docs
pnpm install --frozen-lockfile
pnpm --filter docs build

Результат: /opt/terma-grand/repo/apps/docs/dist/


5. Запуск сервисов

Окно терминала
cd /opt/terma-grand/repo
IMAGE_TAG=v1.0.0 docker compose \
-f docker-compose.prod.yml \
--env-file .env.prod \
up -d

Проверить статус:

Окно терминала
docker compose -f docker-compose.prod.yml ps

Ожидаемый вывод:

NAME STATUS
repo-postgres-1 Up (healthy)
repo-redis-1 Up (healthy)
repo-app-1 Up (healthy)
repo-bot-1 Up
repo-docs-1 Up
repo-proxy-1 Up

6. Проверка работоспособности

Окно терминала
# Health endpoint API
curl https://termagrand.ru/api/health
# Ожидаемый ответ:
# {"status":"ok","version":"..."}

7. Настройка Telegram webhook

После запуска бота установить webhook URL:

Окно терминала
# Long polling (для dev/stage) — webhook не нужен
# Для production с webhook:
BOT_TOKEN="<ваш токен>"
WEBHOOK_URL="https://termagrand.ru/bot/webhook"
curl -X POST "https://api.telegram.org/bot${BOT_TOKEN}/setWebhook" \
-H "Content-Type: application/json" \
-d "{\"url\": \"${WEBHOOK_URL}\"}"
# Проверить
curl "https://api.telegram.org/bot${BOT_TOKEN}/getWebhookInfo"

8. Автоматический деплой

Для последующих деплоев использовать скрипт:

Окно терминала
cd /opt/terma-grand/repo
bash scripts/deploy/deploy.sh --tag v1.1.0

Скрипт сам выполнит git pull, build, up и healthcheck. При неудаче — автоматический rollback.


9. Настройка cron-бэкапа

Окно терминала
# Добавить в crontab ubuntu
crontab -e
# Ежедневно в 03:00
0 3 * * * /opt/terma-grand/repo/scripts/deploy/backup.sh >> /var/log/terma-grand-backup.log 2>&1

Следующий шаг

04 — SSL (Let’s Encrypt)