- PHP 91%
- Shell 8.8%
- JavaScript 0.1%
| assets | ||
| .env.example | ||
| .gitignore | ||
| api.php | ||
| index.php | ||
| lib.php | ||
| README.md | ||
| seed.php | ||
| simulasi.sh | ||
| tailwind.config.js | ||
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
git fetch origin <branch>— cek commit lokal vsorigin/<branch>.- Sama → status Terbaru; beda → status Ada update + tombol Pull.
- 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.shberubah / 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 sebagaiGAGAL. - 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 folderprojects/, 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(ditolak403). pullselalu--ff-only; kredensial dikirim ke git lewat file temp (bukan argumen proses) agar tidak bocor keps.