Lewati ke konten utama
  1. Posts/

Cara Menghemat RAM Server dengan Sablier Middleware di Traefik

·1237 kata·6 menit·
Noor Khafidzin
Penulis
Noor Khafidzin
Seorang homelab enthusiast yang terobsesi pada efisiensi sistem dan seni pemecahan masalah (troubleshooting).
Daftar isi

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:

  1. Sablier server — container yang berjalan terus dan bertugas menghidupkan/mematikan container lain melalui Docker socket.
  2. 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-stopped

Perhatikan beberapa hal:

  • Sablier harus berada di network yang sama dengan Traefik agar bisa dicapai oleh plugin.
  • Volume docker.sock diperlukan 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: 30s

Penjelasan parameter penting:

  • sablierUrl — alamat Sablier server yang bisa dijangkau Traefik
  • group — nama grup container yang akan dikelola bersama
  • sessionDuration — 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:

  1. Label Sablier — untuk menandai container dan mengelompokkannya
  2. 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:
      - proxy

Penting: Nilai group di label container harus sama dengan group yang 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: 30s

Kalau 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 -d

Verifikasi Sablier berjalan:

docker logs sablier --follow

Cek Traefik dashboard — middleware sablier-dynamic@file dan sablier-blocking@file harus muncul di daftar middleware.

Sekarang coba stop manual container target kamu:

docker stop vaultwarden

Akses 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-terminal

Kesimpulan
#

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

Terkait


Muat Komentar