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 file dan folder untuk mapping:
./traefik
├── config
│ ├── traefik.yaml
│ ├── conf.d
| | └── externalservice.yaml
├── data
│ ├── cert
│ | └── cloudflare-acme.json
└── docker-compose.yml
Sebelum deploy Traefik buat terlebih dahulu file config traefik.yaml.
Static Configuration
Yang dimaksud statik disini adalah jika kita melakukan perubahan parameter di file ini, kita harus restart traefik untuk menerapkan perubahan konfigurasi yang baru.
traefik.yaml
global:
checkNewVersion: false
sendAnonymousUsage: false
# --> (Optional) Change log level and format here ...
# - level: [TRACE, DEBUG, INFO, WARN, ERROR, FATAL]
log:
level: ERROR
# <--
# --> (Optional) Enable accesslog here ...
# accesslog: {}
# <--
# --> (Optional) Enable API and Dashboard here, don't do in production
api:
dashboard: true
insecure: true
# <--
# -- EntryPoints...
entryPoints:
web:
address: :80
# --> (Optional) Redirect all HTTP to HTTPS
http:
redirections:
entryPoint:
to: websecure
scheme: https
# <--
websecure:
address: :443
# -- CertificateResolver...
certificatesResolvers:
cloudflare:
acme:
email: [email protected] # <-- Change this to your email
storage: /var/traefik/certs/cloudflare-acme.json
# caServer: https://acme-v02.api.letsencrypt.org/directory # production (default)
caServer: https://acme-staging-v02.api.letsencrypt.org/directory # staging
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"
# --> (Optional) Disable TLS Cert verification check
serversTransport:
insecureSkipVerify: true
# <--
providers:
docker:
exposedByDefault: false
file:
directory: /etc/traefik
watch: true
Di contoh ini saya menggunakan provider Cloudflare untuk generate Trusted SSL/TLS certificates menggunakan DNS-Challenge.
Dynamic Configuration
Kalo file ini jika menerapkan perubahan konfigurasi yang baru, kita ga perlu restart traefik. File ini kita buat untuk setting routing service host manual, misalnya saya ingin mengarahkan domain “proxmox.homelab.modalsemangat.com” ke https://10.67.78.100:8006.
externalservice.yaml
http:
# -- Router Configuration...
routers:
proxmox:
rule: "Host(`proxmox.homelab.modalsemangat.com`)"
tls:
certResolver: cloudflare
service: proxmox
entryPoints:
- websecure
# -- Service Configuration...
services:
proxmox:
loadBalancer:
servers:
- url: "https://10.67.78.100:8006"
Kita tinggal sesuaikan dengan infrastruktur micro-services apps yang ada.
File Storage SSL/TLS Certificates
Traefik membutuhkan file bernama cloudflare-acme.json untuk menyimpan informasi SSL certificate. Jadi, kita buat file ini dan ganti permission yang sesuai.
touch /mnt/docker/traefik/data/certs/cloudflare-acme.json; chmod 600 /mnt/docker/traefik/data/certs/cloudflare-acme.json
DNS API Token Cloudflare
Untuk mendapatkan token DNS API Cloudflare, Anda bisa lihat di contoh artikel Cara Mendapatkan DNS API Token Cloudflare.
Docker Compose
Sekarang kita buat file docker-compose.yml
menggunakan editor favorit. Jika lebih suka membuat docker stack, bisa dengan portainer atau dockge.
---
services:
proxy:
image: traefik:v3.2.1
container_name: traefik
ports:
- 80:80
- 443:443
# - 8080:8080 # --> (Optional) Enable Dashboard
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /mnt/docker/traefik/config/traefik.yaml:/etc/traefik/traefik.yaml:ro
- /mnt/docker/traefik/data/certs/:/var/traefik/certs/:rw
- /mnt/docker/traefik/config/conf.d/:/etc/traefik/conf.d/:ro
environment:
- TZ=Asia/Jakarta
- CF_DNS_API_TOKEN=${CF_DNS_API} # <-- Cloudflare DNS API Token
networks:
- backend
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.http.routers.dashboard.rule=Host(`traefik.homelab.modalsemangat.com`)
- traefik.http.routers.dashboard.entryPoints=websecure
- traefik.http.routers.dashboard.tls=true
- traefik.http.routers.dashboard.tls.certresolver=cloudflare
- traefik.http.routers.dashboard.service=api@internal
networks:
backend:
external: true
Setelah kita sudah mempersiapkan file-file konfigurasi, jalankan perintah:
docker-compose up -d
Deploy Contoh Container
---
services:
whoami:
image: traefik/whoami
networks:
- backend
labels:
- traefik.enable=true
- traefik.http.routers.whoami.rule=Host(`whoami.homelab.modalsemangat.com`)
- traefik.http.routers.whoami.entryPoints=websecure
- traefik.http.routers.whoami.tls=true
- traefik.http.routers.whoami.tls.certresolver=cloudflare
- traefik.http.services.whoami.loadbalancer.server.port=80
networks:
backend:
external: true
Ganti whoami dengan unique name pada label untuk menghindari duplikat pada Traefik.