Lewati ke konten utama
Scale-to-Zero Docker Container dengan Sablier dan Traefik — Bebasin RAM VPS

Scale-to-Zero Docker Container dengan Sablier dan Traefik — Bebasin RAM VPS

Zarvelion Zynji
Penulis
Zarvelion Zynji
Tech enthusiasts (self-proclaimed). Gaming addict (diagnosed). Anime simp (no regrets). I turn my hyperfixations into content—welcome to the chaos.
Daftar isi

Kontainer Docker Kamu Ngabisin RAM Tanpa Ngapa-ngapain? Ini Solusinya
#

Kamu punya 10, mungkin 15 kontainer Docker yang jalan terus di VPS. Mungkin itu Raspberry Pi. Mungkin mini PC yang disembunyiin di belakang router. Mungkin VPS paling murah yang bisa kamu temuin. Pokoknya, kamu pasti tau sakitnya: setengah dari kontainer itu nganggur 90% waktunya, tapi tetep aja ngemil RAM yang berharga.

Uptime monitor yang nge-ping tiap 30 detik. Dashboard yang kamu cek dua kali sehari. Tools internal yang udah seminggu gak dibuka orang. Semuanya jalan. Semua makan memory. Semua gak ngelakuin apa-apa yang berguna.

Gimana kalo kontainer-kontainer itu bisa tidur sampe beneran ada yang butuh?

Nah, itu yang Sablier lakuin. Tools open-source gratis yang integrasi sama Traefik buat jalanin container pas diminta dan matiin setelah sekian lama nganggur. Anggep aja scale-to-zero buat stack self-hosted kamu.

Di panduan ini, gue bakal tunjukin cara setup Sablier sama Traefik biar kontainer-kontainer nganggur kamu berhenti boros resource — tanpa ngorbain aksesibilitas.

Apa Itu Sablier?
#

Sablier adalah middleware enteng yang ngatur siklus hidup kontainer Docker kamu. Pas ada request masuk buat kontainer yang lagi tidur, Sablier bangunin. Pas kontainer udah nganggur dalam waktu yang bisa kamu atur, Sablier menyapih lagi.

Dia bisa pake:

  • Docker (standalone)
  • Docker Swarm
  • Kubernetes

Dan integrasi sama reverse proxy populer kaya Traefik, Caddy, sama Nginx.

Setup-nya ada dua bagian:

  1. Sablier server — backend yang ngobrol sama Docker lewat docker.sock buat start/stop kontainer
  2. Plugin Sablier buat Traefik — middleware yang nyegat request masuk dan koordinasi sama server

Dua Strategi: Dynamic vs Blocking
#

Sablier punya dua strategi buat nanganin proses bangunin kontainer. Pilih yang cocok sama kebutuhan kontainer kamu.

Dynamic Strategy (Paling Oke buat Web App)
#

Dynamic strategy nampilin halaman loading ke pengunjung sementara kontainer booting di belakang layar. Begitu kontainer udah sehat, Sablier ngarahin ke aplikasi aslinya.

Ini mantep buat:

  • Dashboard web (Homepage, Dashy, dll.)
  • Tools internal dengan UI simpel
  • Aplikasi apapun yang loading 5-10 detik masih acceptable

Blocking Strategy (Paling Oke buat API)
#

Blocking strategy nahan request masuk sampe kontainer beneran siap, baru diterusin. Pengunjung cuma ngerasa delay sebentar tapi gak pernah liat halaman loading.

Pake ini buat:

  • REST API
  • Aplikasi yang gak bisa render halaman loading HTML
  • Service yang respon bersih lebih penting daripada kecepatan

Catatan buat pengguna Safari/iOS: Dynamic strategy punya masalah yang udah dikenal di Safari iOS. Kalo pengguna kamu akses dari iPhone atau iPad, mending pake Blocking strategy sebagai fallback.

Prasyarat
#

