fix(install): повторный запуск установщика больше не меняет секреты
Найдено на стенде: повторный `install.sh` без `--reconfigure` генерировал новые MASTER_KEY/SESSION_PEPPER/TOTP_ENCRYPTION_KEY, после чего email-индекс и TOTP-секреты существующих пользователей перестали расшифровываться (вход возвращал `auth.invalid_credentials`). - секреты переиспользуются при любом повторном запуске, а не только с `--reconfigure`; - добавлен явный флаг `--rotate-secrets` с предупреждением о последствиях; - age-ключ бэкапов сохраняется, старые бэкапы остаются читаемыми; - защита от потери `.env`: если база есть, а MASTER_KEY нет — установщик останавливается с объяснением вместо молчаливой генерации новых ключей; - `scripts/test-install.sh` сравнивает секреты до и после повторной установки и падает при их изменении.
This commit is contained in:
+24
-3
@@ -61,12 +61,33 @@ timeout 600 docker exec -i "$CONTAINER" bash -lc '
|
||||
--admin admin@gl.test.local --password "test-password-123" --yes
|
||||
' </dev/null
|
||||
|
||||
run_install "2/4 install.sh (боевой прогон: TLS и публичные порты не трогаем)"
|
||||
run_install "3/4 идемпотентность: повторный запуск с --reconfigure" --reconfigure
|
||||
run_install "2/5 install.sh (боевой прогон: TLS и публичные порты не трогаем)"
|
||||
|
||||
# Секреты обязаны переживать повторную установку: MASTER_KEY расшифровывает
|
||||
# PII и TOTP, SESSION_PEPPER — blind index. Их смена ломает данные инстанса.
|
||||
log "3/5 секреты до повторного запуска"
|
||||
secrets_before="$(docker exec "$CONTAINER" bash -lc '
|
||||
grep -E "^(MASTER_KEY|SESSION_PEPPER|TOTP_ENCRYPTION_KEY|WEBHOOK_SECRET|LIVEKIT_API_SECRET|AGE_RECIPIENT)=" /opt/glchat/.env | sort
|
||||
')"
|
||||
printf '%s\n' "$secrets_before"
|
||||
|
||||
run_install "4/5 идемпотентность: повторный запуск с --reconfigure" --reconfigure
|
||||
|
||||
log "5/5 секреты после повторного запуска"
|
||||
secrets_after="$(docker exec "$CONTAINER" bash -lc '
|
||||
grep -E "^(MASTER_KEY|SESSION_PEPPER|TOTP_ENCRYPTION_KEY|WEBHOOK_SECRET|LIVEKIT_API_SECRET|AGE_RECIPIENT)=" /opt/glchat/.env | sort
|
||||
')"
|
||||
printf '%s\n' "$secrets_after"
|
||||
if [ "$secrets_before" != "$secrets_after" ]; then
|
||||
echo "ОШИБКА: повторный запуск установщика изменил секреты (данные станут нечитаемыми)" >&2
|
||||
diff <(printf '%s\n' "$secrets_before") <(printf '%s\n' "$secrets_after") >&2 || true
|
||||
exit 1
|
||||
fi
|
||||
echo "секреты сохранены при повторной установке: ok"
|
||||
|
||||
# Сборка образа внутри DinD невозможна (overlay поверх overlay), поэтому образ
|
||||
# собирается и проверяется отдельно на хосте (make docker-build + docker compose).
|
||||
log "4/4 проверки состояния установки"
|
||||
log "проверки состояния установки"
|
||||
docker exec "$CONTAINER" bash -lc '
|
||||
set -e
|
||||
echo "--- артефакты ---"
|
||||
|
||||
Reference in New Issue
Block a user