Instalasi di CentOS / RHEL #
Sistem operasi berbasis Red Hat Enterprise Linux (RHEL) beserta turunannya — seperti Rocky Linux, AlmaLinux, CentOS Stream, dan Fedora — memiliki standar keamanan tingkat tinggi yang berbeda secara signifikan jika dibandingkan dengan keluarga Debian atau Ubuntu. Perbedaan utama ini terletak pada penggunaan SELinux (Security-Enhanced Linux) dan firewalld yang aktif secara default di sistem. Kedua komponen ini sering kali memblokir akses jaringan dan file Caddy jika kita tidak mengonfigurasinya dengan tepat.
Artikel ini akan membahas proses instalasi Caddy pada ekosistem berbasis RPM secara komprehensif. Kita tidak hanya akan membahas perintah instalasi dasar, tetapi juga berfokus pada cara mengonfigurasi SELinux secara aman (tanpa mematikan SELinux) serta menyiapkan aturan firewalld untuk lingkungan produksi kita.
Distribusi yang Didukung #
Panduan ini dirancang untuk kompatibilitas penuh dengan sistem operasi berikut:
Distribusi Versi yang Didukung
─────────────────────────────────────────────────
Fedora 39, 40, 41+
CentOS Stream 8, 9
RHEL 8, 9
Rocky Linux 8, 9
AlmaLinux 8, 9
Oracle Linux 8, 9
[!WARNING] CentOS 7 telah mencapai status End-of-Life (EOL) pada Juni 2024. Menggunakan CentOS 7 di lingkungan produksi sangat tidak direkomendasikan karena ketiadaan pembaruan keamanan. Jika kita masih berada di CentOS 7, kita sangat disarankan untuk melakukan migrasi ke Rocky Linux 9 atau AlmaLinux 9 terlebih dahulu sebelum melanjutkan deployment Caddy.
Instalasi via COPR Repository Resmi #
Dalam ekosistem RPM, tim developer Caddy menyediakan paket resmi melalui COPR (Cool Other Package Repo) yang dikelola langsung di bawah payung Fedora Copr. Ini adalah metode instalasi paling stabil dan terintegrasi penuh dengan sistem manajemen paket DNF atau YUM.
1. Instalasi di Fedora #
Fedora telah menyertakan plugin COPR secara bawaan, sehingga kita bisa langsung mengaktifkan repositori Caddy:
# Mengaktifkan repositori resmi Caddy di Fedora
sudo dnf copr enable -y @caddy/caddy
# Menginstal Caddy Web Server
sudo dnf install -y caddy
2. Instalasi di RHEL, Rocky Linux, AlmaLinux, dan CentOS Stream (Versi 8 dan 9) #
Pada distribusi turunan RHEL Enterprise, kita perlu memastikan plugin perintah COPR untuk DNF telah terpasang sebelum mengaktifkan repositori:
# Langkah 1: Pastikan plugin perintah copr telah terinstal
sudo dnf install -y 'dnf-command(copr)'
# Langkah 2: Aktifkan repositori Caddy
sudo dnf copr enable -y @caddy/caddy
# Langkah 3: Perbarui metadata paket dan instal Caddy
sudo dnf install -y caddy
Setelah proses instalasi selesai, kita dapat memvalidasi instalasi Caddy:
# Memeriksa versi Caddy yang terinstal
caddy version
# Memeriksa status service systemd default
sudo systemctl status caddy
Memahami dan Mengonfigurasi SELinux #
SELinux adalah sistem keamanan kontrol akses wajib (Mandatory Access Control) yang menganalisis setiap proses pada tingkat kernel. Di RHEL dan Rocky Linux, SELinux berada dalam mode Enforcing (aktif memblokir aktivitas yang mencurigakan) secara bawaan.
[!CAUTION] Jangan Pernah Mematikan SELinux! Banyak panduan di internet menyarankan untuk mengubah mode SELinux menjadi
DisabledatauPermissiveketika Caddy mengalami error Permission Denied. Ini adalah solusi buruk yang membahayakan keamanan server kita. Jika server kita berhasil ditembus peretas, SELinux adalah benteng terakhir yang mencegah peretas mengakses bagian sistem lainnya. Solusi yang benar adalah menyesuaikan kebijakan SELinux agar mengizinkan aktivitas Caddy secara legal.
1. Memeriksa Mode SELinux saat ini #
Kita dapat memverifikasi status SELinux di server kita menggunakan perintah berikut:
# Memeriksa status aktif SELinux
getenforce
# Output yang diharapkan: Enforcing
# Menampilkan status detail konfigurasi SELinux
sestatus
2. Menyetel Boolean SELinux untuk Akses Jaringan #
Secara default, SELinux memblokir proses server web (seperti Caddy atau Nginx yang berjalan di bawah context httpd_t) untuk melakukan inisiasi koneksi keluar atau bertindak sebagai relay. Caddy sangat membutuhkan izin ini karena ia bertindak sebagai reverse proxy (menghubungi backend app) dan melakukan negosiasi ACME TLS ke Let’s Encrypt.
Kita dapat mengizinkan aktivitas ini menggunakan switch Boolean SELinux:
# Mengizinkan Caddy (proses bertipe httpd) melakukan inisiasi koneksi keluar (ACME challenge)
sudo setsebool -P httpd_can_network_connect 1
# Mengizinkan Caddy melakukan relay koneksi jaringan (Reverse Proxy ke backend app)
sudo setsebool -P httpd_can_network_relay 1
# Verifikasi bahwa kedua parameter Boolean di atas telah bernilai 'on'
getsebool httpd_can_network_connect httpd_can_network_relay
# Output yang diharapkan:
# httpd_can_network_connect --> on
# httpd_can_network_relay --> on
Flag -P memastikan perubahan ini disimpan secara permanen (persistent) ke dalam kebijakan sistem dan tidak akan hilang saat server kita di-reboot.
3. Mengonfigurasi File Context untuk Webroot Kustom #
SELinux menerapkan label tipe keamanan pada setiap file di disk. Caddy hanya dapat membaca file yang memiliki label tipe httpd_sys_content_t (file statis web) atau httpd_sys_rw_content_t (jika membutuhkan akses tulis).
Jika kita menaruh file situs web kita di luar direktori default /var/www/html — misalnya di /home/kita/situsku atau /data/www — Caddy akan menghasilkan error 403 Forbidden karena label tipe keamanan pada file tersebut salah.
Berikut adalah cara mendaftarkan label context SELinux secara permanen:
# Langkah 1: Tambahkan aturan konteks file secara permanen untuk direktori kustom kita
# Pola "(/.*)?" memastikan semua file di dalam folder tersebut mendapatkan label yang sama
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
# Langkah 2: Terapkan perubahan label tersebut ke file fisik di disk (restore context)
sudo restorecon -Rv /data/www
# Langkah 3: Verifikasi label context baru pada file kita
ls -lZ /data/www
# Output harus menyertakan penanda context tipe httpd_sys_content_t
4. Mendiagnosis dan Menyelesaikan Denial AVC #
Jika Caddy masih mengalami masalah hak akses, kita dapat memeriksa log audit SELinux untuk melihat pesan penolakan (AVC denial):
# Menampilkan penolakan SELinux terbaru yang berkaitan dengan Caddy
sudo ausearch -m avc -ts recent
# Menerjemahkan pesan audit yang rumit menjadi penjelasan bahasa manusia
sudo ausearch -m avc -ts recent | audit2why
Jika kita mendapati Caddy membutuhkan hak akses khusus yang tidak dapat diselesaikan via Boolean standar, kita dapat memaketkan pesan penolakan tersebut menjadi modul kebijakan kustom:
# Membuat modul kebijakan bernama caddy-custom berdasarkan log penolakan terbaru
sudo ausearch -m avc -ts recent | audit2allow -M caddy-custom
# Memasang modul kebijakan tersebut ke sistem kernel
sudo semodule -i caddy-custom.pp
Mengonfigurasi Firewalld #
Firewalld adalah pengelola firewall bawaan pada CentOS, RHEL, dan Rocky Linux. Firewall ini menggunakan konsep zona (zones) untuk menentukan tingkat kepercayaan koneksi. Secara default, lalu lintas masuk (inbound traffic) ke port 80 dan 443 diblokir total pada zona public.
Kita harus membuka port ini secara permanen agar pengguna internet dapat mengakses Caddy.
1. Memeriksa Zona Aktif #
# Memeriksa zona default yang digunakan kartu jaringan kita
sudo firewall-cmd --get-active-zones
# Output contoh: public
2. Membuka Port HTTP dan HTTPS #
Kita dapat mendaftarkan layanan web ke dalam aturan firewalld secara permanen:
# Membuka akses untuk port 80 (HTTP) secara permanen
sudo firewall-cmd --permanent --zone=public --add-service=http
# Membuka akses untuk port 443 (HTTPS TCP) secara permanen
sudo firewall-cmd --permanent --zone=public --add-service=https
# Membuka akses untuk port 443 (HTTPS UDP) untuk protokol HTTP/3 (QUIC)
sudo firewall-cmd --permanent --zone=public --add-port=443/udp
# PENTING: Lakukan reload firewalld agar aturan permanen di atas aktif di sistem runtime
sudo firewall-cmd --reload
# Verifikasi layanan dan port yang terbuka saat ini
sudo firewall-cmd --zone=public --list-all
# Output harus menyertakan http, https di bagian 'services' dan 443/udp di bagian 'ports'
Mengelola Caddy dengan Systemd #
Di ekosistem RHEL, unit service systemd diinstal di path /usr/lib/systemd/system/caddy.service. Kita dapat mengontrol proses Caddy menggunakan utilitas systemctl standar:
# Memulai layanan Caddy dan mengaktifkannya saat booting
sudo systemctl enable --now caddy
# Memeriksa status detail Caddy
sudo systemctl status caddy
# Melacak log runtime Caddy untuk memantau aktivitas transaksi ACME
sudo journalctl -u caddy -f
Untuk menerapkan perubahan konfigurasi di Caddyfile, selalu gunakan perintah reload demi meminimalkan downtime:
# Melakukan validasi, jika lolos, lakukan reload gracefully
caddy validate --config /etc/caddy/Caddyfile && sudo systemctl reload caddy
Struktur Direktori di CentOS / RHEL #
Berikut adalah ringkasan lokasi berkas penting Caddy pasca-instalasi di sistem operasi CentOS/RHEL:
| Nama Berkas / Direktori | Jalur (Path) | Keterangan |
|---|---|---|
| Binary Executable | /usr/bin/caddy | File program Caddy yang dijalankan. |
| File Konfigurasi | /etc/caddy/Caddyfile | Konfigurasi utama web server kita. |
| Penyimpanan Sertifikat | /var/lib/caddy/.local/share/caddy | Direktori penyimpanan kunci SSL dan ACME. |
| Unit Service | /usr/lib/systemd/system/caddy.service | Konfigurasi siklus hidup layanan systemd. |
Konfigurasi Awal dan Validasi Caddyfile #
Mari kita ganti konfigurasi default Caddyfile dengan skenario reverse proxy yang umum digunakan di lingkungan produksi:
# Membuka file konfigurasi utama
sudo nano /etc/caddy/Caddyfile
Tulis konfigurasi web server kita seperti contoh di bawah ini:
# Konfigurasi Global
{
email [email protected]
}
# Blok Domain Utama
situsku.com {
# Meneruskan lalu lintas ke backend app di port 8080
reverse_proxy localhost:8080
}
# Blok Subdomain Dokumentasi
docs.situsku.com {
root * /data/www/docs
file_server
encode gzip zstd
}
Sebelum kita memuat ulang perubahan ini, lakukan validasi sintaksis:
# Menjalankan validasi struktur file Caddyfile
caddy validate --config /etc/caddy/Caddyfile
Jika validasi sukses, lakukan reload:
sudo systemctl reload caddy
Troubleshooting Kasus Umum di RHEL/CentOS #
1. Reverse Proxy Mengembalikan Status HTTP 502 Bad Gateway #
Jika pada browser kita mendapatkan pesan 502, dan pada log journalctl Caddy menampilkan error:
dial tcp 127.0.0.1:8080: connect: permission denied
Ini adalah indikasi klasik bahwa SELinux memblokir koneksi dari Caddy ke port backend app kita. Solusi:
# Pastikan Boolean SELinux untuk koneksi jaringan luar bernilai on
sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P httpd_can_network_relay 1
2. File Statis Mengembalikan Status HTTP 403 Forbidden #
Jika file HTML situs kita ada di direktori /var/www/html atau direktori kustom, namun Caddy memberikan respon 403 padahal hak akses permission Linux UNIX (chmod) sudah benar (755).
Solusi:
Penyebabnya adalah file context SELinux pada direktori kita tidak dikenali oleh tipe httpd_t.
# Perbaiki context SELinux secara rekursif
sudo semanage fcontext -a -t httpd_sys_content_t "/path/ke/webroot(/.*)?"
sudo restorecon -Rv /path/ke/webroot
3. Server Web Berjalan tetapi Tidak Dapat Diakses dari Luar #
Jika kita melakukan curl -I localhost:80 dari dalam server dan mendapatkan respon sukses, namun koneksi dari luar server mengalami Connection Timeout.
Solusi:
Firewalld belum dikonfigurasi untuk mengizinkan lalu lintas HTTP/HTTPS masuk pada zona kartu jaringan kita.
# Buka akses layanan di firewalld
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
Checklist Deployment CentOS/RHEL #
Gunakan tabel checklist di bawah ini untuk memastikan seluruh aspek konfigurasi telah dipenuhi dengan benar sebelum server dirlis secara publik:
[ ] REPOSITORI : Paket DNF terinstal resmi dari COPR @caddy/caddy.
[ ] SELINUX : Berstatus Enforcing (bukan disabled).
[ ] BOOLEAN : httpd_can_network_connect diset ke 1 (on).
[ ] BOOLEAN : httpd_can_network_relay diset ke 1 (on).
[ ] CONTEXT : Direktori dokumen web memiliki tipe context httpd_sys_content_t.
[ ] FIREWALL : firewalld membuka service http, https, dan port 443/udp secara permanen.
[ ] DNS : Domain mengarah ke alamat IP publik eksternal server.
[ ] VALIDASI : caddy validate mengembalikan hasil "Valid configuration".
[ ] SYSTEMD : Layanan caddy.service berstatus "active (running)" dan "enabled".
Ringkasan #
- Repositori COPR — Merupakan jalur resmi penginstalan paket RPM Caddy untuk distribusi RHEL, Rocky Linux, dan AlmaLinux.
- SELinux Boolean — Kita wajib mengaktifkan Boolean
httpd_can_network_connectdanhttpd_can_network_relayagar Caddy dapat bertindak sebagai reverse proxy dan mengajukan sertifikat SSL.- SELinux Context — Selalu setel context berkas dokumen web statis kita ke tipe
httpd_sys_content_tmenggunakan perintahsemanage fcontextdanrestorecon.- Firewalld Port — Izinkan layanan HTTP dan HTTPS di firewalld serta port 443/udp untuk mengaktifkan performa maksimal HTTP/3.
- Graceful Management — Terapkan perubahan konfigurasi Caddyfile menggunakan perintah
systemctl reload caddyuntuk menghindari pemutusan koneksi klien.