food-market/docs/forgejo.md
nurdotnet afbf01304a
Some checks failed
CI / Backend (.NET 8) (push) Waiting to run
CI / Web (React + Vite) (push) Waiting to run
CI / POS (WPF, Windows) (push) Waiting to run
Docker Images / API image (push) Failing after 15s
Docker Images / Web image (push) Failing after 2s
ops: Forgejo on git.zat.kz as primary, GitHub as mirror
Pushing straight to GitHub from KZ is a lottery — TCP to github.com
times out often enough that git push becomes a flake. Fix: Forgejo runs
on the stage server (sqlite, single container), all pushes go there
first (local network, always reliable), a systemd timer mirrors the
whole repo into GitHub every 10 minutes so GitHub stays up-to-date as
a backup + CI source.

What's committed here is the infra-as-code side:
- deploy/forgejo/docker-compose.yml — Forgejo 7 on :3000 (HTTP) and :2222 (SSH)
- deploy/forgejo/food-market-forgejo.service — systemd unit that drives compose
- deploy/forgejo/mirror-to-github.sh + mirror timer/service — push to GH every 10 min
- deploy/forgejo/nginx.conf — vhost for git.zat.kz (certbot to be run once DNS is set)
- docs/forgejo.md — how to clone/push, operations, what's left for the user (DNS + certbot)

GitHub Actions CI is untouched: commits land on GitHub via the mirror
and the self-hosted runner picks them up as before.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 12:27:45 +05:00

5.4 KiB
Raw Blame History

Forgejo как primary git

GitHub из KZ периодически роняет TCP (см. network_github_flaky.md). Чтобы push/pull не превращались в лотерею, на стейдж-сервере поднят Forgejo — self-hosted git-сервис (форк Gitea), он работает локально и не зависит от upstream-флапов. GitHub продолжает жить как зеркало (для видимости, CI-интеграций, бэкапа).

Адреса

SSH-порт 2222 (хостовой 22 занят системным sshd).

Первый раз с Mac/iPhone

1. Добавить remote

В локальной копии food-market:

# оставляем github как origin (привычно), добавляем forgejo как primary
git remote add forgejo ssh://git@git.zat.kz:2222/nns/food-market.git

# либо делаем forgejo основным и github запасным:
git remote rename origin github
git remote add origin ssh://git@git.zat.kz:2222/nns/food-market.git
git branch --set-upstream-to=origin/main main

Клонировать с нуля:

git clone ssh://git@git.zat.kz:2222/nns/food-market.git

2. SSH-ключ

На Forgejo в Settings → SSH/GPG Keys → Add Key добавить публичный ключ (~/.ssh/id_ed25519.pub с Mac, либо через Working Copy на iPhone — Settings → Key Management → Generate/Export Public Key).

3. Обычный цикл

git pull                              # (или git pull forgejo main)
# ...работа...
git commit -am "…"
git push                              # мгновенно, внутри ДЦ

Как это связано с GitHub

  • push → Forgejo: primary, мгновенный.
  • Forgejo → GitHub раз в 10 минут пушится автоматически сервисом food-market-forgejo-mirror.timer. Если GitHub недоступен — следующий тик повторит. Cкрипт: /usr/local/bin/food-market-forgejo-mirror.sh, лог /var/log/food-market-forgejo-mirror.log.
  • CI: GitHub Actions на self-hosted runner'е (уже настроено). Запускается от коммитов, пришедших через зеркало. Если когда-нибудь понадобится CI на Forgejo'ых Actions — docs/forgejo-actions.md (пока не настроено).

То есть рабочий флоу: пуш в Forgejo → через ≤10 мин коммит в GitHub → триггер CI → деплой.

Эксплуатация

# состояние
sudo systemctl status food-market-forgejo.service            # контейнер Forgejo
sudo systemctl status food-market-forgejo-mirror.timer       # расписание зеркала
sudo systemctl status food-market-forgejo-mirror.service     # последняя попытка зеркала
tail -f /var/log/food-market-forgejo-mirror.log              # живой лог зеркала

# прогнать зеркало прямо сейчас (не дожидаясь таймера)
sudo systemctl start food-market-forgejo-mirror.service

# рестарт Forgejo (редко нужно)
sudo systemctl restart food-market-forgejo.service

Раскладка

  • docker-compose: deploy/forgejo/docker-compose.yml (образ codeberg.org/forgejo/forgejo:7, sqlite, SSH через OpenSSH образа)
  • systemd unit Forgejo: /etc/systemd/system/food-market-forgejo.service (copy в deploy/forgejo/)
  • mirror script: /usr/local/bin/food-market-forgejo-mirror.sh (copy в deploy/forgejo/mirror-to-github.sh)
  • mirror timer/service: food-market-forgejo-mirror.{timer,service} (copy в deploy/forgejo/)
  • nginx vhost: /etc/nginx/conf.d/git.zat.kz.conf (copy в deploy/forgejo/nginx.conf)
  • data: /opt/food-market-data/forgejo/data (sqlite + repos + ssh host keys)
  • конфиг Forgejo: /opt/food-market-data/forgejo/data/gitea/conf/app.ini
  • GitHub mirror token: /etc/food-market/github-mirror-token (PAT с repo scope, читает mirror-скрипт)
  • локальное зеркало для push в github: /opt/food-market-data/forgejo/mirror (bare repo)

Что ещё нужно от вас (разовое)

  1. DNS A-запись git.zat.kz → 88.204.171.93 (основной IP сервера).
  2. После того как DNS прорастёт:
    sudo certbot --nginx -d git.zat.kz
    
    Certbot выпустит TLS-сертификат и обновит nginx-конфиг (добавит блок 443 + редирект 80→443).
  3. Записать пароль администратора: файл /tmp/forgejo-admin.txt (создан при первой установке, надо скопировать себе в хранилище паролей и удалить с сервера).

Обратный путь

Если Forgejo сломается и нужно срочно пушить напрямую в GitHub:

git push github main

GitHub — полная копия (mirror-таймер гонит всё: branches + tags). Рабочий флоу не ломается.