Sebelum mulai, pastiin kamu punya:

  • Docker dan Docker Compose terinstall
  • Traefik v3.6.0 atau lebih baru (konfigurasi via Docker labels udah didukung dari versi ini)
  • Traefik yang jalan dengan provider Docker aktif
  • Udah lumayan familiar sama label Docker dan konfigurasi Traefik

Langkah 1: Daftarin Plugin Sablier di Traefik
#

Pertama, kamu perlu kasih tau Traefik soal plugin Sablier. Tambahin ke traefik.yml di bagian experimental:

experimental:
  plugins:
    sablier:
      moduleName: "github.com/acouvreur/sablier"
      version: "v1.8.0"

Kalo kamu jalanin Traefik via Docker Compose, pastiin config ini ke-mount dengan bener.

Langkah 2: Deploy Server Sablier
#

Server Sablier butuh akses ke docker.sock biar bisa start/stop kontainer. Ini contoh service Docker Compose minimal:

services:
  sablier:
    image: acouvreur/sablier:latest
    container_name: sablier
    ports:
      - "10000:10000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      - start
      - --provider.name=docker
    restart: unless-stopped

Server-nya dengerin di port 10000 secara default. Traefik bakal komunikasi lewat situ.

Pro Tip: Mulai Semua Kontainer dalam Mode Tidur
#

Kalo kamu mau Sablier ngatur semua kontainer dari awal (bukan dalam keadaan jalan), pake flag ini:

command:
  - start
  - --provider.name=docker
  - --provider.auto-stop-on-startup

Ini nyuruh Sablier buat langsung matiin kontainer yang dikelola, jadi semuanya mulai dari mode tidur.

Langkah 3: Konfigurasi Middleware Sablier
#

Bikin file konfigurasi dinamis (atau tambahin ke config Traefik dinamis yang udah ada) buat definiin middleware Sablier:

http:
  middlewares:
    sablier:
      plugin:
        sablierUrl: "http://sablier:10000"
        group: "my-apps"
        sessionDuration: "5m"
        theme: "hacker-terminal"

Ini arti tiap parameter:

Parameter Deskripsi
sablierUrl URL server Sablier
group Grup label Docker yang dikelola Sablier
sessionDuration Berapa lama kontainer tetap hidup setelah request terakhir (contoh: 5m, 30m, 1h)
theme Tema halaman loading buat Dynamic strategy

Tema yang Tersedia
#

Sablier punya beberapa tema bawaan buat halaman loading Dynamic strategy:

  • hacker-terminal — estetik terminal hijau-hitam
  • ghost — tema gelap minimalis bersih
  • shuffle — animasi loading

Pilih aja yang cocok sama selera kamu. Detail kecil sih, tapi bikin pengalaman loading terasa disengaja, bukan error.

Langkah 4: Tambahin Label ke Kontainer Target
#

Nah, ini bagian yang nyambungin semuanya. Tambahin label ini ke kontainer Docker yang mau kamu kelola pake Sablier:

services:
  my-app:
    image: my-app:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.my-app.rule=Host(`app.zynji.my.id`)"
      - "traefik.http.routers.my-app.middlewares=sablier@docker"
      - "sablier.enable=true"
      - "sablier.group=my-apps"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s

Label yang penting:

  • sablier.enable=true — bilang ke Sablier buat kelola kontainer ini
  • sablier.group=my-apps — harus cocok sama nama grup di konfigurasi middleware
  • traefik.http.routers.my-app.middlewares=sablier@docker — nempelkin middleware Sablier ke router

Langkah 5: Tambahin Health Check
#

Ini krusial. Sablier perlu tau kapan kontainer kamu beneran siap nerima traffic. Tanpa health check, Sablier bisa aja ngarahin user ke kontainer yang masih proses inisialisasi.

Tambahin blok healthcheck ke setiap kontainer yang dikelola Sablier:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
  interval: 10s
  timeout: 5s
  retries: 3
  start_period: 10s

Sesuaiin perintah test dengan endpoint health yang aplikasi kamu punya. Kalo aplikasi kamu gak punya endpoint health, bisa pake TCP check sederhana atau perintah yang ngecek prosesnya jalan.

