diff --git a/deploy/install.sh b/deploy/install.sh index e487251..77ec7cc 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -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 || 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 || 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}" }