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:
+28
-5
@@ -624,17 +624,40 @@ generate_secrets() {
|
|||||||
set_data_ownership
|
set_data_ownership
|
||||||
|
|
||||||
# Ключ шифрования бэкапов тоже сохраняем: иначе старые бэкапы не прочитать.
|
# Ключ шифрования бэкапов тоже сохраняем: иначе старые бэкапы не прочитать.
|
||||||
|
# Генерация требует age-keygen, который ставится позже (install_packages),
|
||||||
|
# поэтому при отсутствии утилиты ключ создаст ensure_age_key.
|
||||||
AGE_KEY_FILE="${GLCHAT_DATA_DIR}/backups/age-key.txt"
|
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 [ ! -f "$AGE_KEY_FILE" ]; then
|
||||||
|
if ! have age-keygen; then
|
||||||
|
warn "age-keygen не установлен: ключ бэкапов создадим после установки пакетов"
|
||||||
|
AGE_RECIPIENT=""
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
generate_age_key "$AGE_KEY_FILE"
|
generate_age_key "$AGE_KEY_FILE"
|
||||||
fi
|
fi
|
||||||
chmod 600 "$AGE_KEY_FILE"
|
if [ -f "$AGE_KEY_FILE" ]; then
|
||||||
AGE_RECIPIENT="$(grep -o 'age1[0-9a-z]*' "$AGE_KEY_FILE" | head -1 || true)"
|
chmod 600 "$AGE_KEY_FILE" 2>/dev/null || true
|
||||||
if [ -z "$AGE_RECIPIENT" ] && have age-keygen; then
|
recipient="$(grep -o 'age1[0-9a-z]*' "$AGE_KEY_FILE" | head -1 || true)"
|
||||||
AGE_RECIPIENT="$(age-keygen -y "$AGE_KEY_FILE" </dev/null 2>/dev/null || true)"
|
|
||||||
fi
|
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-ключ: бэкапы будут без шифрования"
|
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
|
fi
|
||||||
ok "age-ключ бэкапов: ${AGE_KEY_FILE}"
|
ok "age-ключ бэкапов: ${AGE_KEY_FILE}"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user