Kalau kamu sudah mengikuti tutorial sebelumnya tentang Cara Pasang SSL Gratis di Homelab Menggunakan Traefik dan Cloudflare Tanpa Buka Port HTTP dan Cara Mengamankan Homelab Menggunakan Traefik Reverse Proxy untuk Docker , berarti setup Traefik kamu sudah solid — SSL otomatis, routing rapi, dan semua service terlindungi di balik reverse proxy.
Sekarang pertanyaannya: bagaimana kalau kamu punya banyak container tapi RAM server terbatas?
Misalnya kamu menjalankan Vaultwarden, Gitea, Paperless-ngx, Nextcloud, dan beberapa service lain secara bersamaan. Padahal kenyataannya, mayoritas service itu jarang diakses — mungkin hanya beberapa kali sehari, atau bahkan seminggu sekali. Tapi mereka tetap memakan RAM 24 jam penuh.
Di sinilah Sablier masuk.
Apa Itu Sablier? #
Sablier adalah software open-source gratis yang memungkinkan container berjalan hanya ketika ada request masuk, lalu mematikannya secara otomatis setelah periode tidak aktif tertentu. Kompatibel dengan Docker, Docker Swarm, dan Kubernetes.
Sablier bekerja sebagai API server yang mengelola siklus hidup workload. Ia terintegrasi dengan plugin reverse proxy — termasuk Traefik, Caddy, dan Nginx — untuk mencegat request masuk, membangunkan workload yang sedang tidur, dan menampilkan halaman tunggu sampai service siap.
Dengan kata lain: container tidur saat tidak dipakai, bangun otomatis saat ada yang mengaksesnya.
Kenapa Ini Penting untuk Homelab? #
Server homelab — apalagi yang berjalan di atas Raspberry Pi, mini PC, atau VPS kecil — punya RAM terbatas. Menjalankan 10–15 container sekaligus bisa menguras resource meski sebagian besar idle.
Sablier menyelesaikan masalah ini dengan konsep scale-to-zero: container yang tidak diakses akan dihentikan sementara, dan dihidupkan kembali secara transparan saat ada request. Pengguna hanya merasakan sedikit delay di akses pertama (beberapa detik untuk booting container), setelah itu semuanya normal.
Cara Kerja Sablier dengan Traefik #
Sablier terdiri dari dua komponen:
- Sablier server — container yang berjalan terus dan bertugas menghidupkan/mematikan container lain melalui Docker socket.
- Sablier plugin untuk Traefik — middleware yang mencegat request ke Traefik, lalu berkomunikasi dengan Sablier server untuk memastikan container target sudah berjalan sebelum request diteruskan.
Ada dua strategi yang bisa dipilih:
| Strategi | Cara Kerja | Cocok Untuk |
|---|---|---|
| Dynamic | Menampilkan halaman loading sementara container booting | Web apps, dashboard |
| Blocking | Request ditahan (pending) sampai container siap | API, headless service |
Catatan penting: Mulai Traefik v3.6.0, konfigurasi Sablier bisa langsung menggunakan Docker labels — tidak perlu lagi dynamic config file terpisah untuk sebagian besar kasus. Artikel ini menggunakan Traefik v3.6.12.
Prasyarat #
Sebelum mulai, pastikan kamu sudah memiliki:
- Traefik v3.6.12 berjalan sebagai container Docker
- Docker socket tersedia di Traefik (
/var/run/docker.sock) - Dynamic configuration provider aktif (file provider atau Docker provider)
- Minimal satu container yang ingin dikelola oleh Sablier
Langkah 1: Daftarkan Plugin Sablier ke Traefik #
Buka file konfigurasi static Traefik kamu (traefik.yml atau command args di docker-compose.yml), lalu tambahkan blok berikut untuk mendaftarkan plugin Sablier:
# traefik.yml (static config)
experimental:
plugins:
sablier:
moduleName: "github.com/sablierapp/sablier-traefik-plugin"
version: "v1.1.0"Atau jika menggunakan command args di docker-compose.yml:
command:
- "--experimental.plugins.sablier.modulename=github.com/sablierapp/sablier-traefik-plugin"
- "--experimental.plugins.sablier.version=v1.1.0"Cek versi terbaru plugin di Traefik Plugin Catalog.
Langkah 2: Deploy Sablier sebagai Container #
Tambahkan service Sablier ke docker-compose.yml kamu — idealnya di file yang sama dengan Traefik:
services:
sablier:
image: sablierapp/sablier:1.11.1
container_name: sablier
command:
- start
- --provider.name=docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
restart: unless-stoppedPerhatikan beberapa hal:
- Sablier harus berada di network yang sama dengan Traefik agar bisa dicapai oleh plugin.
- Volume
docker.sockdiperlukan agar Sablier bisa mengelola container lain. - Jangan daftarkan Sablier itu sendiri sebagai container yang dikelola Sablier — nanti container-nya akan mematikan dirinya sendiri.
Langkah 3: Buat Dynamic Configuration untuk Middleware Sablier #
Karena container yang di-manage Sablier akan hilang dari pool Traefik saat dimatikan, konfigurasi middleware Sablier harus dibuat di luar container target — bisa di file dynamic config atau di label Sablier sendiri.
Buat file sablier.yml di folder dynamic config Traefik kamu:
# dynamic/sablier.yml
http:
middlewares:
sablier-dynamic:
plugin:
sablier:
sablierUrl: http://sablier:10000
group: my-app-group
sessionDuration: 5m
dynamic:
displayName: "Memuat layanan..."
showDetails: true
theme: hacker-terminal
refreshFrequency: 5s
sablier-blocking:
plugin:
sablier:
sablierUrl: http://sablier:10000
group: my-app-group
sessionDuration: 5m
blocking:
timeout: 30sPenjelasan parameter penting:
sablierUrl— alamat Sablier server yang bisa dijangkau Traefikgroup— nama grup container yang akan dikelola bersamasessionDuration— berapa lama container tetap hidup setelah request terakhir (contoh:5m,1h)dynamic.theme— tema halaman loading; pilihan tersedia:hacker-terminal,ghost,shuffle, dll.blocking.timeout— batas waktu maksimal menunggu container siap
Langkah 4: Tambahkan Label ke Container Target #
Untuk setiap container yang ingin dikelola Sablier, tambahkan dua hal:
- Label Sablier — untuk menandai container dan mengelompokkannya
- Middleware Sablier — di konfigurasi router Traefik
Contoh untuk service vaultwarden:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
labels:
# Label Traefik biasa
- "traefik.enable=true"
- "traefik.http.routers.vaultwarden.rule=Host(`vault.example.com`)"
- "traefik.http.routers.vaultwarden.entrypoints=websecure"
- "traefik.http.routers.vaultwarden.tls.certresolver=cloudflare"
# Tambahkan middleware Sablier ke router
- "traefik.http.routers.vaultwarden.middlewares=sablier-dynamic@file"
# Label Sablier — wajib ada
- "sablier.enable=true"
- "sablier.group=my-app-group"
networks:
- proxyPenting: Nilai
groupdi label container harus sama dengangroupyang didefinisikan di middleware Sablier pada langkah 3.
Langkah 5: Pastikan Container Punya Healthcheck #
Sablier sangat disarankan menggunakan healthcheck pada container yang akan di-manage. Tanpa healthcheck, Sablier tidak bisa membedakan antara container yang baru saja start dengan container yang sudah siap menerima request.
Tambahkan healthcheck di konfigurasi container:
services:
vaultwarden:
image: vaultwarden/server:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/alive"]
interval: 10s
timeout: 5s
retries: 3
start_period: 30sKalau image tidak menyediakan healthcheck bawaan, sesuaikan perintah test dengan endpoint yang tersedia di aplikasinya.
Langkah 6: Apply dan Test #
Setelah semua konfigurasi siap, restart stack kamu:
docker compose down && docker compose up -dVerifikasi Sablier berjalan:
docker logs sablier --followCek Traefik dashboard — middleware sablier-dynamic@file dan sablier-blocking@file harus muncul di daftar middleware.
Sekarang coba stop manual container target kamu:
docker stop vaultwardenAkses https://vault.example.com dari browser. Kamu akan melihat halaman loading dari Sablier sementara container di-start kembali. Setelah container siap, halaman akan auto-refresh ke aplikasi secara otomatis.
Dynamic vs Blocking: Pilih yang Mana? #
Gunakan Dynamic jika:
- Service diakses lewat browser oleh manusia
- Tidak masalah ada halaman loading beberapa detik
- Cocok untuk: dashboard, web apps, media server
Gunakan Blocking jika:
- Service diakses oleh script, API client, atau aplikasi lain
- Client tidak bisa menangani redirect ke halaman loading
- Cocok untuk: API, karena client hanya merasakan response time yang lebih lama di akses pertama, tanpa harus menangani redirect atau logika retry.
Catatan: Strategi Dynamic dilaporkan bermasalah di browser Safari iOS — halaman loading tidak tampil dan langsung menampilkan error. Gunakan Blocking sebagai fallback jika kamu menarget pengguna mobile.
Tips Tambahan #
Atur sessionDuration sesuai kebiasaan pakai. Service yang sering diakses bisa diberi durasi lebih panjang (misalnya 30m), sementara service yang jarang diakses bisa lebih pendek (5m atau 10m).
Gunakan --provider.auto-stop-on-startup. Sablier bisa otomatis menghentikan semua container berlabel sablier.enable=true saat pertama kali dijalankan dengan flag --provider.auto-stop-on-startup — berguna agar semua container langsung dalam mode “sleep” tanpa harus stop manual satu per satu.
Exclude healthcheck dan monitoring dari wake-up. Tambahkan ignoreUserAgent: curl di konfigurasi middleware agar healthcheck dari tool seperti Uptime Kuma tidak membangunkan container yang sedang tidur.
http:
middlewares:
sablier-dynamic:
plugin:
sablier:
sablierUrl: http://sablier:10000
group: my-app-group
sessionDuration: 5m
ignoreUserAgent: curl # Tambahkan ini
dynamic:
displayName: "Memuat layanan..."
theme: hacker-terminalKesimpulan #
Dengan Sablier, kamu bisa menjalankan lebih banyak service di server yang sama tanpa kehabisan RAM — container hanya aktif saat benar-benar dibutuhkan, dan tidur kembali secara otomatis saat idle.
Setup ini sangat cocok untuk homelab dengan resource terbatas yang ingin menjalankan banyak layanan sekaligus. Dikombinasikan dengan Traefik yang sudah kamu setup sebelumnya, hasilnya adalah homelab yang efisien, aman, dan tetap bisa diakses kapan saja.
Kalau kamu menemukan masalah atau punya pertanyaan, tinggalkan komentar di bawah!
Referensi: Sablier GitHub · Sablier Traefik Plugin · Traefik Plugin Catalog