GitHub er praktisk helt til kontoen din blir låst, en org blir slettet, eller tjenesten ligger nede når du trenger den mest. Alt du har av kildekode, issues og historikk ligger da hos noen andre. Løsningen er enkel: speil alt hjem til en git-server du eier selv. Her setter jeg opp Gitea på egen Proxmox og speiler samtlige repos automatisk hver 8. time.
Hvorfor speile i det hele tatt
En ekstern git-tjeneste er greit som primær, men dårlig som eneste kopi. Det som faktisk skjer i praksis:
- Konto låst eller suspendert. Feilaktig flagging skjer, og da er alt borte til supporten svarer.
- Feiltrykk. En force-push eller et slettet repo forsvinner uten forvarsel.
- Nedetid. GitHub er nede akkurat når du skal deploye.
- Offline tilgang. Du sitter uten internett og trenger et gammelt prosjekt.
En lokal speiling løser alle fire. Koden ligger på din egen maskin, oppdateres av seg selv, og blir med i den vanlige backuprutinen din.

To LXC-er: Gitea og gitea-mirror
Oppsettet er delt i to. Gitea er selve git-serveren. gitea-mirror er en liten tjeneste som snakker med GitHub-API-et, oppdager repoene dine og oppretter dem i Gitea som pull-mirrors. Begge kjører som egne containere på Proxmox. Jeg brukte community-scripts sine LXC-hjelpere, som setter opp en ferdig container på et par minutter.
Hjelperne er interaktive med whiptail-dialoger, men de kan kjøres ikke-interaktivt rett fra SSH ved å sette 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 resept for ct/gitea-mirror.sh. Tyngre builds (bun, npm) tar over to minutter. Kjør dem frakoblet med nohup ... & og følg loggen, ikke i en direkte SSH-økt.
Etter installasjon: åpne Gitea på http://192.168.1.147:3000, kjør install-veiviseren og lag en admin-konto. Velg SQLite som database. For hjemmebruk trenger du 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 i tillegg et access-token inne i Gitea (Settings, Applications) med skrivetilgang, slik at gitea-mirror kan opprette repos på serversiden.
Konfigurer speilingen
Logg inn i gitea-mirror på http://192.168.1.135:4321 og fyll inn de to sidene. GitHub: brukernavn og token, og huk av for å inkludere private repos. Gitea: URL, token og brukernavn. Tre innstillinger er de viktige:
- mirror=true (pull-mirror). Da fortsetter Gitea å hente fra GitHub på egen hånd, ikke bare én gang ved import.
- Intervall 8 timer. Ferskt nok for meg. Sett det du vil i sekunder (
28800). - autoMirror. Nye repos på GitHub speiles automatisk uten at du må gjøre noe.
Vil du styre det headless, eksponerer gitea-mirror et REST-API (better-auth). Logg inn med POST /api/auth/sign-in/email, ta vare på session-cookien, og send konfigurasjonen som JSON til POST /api/config etterfulgt av POST /api/sync. Nyttig når du vil ha hele oppsettet i et script.
Sett alt privat i Gitea
Dette er lett å gå i baret på. Speiler du et public GitHub-repo rett inn, blir det public i Gitea også, og da har du plutselig en ny offentlig kopi av koden din på en adresse du kanskje eksponerer. Tving derfor visibility til private for alle speil. Hos meg endte 56 repos (41 private og 15 public på GitHub) opp som 56 private pull-mirrors i Gitea. Speilingen skal gi deg redundans, ikke en lekkasje.
Backup av speilet
En lokal kopi som ikke sikkerhetskopieres er bare en kopi til som kan ryke. Begge containerne står med all 1 i Proxmox sine vzdump-jobber, så de tas nattlig sammen med resten. Gitea-dataene er en enkelt SQLite-fil under /var/lib/gitea, så en vanlig container-dump får med alt. Da er du oppe i tre kopier: GitHub, Gitea hjemme, og NAS-backupen. Det er 3-2-1-regelen uten ekstra arbeid.
Verifiser at det virker
Trigger en sync fra gitea-mirror, sjekk at repolista fylles opp i Gitea, og bekreft at du faktisk kan klone lokalt:
git clone http://192.168.1.147:3000/Trond/mitt-repo.git
cd mitt-repo && git log --oneline -5
Får du historikken tilbake, er speilet ekte og ikke bare en tom skallkopi. Neste gang GitHub er nede eller kontoen henger, er det et ikke-problem. Koden ligger hjemme, oppdatert for maks 8 timer siden, og med i backupen.


