Overview
Menjalankan aplikasi web dalam container Docker di VPS memerlukan reverse proxy untuk mengarahkan trafik domain ke port internal container, sekaligus menangani enkripsi HTTPS. Nginx dan Let's Encrypt adalah kombinasi paling handal untuk kebutuhan produksi pada Ubuntu 24.04 LTS.
Prasyarat
Pastikan sebelum memulai:
- VPS Ubuntu 24.04 LTS dengan akses sudo/root
- Docker sudah terinstall dan container aplikasi berjalan pada port lokal (contoh: 127.0.0.1:3000)
- Domain telah dihubungkan ke IP publik VPS (A Record)
1. Install Nginx dan Certbot
Update indeks paket dan install Nginx beserta plugin Certbot Nginx:
sudo apt update sudo apt install -y nginx certbot python3-certbot-nginx
2. Konfigurasi Nginx Server Block
Buat file konfigurasi Nginx baru untuk domain Anda:
sudo nano /etc/nginx/sites-available/example.com
Isi file dengan konfigurasi reverse proxy berikut (ganti example.com dan port 3000 sesuai aplikasi Anda):
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Aktifkan server block dengan membuat symbolic link dan uji sintaks:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
Peringatan Keamanan: Pastikan port container Docker Anda dipublikasikan hanya ke 127.0.0.1 (contoh: 127.0.0.1:3000:3000 pada docker-compose) agar tidak dapat diakses langsung dari IP publik tanpa melewati Nginx.
3. Generate SSL Let's Encrypt dengan Certbot
Jalankan Certbot untuk mendapatkan sertifikat SSL dan mengonfigurasi HTTPS otomatis pada Nginx:
sudo certbot --nginx -d example.com -d www.example.com
Ikuti instruksi di layar. Certbot akan memperbarui file konfigurasi Nginx secara otomatis untuk mengalihkan HTTP ke HTTPS.
4. Menambahkan Hardening Security Headers
Buka kembali konfigurasi Nginx yang telah diperbarui oleh Certbot:
sudo nano /etc/nginx/sites-available/example.com
Tambahkan header keamanan berikut di dalam block listen 443 ssl:
add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; add_header X-XSS-Protection "1; mode=block"; add_header Referrer-Policy "strict-origin-when-cross-origin";
Simpan file dan reload Nginx:
sudo systemctl reload nginx
5. Pengujian Auto-Renew SSL
Sertifikat Let's Encrypt berlaku selama 90 hari. Systemd timer Certbot aktif secara otomatis saat instalasi. Uji proses pembaharuan sertifikat:
sudo certbot renew --dry-run
Checklist Akhir
- Aplikasi Docker terikat hanya ke 127.0.0.1
- Nginx mem-proxy trafik port 80/443 ke port internal Docker
- Sertifikat SSL Let's Encrypt terpasang dan auto-redirect HTTP ke HTTPS aktif
- Security headers standar sudah terkonfigurasi
- Dry-run certbot renew berhasil tanpa error