Langkah 6: Uji Coba
#

Begitu semua udah terkonfigurasi:

  1. Restart Traefik biar plugin-nya ke-load
  2. Jalanin kontainer-kontainer kamu
  3. Kunjungi URL aplikasi di browser
  4. Kamu bakal liat halaman loading (Dynamic strategy) sementara kontainer booting
  5. Abis kontainer sehat, kamu bakal diarahin ke aplikasi
  6. Tunggu sampe sessionDuration kedaluwarsa dan cek kontainer berhenti

Kamu bisa verifikasi kontainer udah berhenti dengan:

docker ps --filter "name=my-app"

Kontainer harusnya ilang dari daftar yang berjalan setelah durasi sesi habis.

Mencegah Uptime Monitor Membangunkan Kontainer
#

Ini gotcha-nya: kalo kamu pake Uptime Kuma, UptimeRobot, atau monitor HTTP lain buat ngecek service, ping-ping mereka bakal bangunin kontainer yang lagi tidur — jadinya tujuannya meleset.

Sablier ngatasin ini dengan parameter ignoreUserAgent. Tambahin ke konfigurasi middleware:

http:
  middlewares:
    sablier:
      plugin:
        sablierUrl: "http://sablier:10000"
        group: "my-apps"
        sessionDuration: "5m"
        theme: "hacker-terminal"
        ignoreUserAgent:
          - "curl"
          - "UptimeKuma"

Request dengan User-Agent yang cocok bakal lewat tanpa bangunin kontainer. Monitor uptime kamu dapet respon (dari Sablier sendiri), tapi aplikasi kamu tetep tidur.

Kapan Scale-to-Zero Cocok (Dan Kapan Gak)
#

Setup ini ideal buat:

  • Server RAM pas-pasan (Raspberry Pi, VPS murah dengan 1-2GB RAM)
  • Tools internal yang jarang diakses
  • Lingkungan demo/staging yang cuma perlu nyala pas ada yang liat
  • Proyek sampingan yang pengen biaya nol pas gak dipake

Ini GAK ideal buat:

  • Service produksi yang butuh respon instan
  • Kontainer yang boot-nya 30+ detik (delay-nya jadi kerasa)
  • Service dengan koneksi WebSocket yang perlu tetep idup
  • Database (jangan taruh database di belakang Sablier — itu bencana yang tinggal nunggu waktu)

FAQ
#

Apakah Sablier bisa pake Docker Compose?
#

Bisa. Sablier bekerja dengan Docker standalone, Docker Compose, Docker Swarm, dan Kubernetes. Konfigurasi berbasis label yang ditunjukin di panduan ini langsung jalan dengan Docker Compose.

Apa yang terjadi kalo server Sablier mati?
#

Kalo server Sablier gak ada, Traefik bakal ngembaliin error buat rute yang pake middleware Sablier. Kontainer yang udah jalan tetep berfungsi, tapi kontainer yang tidur gak bakal kebangun. Pastiin Sablier punya kebijakan restart: unless-stopped.

Bisa pake durasi sesi beda buat tiap kontainer?
#

sessionDuration diatur di level middleware, jadi semua kontainer yang pake middleware yang sama punya durasi yang sama. Kalo butuh durasi beda, bikin beberapa konfigurasi middleware dengan durasi beda dan terapin ke router yang berbeda.

Apakah Sablier gratis?
#

Ya. Sablier sepenuhnya open-source dan gratis. Gak ada tier berbayar, gak ada fitur premium di balik tembok.

Berapa banyak RAM yang bisa dihemat?
#

Tergantung kontainer kamu. Kalo punya 10 kontainer yang masing-masing pake 50-100MB RAM saat nganggur, kamu bisa hemat 500MB-1GB. Di Raspberry Pi dengan total RAM 2GB, itu lumayan banget.


Kata kunci: Docker, Traefik, Sablier, scale-to-zero, optimasi RAM, self-hosted, VPS hemat memori

Terkait


Load Comments