fix(install): ключ шифрования бэкапов создаётся после установки age

На чистой машине age-keygen появляется только на шаге install_packages,
поэтому генерация ключа в generate_secrets падала, а chmod на несуществующий
файл валил установку. Теперь ensure_age_key вызывается после установки
пакетов, безопасно пропускает chmod и обновляет AGE_RECIPIENT в .env.
Регрессия найдена прогоном scripts/test-install.sh в контейнере.
This commit is contained in:
2026-09-19 22:11:31 +03:00
parent fb221c91bb
commit ac2b2cb18a
+28 -5
View File
@@ -624,17 +624,40 @@ generate_secrets() {
set_data_ownership
# Ключ шифрования бэкапов тоже сохраняем: иначе старые бэкапы не прочитать.
# Генерация требует age-keygen, который ставится позже (install_packages),
# поэтому при отсутствии утилиты ключ создаст ensure_age_key.
AGE_KEY_FILE="${GLCHAT_DATA_DIR}/backups/age-key.txt"
ensure_age_key
}
# ensure_age_key создаёт ключ шифрования бэкапов, если его ещё нет.
ensure_age_key() {
AGE_KEY_FILE="${AGE_KEY_FILE:-${GLCHAT_DATA_DIR}/backups/age-key.txt}"
local recipient=""
if [ ! -f "$AGE_KEY_FILE" ]; then
if ! have age-keygen; then
warn "age-keygen не установлен: ключ бэкапов создадим после установки пакетов"
AGE_RECIPIENT=""
return 0
fi
generate_age_key "$AGE_KEY_FILE"
fi
chmod 600 "$AGE_KEY_FILE"
AGE_RECIPIENT="$(grep -o 'age1[0-9a-z]*' "$AGE_KEY_FILE" | head -1 || true)"
if [ -z "$AGE_RECIPIENT" ] && have age-keygen; then
AGE_RECIPIENT="$(age-keygen -y "$AGE_KEY_FILE" </dev/null 2>/dev/null || true)"
if [ -f "$AGE_KEY_FILE" ]; then
chmod 600 "$AGE_KEY_FILE" 2>/dev/null || true
recipient="$(grep -o 'age1[0-9a-z]*' "$AGE_KEY_FILE" | head -1 || true)"
fi
if [ -z "$AGE_RECIPIENT" ]; then
if [ -z "$recipient" ] && [ -f "$AGE_KEY_FILE" ] && have age-keygen; then
recipient="$(age-keygen -y "$AGE_KEY_FILE" </dev/null 2>/dev/null || true)"
fi
if [ -z "$recipient" ]; then
warn "не удалось определить публичный age-ключ: бэкапы будут без шифрования"
AGE_RECIPIENT=""
return 0
fi
AGE_RECIPIENT="$recipient"
# .env уже записан: обновляем получателя, иначе backup.sh останется без ключа.
if [ "$DRY_RUN" != "1" ] && [ -f "$GLCHAT_ENV_FILE" ]; then
env_set AGE_RECIPIENT "$AGE_RECIPIENT"
fi
ok "age-ключ бэкапов: ${AGE_KEY_FILE}"
}