diff --git a/deploy/env.native.example b/deploy/env.native.example index 2135a41..51ca8e6 100644 --- a/deploy/env.native.example +++ b/deploy/env.native.example @@ -128,6 +128,7 @@ SAC_MOBILE_REFRESH_EXPIRE_DAYS=90 CORS_ORIGINS=https://sac.kalinamall.ru # SSH: verify host keys (RejectPolicy). Add keys to file before remote actions. +# Комментарий — только отдельной строкой с #. Нельзя: SAC_SSH_AUTO_ADD_HOST_KEY=false ← текст # SAC_SSH_KNOWN_HOSTS_FILE=/opt/security-alert-center/config/ssh_known_hosts # SAC_SSH_AUTO_ADD_HOST_KEY=false diff --git a/deploy/sac-deploy.sh b/deploy/sac-deploy.sh index 908a9c5..9e1e0b9 100644 --- a/deploy/sac-deploy.sh +++ b/deploy/sac-deploy.sh @@ -56,12 +56,16 @@ fi log "pip install -r requirements.txt" sudo -u "${APP_USER}" "${VENV}/bin/pip" install -q -r "${APP_ROOT}/backend/requirements.txt" +log "Проверка ${CONFIG_FILE} (pydantic; без bash source — inline-комментарии в значениях ломают deploy)" +sudo -u "${APP_USER}" bash -c " + export SAC_CONFIG_FILE='${CONFIG_FILE}' + cd '${APP_ROOT}/backend' + '${VENV}/bin/python' -c 'from app.config import get_settings; get_settings(); print(\"config: OK\")' +" || die "Неверный ${CONFIG_FILE}: одна переменная = одна строка, комментарии только отдельной строкой с # (не «false ← …» после значения)" + log "alembic upgrade head" sudo -u "${APP_USER}" bash -c " - set -a - # shellcheck source=/dev/null - source '${CONFIG_FILE}' - set +a + export SAC_CONFIG_FILE='${CONFIG_FILE}' cd '${APP_ROOT}/backend' && '${VENV}/bin/alembic' upgrade head " @@ -107,10 +111,7 @@ print('db: OK') log "systemctl restart ${SERVICE_NAME} (краткий 502 в UI возможен ~10 с)" log "Сброс зависших remote_action (running без worker после restart)" sudo -u "${APP_USER}" bash -c " - set -a - # shellcheck source=/dev/null - source '${CONFIG_FILE}' - set +a + export SAC_CONFIG_FILE='${CONFIG_FILE}' cd '${APP_ROOT}/backend' '${VENV}/bin/python' -c \" from app.database import SessionLocal diff --git a/docs/runbook-ops.md b/docs/runbook-ops.md index 92e70db..dcc11b8 100644 --- a/docs/runbook-ops.md +++ b/docs/runbook-ops.md @@ -18,6 +18,32 @@ curl -sS https://sac.kalinamall.ru/health | jq . Ожидается `status: ok`, `database: ok`. При устаревших heartbeat агентов — `status: degraded`, поле `hosts_stale` > 0. +### `sac-api.env`: формат строк + +Файл читается **pydantic** (`SAC_CONFIG_FILE`), не как произвольный bash-скрипт. + +- Одна переменная — одна строка: `SAC_SSH_AUTO_ADD_HOST_KEY=false` +- Комментарии — **отдельной** строкой с `#` в начале +- **Нельзя** inline после значения: `false ← так и оставляем` — deploy упадёт на `alembic` с `bool_parsing` + +Проверка без деплоя: + +```bash +sudo -u sac bash -c 'export SAC_CONFIG_FILE=/opt/security-alert-center/config/sac-api.env; cd /opt/security-alert-center/backend && .venv/bin/python -c "from app.config import get_settings; get_settings(); print(\"OK\")"' +``` + +### Linux SSH update: `known_hosts` + +Перед «Обновить ssh-monitor (SSH)» ключ хоста должен быть в файле (по умолчанию `config/ssh_known_hosts`): + +```bash +ssh-keyscan -H 10.10.7.2 | sudo tee -a /opt/security-alert-center/config/ssh_known_hosts +sudo chown sac:sac /opt/security-alert-center/config/ssh_known_hosts +sudo chmod 600 /opt/security-alert-center/config/ssh_known_hosts +``` + +Иначе SAC: `Server '…' not found in known_hosts`. `SAC_SSH_AUTO_ADD_HOST_KEY=true` для prod не рекомендуется. + ## Мобильные устройства (Seaca) См. [seaca-mobile.md](seaca-mobile.md) и [seaca-fcm.md](seaca-fcm.md).