Skip to main content
Implementasi Scale to Zero dengan Sablier
  1. doc/

Implementasi Scale to Zero dengan Sablier

·3 mins·

Panduan Implementasi Scale to Zero Docker dengan Sablier dan Nginx
#

Catatan penting: scale-to-zero paling efektif untuk aplikasi yang pola pakainya tidak merata sepanjang hari. Contohnya aplikasi yang ramai di jam kantor, lalu cenderung sepi pada malam hari. Dalam kondisi seperti ini, container bisa tidur saat tidak dipakai sehingga pemakaian resource dan RAM lebih hemat.

Teknik ini biasanya kurang berguna jika aplikasi Anda punya banyak user aktif dari berbagai zona waktu dan trafiknya cenderung konstan 24/7. Dalam kasus seperti itu, container hampir tidak pernah benar-benar tidur, jadi manfaatnya kecil dan kadang justru menambah latency saat request pertama harus membangunkan aplikasi.

Pendekatan ini juga kurang cocok untuk aplikasi yang wajib selalu hidup, banyak melakukan job latar belakang, atau sangat sensitif terhadap cold start.

Sablier membantu menerapkan arsitektur scale-to-zero pada container Docker. Aplikasi seperti Nextcloud atau Excalidash akan dimatikan saat idle, lalu otomatis dinyalakan kembali ketika ada request HTTP masuk melalui Nginx.

Prasyarat
#

  • Nginx berjalan langsung di host dan berperan sebagai reverse proxy utama.
  • Docker dan Docker Compose sudah terpasang.
  • Setiap aplikasi ditempatkan dalam folder terpisah.
  • Anda sudah punya domain atau subdomain yang mengarah ke server.

1. Buat jaringan Docker global
#

Buat Docker network eksternal agar Sablier dan aplikasi target bisa saling berkomunikasi.

docker network create sablier-network

2. Siapkan Sablier API controller
#

Buat folder khusus untuk Sablier, misalnya program/sablier/, lalu buat file docker-compose.yml seperti ini.

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

networks:
  sablier-network:
    external: true

Jalankan Sablier dengan perintah berikut.

docker compose -f program/sablier/docker-compose.yml up -d

3. Konfigurasi aplikasi target
#

Pada folder aplikasi yang ingin ditidurkan, misalnya program/nextcloud_docker/, ada tiga hal utama yang perlu disesuaikan di docker-compose.yml.

  • Hapus atau ubah restart: menjadi "no" agar Docker tidak mencoba menyalakan container terus-menerus.
  • Tambahkan label Sablier supaya container terdaftar di pengawasan Sablier.
  • Hubungkan service ke sablier-network agar Sablier bisa menjangkaunya.

Contoh konfigurasi untuk Nextcloud:

services:
  nextcloud-app:
    image: nextcloud:stable
    container_name: nextcloud-app
    restart: "no"
    ports:
      - "8100:80"
    labels:
      - "sablier.enable=true"
      - "sablier.group=nextcloud"
    networks:
      - sablier-network

  nextcloud-db:
    image: postgres:16
    container_name: nextcloud-db
    restart: "no"
    labels:
      - "sablier.enable=true"
      - "sablier.group=nextcloud"
    networks:
      - sablier-network

networks:
  sablier-network:
    external: true

Setelah itu, jalankan ulang aplikasinya.

docker compose -f program/nextcloud_docker/docker-compose.yml up -d --force-recreate

4. Atur Nginx dengan auth_request
#

Ini bagian inti. Nginx akan menahan request pertama, memanggil Sablier untuk membangunkan container, lalu meneruskan request ke aplikasi setelah siap.

Buka konfigurasi Nginx, misalnya /etc/nginx/sites-available/nextcloud, lalu sesuaikan seperti berikut.

server {
    server_name nextcloud.domainmu.com;

    location / {
        auth_request /sablier_wake;

        proxy_pass http://127.0.0.1:8100;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location = /sablier_wake {
        internal;

        proxy_pass http://127.0.0.1:10000/api/strategies/blocking?group=nextcloud&session_duration=15m;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
    }
}

Lalu uji dan muat ulang Nginx.

sudo nginx -t
sudo systemctl restart nginx

Notes: Monitoring
#

Jika Anda memakai monitoring tools seperti Uptime Kuma, jangan gunakan monitor HTTP(s) untuk aplikasi yang di-scale-to-zero. Monitor HTTP(s) akan menghasilkan trafik palsu dan membuat aplikasi terus bangun.

Untuk aplikasi yang ditidurkan, ubah monitor menjadi Docker Container Status. Dengan cara ini Uptime Kuma membaca status lewat Docker socket tanpa mengirim request HTTP, sehingga aplikasi tetap bisa tidur.

Notes: Cronjob Internal
#

Aplikasi seperti Gitea yang ditidurkan Sablier tidak bisa menjalankan cronjob internalnya sendiri saat sedang tidur. Jika ada tugas seperti Git mirroring atau sinkronisasi berkala, gunakan cron di host untuk memicu request pada jam tertentu.

Buka crontab host:

crontab -e

Tambahkan contoh berikut untuk membangunkan Gitea setiap jam 02:00 pagi:

0 2 * * * curl -s https://gitea.domainmu.com > /dev/null

Dengan pola ini, Gitea akan bangun, menjalankan tugasnya, lalu kembali tidur setelah durasi sesi Sablier habis.

Askarhabibulloh
Author
Askarhabibulloh