Speil alle GitHub-repoene til en selvhostet Gitea

Jeg speiler alle GitHub-repoene mine til en Gitea-server på egen Proxmox. Speilingen går automatisk hver 8. time. Da har jeg kildekode og historikk selv om GitHub-kontoen blir låst, en org blir slettet eller tjenesten er nede.

Hvorfor speile

En ekstern git-tjeneste fungerer som primær, men ikke som eneste kopi. Dette kan skje:

  • Kontoen blir låst eller suspendert etter feilaktig flagging, og alt er utilgjengelig til supporten svarer.
  • En force-push eller et slettet repo fjerner kode uten forvarsel.
  • GitHub er nede akkurat når du skal deploye.
  • Du er uten internett og trenger et gammelt prosjekt.

Et lokalt speil dekker alle fire. Koden ligger på egen maskin, oppdateres automatisk og blir med i den vanlige backupen.

GitHub speiles til selvhostet Gitea via gitea-mirror hver 8. time

To LXC-er: Gitea og gitea-mirror

Gitea er git-serveren. gitea-mirror er en liten tjeneste som leser GitHub-API-et, finner repoene dine og oppretter dem i Gitea som pull-mirrors. Begge kjører som egne containere på Proxmox. Jeg brukte LXC-hjelperne fra community-scripts, som setter opp en container på et par minutter.

Hjelperne bruker interaktive whiptail-dialoger, men kan kjøres ikke-interaktivt over SSH hvis du setter miljøvariabler først:

export TERM=xterm-256color
export mode=default
export var_container_storage=local-zfs
export var_template_storage=local
mkdir -p /usr/local/community-scripts
printf 'DIAGNOSTICS=no\n' > /usr/local/community-scripts/diagnostics
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/gitea.sh)"
Samme framgangsmåte gjelder ct/gitea-mirror.sh. Bygg med bun og npm tar over to minutter. Kjør dem frakoblet med nohup ... & og følg loggen, ikke i en direkte SSH-økt.

Etter installasjonen åpner du Gitea på http://192.168.1.147:3000, kjører installasjonsveiviseren og lager en admin-konto. Velg SQLite som database. Hjemme trengs ingen egen databaseserver.

GitHub-token

gitea-mirror trenger et personal access token for å lese repolista og klone. Et classic-token med disse scopene holder:

repo # tilgang til private repos
read:org # org-medlemskap (valgfritt)
read:user # brukerprofil
Lag også et access-token i Gitea (Settings, Applications) med skrivetilgang, slik at gitea-mirror kan opprette repos der.

Oppsett av speilingen

Logg inn i gitea-mirror på http://192.168.1.135:4321 og fyll ut to sider. GitHub: brukernavn, token og avkrysning for private repos. Gitea: URL, token og brukernavn. Tre innstillinger avgjør resultatet.

Med mirror=true blir repoene pull-mirrors, og Gitea fortsetter å hente fra GitHub selv i stedet for å importere én gang.

Intervallet oppgis i sekunder. Jeg bruker 8 timer (28800).

Med autoMirror blir nye repos på GitHub speilet automatisk.

gitea-mirror har også et REST-API (better-auth) hvis du vil styre det fra et script. Logg inn med POST /api/auth/sign-in/email, ta vare på session-cookien, send konfigurasjonen som JSON til POST /api/config og deretter POST /api/sync.

Sett alle speil til private i Gitea

Et public GitHub-repo blir også public i Gitea når det speiles. Eksponerer du Gitea, har du da en ny offentlig kopi av koden. Sett derfor visibility til private for alle speil. Hos meg ble 56 repos (41 private og 15 public på GitHub) til 56 private pull-mirrors i Gitea.

Backup av speilet

Begge containerne er med i Proxmox sine vzdump-jobber (all 1) og tas nattlig sammen med resten. Gitea-dataene er én SQLite-fil under /var/lib/gitea, så en vanlig container-dump får med alt. Det gir tre kopier: GitHub, Gitea hjemme og NAS-backupen, altså 3-2-1-regelen.

Sjekk at speilet virker

Start en sync fra gitea-mirror, sjekk at repolista fylles i Gitea, og klon et repo lokalt:

git clone http://192.168.1.147:3000/Trond/mitt-repo.git
cd mitt-repo && git log --oneline -5
Viser git log historikken, inneholder speilet de faktiske commitene. Er GitHub nede, ligger koden hjemme, maks 8 timer gammel og med i backupen.