# Environment file for ops/backup-forgejo.sh (Forgejo code + DB backup, #2203). # # Install on the prod VM as a ROOT-OWNED, chmod-600 file that is NOT in git: # sudo cp /opt/gendesign/ops/gendesign-backup-forgejo.default.example /etc/default/gendesign-backup-forgejo # sudo chmod 600 /etc/default/gendesign-backup-forgejo # sudo $EDITOR /etc/default/gendesign-backup-forgejo # fill in real S3 credentials # # DELIBERATELY a separate file from /etc/default/gendesign-backup (used by # ops/backup.sh and tradein-mvp/deploy/backup-tradein-db.sh) — this backup # uses a SEPARATE, narrower-scoped S3 service user that can ONLY PutObject # under s3://gendsgn-backups/forgejo/*, nothing else. The prod-host writer # key used by the other two backups (`gendsgn-backup-writer`) has root-of- # bucket access; that key must NOT be reused here, and this key must NOT be # put in /etc/default/gendesign-backup. # # THE KEY DOES NOT EXIST YET (as of #2203). Until a human creates the # `gendsgn-backup-forgejo-writer` service user + bucket policy in the # Selectel panel (see the #2203 PR description for the exact policy JSON — # PutObject-only on arn:aws:s3:::gendsgn-backups/forgejo/*, explicit Deny on # GetObject/ListBucket/Delete*) and fills in the four FORGEJO_S3_* vars # below, ops/backup-forgejo.sh refuses to run and exits non-zero loudly. That # is expected, not a bug. # # --- S3 off-site upload (Selectel S3-compatible). All four required. --- #FORGEJO_S3_ENDPOINT=https://s3.ru-1.storage.selcloud.ru #FORGEJO_S3_BUCKET=gendsgn-backups #FORGEJO_S3_ACCESS_KEY=REPLACE_WITH_REAL_ACCESS_KEY_ONCE_CREATED #FORGEJO_S3_SECRET_KEY=REPLACE_WITH_REAL_SECRET_KEY_ONCE_CREATED # --- optional overrides (defaults are sensible; uncomment only to change) --- #FORGEJO_S3_PREFIX=forgejo/ # key prefix inside the bucket; must match # the policy's Resource path exactly #KEEP=7 # how many recent local copies to retain # (DB dumps and repo bundles are separate series) #MIN_DB_DUMP_BYTES=2048 # sanity floor for the DB dump (small DB — # config/issues/PRs/users, no git blobs) #MIN_REPOS_BUNDLE_BYTES=10240 # sanity floor for the repo tar.gz #LOCAL_BACKUP_DIR=/opt/gendesign/backups/forgejo #FORGEJO_DIR=/home/gendesign/forgejo # Forgejo compose dir on the VM (NOT # part of the gendesign git checkout) #FORGEJO_REPOS_DIR=/home/gendesign/forgejo/data/forgejo/git/repositories # --- контейнер с БД Forgejo (#3061) --- # ЗАДАВАТЬ НЕ НУЖНО почти никогда: ops/backup-forgejo.sh находит контейнер сам. # Он перебирает PG_CONTAINER_CANDIDATES, оставляет запущенные и берёт тот, в # чьей базе `forgejo` реально ЕСТЬ ТАБЛИЦЫ. # # ПОЧЕМУ НЕ КОНСТАНТА. Раньше имя было зашито (gendesign-postgres-1 — общий # кластер основного приложения). Переезд продукта на Selectel переносит базу # forgejo оттуда в лёгкий инфраструктурный кластер (gendesign-infra-postgres, # сервис infra-postgres в docker-compose.prod.yml), а старый контейнер после # переноса какое-то время ещё жив и держит свою — с этого момента протухающую — # копию базы. Зашитое имя означало бы, что бэкап продолжает исправно дампить # именно её: дамп непустой, маркер завершения на месте, размер выше порога — и # ни одной новой строки с момента cutover. Порогов на СВЕЖЕСТЬ здесь нет, так # что выяснилось бы это только при восстановлении. # # КОГДА ЗАДАВАТЬ ЯВНО — ровно один случай: окно переезда, когда непустая база # forgejo есть СРАЗУ В ДВУХ запущенных контейнерах. Автоопределение тогда не # гадает, а останавливается с ошибкой (выбрать наугад = 50% шанс забэкапить # труп) и ждёт прямого указания, какой контейнер боевой. Момент, с которого это # нужно, наступает НЕ на cutover'е, а РАНЬШЕ — с первой же заливки дампа в новый # кластер (шаг 3a в комментарии к сервису infra-postgres, # docker-compose.prod.yml): с этой секунды кандидатов двое, и ночной бэкап # git-хоста иначе просто не снимется. Поэтому значение здесь живёт двумя фазами: # до cutover'а — боевой ещё старый кластер: #PG_CONTAINER=gendesign-postgres-1 # после — новый: #PG_CONTAINER=gendesign-infra-postgres # Строку УБРАТЬ, как только старый контейнер погашен: дальше автоопределение # снова однозначно и переживёт любое следующее переименование само. # # Явное значение берётся КАК ЕСТЬ, без проверок — это ручной override, и тот, # кто его выставил, знает про свою инсталляцию больше. Пустое значение # (PG_CONTAINER=) равносильно незаданному: включается автоопределение. # Где искать, когда PG_CONTAINER пуст. Имена через пробел; КАВЫЧКИ ОБЯЗАТЕЛЬНЫ — # файл читается через `source`, и без них второе имя bash попытается выполнить # как команду. Трогать только если контейнеры называются иначе, чем здесь. #PG_CONTAINER_CANDIDATES="gendesign-postgres-1 gendesign-infra-postgres"