1. Arsitektur yang Direkomendasikan
Pisahkan DNS, reverse proxy, container aplikasi, dan database agar mudah dikelola.
Internet │ ├── DNS: app.domain.tld → PUBLIC_IP_VPS │ ▼ Nginx Proxy Manager │ :80 / :443 │ ├── app-php74:80 ├── app-php82:80 └── app-php84:80
2. Persiapan VPS
apt update && apt upgrade -y
apt install -y curl git nano unzip ca-certificates
docker --version docker compose version
mkdir -p /opt/apps mkdir -p /opt/apps/proxy/nginx mkdir -p /opt/apps/web
3. Membuat Container PHP
PHP 7.4 — contoh untuk aplikasi legacy
FROM php:7.4-apache RUN docker-php-ext-install mysqli pdo pdo_mysql COPY ./src/ /var/www/html/ RUN chown -R www-data:www-data /var/www/html EXPOSE 80
PHP 8.x — contoh aplikasi modern
FROM php:8.3-apache RUN docker-php-ext-install mysqli pdo pdo_mysql COPY ./src/ /var/www/html/ RUN chown -R www-data:www-data /var/www/html EXPOSE 80
Ganti 8.3 sesuai kebutuhan aplikasi. Jangan menaikkan versi PHP
secara langsung pada aplikasi legacy tanpa menguji kompatibilitas dependency dan kode.
Build dan jalankan container
cd /opt/apps/web/nama-app docker build -t nama-app-php74 . docker run -d \ --name nama-app-php74 \ --restart unless-stopped \ --network web \ nama-app-php74
web,
container aplikasi harus terhubung ke network yang sama.
Verifikasi container
docker ps docker inspect nama-app-php74 docker network inspect web
Pastikan container aplikasi terlihat pada bagian Containers di network web.
4. Konfigurasi Nginx Proxy Manager
Di Nginx Proxy Manager buat Proxy Host baru.
| Field | Isi |
|---|---|
| Domain Names | Contoh: tests.telpro5.org |
| Scheme | http |
| Forward Hostname / IP | Nama container, contoh test-php74 |
| Forward Port | 80 |
| Block Common Exploits | Aktifkan |
| Websockets Support | Aktifkan jika aplikasi membutuhkannya |
docker network inspect web
Jika container bernama test-php74 berada pada network yang sama,
Nginx Proxy Manager dapat meneruskan trafik ke test-php74:80.
Tidak perlu mengekspos port container ke Internet.
docker run -p 80:80 ...Jika Nginx Proxy Manager sudah memakai port 80/443 pada VPS, mem-publish port yang sama dari container lain akan menimbulkan konflik.
5. DNS dan SSL
A. DNS
Buat record A pada DNS provider yang benar:
Type : A Name : tests Value: PUBLIC_IP_VPS TTL : 300 / 3600
Verifikasi:
dig +short tests.telpro5.org dig @ns1.niagahoster.com tests.telpro5.org A
ns1.niagahoster.com dan
ns2.niagahoster.com, record harus dibuat pada DNS zone yang benar.
Membuat record di panel DNS yang bukan authoritative tidak akan mengubah DNS publik.
B. SSL Let's Encrypt
Setelah DNS sudah mengarah ke VPS dan HTTP berhasil:
- Nginx Proxy Manager → Proxy Hosts.
- Edit domain/subdomain.
- Tab SSL → Request a new SSL Certificate.
- Pilih Let's Encrypt.
- Aktifkan Force SSL jika HTTP sudah normal.
Uji:
curl -I http://tests.telpro5.org curl -I https://tests.telpro5.org
6. Database
Untuk MySQL/MariaDB, aplikasi sebaiknya menggunakan hostname service/container,
bukan localhost, jika database berada di container terpisah.
DB_HOST=mysql DB_PORT=3306 DB_DATABASE=nama_database DB_USERNAME=nama_user DB_PASSWORD=password-kuat
7. Prosedur Deploy Aplikasi
cd /opt/apps/web git clone URL_REPOSITORY nama-app cd nama-app
cp .env.example .env nano .env
docker build -t nama-app-php74 .
docker network connect web nama-app-php74Jika container dibuat langsung dengan
--network web, langkah ini tidak diperlukan.docker exec nama-app-php74 sh php -v curl -I http://127.0.0.1
docker exec nginx-proxy-manager \ curl -I http://nama-app-php74:80Jika curl tidak tersedia pada image Nginx Proxy Manager, lakukan pengujian dari container lain yang berada di network
web.80.8. Troubleshooting Cepat
| Gejala | Pemeriksaan |
|---|---|
| DNS kosong / NXDOMAIN |
dig +short subdomain.domaindig @ns1.niagahoster.com subdomain.domain APastikan record dibuat pada authoritative DNS. |
| DNS sudah benar tetapi website tidak tampil |
docker psdocker network inspect webPastikan NPM dan container aplikasi berada pada network yang sama. |
| 502 Bad Gateway | Periksa nama container, port internal, network Docker, dan apakah Apache/Nginx di container hidup. |
| Connection refused |
docker exec nama-container curl -I http://127.0.0.1Periksa service web di dalam container. |
| SSL error | Pastikan DNS → VPS, port 80/443 terbuka, Proxy Host benar, dan certificate valid. |
| PHP error |
docker logs nama-containerPeriksa versi PHP dan extension yang dibutuhkan aplikasi. |
Perintah diagnosis utama
docker ps docker logs --tail 100 nama-container docker inspect nama-container docker network inspect web docker exec nama-container php -v docker exec nama-container curl -I http://127.0.0.1 dig +short subdomain.domain.tld curl -I http://subdomain.domain.tld curl -I https://subdomain.domain.tld
9. Checklist Sebelum Go-Live
- DNS subdomain mengarah ke Public IP VPS.
- DNS diverifikasi melalui authoritative nameserver.
- Container aplikasi dalam kondisi running.
- Container aplikasi terhubung ke network Docker yang sama dengan Nginx Proxy Manager.
- Apache/Nginx di dalam container dapat melayani request pada port 80.
- PHP version sesuai requirement aplikasi.
- Extension PHP yang dibutuhkan sudah terpasang.
- Permission file dan folder aplikasi benar.
- Environment / database configuration sudah benar.
- Proxy Host menggunakan hostname container dan port internal yang benar.
- HTTP berhasil sebelum SSL diaktifkan.
- SSL Let's Encrypt berhasil diterbitkan.
- HTTPS dapat diakses dari jaringan luar VPS.
- Container menggunakan
--restart unless-stoppedatau kebijakan restart yang sesuai. - Backup source code dan database tersedia.
- Log aplikasi dan container dapat diperiksa saat terjadi masalah.
Domain:
tests.telpro5.orgDNS:
202.10.37.186Container:
test-php74Network:
webContainer IP:
172.18.0.2Web server: Apache
PHP:
7.4.33Port internal:
80Reverse proxy: Nginx Proxy Manager
10. Pola Standar untuk Banyak Aplikasi
Gunakan satu container per aplikasi/versi PHP bila kebutuhan versi berbeda.
| Domain | Container | PHP | Port Internal |
|---|---|---|---|
| app1.domain.tld | app1-php74 | 7.4 | 80 |
| app2.domain.tld | app2-php82 | 8.2 | 80 |
| app3.domain.tld | app3-php83 | 8.3 | 80 |
Semua container dapat berada di network web. Nginx Proxy Manager
menjadi pintu masuk HTTP/HTTPS dan meneruskan request berdasarkan hostname.