From ac2b2cb18ad594e98b13efb1f22f281377fb1bb2 Mon Sep 17 00:00:00 2001 From: grendervill Date: Sat, 19 Sep 2026 22:11:31 +0300 Subject: [PATCH] =?UTF-8?q?fix(install):=20=D0=BA=D0=BB=D1=8E=D1=87=20?= =?UTF-8?q?=D1=88=D0=B8=D1=84=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF=D0=BE=D0=B2=20=D1=81=D0=BE=D0=B7?= =?UTF-8?q?=D0=B4=D0=B0=D1=91=D1=82=D1=81=D1=8F=20=D0=BF=D0=BE=D1=81=D0=BB?= =?UTF-8?q?=D0=B5=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8?= =?UTF-8?q?=20age?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit На чистой машине age-keygen появляется только на шаге install_packages, поэтому генерация ключа в generate_secrets падала, а chmod на несуществующий файл валил установку. Теперь ensure_age_key вызывается после установки пакетов, безопасно пропускает chmod и обновляет AGE_RECIPIENT в .env. Регрессия найдена прогоном scripts/test-install.sh в контейнере. --- deploy/install.sh | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) 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}" }