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>
41 lines
1.5 KiB
Bash
Executable file
41 lines
1.5 KiB
Bash
Executable file
#!/bin/bash
|
|
# Mirrors our Forgejo repo into GitHub. Best-effort: if the push fails (flaky
|
|
# KZ TCP to github.com), the next tick will retry.
|
|
set -euo pipefail
|
|
|
|
MIRROR_DIR="/opt/food-market-data/forgejo/mirror"
|
|
FORGEJO_URL="http://127.0.0.1:3000/nns/food-market.git"
|
|
GITHUB_URL="https://github.com/nurdotnet/food-market.git"
|
|
GITHUB_TOKEN_FILE="/etc/food-market/github-mirror-token" # 40-char PAT with repo scope
|
|
LOG_FILE="/var/log/food-market-forgejo-mirror.log"
|
|
|
|
log() { printf '%s %s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$*" >> "$LOG_FILE"; }
|
|
|
|
if [[ ! -f $GITHUB_TOKEN_FILE ]]; then
|
|
log "token file $GITHUB_TOKEN_FILE missing — skipping mirror push"
|
|
exit 0
|
|
fi
|
|
TOKEN=$(tr -d '\n' < "$GITHUB_TOKEN_FILE")
|
|
|
|
if [[ ! -d $MIRROR_DIR/objects ]]; then
|
|
log "bootstrap: cloning $FORGEJO_URL → $MIRROR_DIR"
|
|
rm -rf "$MIRROR_DIR"
|
|
git clone --mirror "$FORGEJO_URL" "$MIRROR_DIR" >> "$LOG_FILE" 2>&1
|
|
fi
|
|
|
|
cd "$MIRROR_DIR"
|
|
|
|
# Pull latest from Forgejo (source of truth).
|
|
if ! git remote update --prune >> "$LOG_FILE" 2>&1; then
|
|
log "forgejo fetch failed — aborting this tick"
|
|
exit 0
|
|
fi
|
|
|
|
# Push everything to GitHub, timeout generously (big pushes on flaky link).
|
|
GIT_HTTP_LOW_SPEED_LIMIT=1000 \
|
|
GIT_HTTP_LOW_SPEED_TIME=60 \
|
|
timeout 300 git push --prune "https://x-access-token:$TOKEN@github.com/nurdotnet/food-market.git" \
|
|
'+refs/heads/*:refs/heads/*' '+refs/tags/*:refs/tags/*' >> "$LOG_FILE" 2>&1 \
|
|
&& log "pushed to github ok" \
|
|
|| log "github push failed (exit=$?), will retry next tick"
|