Skip to content

Forgejo di Compose: SSH Bawaan, Push-to-Create, dan LFS

Adityo Guni Waluyo

Satu service Compose dengan env FORGEJO__: SSH bawaan loopback, push-to-create tanpa UI, LFS aktif, dan healthcheck yang benar.

Tadi siang saya mendorong commit revert ke repo agen: konfigurasi Forgejo yang barusan dipakai buka akses LAN, saya tutup lagi dan balikin ke loopback-only. Sedikit aneh memang, ngerusak lalu dirapikan dalam satu jam. Tapi justru di situ poinnya. Kemarin saya sudah cerita kenapa butuh Forgejo sebagai git host sekunder; hari ini bagian yang lebih praktis: seluruh setup-nya cuma 20 baris environment di Compose, tanpa file config terpisah, tanpa SSH proxy di host. Dan ternyata SSH bawaan container aja udah cukup, nggak perlu buka HTTP ke jaringan sama sekali.

SSH Bawaan: Bedakan Port Iklan dan Port Listen

Kesalahan pertama saya waktu mikirnya masih pola lama: pakai SSH host, inject key, proxy ke container. Repot. Forgejo punya SSH server bawaan yang cukup dinyalakan lewat environment FORGEJO__server__START_SSH_SERVER=true. Yang bikin saya sempat salah paham adalah ada dua port yang kelihatan mirip tapi beda tugas. SSH_LISTEN_PORT itu port tempat server SSH bawaan benar-benar listen di dalam container [3]. SSH_PORT itu port yang diiklankan di URL clone yang muncul di web UI [3]. Container saya listen di 22 (port internalnya), tapi yang diiklankan 3122 karena di host, port 3122 yang di-publish.

  forgejo:
    image: codeberg.org/forgejo/forgejo:16
    environment:
      USER_UID: "1000"
      USER_GID: "1000"
      FORGEJO__server__DISABLE_SSH: "false"
      FORGEJO__server__START_SSH_SERVER: "true"
      FORGEJO__server__SSH_LISTEN_PORT: "22"
      FORGEJO__server__SSH_PORT: "3122"
      FORGEJO__repository__ENABLE_PUSH_CREATE_USER: "true"
      FORGEJO__lfs__LFS_START_SERVER: "true"
    ports:
      - "3111:3000"  # HTTP, bind loopback host saja
      - "3122:22"    # SSH bawaan, bind loopback host
    volumes:
      - ./forgejo-data:/data

Detail yang gampang kelewat: image container ini membaca env berformat FORGEJO__[SECTION]__[KEY] dan menuliskannya ke app.ini [1], jadi seluruh konfigurasi di atas resmi dan terdokumentasi, bukan trik gelap. Trik gelapnya malah di tempat lain: lupa set USER_UID dan USER_GID sampai cocok dengan kepemilikan folder volume. Dokumentasinya eksplisit, kalau permission volume salah, container bisa menolak start [1]. Saya pakai 1000:1000 dengan bind mount ./forgejo-data. Bonus yang saya suka: tanpa konfigurasi database, Forgejo langsung pakai SQLite [1], jadi nggak perlu service Postgres tambahan untuk forge pribadi.

Push-to-Create: Repo Baru Tanpa Buka Web UI

Fitur yang mengubah alur kerja saya paling banyak adalah push-to-create: git push ke URL repo yang belum ada, dan repo-nya terbentuk sendiri. Fitur ini default-nya mati [2]. Untuk single-user forge kayak punya saya, saya nyalakan lewat satu baris FORGEJO__repository__ENABLE_PUSH_CREATE_USER=true, restart, selesai. Dokumentasinya juga jujur soal syaratnya: ini bukan pintu anonim. Yang push harus sudah terautentikasi sebagai user, repo tercipta atas nama user itu [2].

Satu konsekuensi yang perlu disadari sebelum dipakai: visibilitas repo hasil push-to-create mengikuti DEFAULT_PUSH_CREATE_PRIVATE, yang default-nya private [3]. Mau langsung publik? Bisa lewat push option tanpa sentuh UI: git push -o repo.private=false -u origin main [2]. Buat saya justru default private ini pas; backup repo pribadi nggak perlu deklarasi ulang tiap kali bikin repo baru.

LFS dan Healthcheck: Dua Baris yang Sering Dianggap Optional

Dua baris terakhir yang menurut saya wajib dari awal, bukan menyusul. Pertama FORGEJO__lfs__LFS_START_SERVER=true karena default-nya mati [3] dan tanpa ini server LFS nggak hidup, padahal seluruh alasan saya pindah file gede ke Forgejo adalah LFS-nya. Kuotanya ya disk bind mount itu sendiri, jadi ukuran folder forgejo-data yang jadi penentu [1]. Kedua, healthcheck. Saya pernah pakai wget ke halaman depan dan dapat status healthy padahal forge belum selesai di-install. Ternyata endpoint /api/healthz dibuat justru untuk kasus ini: dia ada di route install supaya healthcheck Docker tetap bisa jalan sebelum instance benar-benar siap [4]. Sekarang healthcheck compose saya nge-wget ke path itu lewat loopback container, tiap 30 detik.

Soal revert tadi siang: keputusannya bener. HTTP cukup loopback, akses dari laptop lewat SSH di 3122, dan Forgejo yang narik semua pekerjaan. Total env yang saya rawat delapan baris, semua terbaca satu layar, dan nggak ada satu pun yang perlu dihafal artinya dua kali.

Sumber

  1. Forgejo Docs: Installation with Docker
  2. Forgejo Docs: Push To Create
  3. Forgejo Docs: Configuration Cheat Sheet
  4. Forgejo Commit e933f31: Add health check endpoint

Artikel terkait