Реализация на отдельных двух машинах с протестированным взаимодействием по проверке сообщений

This commit is contained in:
mi
2026-08-19 18:24:00 +03:00
parent bbef7a30c9
commit c7a80e7256
103 changed files with 3457 additions and 3725 deletions
+117
View File
@@ -0,0 +1,117 @@
# Release #0: безопасный порядок развертывания
Этот файл больше не является журналом реальных адресов, SSH-ключей и локальных
путей. Фактические значения инфраструктуры хранятся в защищённой CMDB/ops wiki,
а не в Git.
## 1. Подготовка ВМ
Разрешите извне только 80/443 и SSH из административной сети. PostgreSQL
доступен ВМ только через приватную сеть.
```sh
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-данных:
```sh
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/
```
На ВМ:
```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 <PREVIOUS_RELEASE>
```
Откат секрета выполняется активацией предыдущей версии в Selectel, повторным
sync и пересозданием только затронутых сервисов. Snapshot старого `.env` не
создаётся.
## 7. Break-glass
Только при подтверждённом инциденте доставьте root-only recovery file из
защищённой офлайн-копии, установите `SECRETS_SOURCE=file`, выполните
sync/validate/recreate и зафиксируйте событие. Автоматический fallback запрещён.
После восстановления Selectel верните штатный режим и удалите recovery file.