Self-Hosted Git Server: Setup Tutorial Lengkap

by Marcus Chen
Self-Hosted Git Server: Setup Tutorial Lengkap

Masalah: GitHub Gratis Makin Terbatas, Billing Makin Nyebelin

Kamu punya 10+ repo private, tim kecil, dan tiba-tiba dapat email dari GitHub soal storage limit atau — lebih parah — invoice yang nggak terduga karena salah klik fitur Actions. Gue pernah ada di posisi itu. Solusinya? Self-hosted Git server sendiri di VPS yang sudah kamu bayar bulanan.

Tutorial self-hosted Git server ini pakai Gitea — ringan, ditulis di Go, binary tunggal, dan bisa jalan di VPS 1 GB RAM sekalipun. Bukan GitLab yang butuh 4 GB RAM hanya untuk idle.


Kenapa Gitea, Bukan yang Lain?

Ada beberapa opsi: Gitea, Forgejo (fork Gitea), Gogs, GitLab CE, atau Soft Serve. Gue pilih Gitea karena:

  • Binary tunggal — deploy semudah copy file
  • RAM usage rendah — ~80–150 MB saat idle
  • UI familiar — mirip GitHub, kurva belajar minimal
  • Fitur cukup — issue tracker, pull request, webhook, CI runner (Gitea Actions)
  • Komunitas aktif — update rutin, CVE di-patch cepat

Kalau kamu mau fork yang lebih community-driven, Forgejo drop-in replacement untuk Gitea dan pakai setup yang sama persis.


Persiapan Sebelum Setup

Yang kamu butuhkan:

  • VPS dengan Ubuntu 22.04 (minimal 1 vCPU, 1 GB RAM)
  • Domain atau subdomain yang sudah pointing ke IP VPS (misal: git.namakamu.dev)
  • Akses SSH ke VPS
  • Nginx sebagai reverse proxy
  • Certbot untuk SSL

Gue asumsikan kamu sudah bisa SSH ke VPS dan domain sudah resolve ke IP yang benar. Cek dulu:

dig +short git.namakamu.dev
# harus keluar IP VPS kamu

Langkah 1: Install Gitea

Download binary Gitea versi terbaru langsung dari GitHub releases. Cek versi terbaru di gitea.com/gitea/releases, lalu:

# Download binary (ganti versi sesuai latest)
wget -O /usr/local/bin/gitea \
  https://dl.gitea.com/gitea/1.22.1/gitea-1.22.1-linux-amd64

chmod +x /usr/local/bin/gitea

# Verifikasi
gitea --version
# Output: Gitea version 1.22.1 built with...

Buat user sistem khusus untuk Gitea (jangan jalankan sebagai root):

adduser \
  --system \
  --shell /bin/bash \
  --gecos 'Gitea' \
  --group \
  --disabled-password \
  --home /home/gitea \
  gitea

Buat direktori yang dibutuhkan:

mkdir -p /var/lib/gitea/{custom,data,log}
chown -R gitea:gitea /var/lib/gitea/
chmod -R 750 /var/lib/gitea/

mkdir /etc/gitea
chown root:gitea /etc/gitea
chmod 770 /etc/gitea

Langkah 2: Konfigurasi Systemd Service

Biar Gitea otomatis jalan saat VPS reboot, buat service file:

sudo nano /etc/systemd/system/gitea.service

Isi dengan:

