# 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). Рабочий флоу не ломается.