From f52601de416d514cb559e2e56a8cb11bf6f98fd6 Mon Sep 17 00:00:00 2001 From: lekss361 Date: Mon, 24 Aug 2026 03:49:58 +0000 Subject: [PATCH] =?UTF-8?q?feat(ops):=20=D0=B1=D1=8D=D0=BA=D0=B0=D0=BF?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D1=83?= =?UTF-8?q?=D1=80=D0=B0=D1=86=D0=B8=D1=8E=20Forgejo,=20=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=81=D0=BE=D0=B4=D0=B5=D1=80=D0=B6=D0=B8=D0=BC=D0=BE?= =?UTF-8?q?=D0=B5=20(#3073)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ops/backup-forgejo.sh | 52 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/ops/backup-forgejo.sh b/ops/backup-forgejo.sh index 11d4ce47..6c3d98cf 100755 --- a/ops/backup-forgejo.sh +++ b/ops/backup-forgejo.sh @@ -166,8 +166,56 @@ fi log "Repo bundle OK: ${repos_out} ($(du -h "$repos_out" | cut -f1), ${repos_bytes} bytes)" -# --- 3. upload to S3 (mandatory — see guard 0 above) --- -for f in "$db_out" "$repos_out"; do +# --- 3. config bundle (#2203 follow-up) --- +# ПОЧЕМУ ЭТО ОТДЕЛЬНЫЙ АРТЕФАКТ. Бэкап забирал БД и голые репозитории — то есть +# СОДЕРЖИМОЕ Forgejo, но не то, ЧЕМ оно поднимается. Компоуз-файлы Forgejo и +# раннеров живут в /home/gendesign/forgejo/, вне репозитория (проверено: +# `git rev-parse` там отвечает "not a git repository"), их не трогает ни один +# деплой и не покрывал ни один бэкап. +# +# Практический смысл: при потере хоста БД и репозитории восстанавливаются, а +# КОНФИГУРАЦИЯ — нет. Пришлось бы вручную воссоздавать docker-compose.yml и +# заново регистрировать три раннера. Файлы крошечные (~5 КБ на оба), так что +# цена включения нулевая, а цена отсутствия — ручная реконструкция в худший +# момент. +# +# Косвенное подтверждение, что каталог правится руками и без истории: рядом +# лежат runner-compose.yml.bak, .bak.1779049805, .bak.before-runner3 — три +# самодельных снимка вместо version control. +# +# ЧТО НАМЕРЕННО НЕ ВКЛЮЧЕНО: +# .env (режим 600) и runner*/data/ с регистрационными токенами — секреты. +# Они остаются ручным off-box пунктом владельца, тем же, что .env.runtime +# в приёмке #2203. Раннеры при восстановлении перерегистрируются из UI за +# пару минут; компоуз-файл руками не восстановишь. +config_out="${LOCAL_BACKUP_DIR}/forgejo-config_${ts}.tar.gz" +log "Bundling Forgejo compose config from ${FORGEJO_DIR} -> ${config_out}" + +# -C + явные имена, а не путь целиком: в архиве оказываются только те файлы, +# что перечислены, без каталога data/ (он огромен и уже покрыт repo-бандлом). +if ! tar -czf "$config_out" -C "$FORGEJO_DIR" \ + --exclude='.env' \ + $(cd "$FORGEJO_DIR" && ls *.yml 2>/dev/null) 2>/dev/null; then + log "WARN: не удалось собрать config-бандл — продолжаю без него" >&2 + rm -f "$config_out" + config_out="" +fi + +if [[ -n "$config_out" ]]; then + # Порог намеренно низкий: файлы и правда маленькие. Проверяем не «объём», а + # «архив собрался и читается» — те же две проверки, что у repo-бандла. + config_bytes=$(wc -c < "$config_out" | tr -d ' ') + if (( config_bytes < 200 )) || ! tar -tzf "$config_out" >/dev/null 2>&1; then + log "WARN: config-бандл подозрителен (${config_bytes} байт / не читается) — не выгружаю" >&2 + rm -f "$config_out" + config_out="" + else + log "Config bundle OK: ${config_out} (${config_bytes} байт, файлов: $(tar -tzf "$config_out" | wc -l))" + fi +fi + +# --- 4. upload to S3 (mandatory — see guard 0 above) --- +for f in "$db_out" "$repos_out" ${config_out:+"$config_out"}; do key="${FORGEJO_S3_PREFIX%/}/$(basename "$f")" log "Uploading to s3://${FORGEJO_S3_BUCKET}/${key}" # Same AWS_CA_BUNDLE fix as ops/backup.sh / backup-tradein-db.sh — aws-cli