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 --version dan docker 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:

  • -d menjalankan container di latar belakang.
  • -p 9443:9443 mempublikasikan 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 portainer memberi nama yang mudah diingat untuk perintah docker logs dan docker restart nanti.
  • --restart=always memastikan Portainer ikut hidup lagi setelah VPS reboot.
  • -v /var/run/docker.sock:/var/run/docker.sock menghubungkan 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:/data menempelkan volume dari langkah 1.
  • portainer/portainer-ce:lts adalah 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-container di 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 exec manual.

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

BagianNilai / perintahKeterangan
Imageportainer/portainer-ce:ltsJalur Long Term Support Portainer CE
Volume dataportainer_data:/dataMenyimpan akun, pengaturan, dan stack
Socket Docker/var/run/docker.sock:/var/run/docker.sockKendali penuh atas Docker host — perlakukan seperti akses root
Port UI9443 (HTTPS)Sertifikat self-signed saat pertama jalan
Port yang tidak dibuka8000, 9000Edge Agent tunnel dan HTTP lawas; hanya dibuka bila benar-benar perlu
Restart--restart=alwaysPortainer hidup lagi setelah reboot
Buat akun adminSegera setelah container jalanJendela pembuatan admin bisa terkunci bila dibiarkan
Updatestop, rm, pull, run ulangData 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