Self-Hosted Git Server Alternatif GitHub

by Marcus Chen
Self-Hosted Git Server Alternatif GitHub

Bulan lalu gue dapet email dari teman yang panik: repo private-nya di GitHub tiba-tiba di-flag, akun di-suspend sementara, dan dia nggak bisa akses kode production-nya selama hampir 6 jam. Dia bukan satu-satunya — ini kejadian cukup sering, terutama kalau kamu pakai akun free atau region billing yang kadang dianggap suspicious.

Kalau kamu developer solo atau tim kecil yang mulai serius soal kontrol penuh atas kode, self-hosted git server alternatif GitHub adalah langkah yang masuk akal. Bukan berarti GitHub jelek — tapi punya backup infrastruktur sendiri itu beda rasanya.

Artikel ini bakal fokus ke tiga pilihan paling realistis buat dijalanin di VPS: Gitea, Forgejo, dan Soft Serve (buat yang mau bare-minimum). Gue udah nyoba ketiganya, jadi kamu bisa skip bagian trial-and-error yang nyebelin.


Kenapa Self-Host Git Itu Nyebelin (dan Tetap Worth It)

Jujur, setup awal itu ribet. Kamu harus ngurusin:

  • SSL certificate
  • Reverse proxy (Nginx/Caddy)
  • Backup database
  • Update manual tiap ada security patch

Tapi trade-off-nya nyata:

  1. Data kamu, server kamu — nggak ada ToS yang bisa matiin repo kamu tiba-tiba.
  2. Private repo unlimited tanpa bayar per-seat.
  3. CI/CD bisa diintegrasiin langsung ke infrastruktur sendiri (Woodpecker CI, Drone, dll).
  4. Latency lebih rendah kalau servernya di region yang sama sama tim kamu.

Oke, langsung ke setup.


Pilihan 1: Gitea — Paling Populer, Paling Lengkap

Gitea adalah fork dari Gogs yang aktif dikembangin. UI-nya mirip GitHub, ada issue tracker, pull request, webhook, dan bahkan package registry. Cocok buat kamu yang mau pengalaman paling mirip GitHub.

Requirement

  • VPS minimal 1 vCPU, 512MB RAM (tapi 1GB lebih nyaman)
  • Docker + Docker Compose
  • Domain atau subdomain (contoh: git.namakamu.dev)

Setup Gitea dengan Docker Compose

Buat file docker-compose.yml:

version: "3"

networks:
  gitea:
    external: false

services:
  server:
    image: gitea/gitea:1.21.11
    container_name: gitea
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=gantibytesandikuat
    restart: always
    networks:
      - gitea
    volumes:
      - ./gitea:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"
    depends_on:
      - db

  db:
    image: postgres:14
    restart: always
    environment:
      - POSTGRES_USER=gitea
      - POSTGRES_PASSWORD=gantibytesandikuat
      - POSTGRES_DB=gitea
    networks:
      - gitea
    volumes:
      - ./postgres:/var/lib/postgresql/data

Jalanin:

docker compose up -d

Akses http://IP_VPS:3000, ikutin wizard setup pertama. Setelah itu, pasang Caddy sebagai reverse proxy biar dapat HTTPS otomatis:

# /etc/caddy/Caddyfile
git.namakamu.dev {
    reverse_proxy localhost:3000
}

Restart Caddy:

systemctl restart caddy

Done. Gitea kamu udah live dengan HTTPS.

Gotcha Gitea

SSH port conflict. Kalau VPS kamu pakai port 22 buat SSH login, mapping 222:22 di atas bikin git clone via SSH jadi:

git clone ssh://git@git.namakamu.dev:222/username/repo.git

Agak aneh, tapi bisa diakalin dengan config di ~/.ssh/config:

Host git.namakamu.dev
    HostName git.namakamu.dev
    User git
    Port 222

Setelah itu git clone git@git.namakamu.dev:username/repo.git langsung jalan normal.


Pilihan 2: Forgejo — Fork Gitea yang Lebih Community-Driven

Forgejo lahir dari drama governance Gitea tahun 2022 ketika perusahaan di balik Gitea dianggap terlalu mengontrol arah proyek. Forgejo adalah hard fork yang dikelola komunitas, dengan komitmen tetap free dan open source.

Secara fitur, Forgejo hampir identik sama Gitea (karena memang fork-nya). Bedanya ada di:

  • Federasi (ActivityPub) — masih experimental, tapi Forgejo mau jadi bagian dari Fediverse.
  • Governance yang lebih transparan.
  • Release cycle yang kadang lebih cepat untuk security patch.

Setup Forgejo

Hampir sama persis dengan Gitea, tinggal ganti image:

services:
  server:
    image: codeberg.org/forgejo/forgejo:7
    container_name: forgejo
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    volumes:
      - ./forgejo:/data
    ports:
      - "3000:3000"
      - "222:22"

Config database dan reverse proxy sama seperti Gitea. Kalau kamu udah familiar sama Gitea, migrasi ke Forgejo tinggal ganti image dan restore backup.

