Files
han-app/support&notes/releases/#0 deploy-steps.md
T

4.6 KiB
Raw Blame History

Release #0: безопасный порядок развертывания

Этот файл больше не является журналом реальных адресов, SSH-ключей и локальных путей. Фактические значения инфраструктуры хранятся в защищённой CMDB/ops wiki, а не в Git.

1. Подготовка ВМ

Разрешите извне только 80/443 и SSH из административной сети. PostgreSQL доступен ВМ только через приватную сеть.

scp -i <DEPLOY_SSH_KEY> deployment/scripts/setup-vm.sh \
  <CLOUD_USER>@<VM_IP>:/tmp/setup-vm.sh
ssh -i <DEPLOY_SSH_KEY> <CLOUD_USER>@<VM_IP>
sudo chmod 0755 /tmp/setup-vm.sh
sudo /tmp/setup-vm.sh

После создания пользователя deploy проверьте отдельную SSH-сессию до отключения root login. Не копируйте приватный ключ на ВМ.

2. Доставка приложения

Предпочтительно использовать Git либо архив без runtime-данных:

tar -C HAN_chat_specification/codebase/backend \
  --exclude='.env' \
  --exclude='secrets' \
  --exclude='backups' \
  -czf han-chat-backend.tar.gz .
scp -i <DEPLOY_SSH_KEY> han-chat-backend.tar.gz deploy@<VM_IP>:/tmp/

На ВМ:

sudo install -d -o deploy -g deploy -m 0755 /opt/han-chat/backend
sudo -u deploy tar -C /opt/han-chat/backend \
  -xzf /tmp/han-chat-backend.tar.gz
cd /opt/han-chat/backend
sudo find . -type f \( -name '*.sh' -o -name 'validate-env' \
  -o -name 'han-secrets' -o -name 'han-compose' \) \
  -exec dos2unix {} +
sudo chmod 0755 scripts/validate-env deployment/scripts/*.sh \
  deployment/secrets/han-secrets deployment/secrets/han-compose \
  redis/scripts/*.sh nginx/scripts/*.sh
sudo deployment/scripts/setup-vm.sh

3. Несекретная конфигурация

.env создаётся на самой ВМ из .env.example и содержит только URL, resource names, feature flags и SECRETS_SOURCE. Его разрешено передавать как обычный config, но запрещено добавлять credential-bearing DSN, password, token и key.

cp .env.example .env
chmod 0600 .env
nano .env
./scripts/validate-env .env

4. Selectel Secrets Manager

Выполните deployment/secrets/SELECTEL_RUNBOOK.ru.md:

  1. отдельный проект и service user;
  2. provider secrets и audit alerts;
  3. root-only JSON-карта;
  4. encrypted systemd credential;
  5. SECRETS_SOURCE=selectel.

Не передавайте значение секрета аргументом команды, через export, тикет или shell history. Старые значения из прежнего .env после cutover ротируются.

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

sudo systemctl daemon-reload
sudo systemctl enable han-secrets@production.service
sudo systemctl restart han-secrets@production.service
sudo ./scripts/validate-env .env \
  --runtime-manifest /run/han-chat/secrets/manifest
sudo deployment/secrets/han-compose config --quiet
python3 -m unittest discover -s tests -v
sudo deployment/secrets/han-compose build --pull
sudo deployment/scripts/migrate.sh
sudo deployment/secrets/han-compose up -d --wait
sudo deployment/scripts/smoke.sh

Для диагностики используйте han-compose ps и ограниченные logs. Не выводите resolved Compose config, docker inspect environment, полный env или secret files.

6. Откат

Откат приложения использует immutable image/release ID и подтверждённую совместимость схемы:

sudo SCHEMA_BACKWARD_COMPATIBLE_CONFIRMED=true \
  deployment/scripts/rollback.sh <PREVIOUS_RELEASE>

Откат секрета выполняется активацией предыдущей версии в Selectel, повторным sync и пересозданием только затронутых сервисов. Snapshot старого .env не создаётся.

7. Break-glass

Только при подтверждённом инциденте доставьте root-only recovery file из защищённой офлайн-копии, установите SECRETS_SOURCE=file, выполните sync/validate/recreate и зафиксируйте событие. Автоматический fallback запрещён. После восстановления Selectel верните штатный режим и удалите recovery file.