Деплой приложения
Деплой приложения
Предварительные требования
- Сервер подготовлен по 02 — Подготовка сервера
- SSL-сертификат получен (04 — SSL)
- Доступ к GitHub-репозиторию
1. Клонирование репозитория
cd /opt/terma-grandgit clone git@github.com:<org>/terma-grand.git repocd repo2. Настройка .env.prod
cp scripts/deploy/.env.example .env.prodnano .env.prodОбязательные переменные:
| Переменная | Описание |
|---|---|
POSTGRES_PASSWORD | Пароль PostgreSQL (min 20 символов) |
DATABASE_URL | postgresql://terma:<pass>@postgres:5432/terma_prod |
REDIS_PASSWORD | Пароль Redis |
REDIS_URL | redis://:<pass>@redis:6379 |
BOT_TOKEN | Токен бота от @BotFather |
BOT_WEBHOOK_URL | https://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.editoryc 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.prod3. Сборка 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-grand4. Сборка статики документации
# Если pnpm не установленnpm install -g pnpm
# Установить зависимости и собрать docspnpm install --frozen-lockfilepnpm --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 STATUSrepo-postgres-1 Up (healthy)repo-redis-1 Up (healthy)repo-app-1 Up (healthy)repo-bot-1 Uprepo-docs-1 Uprepo-proxy-1 Up6. Проверка работоспособности
# Health endpoint APIcurl 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/repobash scripts/deploy/deploy.sh --tag v1.1.0Скрипт сам выполнит git pull, build, up и healthcheck. При неудаче — автоматический rollback.
9. Настройка cron-бэкапа
# Добавить в crontab ubuntucrontab -e
# Ежедневно в 03:000 3 * * * /opt/terma-grand/repo/scripts/deploy/backup.sh >> /var/log/terma-grand-backup.log 2>&1