# Release #0: безопасный порядок развертывания Этот файл больше не является журналом реальных адресов, SSH-ключей и локальных путей. Фактические значения инфраструктуры хранятся в защищённой CMDB/ops wiki, а не в Git. ## 1. Подготовка ВМ Разрешите извне только 80/443 и SSH из административной сети. PostgreSQL доступен ВМ только через приватную сеть. ```sh scp -i deployment/scripts/setup-vm.sh \ @:/tmp/setup-vm.sh ssh -i @ sudo chmod 0755 /tmp/setup-vm.sh sudo /tmp/setup-vm.sh ``` После создания пользователя `deploy` проверьте отдельную SSH-сессию до отключения root login. Не копируйте приватный ключ на ВМ. ## 2. Доставка приложения Предпочтительно использовать Git либо архив без runtime-данных: ```sh tar -C HAN_chat_specification/codebase/backend \ --exclude='.env' \ --exclude='secrets' \ --exclude='backups' \ -czf han-chat-backend.tar.gz . scp -i han-chat-backend.tar.gz deploy@:/tmp/ ``` На ВМ: ```sh 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. ```sh 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. Проверка и запуск ```sh 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 и подтверждённую совместимость схемы: ```sh sudo SCHEMA_BACKWARD_COMPATIBLE_CONFIRMED=true \ deployment/scripts/rollback.sh ``` Откат секрета выполняется активацией предыдущей версии в Selectel, повторным sync и пересозданием только затронутых сервисов. Snapshot старого `.env` не создаётся. ## 7. Break-glass Только при подтверждённом инциденте доставьте root-only recovery file из защищённой офлайн-копии, установите `SECRETS_SOURCE=file`, выполните sync/validate/recreate и зафиксируйте событие. Автоматический fallback запрещён. После восстановления Selectel верните штатный режим и удалите recovery file.