Git Pull Manager bertujuan mempermudah 1 portal web untuk melakukan pull di setiap project di directory yang berbeda pada 1 server
  • PHP 91%
  • Shell 8.8%
  • JavaScript 0.1%
Find a file
2026-08-30 15:46:36 +07:00
assets init: git pull manager (web + api token + sqlite) 2026-08-06 14:11:08 +07:00
.env.example feat: Basic Auth index.php via .env (APP_USER/APP_PASS) 2026-08-29 00:07:04 +07:00
.gitignore feat: Basic Auth index.php via .env (APP_USER/APP_PASS) 2026-08-29 00:07:04 +07:00
api.php init: git pull manager (web + api token + sqlite) 2026-08-06 14:11:08 +07:00
index.php feat: Basic Auth index.php via .env (APP_USER/APP_PASS) 2026-08-29 00:07:04 +07:00
lib.php fix: jam log ikut WIB (Asia/Jakarta) 2026-08-30 15:46:36 +07:00
README.md contoh hook post-pull sederhana (create file deploy-info.txt) di seed + README 2026-08-18 10:17:50 +07:00
seed.php contoh hook post-pull sederhana (create file deploy-info.txt) di seed + README 2026-08-18 10:17:50 +07:00
simulasi.sh init: git pull manager (web + api token + sqlite) 2026-08-06 14:11:08 +07:00
tailwind.config.js init: git pull manager (web + api token + sqlite) 2026-08-06 14:11:08 +07:00

Git Pull Manager

Alat sederhana berbasis PHP native untuk memantau & menarik (pull) banyak repo git sekaligus dari satu halaman web, dengan kredensial tersimpan di database SQLite dan API untuk pull otomatis/manual.

webpull/
├── index.php        # Halaman web (tabel repo, ssh key, kredensial, log, API token)
├── api.php          # Endpoint JSON untuk pull via HTTP (Bearer token / ?token=)
├── lib.php          # Inisialisasi DB + fungsi bersama (index & api)
├── seed.php         # Isi data dummy + buat repo contoh (MENGHAPUS repos.db!)
├── simulasi.sh      # Simulasi alur deploy nyata (opsional)
├── .gitignore       # File sensitif (repos.db, projects/) tidak ikut di-push
├── tailwind.config.js / assets/input.css   # Sumber CSS Tailwind
├── assets/tailwind.css  # CSS hasil build (statis, tanpa CDN)
├── repos.db         # SQLite: repos, ssh_keys, credentials, logs, api_tokens (dibuat otomatis)
└── projects/        # Folder tempat semua repo di-pull (dibuat otomatis)

Kebutuhan

  • PHP 8.0+ (pakai str_starts_with, random_bytes) dengan ekstensi PDO SQLite (php-sqlite3)
  • Git

Cara Pasang & Jalankan

# 1. Clone, lalu masuk ke folder hasil clone (semua perintah di bawah diasumsikan
#    dijalankan dari dalam folder proyek ini — tanpa path absolut).
git clone https://git.pi.interka.my.id/alfatha/git-pull-manager.git
cd git-pull-manager

# 2. (Disarankan) batasi akses file DB agar tidak terbaca orang lain:
chmod 600 repos.db

# 3. Jalankan server PHP:
php -S 0.0.0.0:8080 -t ./
#    lalu buka http://localhost:8080

Konfigurasi (lib.php)

Variabel Lokasi Fungsi
$projectsDir lib.php Folder tempat semua repo di-pull (default: projects/ di dalam folder proyek)
$tokens lib.php Token global bootstrap — hanya dipakai saat tabel api_tokens masih kosong (default GANTI-TOKEN-SEKARANG)

Setelah itu token global dikelola langsung dari tab "API Token" di halaman web: tombol Generate Token membuat token acak baru (bisa diberi label), tombol Hapus mencabutnya, dan Salin Token untuk menyalin. Token tersimpan di tabel api_tokens.

Token per-repo digenerate otomatis (32 karakter hex) saat repo ditambahkan — lihat kolom Token di tabel Repo.

Penggunaan Web

  • Tab Repo — daftar repo + status (Terbaru / Ada update / Error), kolom Token (salin token per-repo), tombol Pull, Pull Semua, dan Tambah Repo (Nama Project + Path relatif di dalam projects/ + Branch + pilih SSH key / user-password yang sudah disimpan).
  • Tab SSH Keys — simpan isi key langsung ke DB (upload file atau tempel), pakai berulang tanpa ketik ulang.
  • Tab Kredensial — simpan username/password untuk HTTPS.
  • Tab Log — catatan semua aktivitas (pull mencatat perubahan commit sebelum → sesudah, tambah/hapus, buat/hapus token, dll).
  • Tab API Token — kelola token global (Generate / Hapus / Salin), contoh perintah curl yang bisa disalin.
  • Setiap tabel punya pencarian & pagination server-side via ?tab=…&q=…&page=… — aman walau data sudah banyak.