[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target

[Service]
RestartSec=2s
Type=simple
User=gitea
Group=gitea
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=gitea HOME=/home/gitea GITEA_WORK_DIR=/var/lib/gitea

[Install]
WantedBy=multi-user.target

Aktifkan dan jalankan:

sudo systemctl daemon-reload
sudo systemctl enable gitea
sudo systemctl start gitea

# Cek status
sudo systemctl status gitea

Gitea sekarang jalan di port 3000 secara default.


Langkah 3: Setup Nginx Reverse Proxy + SSL

Install Nginx dan Certbot kalau belum ada:

sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx

Buat konfigurasi Nginx untuk domain kamu:

sudo nano /etc/nginx/sites-available/gitea
server {
    listen 80;
    server_name git.namakamu.dev;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # Untuk Git over HTTP (clone/push)
    client_max_body_size 50M;
}

Aktifkan dan test:

sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Dapat SSL dengan Certbot:

sudo certbot --nginx -d git.namakamu.dev

Certbot otomatis edit konfigurasi Nginx dan setup auto-renewal. Setelah ini, https://git.namakamu.dev harusnya sudah bisa diakses.


Langkah 4: Initial Setup via Web UI

Buka https://git.namakamu.dev di browser. Kamu akan lihat halaman Initial Configuration Gitea.

Setting penting yang perlu kamu ubah dari default:

Setting Nilai yang Disarankan
Database Type SQLite3 (cukup untuk personal/tim kecil)
Site URL https://git.namakamu.dev/
HTTP Port 3000
SSH Port 22
Server Domain git.namakamu.dev

Gotcha #1: Pastikan Site URL diisi dengan benar termasuk trailing slash. Kalau salah, clone URL yang muncul di repo bakal keliru dan bikin bingung.

Scroll ke bawah, buat Administrator Account — ini akun pertama dan otomatis jadi admin. Isi username, email, password, lalu klik Install Gitea.

Proses install selesai dalam hitungan detik. Login dengan akun yang baru dibuat.


Langkah 5: Konfigurasi app.ini Tambahan

Setelah initial setup, Gitea generate file /etc/gitea/app.ini. Ada beberapa setting yang perlu kamu tambahkan manual untuk keamanan dan performa:

sudo nano /etc/gitea/app.ini

Tambahkan atau edit bagian-bagian ini:

[server]
DOMAIN           = git.namakamu.dev
ROOT_URL         = https://git.namakamu.dev/
HTTP_PORT        = 3000
DISABLE_SSH      = false
SSH_PORT         = 22

[service]
; Matikan registrasi publik — hanya admin yang bisa tambah user
DISABLE_REGISTRATION              = true
REQUIRE_SIGNIN_VIEW               = true

[security]
INSTALL_LOCK                      = true
SECRET_KEY                        = ganti_dengan_random_string_panjang
INTERNAL_TOKEN                    = ganti_dengan_token_lain

[log]
MODE  = file
LEVEL = Info
ROOT_PATH = /var/lib/gitea/log

Setting DISABLE_REGISTRATION = true penting banget kalau server kamu public-facing. Tanpa ini, siapa saja bisa daftar akun di Git server kamu.

Restart Gitea setelah edit:

sudo systemctl restart gitea

Langkah 6: Test Clone dan Push

Buat repo baru lewat UI Gitea, lalu test dari lokal:

# Clone via HTTPS
git clone https://git.namakamu.dev/username/repo-test.git
cd repo-test

# Buat file dan commit
echo '# Repo Test' > README.md
git add README.md
git commit -m 'initial commit'
git push origin main

Kalau mau pakai SSH (lebih nyaman untuk daily use), tambahkan SSH key kamu dulu:

  1. Copy output cat ~/.ssh/id_ed25519.pub
  2. Di Gitea: Settings → SSH / GPG Keys → Add Key
  3. Paste public key, save

Test SSH:

ssh -T git@git.namakamu.dev
# Output: Hi username! You've successfully authenticated...

Clone via SSH:

git clone git@git.namakamu.dev:username/repo-test.git

Gotcha yang Gue Temuin

Gotcha #2 — SSH port conflict: Kalau VPS kamu pakai SSH di port 22 (default), Gitea SSH juga mau pakai port 22. Solusinya: pindahkan SSH VPS kamu ke port lain (misal 2222), atau set Gitea SSH ke port berbeda di app.ini dengan SSH_PORT = 2222. Jangan lupa update firewall:

sudo ufw allow 2222/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Gotcha #3 — Git LFS: Kalau kamu kerja dengan file besar (model ML, asset game, video), aktifkan Git LFS di Gitea. Tambahkan di app.ini:

[lfs]
PATH = /var/lib/gitea/data/lfs

Dan install git-lfs di client:

sudo apt install git-lfs
git lfs install

Gotcha #4 — Backup: Gitea punya built-in backup command:

# Jalankan sebagai user gitea
sudo -u gitea gitea dump -c /etc/gitea/app.ini

Ini generate ZIP berisi database, repo data, dan config. Jadwalkan dengan cron atau script backup ke object storage.


Langkah Lanjutan

Setup dasar sudah jalan. Yang gue lakuin selanjutnya setelah ini:

  1. Setup Gitea Actions — mirip GitHub Actions, bisa jalankan CI/CD pipeline langsung dari server yang sama. Butuh install act_runner terpisah.
  2. Webhook ke deployment server — setiap push ke branch main, trigger deploy otomatis ke server production lewat webhook.
  3. Mirror repo dari GitHub — Gitea bisa auto-mirror repo GitHub kamu sebagai backup. Setting di repo → Settings → Mirror Settings.
  4. Monitoring — pasang Prometheus exporter Gitea dan visualisasi di Grafana untuk pantau usage.
  5. Upgrade Gitea — tinggal replace binary dan restart service. Selalu cek release notes untuk breaking changes.

Self-hosted Git server setup tutorial ini harusnya cukup untuk kamu punya Git server yang production-ready dalam waktu kurang dari satu jam. Total biaya? Hanya hosting Indonesia murah untuk WordPress atau VPS yang mungkin sudah kamu bayar. Tidak ada per-seat pricing, tidak ada storage limit yang tiba-tiba bikin invoice membengkak.