Production deploy Around вынесен в отдельный infra repository:
git@github.com:Arch1E2/infra_around.git
Wiki.js не входит в этот deploy flow и разворачивается отдельно.
80, 443.wiki.example.com.docker network inspect around_public >/dev/null 2>&1 || docker network create around_public
На сервере должны быть:
80 и 443.q7m4t2x9b1.auna.kz./etc/letsencrypt/live/q7m4t2x9b1.auna.kz/.Создать deploy user:
sudo useradd -m -s /bin/bash around-deploy
sudo usermod -aG docker around-deploy
sudo install -d -m 700 -o around-deploy -g around-deploy /home/around-deploy/.ssh
Для GitHub Actions -> server:
SSH_PRIVATE_KEY репозитория infra_around;/home/around-deploy/.ssh/authorized_keys.Для server -> GitHub:
/home/around-deploy/.ssh/infra_around;infra_around как read-only Deploy Key.Проверка:
sudo -u around-deploy ssh -T git@github.com
sudo -u around-deploy git clone git@github.com:Arch1E2/infra_around.git /home/around-deploy/around-infra
В GitHub Actions secrets репозитория infra_around:
SSH_HOST=<server>
SSH_USER=around-deploy
SSH_PORT=22
SSH_PRIVATE_KEY=<private key for GitHub Actions -> server>
APP_DIR=/home/around-deploy/around-infra
GHCR_USERNAME=<github username>
GHCR_TOKEN=<token with write:packages/read:packages>
SOURCE_REPO_TOKEN=<token with read access to source repos>
CI/CD централизован в infra_around. В source repositories django_around, around_chat, qr_around и mobile_around эти secrets добавлять не нужно, если в них нет собственных активных workflows.
Назначение secrets:
| Secret | Назначение |
|---|---|
SOURCE_REPO_TOKEN |
Checkout приватных source repositories из workflow build-images |
GHCR_USERNAME |
Логин в GitHub Container Registry при публикации и скачивании images |
GHCR_TOKEN |
Публикация images из build workflow и их скачивание на production server |
SSH_HOST |
Адрес production server |
SSH_USER |
Пользователь для deploy по SSH, обычно around-deploy |
SSH_PORT |
SSH port; можно не задавать при стандартном 22 |
SSH_PRIVATE_KEY |
Private key для подключения GitHub Actions к production server |
APP_DIR |
Путь к checkout infra_around на server, например /home/around-deploy/around-infra |
SOURCE_REPO_TOKEN создается как fine-grained personal access token:
Only select repositories;django_around, around_chat, qr_around, mobile_around;Contents: Read-only;infra_around, а не в source repositories.Без SOURCE_REPO_TOKEN checkout приватного repository завершается ошибкой 403: Write access to repository not granted. Встроенный GITHUB_TOKEN репозитория infra_around не дает доступ к другим приватным repositories.
Для GHCR_TOKEN используется personal access token classic с scopes read:packages и write:packages. delete:packages для build/deploy не требуется.
Файл:
/home/around-deploy/around-infra/deploy/.env
Обязательные группы переменных:
DJANGO_SECRET_KEYDEBUG=0ALLOWED_HOSTSCSRF_TRUSTED_ORIGINSPOSTGRES_DBPOSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_HOST=around_dbPOSTGRES_PORT=5432REDIS_PASSWORDREDIS_URL=redis://:<password>@around_redis:6379/0WS_ALLOWED_ORIGINSAWS_*, если media/chat uploads используют S3-compatible storageNUXT_PUBLIC_API_BASE_URLNUXT_PUBLIC_CHAT_API_BASE_URLNUXT_PUBLIC_YANDEX_MAPS_API_KEYNUXT_PUBLIC_YANDEX_GEOCODER_API_KEYПрава:
Если включены платежи и привязка карт, заполнить FREEDOMPAY_*:
FREEDOMPAY_AUTH_IDFREEDOMPAY_ACCEPT_SECRET_KEYFREEDOMPAY_MERCHANT_IDFREEDOMPAY_MERCHANT_SECRET_KEYFREEDOMPAY_DEFREEZE_SECRET_KEYFREEDOMPAY_CHECK_URLFREEDOMPAY_RESULT_URLFREEDOMPAY_CARD_SUCCESS_URLFREEDOMPAY_CARD_FAILURE_URLFREEDOMPAY_CARD_RESULT_URLFREEDOMPAY_CARD_BACK_LINKЕсли включены push notifications, заполнить FIREBASE_* и обеспечить доступность service account JSON внутри backend/worker containers:
FIREBASE_ENABLED=1FIREBASE_PROJECT_IDFIREBASE_CREDENTIALS_FILEТекущий nginx ожидает сертификаты в /etc/letsencrypt/live/<domain>/.
sudo chown around-deploy:around-deploy /home/around-deploy/around-infra/deploy/.env
sudo chmod 600 /home/around-deploy/around-infra/deploy/.env
В репозитории infra_around вручную запустить workflow:
Wiki.js разворачивается отдельным compose. Текущий nginx уже содержит отдельный server block для wiki.q7m4t2x9b1.auna.kz, который проксирует в wiki:3000 через network around_public. Если домен меняется, нужно обновить server_name и пути сертификатов в django_around/around/nginx/nginx.conf.
Production media: текущий production compose не монтирует persistent media volume, а nginx не отдает /media/. Для production нужно включить S3-compatible storage через AWS_* или отдельно добавить media volume и nginx route.
Actions -> build-images -> Run workflow
Refs:
backend_ref=master
chat_ref=master
location_ref=master
frontend_ref=master
Workflow публикует:
ghcr.io/arch1e2/django_aroundghcr.io/arch1e2/around_chatghcr.io/arch1e2/around_locationghcr.io/arch1e2/around_frontLocation image собирается job build_location. Job выполняет checkout Arch1E2/qr_around из ветки master, запускает Go tests/build и публикует теги latest и source commit SHA.
Старые standalone workflow runs в qr_around с job build_deploy относятся к удаленному workflow. Их не нужно перезапускать; актуальная сборка запускается только через infra_around -> Actions -> build-images.
Перед первым deploy остановить старые контейнеры без удаления volumes:
docker compose -f docker-compose.prod.yml down
Проверить endpoints:
GET /api/schema/GET /api/v1/schema/swagger-ui/GET /admin/GET /api/v1/billing/card-banks/GET /api/v1/push/status/ws/chatsЕсли card bank reference data пустая:
docker compose -f docker-compose.prod.yml exec around_back python manage.py seed_kz_card_banks
Не выполнять down -v, если нужно сохранить базу.
В infra_around запустить:
Actions -> deploy -> Run workflow
Параметры:
backend_image_tag=latest
chat_image_tag=latest
location_image_tag=latest
frontend_image_tag=latest
run_migrations=true
Если миграции уже применены, для следующих deploy можно использовать run_migrations=false.
На сервере:
sudo -u around-deploy bash -lc 'cd /home/around-deploy/around-infra/deploy && docker compose -f docker-compose.prod.yml ps'
sudo -u around-deploy bash -lc 'cd /home/around-deploy/around-infra/deploy && docker compose -f docker-compose.prod.yml logs --tail=100 around_back around_chat around_location around_front nginx'
HTTP checks:
curl -I https://q7m4t2x9b1.auna.kz
curl -I https://q7m4t2x9b1.auna.kz/api/v1/
Migrations:
sudo -u around-deploy bash -lc 'cd /home/around-deploy/around-infra/deploy && docker compose -f docker-compose.prod.yml exec -T around_back python manage.py showmigrations | grep "\[ \]" | head'
No output means all migrations are applied.