Episode ini mengintegrasikan Authelia dengan Traefik lewat middleware ForwardAuth: definisi middleware di dynamic config, pemasangan lewat Docker labels, penyalinan header identitas Remote-User, hingga contoh compose lengkap yang melindungi sebuah layanan.

Di episode 13 kalian membangun gerbang autentikasi di NGINX dengan auth_request. Di episode 14 kita menerapkan pola yang sama — proxy bertanya, Authelia menjawab — pada proxy yang paling akrab dengan dunia container: Traefik. Kalau NGINX mengharuskan blok konfigurasi manual, Traefik menawarkan sesuatu yang berbeda: middleware forwardAuth yang dipasang per router, sering kali cukup lewat Docker labels tanpa menyentuh file konfigurasi.
Traefik adalah reverse proxy yang lahir di era container: ia membaca deklarasi layanan dari provider seperti Docker dan menentukan routing berdasarkan label yang ditempel pada container. Artinya, mengamankan aplikasi dengan Authelia bisa sesederhana menambahkan satu label middlewares pada layanan tersebut.
Analogi: NGINX adalah satpam yang diatur lewat buku panduan tebal; Traefik adalah satpam yang mematuhi papan perintah yang ditempel di setiap pintu. Keduanya menjaga gedung yang sama — bedanya di cara kita memberi instruksi.
Middleware adalah pipa pemrosesan permintaan Traefik. forwardAuth bekerja dengan mengirim permintaan ke alamat yang ditentukan; responsnya menentukan nasib permintaan asli:
Konfigurasi intinya dalam dynamic config (file YAML):
http:
middlewares:
authelia:
forwardAuth:
address: "http://authelia:9091/api/authz/forward-auth"
trustForwardHeader: true
maxResponseBodySize: 8192
authResponseHeaders:
- Remote-User
- Remote-Groups
- Remote-Email
- Remote-NameOpsi kuncinya:
address — endpoint Authelia. Perhatikan path /api/authz/forward-auth, bukan portal-nya.trustForwardHeader — memberitahu Authelia untuk mempercayai header X-Forwarded-* yang dikirim Traefik. Header inilah yang dipakai Authelia menentukan skema, host, dan IP asli untuk mengevaluasi access control rules.authResponseHeaders — header respons Authelia yang disalin ke permintaan yang diteruskan ke aplikasi. Inilah mekanisme Trusted Header SSO: aplikasi menerima identitas user lewat Remote-User dan kawan-kawan.Keunggulan Traefik di Docker adalah semuanya bisa deklaratif lewat label. Definisi middleware yang sama di atas bisa ditulis sebagai label:
services:
nextcloud:
image: linuxserver/nextcloud
labels:
traefik.enable: "true"
traefik.http.routers.nextcloud.rule: "Host(`nextcloud.example.com`)"
traefik.http.routers.nextcloud.entryPoints: "websecure"
traefik.http.routers.nextcloud.tls: "true"
traefik.http.routers.nextcloud.middlewares: "authelia@file"Perhatikan traefik.http.routers.nextcloud.middlewares: "authelia@file" — ini kalimat ajaib yang memasang middleware authelia pada router nextcloud. Suffix @file menunjukkan middleware itu didefinisikan di file provider (dynamic config), bukan lewat label.
Jika ingin mendefinisikan middleware sekaligus lewat label (biasanya pada container Authelia), polanya sama:
labels:
traefik.enable: "true"
traefik.http.routers.authelia.rule: "Host(`auth.example.com`)"
traefik.http.routers.authelia.entryPoints: "websecure"
traefik.http.routers.authelia.tls: "true"
traefik.http.middlewares.authelia.forwardauth.address: "http://authelia:9091/api/authz/forward-auth"
traefik.http.middlewares.authelia.forwardauth.trustForwardHeader: "true"
traefik.http.middlewares.authelia.forwardauth.maxResponseBodySize: "8192"
traefik.http.middlewares.authelia.forwardauth.authResponseHeaders: "Remote-User,Remote-Groups,Remote-Email,Remote-Name"Di sini label berprefix traefik.http.middlewares.* mendefinisikan middleware, dan router Authelia sendiri melewati middleware itu supaya portal tetap bisa diakses. Layanan lain cukup menulis middlewares: "authelia@docker" untuk menunjuk middleware dari label ini.
Mari rakit semuanya: Traefik, Authelia, dan satu aplikasi yang dilindungi.
networks:
net: {}
services:
traefik:
image: traefik:v3
restart: unless-stopped
networks: [net]
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./dynamic:/etc/traefik/dynamic
command:
- --providers.docker=true
- --providers.docker.exposedByDefault=false
- --providers.file.directory=/etc/traefik/dynamic
- --entryPoints.web.address=:80
- --entryPoints.websecure.address=:443
authelia:
image: authelia/authelia
restart: unless-stopped
networks: [net]
volumes:
- ./config:/config
labels:
traefik.enable: "true"
traefik.http.routers.authelia.rule: "Host(`auth.example.com`)"
traefik.http.routers.authelia.entryPoints: "websecure"
traefik.http.routers.authelia.tls: "true"
traefik.http.routers.authelia.middlewares: "authelia@file"
nextcloud:
image: linuxserver/nextcloud
restart: unless-stopped
networks: [net]
volumes:
- ./nextcloud:/config
- ./nextcloud/data:/data
labels:
traefik.enable: "true"
traefik.http.routers.nextcloud.rule: "Host(`nextcloud.example.com`)"
traefik.http.routers.nextcloud.entryPoints: "websecure"
traefik.http.routers.nextcloud.tls: "true"
traefik.http.routers.nextcloud.middlewares: "authelia@file"Catatan penting: --providers.docker.exposedByDefault=false memastikan hanya container dengan traefik.enable: "true" yang dipublikasikan — praktik yang mencegah layanan tak sengaja terekspos ke publik.
Kedua versi memakai konsep yang sama. Perbedaan praktis yang perlu kalian tahu:
authResponseHeaders agar cocok dengan yang dibaca aplikasi./api/authz/forward-auth pada v3 (endpoint ForwardAuth yang modern); endpoint lama /api/verify masih berfungsi untuk kompatibilitas, tetapi tidak direkomendasikan untuk instalasi baru.maxResponseBodySize — opsi yang membatasi ukuran body respons auth, berguna mencegah respons tak terduga memenuhi memori.Warning
Pastikan Traefik dan Authelia berada di jaringan Docker yang sama (dalam contoh: net). Jika terpisah, gunakan nama host yang benar di address — salah nama berarti middleware tidak pernah bisa menjawab, dan semua permintaan ke layanan yang dilindungi akan gagal.
Setelah stack berjalan:
nextcloud.example.com tanpa login — harus diarahkan ke portal auth.example.com.docker compose logs traefik untuk memastikan middleware authelia@file menanggapi tanpa error.Remote-User tiba — aplikasi akan mengenali user tanpa form login.Episode ini mengintegrasikan Authelia dengan Traefik: memahami middleware forwardAuth sebagai pengganti auth_request, mendefinisikan middleware di dynamic config maupun Docker labels, memilih opsi address, trustForwardHeader, dan authResponseHeaders dengan benar, serta merakit compose lengkap yang melindungi layanan dengan satu label.
Traefik menunjukkan kekuatan pola forward authentication ketika dipadukan dengan deklarasi berbasis container — satu definisi middleware, dipakai ulang oleh semua layanan. Di episode 15 kita melihat sisi lain dari spektrum konfigurasi: Caddy, proxy yang dikenal dengan kesederhanaan Caddyfile dan HTTPS otomatis. Sampai jumpa!