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>
5.4 KiB
Forgejo как primary git
GitHub из KZ периодически роняет TCP (см. network_github_flaky.md). Чтобы push/pull не превращались в лотерею, на стейдж-сервере поднят Forgejo — self-hosted git-сервис (форк Gitea), он работает локально и не зависит от upstream-флапов. GitHub продолжает жить как зеркало (для видимости, CI-интеграций, бэкапа).
Адреса
- Web UI: https://git.zat.kz (после certbot; до этого — http:// если DNS уже указан)
- Git HTTPS: https://git.zat.kz/nns/food-market.git
- Git SSH:
ssh://git@git.zat.kz:2222/nns/food-market.git
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 сreposcope, читает mirror-скрипт) - локальное зеркало для push в github:
/opt/food-market-data/forgejo/mirror(bare repo)
Что ещё нужно от вас (разовое)
- DNS A-запись
git.zat.kz → 88.204.171.93(основной IP сервера). - После того как DNS прорастёт:
Certbot выпустит TLS-сертификат и обновит nginx-конфиг (добавит блок 443 + редирект 80→443).sudo certbot --nginx -d git.zat.kz - Записать пароль администратора: файл
/tmp/forgejo-admin.txt(создан при первой установке, надо скопировать себе в хранилище паролей и удалить с сервера).
Обратный путь
Если Forgejo сломается и нужно срочно пушить напрямую в GitHub:
git push github main
GitHub — полная копия (mirror-таймер гонит всё: branches + tags). Рабочий флоу не ломается.