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
|
||||
|
||||
# Ключ шифрования бэкапов тоже сохраняем: иначе старые бэкапы не прочитать.
|
||||
# Генерация требует 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}"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user