Untuk yang menggunakan docker-compose untuk install Traefik di Docker Container, install & renew sertifikat SSL/TLS dengan Let’s Encrypt secara otomatis tanpa expose port 80/443 ke public internet. Hanya ingin “Everything use VALID HTTPS” untuk aplikasi-aplikasi di docker container lokal kita.
Buat Directory dan File Konfigurasi
Buat struktur folder untuk mapping:
./traefik
├── data
│ ├── acme.json
│ ├── config.yml
│ └── traefik.yml
└── docker-compose.yml
mkdir -p /home/appdata/traefik /home/appdata/traefik/data
Agar traefik bisa berjalan sepenuhnya, kita perlu menambahkan 2 files config traefik.yml and fileConfig.yml.
Konfigurasi File Static
Yang dimaksud statik disini adalah jika kita melakukan perubahan di file ini, kita harus restart container untuk menerapkan perubahan konfigurasi yang baru.
nano /home/appdata/traefik/data/traefik.yml
Contoh konfigurasi file traefik.yml
global:
checkNewVersion: true
sendAnonymousUsage: false
serversTransport:
insecureSkipVerify: true
entryPoints:
# Not used in apps, but redirect everything from HTTP to HTTPS
http:
address: :80
http:
redirections:
entryPoint:
to: https
scheme: https
# HTTPS endpoint, with domain wildcard
https:
address: :443
http:
tls:
# Generate a wildcard domain certificate
certResolver: letsencrypt
domains:
- main: DOMAINKITA.COM
sans:
- '*.DOMAINKITA.COM'
middlewares:
- securityHeaders@file
providers:
providersThrottleDuration: 2s
# File provider for connecting things that are outside of docker / defining middleware
file:
filename: /etc/traefik/fileConfig.yml
watch: true
# Docker provider for connecting all apps that are inside of the docker network
docker:
watch: true
network: proxy # Add Your Docker Network Name Here
# Default host rule to containername.domain.example
defaultRule: "Host(`{{ index .Labels \"com.docker.compose.service\"}}.DOMAINKITA.COM`)"
swarmModeRefreshSeconds: 15s
exposedByDefault: false
#endpoint: "tcp://dockersocket:2375" # Uncomment if you are using docker socket proxy
# Enable traefik ui
api:
dashboard: true
insecure: true
# Log level INFO|DEBUG|ERROR
log:
level: INFO
# Use letsencrypt to generate ssl serficiates
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: /etc/traefik/acme.json
dnsChallenge:
provider: cloudflare
# Used to make sure the dns challenge is propagated to the rights dns servers
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
Di contoh ini saya menggunakan provider Cloudflare untuk generate WildCard SSL/TLS certificates.
Konfigurasi File Dynamic
Kalo file ini jika menerapkan perubahan konfigurasi yang baru, kita ga perlu restart container. File ini kita buat untuk setting routing service host manual, misalnya saya ingin mengarahkan domain “adguard.domainkita.com” ke http://192.168.99.53:3000 (WebUI Adguard-home) dan setting middleware yang akan kita gunakan.
nano /home/appdata/traefik/data/fileConfig.yml
Contoh File Konfigurasi fileConfig.yml
http:
## EXTERNAL ROUTING - Only use if you want to proxy something manually ##
routers:
# Adguard routing example - Remove if not used
adguard:
entryPoints:
- https
rule: 'Host(`adguard.domainkita.com`)'
service: adguard
middlewares:
- default-headers
- https-redirectscheme
pihole:
entryPoints:
- https
rule: 'Host(`pihole.domainkita.com`)'
service: pihole
middlewares:
- redirectregex-pihole
- default-headers
- addprefix-pihole
- https-redirectscheme
## SERVICES EXAMPLE ##
services:
adguard:
loadBalancer:
servers:
- url: http://192.168.99.53:3000/
pihole:
loadBalancer:
servers:
- url: "http://192.168.99.101:80"
## MIDDLEWARES ##
middlewares:
# Only Allow Local networks
default-ipwhitelist:
ipWhiteList:
sourceRange:
- 127.0.0.1/32 # localhost
- 192.168.1.1/24 # LAN Subnet
# Security headers
default-headers:
headers:
customResponseHeaders:
X-Robots-Tag: "none,noarchive,nosnippet,notranslate,noimageindex"
server: ""
X-Forwarded-Proto: "https"
sslProxyHeaders:
X-Forwarded-Proto: https
referrerPolicy: "strict-origin-when-cross-origin"
hostsProxyHeaders:
- "X-Forwarded-Host"
customRequestHeaders:
X-Forwarded-Proto: "https"
contentTypeNosniff: true
browserXssFilter: true
forceSTSHeader: true
stsIncludeSubdomains: true
stsSeconds: 63072000
stsPreload: true
secured:
chain:
middlewares:
- default-ipwhitelist
- default-headers
# pihole subfolder redirect /admin
addprefix-pihole:
addPrefix:
prefix: "/admin"
https-redirectscheme:
redirectScheme:
scheme: https
permanent: true
redirectregex-pihole:
redirectRegex:
regex: /admin/$
replacement: /
# Authelia guard
auth:
forwardauth:
address: http://auth:9091/api/verify?rd=https://auth.domain.com/ # replace auth with your authelia container name
trustForwardHeader: true
authResponseHeaders:
- Remote-User
- Remote-Groups
- Remote-Name
- Remote-Email
# Authelia basic auth guard
auth-basic:
forwardauth:
address: http://auth:9091/api/verify?auth=basic # replace auth with your authelia container name
trustForwardHeader: true
authResponseHeaders:
- Remote-User
- Remote-Groups
- Remote-Name
- Remote-Email
# Only use secure ciphers - https://ssl-config.mozilla.org/#server=traefik&version=2.6.0&config=intermediate&guideline=5.6
tls:
options:
default:
minVersion: VersionTLS12
cipherSuites:
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305
Kita tinggal sesuaikan dengan infrastruktur micro-services apps yang ada.
File Storage SSL/TLS certificates
Traefik membutuhkan file bernama acme.json untuk menyimpan informasi SSL certificate. Jadi, kita buat file ini dan ganti permission yang sesuai.
touch /home/appdata/traefik/data/acme.json; chmod 600 /home/appdata/traefik/data/acme.json
API Token Cloudflare
Untuk mendapatkan token API, login ke akun cloudflare kita di link: https://dash.cloudflare.com. Masuk ke My Profile, pilih API tokens dan pilih Create Token. Gunakan template Edit zone DNS. Sesuaikan seperti settingan dibawah, klik Continue to Summary kemudian Create Token.
- Zone – Zone Settings – Read
- Zone – Zone – Read
- Zone – DNS – Edit
- Zone Resources – Include – All Zones
Docker Compose
Sekarang kita buat file docker-compose.yml
menggunakan editor favorit. Jika lebih suka membuat docker stack, bisa dengan portainer atau dockge.
nano /home/appdata/traefik/docker-compose.yml
version: '3'
services:
traefik:
container_name: traefik
image: traefik:latest
restart: unless-stopped
security_opt:
- no-new-privileges:true
ports:
- 80:80
- 443:443
- 8080:8080 # Dashboard Web UI
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /home/appdata/traefik/data/:/etc/traefik/
networks:
- proxy
environment:
- CF_DNS_API_TOKEN=YOUR_SUPER_SECURE_CLOUDFLARE_API_TOKEN
labels:
- traefik.enable=true # Enable Traefik reverse proxy for the Traefik dashboard.
- traefik.http.routers.api.rule=Host(`traefik.DOMAINKITA.COM`) # Define the subdomain for the traefik dashboard.
- traefik.http.routers.api.entryPoints=https # Set the Traefik entry point.
- traefik.http.routers.api.service=api@internal # Enable Traefik API.
networks:
proxy:
driver: bridge
external: true
Setelah kita sudah mempersiapkan file-file konfigurasi, jalankan perintah:
docker-compose -f /home/appdata/traefik/docker-compose.yml up -d
Proksi kan Aplikasi
Yang kita lakukan di beberapa aplikasi docker yang kita buat dan mengarahkan WebUInya via traefik, kita hanya menambahkan label atau menambahkan metadata di docker object supaya traefik bisa otomatis mengambilnya. Jika menggunakan docker-compose cukup tambahkan baris dibawah label:
labels:
- traefik.enable=true
- traefik.http.routers.app.entryPoints=https
Kita harus mengganti app dengan nama aplikasi di label ini untuk menghindari duplikat pada Traefik.
Misalnya saya ingin buat container Excalidraw dengan docker-compose dan WebUI diproksikan via traefik:
version: "3.3"
services:
excalidraw:
container_name: excalidraw
image: excalidraw/excalidraw
restart: unless-stopped
networks:
- proxy
ports:
- 8080:80/tcp
environment:
- TZ=Asia/Bangkok
labels:
- traefik.enable=true
- traefik.http.routers.excalidraw.entryPoints=https
networks:
proxy:
driver: bridge
external: true
Web UI App Docker HTTPS
Secara default Traefik terkoneksi dengan aplikasi via HTTP. Jika aplikasi kita hanya mengexpose WebUI via HTTPS, kita harus memberitahukan Traefik agar menggunakan protocol ini dengan menambahkan label:
labels:
- traefik.enable=true
- traefik.http.routers.app.entryPoints=https
- traefik.http.services.app.loadbalancer.server.scheme=https
App Docker Multiple Port
Jika Aplikasi docker kita mengexpose port lebih dari satu, misalnya aplikasi kita mempunyai port untuk WebUI di 8080 dan ada port lain yang di expose juga. Kita harus memberitahu Traefik bahwa Web-UI nya di port 8080 dengan menambahkan label::
labels:
- traefik.enable: true
- traefik.http.routers.app.entryPoints=https
- traefik.http.services.app.loadbalancer.server.port=8080
Kita harus mengganti app dengan nama aplikasi pada label ini untuk menghindari duplikat pada Traefik.
Pilih Nama Subdomain Manual
Kalau kita pakai label diatas, Traefik akan otomatis membuat subdomain dengan nama container. Kita juga bisa secara manual memberikan nama subdomain untuk App kita dengan menambahkan label:
labels:
- traefik.enable=true
- traefik.http.routers.app.entryPoints=https
- traefik.http.routers.app.rule=Host(`draw.domainkita.com`)