Di banyak setup self-hosting, satu alamat IP publik sering kali harus menampung puluhan service. Mengelola semua service ini dengan Nginx murni berarti menulis dan memelihara banyak server block, aturan proxy, dan route map yang rentan terhadap kesalahan konfigurasi saat service bertambah. Tantangan utamanya bukan hanya kompleksitas file konfigurasi, tetapi juga pengelolaan sertifikat TLS/SSL untuk setiap domain, penanganan pembaruan otomatis, dan konflik port.
Apa itu Nginx Proxy Manager (NPM)?
Nginx Proxy Manager (NPM) adalah aplikasi berbasis container yang membungkus Nginx dengan web User Interface untuk mengelola reverse proxy, host, sertifikat SSL/TLS, redirections, dan stream TCP/UDP. NPM menyediakan dashboard yang memungkinkan kita menambahkan atau mengubah proxy host, menghubungkan hostname dengan backend, dan meminta sertifikat Let's Encrypt tanpa menyentuh file konfigurasi Nginx secara manual.
Mengapa Memilih NPM?
- Gratis & Open Source: Solusi gratis dengan komunitas yang aktif.
- User Friendly UI: Cocok untuk pengguna yang tidak ingin edit config manual.
- SSL Otomatis: Integrasi langsung dengan Let's Encrypt untuk issuance dan renewal otomatis.
- Perbandingan Singkat:
- Nginx Murni: Fleksibel tapi konfigurasi manual dan rawan human error.
- NPM: Mengutamakan kemudahan operasi dan manajemen sertifikat terpusat.
1. Persiapan & Instalasi
Spesifikasi Minimum Server
- CPU: 1 vCPU
- RAM: 1 GB (2 GB direkomendasikan jika menjalankan banyak container)
- Disk: 10 GB free space
- Network: Akses inbound pada port 80, 443, dan 81
Instalasi Docker
Gunakan script resmi instalasi Docker. Jalankan perintah berikut:
sudo sh -c "curl -fsSL https://get.docker.com/ | sh"
Docker Compose
Membuat direktori npm:
mkdir npm
cd npmMembuat file compose.yml:
nano compose.ymlMasukkan konfigurasi berikut, pastikan mengganti password pada bagian environment:
services:
npm:
image: jc21/nginx-proxy-manager:2.14.0
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- "80:80"
- "81:81"
- "443:443"
environment:
DB_MYSQL_HOST: "db"
DB_MYSQL_PORT: 3306
DB_MYSQL_USER: "npm"
DB_MYSQL_PASSWORD: "npm_password_here"
DB_MYSQL_NAME: "npm"
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
depends_on:
- db
db:
image: 'jc21/mariadb-aria:latest'
container_name: mariadb-nginx-proxy-manager
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "root_password_here"
MYSQL_DATABASE: "npm"
MYSQL_USER: "npm"
MYSQL_PASSWORD: "npm_password_here"
volumes:
- ./data/mysql:/var/lib/mysql
networks:
default:
name: npm_networkKeterangan:
- Services: npm (Reverse Proxy)
- Ports:
- 80:80 & 443:443: Jalur masuk utama untuk trafik HTTP dan HTTPS.
- 81:81: Port untuk mengakses Dashboard Admin NPM.
- Environment: Menghubungkan NPM ke database MariaDB menggunakan kredensial yang sama dengan service db.
- Volumes:
- ./data: Menyimpan konfigurasi host dan pengaturan user.
- ./letsencrypt: Menyimpan sertifikat SSL agar tidak hilang saat kontainer di-restart.
- Ports:
- Services: db (Database)
- Image (mariadb-aria): Versi database yang dioptimalkan untuk NPM agar lebih ringan dan cepat.
- Volumes (./data/mysql): Sangat krusial agar data tabel dan user proxy tetap tersimpan secara permanen di disk host.
- Networks
- name: npm_network: Membuat jaringan khusus. Container lain bisa dihubungkan ke jaringan yang sama dan dikenali oleh NPM cukup menggunakan nama container saja.
Menjalankan & Login Pertama
Jalankan container:
sudo docker compose up -dVerifikasi hasil docker compose:
sudo docker compose psContoh responnya:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
mariadb-nginx-proxy-manager jc21/mariadb-aria:latest "/scripts/run.sh" db 37 seconds ago Up 36 seconds 3306/tcp
nginx-proxy-manager jc21/nginx-proxy-manager:latest "/init" npm 37 seconds ago Up 36 seconds 0.0.0.0:80-81->80-81/tcp, [::]:80-81->80-81/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcpAkses panel admin pada port 81 (misal: http://server-ip:81). Lanjutkan membuat akun admin.
2. Skenario Penggunaan
a. Reverse Proxy untuk Docker Container
Aplikasi yang terbungkus Docker container ingin diakses via subdomain docker-app.domain.com melalui NPM pada host yang sama, dengan kondisi kedua container sudah terhubung ke dalam network yang sama (npm_network) agar komunikasi internal berjalan lancar.
Topologi:
User → Internet → NPM (80/443) → Container (container_name:80)Menjalankan container yang mau dihubungkan dengan NPM:
sudo docker run -d --name nginx-app --network npm_network -p 127.0.0.1:8080:80 --restart always nginx:alpine
Langkah Membuat Proxy:
- Hosts → Proxy Hosts. Add Proxy Hosts.
- Details:
- Domain Names = misal docker-app.domain.com.
- Scheme = http.
- Forward Hostname / IP = nginx-app (karena berada di network yang sama dengan NPM, cukup pakai nama container)
- Forward Port = 80.
- SSL:
- Request a new Certificate
- Force SSL
- HTTP/2 Support
- HSTS Enabled
- Lalu Save.

b. Reverse Proxy untuk Host Berbeda
Kondisi saat ini aplikasi berada di host yang berbeda dengan NPM, sehingga akses dapat dilakukan melalui IP server aplikasi tersebut, bukan lagi menggunakan nama container.
Topologi:
User → Internet → NPM (10.130.0.2) → App (10.130.0.3:8080)Langkah Membuat Proxy:
- Hosts → Proxy Hosts. Add Proxy Hosts.
- Details:
- Domain Names = misal other-app.domain.com.
- Scheme = http.
- Forward Hostname / IP = IP server aplikasi, misal 10.130.0.3.
- Forward Port = port aplikasi, misal 8080.
- SSL:
- Request a new Certificate
- Force SSL
- HTTP/2 Support
- HSTS Enabled
- Lalu Save.
3. Custom SSL Certificate
Jika tidak ingin menggunakan SSL dari Let's Encrypt, Nignx Proxy Manager mendukung custom SSL certificate.
Menambah SSL Certificate:
- Certificates → Add Certificate → Custom Certificate.
- Beri nama certificate dan upload file certificate key, certificate, dan intermediate certificate (opsional).
- Save.
Mengganti SSL Certificate:
- Edit Proxy Host → tab SSL.
- Pada SSL Certificate, pilih nama SSL yang telah dimasukkan.
- Save.
Penutup
Nginx Proxy Manager mempermudah manajemen reverse proxy dan SSL lewat GUI, cocok untuk self-hosters yang ingin solusi cepat tanpa edit config manual. Untuk infrastruktur yang sangat dinamis atau ber-orchestrator besar, solusi lain mungkin lebih cocok, namun untuk prioritas kemudahan operasi dan manajemen terpusat, NPM adalah pilihan terbaik.




