Install Portainer di VPS: Kelola Semua Container Docker dari Browser
Masalahnya: Docker yang cuma bisa dipegang lewat terminal
Begitu jumlah container di VPS bertambah, mengelola semuanya dari terminal mulai terasa sempit. Satu layanan mogok, Anda harus ingat nama containernya, mengecek lognya, lalu memastikan restart policy-nya benar. Tambah satu stack baru, Anda membuka file compose, mengetik perintah, lalu mengecek lagi apakah semua service benar-benar jalan. Semua itu bisa dilakukan dari terminal, dan tidak ada yang salah dengan cara itu. Masalahnya muncul ketika Anda perlu gambaran utuh dalam satu pandangan: container mana yang sedang jalan, mana yang restart berulang, berapa pemakaian resource-nya, dan volume mana yang menempel ke service apa.
Portainer CE menjawab kebutuhan itu dengan satu dashboard web. Portainer sendiri berjalan sebagai container, berbicara ke Docker daemon lewat socket, lalu menampilkan container, image, volume, network, dan stack dalam antarmuka yang bisa diklik. Anda tetap bisa memakai terminal kapan pun, tetapi tugas rutin seperti melihat log, restart container, atau men-deploy stack jadi jauh lebih cepat dibaca.
Satu hal yang wajib dipahami sejak awal: Portainer memegang kendali penuh atas Docker di host itu. Siapa pun yang bisa login ke Portainer praktis bisa menjalankan container baru, termasuk container dengan hak tinggi. Jadi instalasi di artikel ini sengaja dibuat konservatif: port UI hanya dibuka seperlunya, akun admin dibuat kuat, dan akses publik tanpa perlindungan tambahan tidak pernah jadi opsi yang direkomendasikan.
Prasyarat
Sebelum mulai, pastikan tiga hal ini sudah beres:
- VPS dengan Docker dan Docker Compose sudah terpasang dan berjalan. Periksa dengan
docker --versiondandocker ps. Kalau Docker belum ada, pasang dulu dari repositori resmi Docker untuk distribusi yang Anda pakai, lalu kembali ke sini. - Akses SSH ke VPS dengan hak sudo.
- Port 9443 belum dipakai layanan lain. Cek dengan
sudo ss -tlnp | grep 9443. Kalau tidak ada output, port itu kosong dan aman dipakai.
Portainer CE gratis dan cukup untuk satu host maupun beberapa host kecil. Versi berbayar (Business) menambah fitur seperti kontrol akses berbasis peran yang lebih detail, tetapi untuk homelab dan VPS tunggal, CE sudah memadai.
Langkah 1: Buat volume data Portainer
Portainer menyimpan akun admin, pengaturan environment, dan riwayat stack di dalam container pada direktori /data. Kalau direktori itu tidak dipersistensikan, menghapus container berarti menghapus semua konfigurasi. Karena itu langkah pertama adalah membuat volume Docker bernama portainer_data:
docker volume create portainer_data
Hasil yang diharapkan: output satu baris berisi nama volume itu sendiri.
portainer_data
Konfirmasi dengan:
docker volume inspect portainer_data
Outputnya berupa objek JSON yang menunjukkan nama volume dan mountpoint di host. Anda tidak perlu menghafal mountpoint itu; yang penting, volume ini akan dipakai ulang setiap kali container Portainer dibuat ulang, termasuk saat upgrade.
Kesalahan umum di langkah ini: menjalankan perintah sebagai user yang belum masuk grup docker sehingga Docker menolak koneksi ke daemon. Gejalanya pesan permission denied saat mengakses socket. Solusinya, jalankan dengan sudo atau tambahkan user ke grup docker dengan sudo usermod -aG docker $USER, lalu login ulang sebelum melanjutkan.
Langkah 2: Jalankan Portainer CE
Perintah resmi untuk instalasi Docker pada satu host memakai image portainer/portainer-ce dengan tag lts (Long Term Support). Tag ini dipilih karena jalurnya stabil, bukan jalur yang berubah setiap rilis fitur:
docker run -d \ -p 9443:9443 \ --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:lts
Arti tiap flag, supaya tidak sekadar ditempel:
-dmenjalankan container di latar belakang.-p 9443:9443mempublikasikan UI dan API Portainer lewat HTTPS pada port 9443. Portainer membuat sertifikat self-signed sendiri saat pertama kali jalan, jadi browser akan menampilkan peringatan sertifikat. Itu wajar pada tahap ini dan dibahas lagi di langkah pengamanan.--name portainermemberi nama yang mudah diingat untuk perintahdocker logsdandocker restartnanti.--restart=alwaysmemastikan Portainer ikut hidup lagi setelah VPS reboot.-v /var/run/docker.sock:/var/run/docker.sockmenghubungkan Portainer ke Docker daemon host. Mount ini sengaja read-write, karena Portainer perlu membuat dan mengelola container. Mount read-only akan merusak fungsi itu.-v portainer_data:/datamenempelkan volume dari langkah 1.portainer/portainer-ce:ltsadalah image resmi Portainer CE.
Dua port lain sengaja tidak dipublikasikan di sini. Port 8000 adalah tunnel untuk Edge Agent, hanya relevan kalau Anda mengelola environment remote lewat agen. Port 9000 adalah port HTTP lawas; pada Portainer modern, HTTP dinonaktifkan secara default dan akses normal lewat HTTPS 9443. Menambah keduanya tanpa kebutuhan hanya memperlebar permukaan serangan.
Tunggu beberapa detik, lalu verifikasi:
docker ps --filter name=portainer
Hasil yang diharapkan kurang lebih seperti ini: status Up, dan kolom PORTS menunjukkan 9443->9443:
CONTAINER ID IMAGE STATUS PORTS NAMES a1b2c3d4e5f6 portainer/portainer-ce:lts Up 8 seconds 0.0.0.0:9443->9443/tcp portainer
Kalau statusnya Exited, jangan langsung mengulang perintah. Lihat dulu penyebabnya:
docker logs portainer
Dua penyebab paling sering: port 9443 sudah dipakai container lain, atau volume portainer_data bermasalah. Pesan log biasanya menyebut keduanya dengan jelas. Perbaiki penyebabnya, hapus container gagal dengan docker rm portainer, lalu jalankan lagi perintah docker run di atas.
Langkah 3: Buat akun admin dan hubungkan environment lokal
Buka di browser:
https://IP-VPS-Anda:9443
Ganti IP-VPS-Anda dengan alamat IP publik VPS. Browser akan menampilkan peringatan sertifikat self-signed. Pada tahap awal ini, Anda bisa melanjutkan melewati peringatan itu (biasanya lewat tautan "Advanced" lalu "Proceed"), dengan catatan Anda memang sedang membuka IP VPS sendiri, bukan tautan dari pihak lain.
Di layar pertama, Portainer meminta Anda membuat akun admin. Buat username dan password yang panjang dan unik, lalu simpan di password manager. Jendela pembuatan admin ini punya batas waktu: kalau dibiarkan terlalu lama, Portainer mengunci pembuatan akun demi keamanan dan Anda harus restart container untuk mengulang. Jadi buat akunnya segera setelah container jalan.
Setelah login, pilih environment lokal. Pada instalasi satu host, Portainer biasanya langsung mendeteksi Docker lokal dan menampilkannya sebagai environment local. Klik environment itu, dan Anda masuk ke dashboard: daftar container, pemakaian CPU dan memori, serta status tiap service.
Kalau environment lokal tidak muncul, periksa dua hal: apakah mount socket di perintah docker run sudah benar (/var/run/docker.sock di kedua sisi), dan apakah container Portainer berstatus Up. Tanpa socket yang benar, Portainer tidak punya apa-apa untuk dikelola.
Langkah 4: Melihat log dan mengelola container dari UI
Dari menu Containers, klik nama container apa pun untuk membuka detailnya. Tiga hal yang paling sering dipakai di sini:
- Logs: menampilkan output container secara live. Ini pengganti
docker logs -f nama-containerdi terminal, dengan tombol refresh dan pencarian. Ketika sebuah service crash, log di sinilah tempat pertama yang layak dibuka. - Inspect: menampilkan konfigurasi lengkap container, dari image dan environment variable sampai mount dan network.
- Console: membuka shell di dalam container yang sedang jalan, berguna untuk memeriksa file konfigurasi tanpa SSH ke host lalu
docker execmanual.
Untuk menghentikan, memulai ulang, atau menghapus container, cukup centang containernya lalu pakai tombol aksi di atas daftar. Portainer juga menampilkan kolom status yang jelas: container yang restart berulang biasanya langsung terlihat dari status dan waktu uptime yang sangat pendek. Itu sinyal untuk membuka log, bukan sekadar menekan restart berulang kali.
Satu kebiasaan yang layak dijaga: sebelum menghapus container dari UI, periksa dulu apakah datanya hidup di volume atau bind mount. Container yang datanya hanya tersimpan di layer writable-nya akan kehilangan data itu saat dihapus. Aturan praktisnya, service stateful selalu dipasangi volume bernama, sama seperti portainer_data di langkah 1.
Langkah 5: Men-deploy stack dari UI
Stack di Portainer adalah file Docker Compose yang dikelola lewat UI. Ini cara paling rapi untuk menambah layanan baru tanpa kembali ke terminal setiap kali.
Caranya: masuk ke menu Stacks, klik "Add stack", beri nama, lalu tempel isi file Compose di editor. Contoh stack kecil untuk menguji alur ini, memakai image nginx resmi:
services:
web-uji:
image: nginx:alpine
container_name: web-uji
restart: unless-stopped
ports:
- "8080:80"Klik "Deploy the stack". Hasil yang diharapkan: Portainer membuat container web-uji, dan daftar stack menampilkan statusnya sebagai berjalan. Verifikasi dari terminal juga bisa:
docker ps --filter name=web-uji
Dan dari browser, buka http://IP-VPS-Anda:8080. Halaman sambutan Nginx berarti stack bekerja. Setelah puas menguji, hapus stack uji ini dari menu Stacks supaya tidak tertinggal jadi beban: Portainer akan menghapus containernya, sementara network yang dibuat stack ikut dibersihkan.
Untuk stack produksi, ada dua pola yang umum. Pola pertama, tempel Compose langsung di editor Portainer seperti contoh di atas. Pola kedua, arahkan Portainer ke repositori Git yang berisi file Compose, sehingga perubahan stack tercatat di version control. Pola kedua lebih rapi untuk stack yang sering berubah, tetapi pola pertama sudah cukup untuk layanan yang jarang disentuh.
Kesalahan umum saat men-deploy stack: salah indentasi YAML atau nama service bentrok dengan container yang sudah ada. Portainer akan menampilkan pesan error dari Docker Compose di layar yang sama; baca baris yang disebut error itu, perbaiki di editor, lalu deploy ulang. Jangan mengubah nama volume yang sudah dipakai stack lain tanpa sadar, karena itu bisa membuat service membaca data yang salah.
Langkah 6: Amankan akses — bagian yang tidak boleh dilewati
Inilah bagian yang membedakan instalasi rapi dari instalasi yang mengundang masalah. Ingat, Portainer memegang kendali Docker penuh. Membuka https://IP-VPS-Anda:9443 ke seluruh internet dengan hanya mengandalkan password admin adalah risiko yang tidak perlu diambil, sekencang apa pun password itu.
Pilih salah satu dari tiga pola ini, sesuai kondisi Anda:
Pola A — Batasi lewat firewall ke IP Anda saja. Kalau IP rumah atau kantor Anda relatif stabil, ini pola paling sederhana. Dengan UFW:
sudo ufw allow from IP-Anda to any port 9443 proto tcp sudo ufw enable
Ganti IP-Anda dengan IP publik tempat Anda mengakses. Kekurangannya, IP yang berubah membuat Anda harus memperbarui rule ini. Kelebihannya, tidak ada komponen tambahan.
Pola B — Jangan publikasikan portnya, akses lewat SSH tunnel. Ubah publikasi port menjadi hanya localhost dengan menghentikan container dan menjalankannya ulang dengan -p 127.0.0.1:9443:9443 menggantikan -p 9443:9443. Lalu dari komputer Anda:
ssh -L 9443:localhost:9443 user@IP-VPS-Anda
Selama sesi SSH itu hidup, buka https://localhost:9443 di browser komputer Anda. Portainer tidak bisa dijangkau dari internet sama sekali, hanya lewat tunnel itu.
Pola C — Letakkan di balik reverse proxy dengan autentikasi dan sertifikat valid. Ini pola yang paling cocok kalau beberapa orang perlu mengakses Portainer. Pasang Nginx sebagai reverse proxy, terbitkan sertifikat Let's Encrypt untuk subdomain khusus (misalnya portainer.domain-Anda.com), dan jangan publikasikan port 9443 ke publik sama sekali — proxy yang berbicara ke Portainer lewat jaringan internal. Sertifikat valid menghilangkan peringatan self-signed, dan Anda bisa menambah lapisan autentikasi di depan proxy.
Apa pun polanya, tiga aturan ini tetap berlaku: jangan pernah memakai password admin yang lemah atau dipakai ulang, jangan membagikan akun admin ke orang yang hanya perlu melihat status (buat akun dengan peran lebih terbatas bila Portainer Business dipakai, atau batasi aksesnya lewat pola A/B), dan perbarui Portainer secara berkala. Cara update-nya sederhana karena datanya ada di volume:
docker stop portainer docker rm portainer docker pull portainer/portainer-ce:lts
Lalu jalankan lagi perintah docker run dari langkah 2 dengan flag yang sama. Volume portainer_data memastikan akun dan stack Anda tetap ada.
Kesalahan keamanan yang paling sering terlihat: membiarkan port 9443 terbuka sambil menunda pembuatan akun admin. Selama jendela itu, siapa pun yang menemukan port tersebut bisa membuat akun admin sendiri. Karena itu urutannya tidak boleh dibalik: jalankan container, segera buat akun admin, baru pikirkan akses jangka panjangnya.
Tabel ringkasan
| Bagian | Nilai / perintah | Keterangan |
|---|---|---|
| Image | portainer/portainer-ce:lts | Jalur Long Term Support Portainer CE |
| Volume data | portainer_data:/data | Menyimpan akun, pengaturan, dan stack |
| Socket Docker | /var/run/docker.sock:/var/run/docker.sock | Kendali penuh atas Docker host — perlakukan seperti akses root |
| Port UI | 9443 (HTTPS) | Sertifikat self-signed saat pertama jalan |
| Port yang tidak dibuka | 8000, 9000 | Edge Agent tunnel dan HTTP lawas; hanya dibuka bila benar-benar perlu |
| Restart | --restart=always | Portainer hidup lagi setelah reboot |
| Buat akun admin | Segera setelah container jalan | Jendela pembuatan admin bisa terkunci bila dibiarkan |
| Update | stop, rm, pull, run ulang | Data aman karena tersimpan di volume |
Checklist akhir
- Volume portainer_data dibuat dan terlihat di
docker volume inspect. - Container portainer berstatus Up dan port 9443 mendengarkan.
- Akun admin dibuat dengan password panjang dan unik, tersimpan di password manager.
- Environment local terlihat dan daftar container tampil di dashboard.
- Satu stack uji berhasil di-deploy dan dihapus lagi tanpa sisa.
- Akses ke port 9443 dibatasi: firewall ke IP tertentu, SSH tunnel, atau reverse proxy — bukan terbuka ke seluruh internet.
- Jadwal update Portainer dicatat, dan perintah update di atas sudah dipahami.
Kalau semua kotak ini tercentang, VPS Anda kini punya satu tempat untuk melihat dan mengendalikan seluruh armada containernya, tanpa harus menghafal nama container satu per satu di terminal.
Layanan apa yang pertama kali akan Anda pindahkan pengelolaannya ke Portainer — stack yang sudah jalan, atau layanan baru yang selama ini tertunda karena malas mengurus Compose-nya dari terminal? Ceritakan di komentar, dan sebut juga pola pengamanan mana yang Anda pilih: firewall, SSH tunnel, atau reverse proxy.
Baca juga: Kalau Portainer ini menjadi pusat kendali container Anda, artikel tentang Docker Compose untuk self-hosting dari nol membantu merapikan file Compose yang nantinya di-deploy sebagai stack, sementara panduan satu VPS banyak layanan dengan Nginx reverse proxy menjelaskan pola pengamanan akses yang disebut di langkah 6.


Komentar
Posting Komentar