118 lines
4.6 KiB
Markdown
118 lines
4.6 KiB
Markdown
# 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.
|