GitBackup: One-liner per backuppare tutte le tue repo GitHub

Nerd Level: 2/5
GitBackup: One-liner per backuppare tutte le tue repo GitHub

GitHub Non È Un Backup

Non che github vada in down, anche se può succedere, come può succedere che l’account venga bloccato. TUtto può capitare, anche di cancellare la repo per sbaglio. Sull’onda di sbattimenti che altri miei amici hanno, ho pensato perché non mettere in piedi una logica molto semplice; un programmino che legga le tue repo su github (sì sono un fanboy) e le tiri tutte giù, o almeno una parte, magari a cron. Il progetto è ancora in… progettazione, ma penso di metterlo a terra entro fine anno.


GitBackup: Setup in 60 Secondi

One-liner install: uno scriptino che scarica l’install e fa le due o tre domande necesarie per far partire il backup.

curl -sSL https://raw.githubusercontent.com/giobi/gitbackup/main/install.sh | bash

Cosa fa:

  1. Clone repo gitbackup nella directory scelta
  2. Setup interattivo (GitHub token + opzionale Telegram)
  3. Configura cron per backup automatico (default 2am daily)
  4. Esegue primo backup immediatamente

Dopo 60 secondi: Hai tutte le tue repo GitHub clonate localmente + cron attivo.


Features

1. Clone o Pull Automatico

Per ogni repo nel tuo account GitHub:

  • Se non esiste localmente → clone
  • Se esiste → pull (aggiorna)
✅ Cloned: giobi/circus (new repo)
✅ Pulled: giobi/sgravoquest (already existed)
✅ Pulled: giobi/innesto (already existed)

2. Storage Tracking

📊 Storage Report:
   Total: 2.3 GB
   Largest repo: circus (1.1 GB)

⚠️  Large repos (>500 MB):
   - circus: 1.1 GB
   - giobicom: 687 MB

Sai quanto spazio serve per i backup, quali repo sono gonfie.

3. Stale Repos Detection

Se siete come me o anche peggio ci sono decine di repository che vengono dimenticati e rimangono lì, non ha un gran senso stare ad aggiornarle continuamente probabilmente.

⏰ Stale repos (no commits in 6+ months):
   - old-project (last commit: 2024-03-15)
   - archived-site (last commit: 2023-11-20)

4. Telegram Notifications (Opzionali)

🔄 GitBackup started
   Repos found: 42

✅ GitBackup completed
   Cloned: 2 new repos
   Updated: 40 repos
   Failed: 0
   Total size: 2.3 GB
   Duration: 3m 24s

Sono fan della facilità con cui è possibile fare un bot telegram, ne abuso per diversi tipi di notifiche.

È opzionale durante setup.sh, basta bot token + chat ID.

5. Logging Completo

cat logs/gitbackup.log
[2025-11-16 02:00:01] Backup started
[2025-11-16 02:00:02] Found 42 repositories
[2025-11-16 02:00:05] ✅ circus: pulled (3 new commits)
[2025-11-16 02:00:08] ✅ sgravoquest: pulled (up to date)
...
[2025-11-16 02:03:25] Backup completed: 42 repos, 2.3 GB

Utile per debug, per capire cosa è successo durante backup notturno. Non è così divertente quando qualcosa non funziona e non sai perché.


Setup Interattivo

Lo script setup.sh ti chiede:

  1. GitHub Token (obbligatorio)
    • Crea su https://github.com/settings/tokens
    • Scope richiesto: repo (full control)
  2. GitHub Username (default: dedotto da token)

  3. Backup Directory (default: ./backup)

  4. Telegram Bot Token (opzionale - premi Enter per skip)

  5. Telegram Chat ID (opzionale)

  6. Cron Schedule (default: 0 2 * * * = 2am daily)

Genera env.json con permessi 600 (solo tu puoi leggerlo).

Security: Token GitHub NON committato in Git (.gitignore).


Backup Manual Run

Puoi anche scegliere di lanciare il backup a mano, ovviamente.

cd /home/web/gitbackup
./backup.sh

Output:

🔄 GitBackup - Manual Run
📂 Backup directory: /home/web/gitbackup/backup
🔍 Fetching repositories...

Found 42 repositories

✅ circus: pulled (3 new commits)
✅ sgravoquest: up to date
✅ innesto: up to date
...

📊 Storage Report:
   Total: 2.3 GB
   Largest: circus (1.1 GB)

✅ Backup completed in 3m 24s

Restore da Backup

Il lato davvero utile, oltre a sapere che la tua roba rimane salvata in diversi posti del mondo, è poterla ripristinare.

Scenario: Hai cancellato per sbaglio repo myproject da GitHub.

Restore:

cd /home/web/gitbackup/backup/myproject
git remote -v
# origin  https://github.com/giobi/myproject.git (fetch)

# Ricrea repo su GitHub, poi:
git push origin main --force

Fatto: Repo ripristinata completamente.


Dipendenze

Praticamente nessuna. Serve solo:

  • ✅ Bash
  • ✅ Git
  • ✅ cURL (per setup one-liner)
  • ✅ jq (per parsing JSON GitHub API)

Installazione jq (se manca):

# Debian/Ubuntu
sudo apt install jq

# macOS
brew install jq

Cost & Performance

Teniamo presente che github ha un throttle di richieste, e per questo può avere senso sfasare i backup in orari diversi.

GitHub API Rate Limit: 5000 requests/hour (autenticato).

Stima:

  • 50 repos × 2 requests/repo = 100 requests
  • Tempo: ~3-5 minuti per 50 repos
  • Network: dipende da dimensione repos (primo clone pesante, poi solo delta)

Storage needed:

  • Esempio: 42 repos, totale 2.3 GB
  • Consigliato: SSD con almeno 5-10 GB free per crescita

Comparison: GitBackup vs Alternative

Tool GitBackup BackHub Duplicati
Setup 60 secondi one-liner Account paid Config complessa
Cost FREE $7/mese FREE
Dependencies Bash + Git + jq SaaS GUI app
Automation Cron native Cloud schedule App schedule
Telegram ✅ Built-in
Open Source

Verdict: GitBackup per chi vuole soluzione self-hosted, zero-cost, minimal dependencies.


Future Enhancements

Possibili feature future (PR welcome):

  • Git LFS auto-detection + pull automatico
  • Submodules support con --recursive
  • Cloud sync opzionale (S3, Google Drive, Dropbox)
  • Healthchecks.io integration per monitoring uptime

Source & Docs

GitHub: https://github.com/giobi/gitbackup

License: MIT


Next step: Prova l’installer, lascia feedback su GitHub Issues. 🚀