Deploy Golang di shared hosting cPanel memang terasa berbeda dibanding VPS atau platform seperti Railway. Kebanyakan panel hosting belum menyediakan Go App Manager seperti yang dipunya Node.js atau Python. Artikel ini menjelaskan langkah deploy Golang di shared hosting secara lengkap. Pembahasan mencakup clone kode lewat Git sampai reverse proxy dan SSL.
Kenapa Golang Berbeda dari Node.js dan Python di cPanel
Banyak provider hosting cPanel sudah menyediakan menu Setup Python App atau Setup Node.js App. Menu ini otomatis mengatur proses, port, dan restart aplikasi. Golang jarang mendapat menu serupa karena dikompilasi menjadi binary tunggal. Panel kontrol kebanyakan belum punya manajer khusus untuk binary Go.
Konsekuensinya, proses deploy Golang di shared hosting cPanel harus dilakukan manual lewat Terminal. Sistem shared hosting juga tidak menyediakan systemd untuk menjaga proses tetap hidup. Akses publik ke aplikasi diatur lewat reverse proxy .htaccess, bukan port terbuka langsung. Kondisi ini membuat developer perlu memahami beberapa langkah tambahan.
Perbedaan ini bukan berarti Golang tidak cocok dijalankan di shared hosting. Developer hanya perlu mengganti beberapa proses otomatis dengan konfigurasi manual. Setelah konfigurasi awal selesai, aplikasi Go bisa berjalan cukup stabil. Pemeliharaan rutin tetap dibutuhkan karena tidak ada systemd yang mengawasi proses.
Menyiapkan Struktur Folder dan Repository Git
Struktur folder yang rapi memudahkan proses maintenance ke depannya. Source code Go sebaiknya dipisahkan dari folder document root subdomain. Folder aplikasi berisi file main.go, go.mod, dan binary hasil build. Folder subdomain hanya berisi file .htaccess untuk reverse proxy.
Pemisahan ini juga membantu keamanan karena source code tidak langsung terekspos ke publik. File konfigurasi sensitif jadi lebih mudah diproteksi kalau berada di luar document root. Struktur ini juga memudahkan proses update kode di kemudian hari. Developer cukup masuk ke folder aplikasi tanpa mengubah folder subdomain.
Sebelum masuk ke server, siapkan file .gitignore di komputer lokal terlebih dahulu. File ini mencegah data sensitif seperti config.yaml ikut ter-push ke GitHub. Buat juga file config.yaml.example sebagai template kosong. Setelah itu, commit dan push kode ke repository GitHub.
Berikut struktur folder yang disarankan.
/home/namauser/
├── nama-app/
│ ├── main.go
│ ├── go.mod
│ ├── config.yaml
│ ├── data/
│ └── nama-app (binary)
└── subdomain.namadomain.com/
└── .htaccessFile berikut sebaiknya masuk daftar .gitignore.
config.yaml
data/
*.db
nama-app (binary hasil build)
app.log
Clone dan Build Aplikasi Go di Server
Proses clone repository ke cPanel bisa dilakukan lewat menu Git Version Control atau Terminal manual. Opsi Terminal manual lebih terkontrol karena tidak bergantung pada perilaku UI cPanel. Beberapa versi cPanel menambahkan home directory otomatis di depan Repository Path. Kalau path yang diisi sudah absolut, folder hasil clone bisa nested dobel.
Masalah folder nested dobel ini cukup sering dialami pengguna baru cPanel. Solusinya, isi kolom Repository Path dengan path relatif saja, bukan path absolut lengkap. cPanel akan otomatis menambahkan prefix home directory di belakang layar. Kalau sudah terlanjur nested, folder yang salah alamat perlu dihapus lebih dulu.
Setelah clone selesai, cek dulu versi Go yang terpasang di server. Versi Go sebaiknya dekat dengan versi yang dipakai saat development. Variabel TMPDIR juga perlu diarahkan ke folder milik user sendiri. Shared hosting biasanya membatasi penulisan ke folder temp default sistem.
File config.yaml berisi kredensial harus dibuat manual di server. File ini tidak ikut ter-clone karena masuk daftar .gitignore. Folder data untuk database SQLite juga perlu dibuat dan diberi permission writable. Setelah semua siap, jalankan perintah build untuk menghasilkan binary.
Berikut ringkasan perintah utama pada tahap ini.
git clone https://github.com/username/nama-repo.git nama-app
cd nama-app
export TMPDIR=/home/namauser/tmp
mkdir -p $TMPDIR data
go mod tidy
go build -o nama-app main.goMenjalankan Aplikasi Go di Background dengan Nohup
Shared hosting umumnya tidak menyediakan systemd untuk mengelola proses aplikasi. Perintah nohup dipakai supaya proses tetap berjalan meski sesi Terminal ditutup. Log aplikasi bisa dipantau lewat file app.log yang dibuat otomatis. Proses yang aktif bisa dicek dengan perintah pgrep.
Memantau log secara berkala membantu mendeteksi error lebih awal. Kesalahan koneksi database atau port yang bentrok biasanya langsung terlihat di log. Kebiasaan mengecek log setelah setiap deploy baru sangat disarankan. Cara ini mengurangi risiko aplikasi mati tanpa disadari dalam waktu lama.
Aplikasi Go yang butuh koneksi keluar, misalnya SSH ke server lain, perlu dicek dulu port outbound-nya. Banyak shared hosting tidak menyediakan tool netcat untuk mengecek port. Alternatifnya, gunakan fitur /dev/tcp bawaan bash untuk tes koneksi. Kalau muncul banner SSH sebelum pesan timeout, artinya koneksi sebenarnya berhasil.
nohup ./nama-app > app.log 2>&1 &
pgrep -af nama-app
timeout 5 bash -c "cat < /dev/tcp/ip-server-target/22"Reverse Proxy dan SSL untuk Subdomain Golang
Subdomain baru di cPanel otomatis punya folder document root sendiri. File .htaccess di folder ini mengatur reverse proxy ke port lokal aplikasi Go. Header X-Forwarded-Proto perlu ditambahkan supaya aplikasi tahu request datang lewat HTTPS. Aturan proteksi tambahan wajib dipasang kalau source code satu folder dengan .htaccess.
Sertifikat SSL AutoSSL biasanya butuh waktu untuk terbit setelah subdomain dibuat. Error wrongHost saat akses HTTPS sering disebabkan DNS subdomain belum resolve ke IP hosting. Domain dengan nameserver eksternal seperti Cloudflare tidak otomatis membuat DNS record di cPanel. Pengecekan status AutoSSL Domain Validated perlu dilakukan sebelum HTTPS dianggap aktif.
Kalau browser masih menampilkan error setelah status SSL berubah hijau, penyebabnya biasanya cache lama. Tes ulang lewat jendela incognito bisa memastikan apakah masalah benar dari cache browser. Verifikasi sertifikat juga bisa dilakukan langsung lewat command line memakai curl. Cara ini lebih akurat dibanding hanya mengandalkan tampilan browser.
RewriteEngine on
RewriteRule ^(.*)$ http://127.0.0.1:8080/$1 [P,L]
RequestHeader set X-Forwarded-Proto "https"
<Files "config.yaml">
Require all denied
</Files>Checklist dan Cron Job Auto-Restart untuk Deploy Golang di Shared Hosting cPanel
Server shared hosting bisa di-restart sewaktu-waktu oleh provider tanpa pemberitahuan. Proses nohup yang sedang berjalan otomatis ikut mati saat kondisi ini terjadi. Cron job dipasang untuk mengecek proses tiap lima menit dan menjalankan ulang kalau mati. Cara ini memastikan aplikasi tetap online tanpa perlu pengecekan manual.
*/5 * * * * pgrep -f nama-app || (cd /home/namauser/nama-app && nohup ./nama-app > app.log 2>&1 &)Update kode di server juga perlu dilakukan secara berkala mengikuti perubahan repository. Proses ini mencakup pull kode terbaru, build ulang binary, lalu restart proses lama. Langkah ini sebaiknya dilakukan di luar jam trafik tinggi agar gangguan minimal. Backup database SQLite juga disarankan sebelum melakukan update besar.
cd /home/namauser/nama-app
git pull origin main
go build -o nama-app main.go
pkill -f nama-app
nohup ./nama-app > app.log 2>&1 &Sebelum deployment dianggap selesai, beberapa hal wajib dipastikan lebih dulu. Tabel berikut merangkum poin penting yang perlu dicek satu per satu. Proses deploy Golang di shared hosting cPanel baru bisa dikatakan stabil kalau semua poin ini terpenuhi. Pengecekan berkala tetap disarankan meski cron job sudah terpasang.
| Poin Pengecekan | Tujuan |
|---|---|
| Port outbound (misal SSH 22) | Memastikan koneksi keluar aplikasi berfungsi |
| Permission folder data/ | Memastikan database SQLite bisa ditulis |
| Modul mod_proxy Apache aktif | Mencegah error 500 pada reverse proxy |
| File config.yaml tidak public | Mencegah kebocoran kredensial lewat browser |
| Status DNS dan SSL subdomain | Memastikan HTTPS bisa diakses tanpa error |
| Cron job auto-restart | Menjaga aplikasi tetap hidup usai restart server |