Kalau PostgreSQL kamu jalan di dalam container Docker di remote server dan tidak diekspos ke internet, SSH tunnel adalah cara paling rapi untuk mengaksesnya dari laptop. Tanpa firewall rule, tanpa port terbuka, tanpa VPN. Cukup SSH.
Panduan ini membahas langkah-langkahnya lengkap dengan command yang bisa langsung kamu copy dan sesuaikan.
Kenapa pakai SSH tunnel?
Membuka port 5432 ke internet publik itu ide buruk. Dengan SSH tunnel, koneksi tetap privat:
- Port database tidak pernah menyentuh internet publik
- Akses dijaga oleh kredensial SSH yang sudah ada (lebih baik lagi pakai SSH key)
- Tool lokal seperti psql, DBeaver, TablePlus, dan Prisma Studio jalan persis seperti database-nya ada di mesinmu sendiri
Jalur trafiknya seperti ini:
local machine → SSH server → PostgreSQL container
Yang kamu butuhkan
Sebelum mulai, pastikan kamu punya:
- Akses SSH ke remote host
- Docker yang jalan di host itu dengan container PostgreSQL
- Nama (atau ID) container
- Port PostgreSQL di dalam container (biasanya
5432) - Satu port lokal yang kosong (panduan ini pakai
5433)
SSH key sangat disarankan dibanding login password. Lebih aman dan kamu tidak perlu mengetik password tiap sesi.
Step 1: Cari IP internal container
Bridge network Docker memberi tiap container IP sendiri yang bisa dijangkau host. Ambil dengan:
ssh root@<remote_host> "docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name>"
Hasilnya kira-kira seperti 172.18.0.5.
Kalau tidak ada output, cek dulu nama container-nya:
ssh root@<remote_host> "docker ps --format '{{.Names}}'"
Step 2: Buka tunnel
ssh -N -L <local_port>:<container_ip>:<container_port> root@<remote_host>
Contoh konkretnya:
ssh -N -L 5433:172.18.0.5:5432 root@example.com
Flag -N menyuruh SSH tidak menjalankan command di remote, cukup forward port. Biarkan terminal ini terbuka selama kamu butuh koneksinya.
Step 3: Konek dari tool lokal
Setelah tunnel jalan, konek ke 127.0.0.1 di port lokal pilihanmu dengan kredensial yang sama seperti database remote:
- Host:
127.0.0.1 - Port:
5433(atau port lokal apa pun yang kamu pilih) - User / password / database: sama seperti di instance PostgreSQL remote
Dengan psql:
psql -h 127.0.0.1 -p 5433 -U <db_user> -d <db_name>
GUI client apa pun (DBeaver, TablePlus, DataGrip) caranya sama: arahkan ke localhost dan port tunnel-mu.
Menjalankan tunnel di background
Kalau tunnel harus terbuka tanpa memakai satu terminal, tambahkan -f:
ssh -f -N -L 5433:172.18.0.5:5432 root@example.com
Untuk menutupnya nanti:
ps aux | grep "ssh -f -N -L 5433"
kill <pid>
Untuk yang lebih permanen, misalnya dev server yang kamu tunnel tiap hari, pakai autossh. Tool ini menjaga tunnel tetap hidup dan reconnect otomatis kalau putus.
Beberapa catatan keamanan
- Jangan ekspos port 5432 ke publik. Seluruh tujuan setup ini supaya kamu tidak perlu melakukannya.
- Pakai SSH key. Lebih sulit di-brute-force daripada password dan lebih mudah dikelola setelah setup.
- Hindari root kalau bisa. Kalau server mengizinkan user dengan hak terbatas lewat SSH, pakai itu untuk tunneling sehari-hari.
Pertanyaan umum
Bisa dipakai dengan Prisma?
Bisa. Set DATABASE_URL ke postgresql://<user>:<password>@127.0.0.1:<local_port>/<db_name> selama tunnel aktif. Prisma tidak tahu dan tidak peduli koneksinya lewat tunnel.
Bagaimana kalau PostgreSQL ada di host network, bukan di dalam container?
Lewati pencarian IP container dan pakai 127.0.0.1 sebagai target di command tunnel:
ssh -N -L 5433:127.0.0.1:5432 root@example.com
Perlu autossh?
Untuk pemakaian sesekali, tidak. Untuk tunnel yang harus selalu nyala tanpa dipantau, autossh layak disetup, cuma butuh lima menit.