Alur pull

  1. git fetch origin <branch> — cek commit lokal vs origin/<branch>.
  2. Sama → status Terbaru; beda → status Ada update + tombol Pull.
  3. Pull memakai --ff-only — jika ada commit lokal yang belum di-push, pull GAGAL dan dilaporkan (tidak membuat merge tak terduga).

Hook post-pull (jalankan script setelah pembaruan)

Jika di dalam folder repo ada file post-pull.sh (ter-commit di repo), script itu otomatis dijalankan setelah pull — hanya saat file post-pull.sh itu sendiri ikut berubah pada commit yang di-pull (atau saat deploy pertama). Dengan begitu pull kode biasa tidak mengulang script; script hanya jalan ulang kalau memang diperbarui. Berguna untuk migrasi query, generate folder, composer install, dsb.

# contoh sederhana: /projects/app-web/post-pull.sh — buat file info deploy
#!/bin/bash
echo "deploy $(date '+%Y-%m-%d %H:%M:%S') | commit $(git rev-parse --short HEAD)" > deploy-info.txt
echo "deploy-info.txt dibuat"

Contoh di atas juga sudah disertakan di repo dummy mobile-backend saat menjalankan php seed.php — setelah pull, file deploy-info.txt akan muncul di folder repo tersebut.

  • Dijalankan dengan working directory = folder repo (script tinggal pakai path relatif).
  • Hanya jalan saat post-pull.sh berubah / deploy pertama — pull "sudah terbaru" atau pull kode biasa dilewati (hook: dilewati).
  • Output & kegagalannya tercatat di tab Log (hook: OK / hook GAGAL); kegagalan hook menandai hasil pull sebagai GAGAL.
  • Berlaku juga untuk pull via api.php.

Jika butuh script yang selalu jalan tiap deploy tapi idempoten, buat script-nya memakai penanda sendiri, misalnya: [ -f .migrasi-v3.done ] && exit 0; ... ; touch .migrasi-v3.done.

API (api.php)

Respons JSON; hasil pull ikut tercatat di log. Token bisa via header Authorization: Bearer <token> atau parameter ?token=<token>.

# 1. Pull SATU repo — token PER-REPO (tanpa id), token ada di kolom Token tabel Repo
curl -H "Authorization: Bearer <token-repo>" "http://host/api.php?action=pull"

# 2. Pull repo tertentu — token GLOBAL + id atau repo=nama
curl -H "Authorization: Bearer <token-global>" "http://host/api.php?action=pull&id=3"
curl -H "Authorization: Bearer <token-global>" "http://host/api.php?action=pull&repo=app-web"

# 3. Pull SEMUA repo — wajib token GLOBAL
curl -H "Authorization: Bearer <token-global>" "http://host/api.php?action=pullall"

Kode status: 200 sukses, 401 token tidak valid, 403 token per-repo dipakai untuk pullall, 404 repo tidak ditemukan, 400 action tidak dikenal.

Data Dummy & Simulasi

php seed.php            # BUAT ULANG data dummy: 4 repo contoh di projects/ + 3 ssh key + 3 kredensial.
                        # PERHATIAN: menghapus repos.db (termasuk logs & token) dan folder projects.
bash simulasi.sh        # Simulasi alur deploy (dev push -> deteksi update -> pull), lalu bersih sendiri.

Git & File Sensitif

.gitignore sudah mengesampingkan repos.db (berisi password, isi SSH key, token) dan projects/ (hasil clone) — keduanya tidak boleh di-push. Kode sumber (index.php, api.php, lib.php, seed.php, simulasi.sh, assets/tailwind.css) aman untuk di-commit.

Kustomisasi Tampilan (Tailwind)

CSS statis di assets/tailwind.css di-build dari class yang dipakai index.php. Setelah menambah class baru, build ulang (butuh binary tailwindcss v3.4 atau npx tailwindcss):

tailwindcss -c tailwind.config.js -i assets/input.css -o assets/tailwind.css --minify

Catatan Keamanan

  • Tanpa login di halaman web — jangan pasang di jaringan publik tanpa proteksi web server (Basic Auth).
  • Password & isi SSH key tersimpan plaintext di repos.db — lindungi file DB (chmod 600) dan folder projects/, dan pastikan tidak ikut ter-push (lihat .gitignore).
  • Token global default (GANTI-TOKEN-SEKARANG) hanya bootstrap — segera Generate Token baru di tab API Token dan hapus token default-nya.
  • Token per-repo (kolom Token di tabel Repo) hanya untuk pull repo itu sendiri — tidak bisa pullall (ditolak 403).
  • pull selalu --ff-only; kredensial dikirim ke git lewat file temp (bukan argumen proses) agar tidak bocor ke ps.