Ketika tiba - tiba repositori publik milik ane di Codeberg tidak bisa diakses tanpa login, ane memutuskan untuk mencari alternatif.
Banyak alternatif yang tersedia, namun sebelum itu perlu diketahui bahwa Codeberg mempergunakan Forgejo sebagai aplikasinya. Forgejo adalah fork dari Gitea, frontend web interface suite untuk Git yang ringan. Namun ane tidak ingin mengganti Codeberg dengan self host Forgejo karena keterbatasan sumber daya VPS dan karena fiturnya yang melimpah yang sebagian besar tidak ane butuhkan.
Oleh karena itu ane mencari alternatif dengan syarat
- Bukan Forgejo atau Gitea atau fork-nya,
- Ringan! kalo bisa dibangun dengan C,
- Tersedia di FreeBSD (atau NetBSD).
Dan akhirnya pilihan itu mengerucut ke cgit dan stagit. Perbedaan mendasar dari 2 pilihan ini adalah cgit merupakan aplikasi frontend yang dinamis dimana dia bisa memproses perintah Git on the fly contohnya adalah melakukan diff pada 2 files maupun lebih. Sedangkan stagit lebih menjadi tampilan frontend yang statis sehingga saat melakukan diff hanya bisa menampilkan perbedaan dari files yang sudah digenerate di awal saja.
Untuk saat ini pemenangnya cgit.
Install #
cgit & kebutuhannya #
Catatan
Asumsi pemasangan cgit di dalam jail dengan rilis 15.1-RELEASE dan IP 10.0.0.7
Binari cgit sendiri sudah tersedia di FreeBSD sehingga tidak perlu mengkompilasi dari source.
# pkg install git cgit fcgiwrap spawn-fcgi
fcgiwrap adalah wrapper CGI untuk menjalankan script cgit nantinya. Agar berjalan saat boot maka perlu menambahkan baris berikut di file /etc/rc.conf
fcgiwrap_enable="YES"
fcgiwrap_flags="-f"
fcgiwrap_user="www"
fcgiwrap_group="www"
fcgiwrap_socket_owner="www"
fcgiwrap_socket_group="www"
Ingat! bahwa fcgiwrap mempergunakan user dan group www:www sehingga semua folder/path yang dipakai untuk cgit harus bisa diakses oleh user/group ini.
Sedangkan spawn-fcgi nanti dipergunakan untuk mengelola proses FastCGI dari fcgi-wrap melalui pengaturan socketnya.
# spawn-fcgi -s /var/run/cgit.sock /
-u www -g www -a 10.0.0.7 \
-p 9000 -F 4 -- \
/usr/local/bin/fcgiwrap
Maka spawn-fcgi akan menjalankan fcgiwrap di port 9000 yang nantinya akan dipanggil melalui Caddy.
Validasi dengan perintah ini
# sockstat -4 | grep 9000
www fcgiwrap 21451 0 tcp4 10.0.0.7:9000 *:*
Terpantau fcgiwrap sudah berjalan di mode tcp port 9000.
Konfigurasi Caddy reverse proxy #
Setelah pengaturan di atas seharusnya cgit bisa diakses melalui IP 10.0.0.7:9000 , agar bisa ditempelkan ke domain maka ane buat pengaturan di Caddyfile (di host), seperti ini
legit.kusaeni.com {
handle /git/* {
basic_auth {
poes $2a$14$.NhljHKhalkfhalkHK.XPp/PkuJU7ALJDLaBZoo/jladalHKA
}
uri strip_prefix /git
reverse_proxy 10.0.0.7:9000 {
request_buffers 50mb
transport fastcgi {
env SCRIPT_FILENAME /usr/local/libexec/git-core/git-http-backend
env GIT_PROJECT_ROOT /home/legit
env GIT_HTTP_EXPORT_ALL ""
env PATH_INFO {http.request.uri.path}
env QUERY_STRING {http.request.uri.query}
env REQUEST_METHOD {http.request.method}
env CONTENT_TYPE {http.request.header.Content-Type}
env CONTENT_LENGTH {http.request.header.Content-Length}
env REMOTE_USER {http.auth.user.id}
env HTTP_HOST {http.request.host}
env PATH /usr/local/bin:/usr/bin:/bin
}
}
}
handle /favicon.ico {
root * /var/www/cgit
file_server
}
handle /cgit.js {
root * /var/www/cgit
file_server
}
handle /cgit.css {
root * /var/www/cgit
file_server
}
handle /cgit.png {
root * /var/www/cgit
file_server
}
handle {
reverse_proxy 10.0.0.7:9000 {
transport fastcgi {
env SCRIPT_FILENAME /usr/local/libexec/git-core/git-http-backend
env GIT_PROJECT_ROOT /home/legit
env GIT_HTTP_EXPORT_ALL ""
env CONTENT_TYPE {http.request.header.Content-Type}
env CONTENT_LENGTH {http.request.header.Content-Length}
env REMOTE_USER {http.auth.user.id}
env SCRIPT_FILENAME /usr/local/www/cgit/cgit.cgi
env SCRIPT_NAME /
env PATH_INFO {http.request.uri.path}
env DOCUMENT_ROOT /usr/local/www/cgit
env CGIT_CONFIG /usr/local/etc/cgitrc
env QUERY_STRING {http.request.uri.query}
env REQUEST_METHOD {http.request.method}
env HTTP_HOST {http.request.host}
}
}
}
}
Cukup rumit kan? yang perlu diperhatikan adalah handle.
- handle
/gitini nanti akan menjadi endpoint untuk prosespull - push - clone, disini akan dilindungi oleh basic auth dari Caddy baca dokumentasinya - handle
/ini akan menjadi halaman web interfacecgityang di-reverse proxy kan ke IP10.0.0.7dan port9000 - handle lainnya seperti favicon, *js, *css, dan *png di arahkan di folder
/var/www/cgitdi host karena ini cuma serve static files saja.
Validasi konfigurasi dan restart Caddy.
Buat lokasi Repositori #
Karena cgit dan fcgiwrap jalan dengan user dan group www maka ane tidak bisa naruh folder repo di bawah /root (default user di FreeBSD jail). Jadi ane bikin di tempat lain, misal di /home/legit
# mkdir -p /home/legit
# cd /home/legit
# mkdir repopo
# git init --bare
hint: Using 'master' as the name for the initial branch. This default branch name
hint: will change to "main" in Git 3.0. To configure the initial branch name
hint: to use in all of your new repositories, which will suppress this warning,
hint: call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
hint:
hint: Disable this message with "git config set advice.defaultBranchName false"
Initialized empty Git repository in /home/legit/repopo/
# chown -R www:www /home/legit/repopo
Ini akan membuat folder /home/legit dan folder repopo serta merubah kepemilikan folder menjadi milik user www. Nantinya semua pembuatan repo akan mengulang perintah ini.
Bunuh spawn-fcgi dan fcgiwrap yang sedang berjalan kemudian ulangi perintah untuk menjalankannya. Untuk lebih mudah silakan membuat script rc.d saja.
Kemudian kunjungi URL dari repo dan pastikan bahwa cgit sudah berjalan dengan baik.
Konfigurasi cgit #
Berikut adalah konfigurasi cgitrc yang ane pakai. Buat atau edit file /usr/local/etc/cgitrc (di dalam jail)
## style-sheet and custom logo
css=/cgit.css
logo=/cgit.png
## root for all cgit links
virtual-root=/
clone-prefix=https://legit.kusaeni.com/git
enable-http-clone=1
scan-path=/home/legit/
root-title=Lapis LeGit
root-desc=sungguh legit menggigit, auwwww!
Ini merupakan konfigurasi minimal dari cgit, ada beberapa hal yang mungkin ingin diaktifkan diantaranya berikut ini
Memperluas info di tab Summary, seperti info tentang branches, logs, maupun tags
summary-branches=10 summary-log=10 summary-tags=10Memperluas tampilan commit message, ini berguna biar tampilan pesan commit tidak terpotong
max-message-length=10000Fleksibel dalam membaca pengaturan spesifik pada masing - masing repo, perintah ini akan membuat
cgitmemprioritaskan pembacaan informasi repo langsung dari file.git/configalih - alih membaca daricgitrc. Sangat bermanfaat jika punya multiple repo.enable-git-config=1 enable-index-owner=1Jika pakai ini maka untuk menulis deskripsi repo harus mengubah file
.git/description, sedangkan nama owner bisa dengan merubah file.git/configyang berada di bawah masing - masing folder repo.Menampilkan statistik di halaman Commit, Summary, dan Logs, gunakan pengaturan ini untuk menampilkan banyak pesan yang mungkin bermanfaat.
enable-blame=1 enable-index-links=1 enable-commit-graph=1 enable-follow-links=1 enable-log-filecount=1 enable-log-linecount=1 max-stats=quarterPakai filter,
cgitpunya beberapa filter bawaan untuk melakukan post-process tampilan web-nya. Salah satu filter yang menarik adalah untuk menampilkan isi fileREADME.mddan filter untuk syntax highlightingcgitmenaruh filter bawaan di folder/usr/local/lib/cgit/filtersdan bisa diaktifkan dengan menambahkan konfigurasi berikutabout-filter=/usr/local/lib/cgit/filters/about-formatting.sh source-filter=/usr/local/lib/cgit/filters/syntax-highlighting.shPada dasarnya filter ini adalah kumpulan shell script yang mengformat hasil
stdoutdaricgit, sebagai contohabout-formatting.shadalah shell script yang berguna untuk merender fileREADME.mddan menampilkan di tab khusus bernamaabout. Namun agar bisa merender file raw hasil daricgitperlu library terpasang yaitupythondanpython markdown. Di FreeBSD ane pakaipython312maka ane perlu memasang paket ini. Tapi ane males!Jadi ane pasang parser dan render lain yang lebih ringan yaitu
md4cyang juga punya fungsi yang sama namun lebih ringan dan mendukungmarkdowna la Github.# pkg install md4cKemudian buat file filter baru dengan nama misalnya
about-formatting-md4c.shdan isinya menjiplak isi dari file asliabout-formatting.sh. Kira - kira seperti ini#!/bin/sh case "$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')" in *.markdown|*.mdown|*.md|*.mkd) exec /usr/local/bin/md2html --github ;; *.htm|*.html) exec cat ;; *) exec /usr/local/lib/cgit/filters/lowdown.sh "$@" esacbaris ke-11 berisi aturan jika misal terjadi gagal render maka pakai filter
lowdown.shyang juga merupakan rederer markdown yang ringan. Tapi jika tidak ingin pakai bisa dihapus saja.Selanjutnya aktifkan pembacaan file README.md di konfigurasi
cgitreadme=:README readme=:README.mdjika ada file README atau README.md maka
cgitakan merendernya di tab aboutBegitupula dengan filter
highlightuntuk syntax highlighting memerlukan paket lain yaituhighlightyang bisa dipasang dengan perintah# pkg install highlightKemudian edit file
/usr/local/lig/cgit/filters/syntax-highlighting.sh.File ini memberikan pilihan cara menjalankan
highlightyaitu pada versi 2 atau 3, karena ane pasang versi terbaru maka ane pakai versi 3. Cukup uncomment baris untuk versi 3. Kemudian simpan.Untuk mendapatkan tampilah syntax highlight yang sesuai, salin CSS yang dicontohkan di dalam file
syntax-highlighting.shdan simpan di filecgit.css. Namunhighlightjuga memberikan pilihan tema yang banyak, memakai tema bawaan ini lebih mudah daripada menyalin dan mengubah CSS sendiri.Edit kembali file
syntax-highlighting.shdan rubah menjadi seperti iniexec /usr/local/bin/highlight --force --inline-css -f -I -O xhtml -S "$EXTENSION" -s github 2>/dev/nullMenyembunyikan email, sudah jelas fungsinya untuk menghindari spamkan?, tambahkan pengaturan ini untuk menghilangkan email (owner maupun commiter) dari halaman
cgitnoplainemail=1Menyembunyikan repo atau membuat repositori menjadi private? tidak muncul di
cgit, tidak bisa diclone, tapi masih bisa diakses dengangit?[cgit] ignore = 1tambahkan pengaturan di atas di dalam file
.git/configmasing - masing repo yang ingin disembunyikan.Menambahkan tautan ke situs lain, tambahkan
[gitweb] homepage = https://kusaeni.commembuat
cgitakan menampilkan tab baru Homepage yang merupakan tautan ke situs yang disebutkan.
Troubleshoting #
Tidak bisa
pushke repo yang sudah ada. Masalah ini biasanya dikarenakan folder repo tersebut dimiliki (ownership) bukan oleh userfcgiwrap. Biasanya mudah diselesaikan dengan cara memasukkan user atau groupwww# chown -R www:www /home/legit/repopoJika ownership sudah diatur dengan benar namun masih muncul error permission, maka coba untuk mengabaikan error tersebut dengan memasukkan
repopoke dalam safe directory# git config --global add safe.directory /home/legit/repopoperintah ini dijalankan dari client bukan di server
Filter tidak jalan, yang ini pastikan path ke file filter sudah benar dan pastikan atribut filter adalah file yang bisa dieksekusi.
# chmod +x /usr/local/lib/cgit/filters/about-formatting.shMuncul error
error: failed to push some refs to, masalah ini muncul saat berusahapushke repo dikarenakan saat bikin repo pertama kali tidak menyertakan opsi--bare. Solusinya hapus saja folder reponya dan buat ulang dengan menambahkan opsi yang diminta dan jangan lupa rubah kepemilikan kewww# git init --bare /home/legit/repopo/ # chown -R www:www /home/legit/repopo/
Inspirasi Modifikasi #
Ane membuat repo khusus untuk menampung modifikasi yang sudah ane buat termasuk logo, css, dan beberapa filters.
Bisa dilihat di repo ini cgit_kus
dari Fediverse
Kamu juga bisa meninggalkan komentar dari akun fediversemu dengan menyalin tautan dibawah ini dan mencarinya di instance Mastodon atau ActivityPub pilihanmu
https://sok.egois.org/@poes/statuses/01M33SJXR194MWDGBPQF90KM8K