Kapan Pilih Forgejo vs Gitea?

  • Kalau kamu peduli sama open source governance dan nggak mau locked ke entitas komersial → Forgejo.
  • Kalau kamu mau ekosistem plugin dan integrasi yang lebih mature → Gitea.
  • Kalau tim kamu udah pakai Gitea dan males migrasi → tetap Gitea aja.

Pilihan 3: Soft Serve — Buat yang Mau Bare-Minimum

Soft Serve dari Charmbracelet adalah git server yang dioperasiin full via SSH dan TUI. Nggak ada web UI yang fancy, nggak ada issue tracker. Ini buat kamu yang cuma butuh tempat push/pull repo dengan overhead minimal.

Setup Soft Serve

docker run -d \
  --name soft-serve \
  -v $(pwd)/soft-serve:/soft-serve \
  -p 23231:23231 \
  -e SOFT_SERVE_INITIAL_ADMIN_KEYS="$(cat ~/.ssh/id_ed25519.pub)" \
  charmcli/soft-serve:latest

Tambah repo:

ssh -p 23231 localhost repo create myproject

Clone:

git clone ssh://localhost:23231/myproject

Browse repo via TUI:

ssh -p 23231 localhost

Kamu bakal masuk ke interface terminal yang bisa navigasi repo, lihat log, diff — semua tanpa browser.

Gotcha Soft Serve

Soft Serve nggak ada authentication berbasis password atau token. Semua akses pakai SSH key. Ini bagus dari sisi security, tapi kalau kamu mau kasih akses ke orang lain, kamu harus manage SSH key mereka manual. Buat tim lebih dari 3 orang, ini mulai ribet.


Perbandingan Singkat

Fitur Gitea Forgejo Soft Serve
Web UI ❌ (TUI only)
Pull Request
Issue Tracker
CI/CD built-in ✅ (Gitea Actions)
RAM usage ~150MB ~150MB ~20MB
Setup complexity Medium Medium Low
Federasi Experimental

Strategi Backup yang Wajib Kamu Setup

Self-hosted berarti backup jadi tanggung jawab kamu sendiri. Ini script sederhana buat backup Gitea/Forgejo ke object storage (contoh: Cloudflare R2 atau Backblaze B2):

#!/bin/bash
# backup-gitea.sh

DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_DIR="/tmp/gitea-backup-$DATE"
S3_BUCKET="s3://nama-bucket-kamu/gitea/"

# Dump database
docker exec gitea-db pg_dump -U gitea gitea > "$BACKUP_DIR-db.sql"

# Archive data gitea
tar -czf "$BACKUP_DIR-data.tar.gz" ./gitea/

# Upload ke S3-compatible storage
aws s3 cp "$BACKUP_DIR-db.sql" "$S3_BUCKET" --endpoint-url https://ACCOUNT.r2.cloudflarestorage.com
aws s3 cp "$BACKUP_DIR-data.tar.gz" "$S3_BUCKET" --endpoint-url https://ACCOUNT.r2.cloudflarestorage.com

# Cleanup
rm -f "$BACKUP_DIR-db.sql" "$BACKUP_DIR-data.tar.gz"

echo "Backup selesai: $DATE"

Jadwalin via cron setiap hari:

crontab -e
# Tambahkan:
0 2 * * * /home/ubuntu/backup-gitea.sh >> /var/log/gitea-backup.log 2>&1

Mirror dari GitHub ke Self-Hosted

Kamu nggak harus langsung cabut dari GitHub. Strategi yang gue pakai: GitHub sebagai public-facing, self-hosted sebagai primary.

Setup mirror di Gitea/Forgejo:

  1. Buka repo settings → Mirror Settings
  2. Masukkan URL repo GitHub kamu
  3. Set interval sync (misalnya setiap 1 jam)
  4. Kalau repo private, tambahkan personal access token GitHub

Dengan ini, kamu push ke self-hosted, dan otomatis ter-mirror ke GitHub. Kalau self-hosted server mati, GitHub tetap jadi fallback.

Alternatif via git remote:

# Push ke dua remote sekaligus
git remote set-url --add --push origin git@git.namakamu.dev:username/repo.git
git remote set-url --add --push origin git@github.com:username/repo.git

# Sekarang git push origin bakal push ke keduanya
git push origin main

Yang Gue Lakuin Sekarang

Setup gue saat ini: Forgejo di VPS Hetzner CX21 (€3.79/bulan, 2 vCPU, 4GB RAM), dengan Caddy sebagai reverse proxy dan backup harian ke Cloudflare R2. Semua repo personal dan proyek freelance ada di sana.

GitHub gue tetap aktif buat repo open source yang memang mau gue expose ke publik — karena GitHub masih punya network effect yang nggak bisa diabaikan kalau kamu mau contribution dari orang lain.

Kalau kamu baru mulai, rekomendasi gue:

  1. Setup Gitea dulu di VPS paling murah yang kamu punya.
  2. Mirror repo penting dari GitHub ke Gitea.
  3. Setelah nyaman, pertimbangin pindah ke Forgejo kalau governance itu penting buat kamu.
  4. Jangan lupa test restore backup minimal sebulan sekali — backup yang belum pernah di-restore itu sama aja bohong.

Self-hosted git server alternatif GitHub bukan soal anti-GitHub. Ini soal punya kontrol lebih atas infrastruktur yang kamu andalkan setiap hari.