@@ -44,19 +44,19 @@ TLS и redirect policy отключать нельзя.
## 2. Каталог секретов
Скопируйте `config.example.json` в
`/etc/han/secrets/production-like .selectel.json` и замените account, username,
`/etc/han/secrets/production.selectel.json` и замените account, username,
project, region и `remote` . Каноническое имя слева обязано совпадать с
Compose/validator; `remote` — неизменяемый ключ в Selectel.
Используйте консервативные provider keys с дефисами, например:
- `han-chat-prod-pg-han-app-dsn` , `han-chat-prod-pg-bitrix-local-dsn` ,
`han-chat-prod-pg-bitrix-sync-dsn` , `han-chat-prod-pg- sms-dsn` ,
`han-chat-prod-pg-sms-dsn` ,
`han-chat-prod-pg-keycloak-password` , `han-chat-prod-pg-backup-dsn` ;
- `han-chat-prod-redis-api-password` , `han-chat-prod-redis-safety -password` ,
`han-chat-prod-redis-health-password` , а также три credential-bearing URL;
- `han-chat-prod-redis-api-password` , `han-chat-prod-redis-health -password` ,
а также credential-bearing URL только для Redis DB0/DB1 ;
- `han-chat-prod-message-safety-token` , `han-chat-prod-bitrix-internal-token` ,
`han-chat-prod-bitrix-forward-token` , `han-chat-prod-bitrix-sync-token` ,
`han-chat-prod-bitrix-forward-token` ,
`han-chat-prod-keycloak-settings-token` , `han-chat-prod-sms-service-token` ;
- Keycloak bootstrap password, OTP HMAC и mock code только для среды, где mock
действительно включён;
@@ -79,25 +79,25 @@ S3 и Bitrix sync credentials до появления потребляющего
## 3. Установка на ВМ
Повторный запуск `deployment/scripts/setup-vm.sh` после копирования проекта
устанавливает loader, launcher, systemd template и этот runbook. Вручную:
Повторный запуск `deployment/scripts/setup-vm.sh` после root-активации release
устанавливает loader, launcher, systemd units и этот runbook. Production
установка вручную не поддерживается: точные owner/mode и пути задаёт setup.
Ожидаемые артефакты:
``` sh
sudo install -d -m 0700 /etc /han/ secrets /etc/han/credential s
sudo install -d -m 0755 /usr/local/lib /han-secrets
sudo install -m 0750 secrets_loader.py han-secrets /usr/local/lib/han-secrets/
sudo install -m 0750 han-compose /usr/local/bin/han-compos e
sudo install -m 0644 han-secrets@.service /etc/systemd/system/
sudo install -m 0600 config.example.json \
/etc/han/secrets/production-like.selectel.json
test -x /usr/local/lib /han- secrets/han-secret s
test -x /usr/local/sbin /han-vm1-compose
test -f /etc/systemd/system/han-secrets@.service
test -f /etc/systemd/system/han-stack@.servic e
```
Обычный `/opt/han-chat/backend/.env` содержит только несекретные параметры.
`/etc/han/vm1.env` принадлежит root ( `0600` ) и содержит только несекретные
параметры. Config находится вне immutable release.
Штатный режим:
``` dotenv
SECRETS_SOURCE=selectel
APP_ENV=production-like
APP_ENV=production
```
## 4. Bootstrap credential
@@ -116,23 +116,21 @@ sudo chmod 0600 /etc/han/credentials/production.selectel-password.cred
## 5. Проверка и запуск
Все команды, которым нужны Compose secrets, запускайте о т root через wrapp er:
Secret sync и preflight запускае т root. `deploy` не вызывает Docker/launch er:
``` sh
cd /opt/han-chat/backend
sudo ./scripts/validate-env .env
sudo systemctl daemon-reload
sudo systemctl enable han-secrets@production.service
sudo systemctl restart han-secrets@production.service
sudo ./scripts/validate-env .env \
cd /opt/han-chat/current/ backend
./scripts/validate-env /etc/han/vm1 .env
systemctl restart han-secrets@production.service
./scripts/validate-env /etc/han/vm1.env \
--runtime-manifest /run/han-chat/secrets/manifest
sudo deployment/secrets/han-compose config --quiet
sudo deployment/secrets /han-compose up -d --wai t
deployment/preflight.sh
/usr/local/sbin /han-vm1- compose config --quie t
```
Selectel sync запускается именно unit-файлом: только он предоставляет
расшифрованный bootstrap credential через `$CREDENTIALS_DIRECTORY` .
`han-compose` и ops-скрипты используют уже синхронизированный manifest и
`han-vm1- compose` и ops-скрипты используют уже синхронизированный manifest и
отказываются работать, если `SECRETS_SOURCE` /loader config не совпадают с
runtime state. После смены source, provider version или JSON-карты сначала
выполняйте `systemctl restart han-secrets@production.service` .
@@ -142,27 +140,17 @@ runtime state. После смены source, provider version или JSON-кар
приёмки должна подтвердить отсутствие canary value в `docker inspect` , stdout,
json logs, traces и shell history.
На выделенной только под HAN Chat ВМ после canary и проверки file fallback
установите fail-closed ordering:
``` sh
sudo install -d -m 0755 /etc/systemd/system/docker.service.d
sudo install -m 0644 \
deployment/secrets/docker-han-secrets.conf.example \
/etc/systemd/system/docker.service.d/han-secrets.conf
sudo systemctl daemon-reload
sudo systemctl restart docker
```
После этого проведите reboot rehearsal: materializer должен завершиться до
autorestart контейнеров. Ошибка Selectel намеренно блокирует Docker. На ВМ с
другими workloads такой глобальный `Requires=` запрещён: нужен отдельный Docker
Fail-closed ordering задают `han-stack@production.service` и
`han-secrets@production.service` . Глобальную зависимость Docker daemon от
секретов не устанавливайте. После настройки проведите reboot rehearsal:
materializer должен завершиться до root stack unit. На ВМ с другими workloads
тем более запрещено связывать весь Docker
daemon/VM, иначе fail-closed HAN остановит несвязанные системы.
## 6. Явный file fallback
Подготовьте отдельную карту
`/etc/han/secrets/production-like .file.json` : скопируйте Selectel-карту,
`/etc/han/secrets/production.file.json` : скопируйте Selectel-карту,
установите `"mode": "file"` , удалите `selectel` и `http` , добавьте:
``` json
@@ -178,7 +166,7 @@ shell: запрещены `export`, substitutions, multiline, неизвестн
ключи. Файл — `root:root 0600` .
При инциденте доставьте recovery-файл из защищённой офлайн-копии и только затем
явно измените `.env` :
явно измените `/etc/han/vm1 .env` :
``` dotenv
SECRETS_SOURCE=file
@@ -198,7 +186,7 @@ validate/recreate через wrappers. После восстановления S
4. Сделайте версию current, удалите pin, снова sync и пересоздайте только
потребителей.
5. Для rollback активируйте предыдущую provider version; не храните snapshot
старого `.env` .
старого `/etc/han/vm1 .env` .
Selectel не позволяет удалить отдельную версию — только секрет целиком. Старые
значения должны быть отозваны в PostgreSQL/S3/Bitrix/i-Digital после окна