Membangun Jenkins Production Stabil dengan Inbound Agent dan Traefik SSL
Panduan ini menjelaskan instalasi Jenkins production menggunakan Docker + Traefik (SSL otomatis via DNS Challenge Cloudflare), dengan fokus utama pada konfigurasi agent bernama AGENT-1 yang memiliki label masdika.
Artikel ini dibuat berdasarkan implementasi real production sehingga step-by-step dan praktis.
๐๏ธ Arsitektur yang Digunakan
Internet
โ
Cloudflare (DNS)
โ
Traefik (SSL + Reverse Proxy)
โ
Jenkins Controller
โ
Jenkins Agent (AGENT-1 | label: masdika)
Komponen:
- Traefik โ Reverse proxy + Auto SSL Let’s Encrypt (DNS Challenge)
- Jenkins Controller โ Server utama Jenkins
- Jenkins Agent (AGENT-1) โ Executor untuk menjalankan build
๐ฆ 1. Docker Compose Production
File: /opt/jenkins.masdika.id/docker-compose.yml
services:
traefik:
image: traefik:latest
container_name: traefik
restart: always
command:
- "--api.dashboard=false"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entrypoint.to=websecure"
- "--entrypoints.web.http.redirections.entrypoint.scheme=https"
- "--certificatesresolvers.letsencrypt.acme.dnschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare"
- "--certificatesresolvers.letsencrypt.acme.email=me@masdika.id"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.dnschallenge.delaybeforecheck=10"
ports:
- "80:80"
- "443:443"
environment:
- CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
networks:
- proxy
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins-controller
restart: always
user: root
environment:
- JAVA_OPTS=-Xms512m -Xmx1024m
volumes:
- jenkins_data:/var/jenkins_home
labels:
- "traefik.enable=true"
- "traefik.http.routers.jenkins.rule=Host(`jenkins.masdika.id`)"
- "traefik.http.routers.jenkins.entrypoints=websecure"
- "traefik.http.routers.jenkins.tls.certresolver=letsencrypt"
- "traefik.http.services.jenkins.loadbalancer.server.port=8080"
networks:
- proxy
jenkins-agent:
image: jenkins/inbound-agent
container_name: jenkins-agent-1
restart: always
command: >
-url http://jenkins-controller:8080
-secret 255cc8b23312974c7873415ba760997c41074d76d8ae1bc39b69aea4a011b1c2
-name AGENT-1
-webSocket
-workDir /home/jenkins
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- proxy
volumes:
jenkins_data:
networks:
proxy:
driver: bridge
Jalankan:
docker compose up -d
๐ค 2. Konfigurasi Agent (AGENT-1)
Masuk ke Jenkins UI:
Manage Jenkins โ Nodes โ New Node
Isi seperti ini:
Name:
AGENT-1
Type:
Permanent Agent
Konfigurasi penting:
- Remote root directory:
/home/jenkins - Labels:
masdika - Launch method: Launch agent by connecting it to the controller
Klik Save.
Kemudian Jenkins akan memberikan:
- Secret key
- Command connect agent
Secret itulah yang dimasukkan ke docker-compose.
๐ท๏ธ Kenapa Label = masdika?
Label digunakan untuk menentukan build dijalankan di node mana.
Karena agent production kita diberi label:
masdika
Maka pipeline bisa diarahkan khusus ke agent ini.
๐งช 3. Contoh Pipeline Menggunakan AGENT-1
pipeline {
agent { label 'masdika' }
stages {
stage('Info') {
steps {
sh 'hostname'
sh 'docker --version'
}
}
stage('Build Example') {
steps {
sh 'echo Build berjalan di AGENT-1'
}
}
}
}
Artinya:
- Jenkins TIDAK akan menggunakan built-in node
- Build hanya berjalan di AGENT-1
๐ง Built-in Node Dipakai atau Tidak?
Secara default:
- Built-in node tetap ada
- Tapi bisa dibuat tidak punya executor (set ke 0)
Manage Jenkins โ Nodes โ Built-in Node โ Configure
Set:
Number of executors = 0
Sehingga semua job production hanya jalan di AGENT-1.
๐ Kenapa Pakai WebSocket?
Kita menggunakan:
-webSocket
Karena:
- Tidak perlu buka port 50000
- Aman di balik Traefik + HTTPS
- Cocok untuk production environment
๐พ Production Best Practice
Untuk server 2GB RAM:
Tambahkan swap minimal 2GB.
Controller:
JAVA_OPTS=-Xms512m -Xmx1024m
Agent:
- Jalankan Docker socket jika butuh build image
- Gunakan label khusus
- Jangan gunakan built-in node untuk build production
โ Status Akhir Yang Benar
Di Jenkins UI:
Nodes:
- Built-in Node โ 0 executors
- AGENT-1 โ Online
- Label: masdika
Jika AGENT-1 berwarna hijau dan status Connected, artinya production setup berhasil.


๐ฏ Kesimpulan
Setup ini menghasilkan:
- SSL otomatis (DNS Challenge Cloudflare)
- Jenkins aman di HTTPS
- Agent terpisah dari controller
- Build hanya berjalan di AGENT-1
- Arsitektur clean dan production-ready
Dengan label masdika, kita bisa scaling ke depan dengan menambah agent baru tanpa mengubah pipeline. Production CI yang rapi, aman, dan scalable
Let’s Encrypt adalah layanan gratis untuk membuat sertifikat SSL agar akses web Proxmox menjadi aman (HTTPS). Mulai dari versi 6.3,…
Artikel ini akan membahas langkah end-to-end untuk membangun aplikasi Go REST API, membuat image Docker, lalu melakukan deployment di Kubernetes…