Episode ini membahas ekosistem plugin: marketplace Traefik Hub dan community plugins, plugin populer seperti GeoIP blocking dan ModSecurity WAF, arsitektur pengembangan plugin Go dengan plugin.toml, serta instalasi dengan localPlugins dan versioning plugin.

Middleware bawaan Traefik sudah lengkap, tapi dunia nyata selalu punya kebutuhan tambahan. Episode 29 membahas plugins: middleware custom yang memperluas Traefik tanpa mengubah inti. Dari plugin komunitas yang siap pakai sampai pengembangan plugin sendiri dalam Go.
Arsitektur plugin Traefik sederhana: setiap plugin adalah sebuah Go module yang mengimplementasikan interface middleware. Traefik v3 memuat plugin lewat Yaegi interpreter — sehingga plugin bisa diaktifkan tanpa rebuild image, meskipun dikompilasi ke Go. Mari kita jelajahi pasar plugin, cara install, dan bagaimana menulisnya.
Plugin didistribusikan lewat Traefik Hub (sebelumnya Traefik Pilot) — katalog resmi yang bisa dicari dan diinstall langsung. Selain itu, banyak plugin open-source beredar di GitHub dengan pola instalasi yang sama.
Beberapa kategori plugin populer:
Plugin diinstall lewat konfigurasi static. Cara paling sederhana adalah experimental.localPlugins, yang memuat kode dari direktori lokal:
experimental:
localPlugins:
geo-block:
moduleName: github.com/yourorg/geo-blockservices:
traefik:
image: traefik:v3
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config/plugins:/plugins-local/src/github.com/yourorg/geo-blockPlugin dari Traefik Hub diinstall dengan pola berbeda — via token Hub dan konfigurasi experimental.plugins dengan versi spesifik. Setelah terdaftar, plugin dipakai seperti middleware biasa:
http:
middlewares:
geo-filter:
plugin:
geo-block:
allowedCountries:
- "ID"
- "SG"
routers:
app:
rule: "Host(`app.example.com`)"
entrypoints:
- web
service: app-svc
middlewares:
- geo-filterSebuah plugin adalah Go module dengan struktur:
geo-block/
├── go.mod
├── plugin.toml
├── geo_block.go
└── geo_block_test.goInti plugin mengimplementasikan interface http.Handler — menerima request, melakukan logika, lalu memanggil handler berikutnya:
package geoblock
import "net/http"
type Config struct {
AllowedCountries []string `json:"allowedCountries"`
}
func New(ctx context.Context, next http.Handler, config Config, name string) (http.Handler, error) {
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
if !isAllowed(req) {
rw.WriteHeader(http.StatusForbidden)
return
}
next.ServeHTTP(rw, req)
}), nil
}Fungsi New menerima konfigurasi yang didefinisikan user, mengembalikan handler yang membungkus next. Selama context dan net/http tersedia, plugin bisa berbuat apa pun yang dilakukan middleware.
File plugin.toml adalah metadata yang membuat Traefik mengenali plugin:
[plugin]
description = "Geo blocking by country"
version = "0.1.0"
[go]
version = "1.21"
[go.mod]
module = "github.com/yourorg/geo-block"description: deskripsi singkat.version: versi plugin.go.mod.module: nama module Go — harus cocok dengan moduleName di konfigurasi Traefik.latest; tentukan versi eksplisit agar perilaku bisa direproduksi.Warning
Plugin berjalan dalam proses Traefik — plugin yang panic bisa mengganggu pemrosesan request. Batasi jumlah plugin, jaga kode tetap sederhana, dan lakukan review keamanan terhadap plugin dari sumber yang tidak dikenal.
Inti yang harus dibawa pulang:
experimental.localPlugins dan mount direktori.plugin.toml dan interface http.Handler.Di episode 30 selanjutnya — episode terakhir series ini — kita akan menyatukan semua pelajaran: production checklist & best practices, perbandingan Traefik v2 versus v3, pitfall umum, dan daftar periksa lengkap untuk deployment Traefik yang siap produksi.