diff --git a/RESTORE_VALIDATION.md b/RESTORE_VALIDATION.md new file mode 100644 index 0000000..3b8e175 --- /dev/null +++ b/RESTORE_VALIDATION.md @@ -0,0 +1,88 @@ +# Gitea Helm Chart And Restore Validation + +Дата проверки: 2026-05-06 + +## Что входит в чарт + +Чарт расположен в `gitea/.helm` и ставится как release `gitea` в namespace `gitea`. + +- Gitea `gitea/gitea:1.22.6`. +- Gitea runner `gitea/act_runner:0.2.11`. +- PostgreSQL через dependency `postgresql-preprod:16.4.8` из `cr.yandex/crp3ccidau046kdj8g9q/charts/postgresql-preprod`. +- `universal-chart:0.1.9` используется для runner. +- Для Gitea используется статический Deployment template, потому что нужны sidecar containers для файлового backup без Multi-Attach PVC. +- Ingress/VirtualService в чарте нет, внешний routing остается в отдельном чарте. +- Чувствительные значения не лежат в `values.yaml`; секреты берутся из `gitea-secret`/`postgresql-secret`, шаблон секрета использует `lookup` и generated fallback values. + +## Backup + +Файлы Gitea backup: + +- Реализованы sidecar containers в pod Gitea. +- `gitea-files-archive` читает `/data` read-only и собирает архив во временный `emptyDir`. +- `gitea-files-upload` отправляет архив в S3. +- Такой режим не монтирует `gitea-data` во второй pod и не ловит Multi-Attach на RWO PVC. + +PostgreSQL backup: + +- В чарте есть `CronJob/gitea-postgresql-backup`. +- Dump создается через `pg_dump` пользователем `gitea`. +- Upload идет в S3 через `amazon/aws-cli:2.15.57`. + +Использованные S3 keys: + +- Files: `gitops-backups/gitea-files/gitea-files-2026-05-06-145356.tar.gz` +- PostgreSQL: `gitops-backups/postgresql/gitea-postgresql-2026-05-06-145822.sql.gz` + +## Restore + +Restore запускается через `helm upgrade --install` с отдельным values-файлом: + +- `restore.enabled=true` +- `restore.files.enabled=true` +- `restore.postgresql.enabled=true` +- `restore.s3.giteaFilesKey=` +- `restore.s3.postgresqlDumpKey=` + +Restore hook делает: + +- scale down Deployment `gitea`; +- скачивание backup archives из S3; +- очистку `/data` и распаковку файлового backup; +- drop schema `public` в базе `gitea`; +- restore SQL dump через пользователя `gitea`; +- verification количества public tables и core tables; +- scale up Deployment `gitea`. + +## Проверка + +Проверено на `yc-infra-prod`, namespace `gitea`. + +- Release `gitea` установлен заново после полной очистки namespace/PVC/PV. +- Pods после чистой установки: `gitea`, `gitea-ci-worker`, `postgresql-0`. +- Создан admin user `bootstrap`. +- Создан access token для API/git push. +- В свежий Gitea запушен репозиторий `bootstrap/gitea`. +- В репозиторий добавлен workflow `.gitea/workflows/trash-ci.yaml`. +- Runner зарегистрирован через generated registration token. +- Runner объявился с labels `linux-amd64` и `linux-shell`. +- CI task по `bootstrap/gitea` был принят runner. +- Тестовые файлы для restore созданы в `/data/backup-test` и `/data/gitea/custom/backup-test`. +- Файловый backup отправлен в S3. +- PostgreSQL backup вручную запущен из существующего `CronJob/gitea-postgresql-backup`. +- Restore запущен через `helm upgrade --install`. +- Restore job завершился успешно. +- Verification restore job: `110 public tables`, `3 core tables`. +- После restore Gitea API вернул `bootstrap/gitea|main`. +- После restore на PVC найдены: + - `/data/backup-test/blob.bin` + - `/data/backup-test/generated-at.txt` + - `/data/gitea/custom/backup-test/marker.txt` + - `/data/git/repositories/bootstrap/gitea.git` +- После restore в базе: + - `users=1` + - `repos=1` + - repository `bootstrap/gitea` + - action runs `1` и `2` + +Итог: полный цикл install, runner, CI, backup files, backup PostgreSQL и restore из S3 проверен.