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>
101 lines
5.4 KiB
Markdown
101 lines
5.4 KiB
Markdown
# 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`:
|
||
|
||
```bash
|
||
# оставляем 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
|
||
```
|
||
|
||
Клонировать с нуля:
|
||
|
||
```bash
|
||
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. Обычный цикл
|
||
|
||
```bash
|
||
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 → деплой.
|
||
|
||
## Эксплуатация
|
||
|
||
```bash
|
||
# состояние
|
||
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 прорастёт:
|
||
```bash
|
||
sudo certbot --nginx -d git.zat.kz
|
||
```
|
||
Certbot выпустит TLS-сертификат и обновит nginx-конфиг (добавит блок 443 + редирект 80→443).
|
||
3. Записать пароль администратора: файл `/tmp/forgejo-admin.txt` (создан при первой установке, надо скопировать себе в хранилище паролей и удалить с сервера).
|
||
|
||
## Обратный путь
|
||
|
||
Если Forgejo сломается и нужно срочно пушить напрямую в GitHub:
|
||
```bash
|
||
git push github main
|
||
```
|
||
GitHub — полная копия (mirror-таймер гонит всё: branches + tags). Рабочий флоу не ломается.
|