Traefik v3: ஒரே Docker Compose கோப்பில் 5 செயலிகள்
Traefik v3 மூலம் ஒரே IP முகவரியில் 5 செயலிகளை இயக்குவது எப்படி? Host rule கட்டமைப்பு, தானியங்கி TLS மற்றும் acme.json கோப்பினால் ஏற்படும் தொடக்க பிழைகளைத் தவிர்க்கும் முறைகள்.
ஒரே IP, ஐந்து செயலிகள், ஒரே port 443
உங்கள் VPS-ல் ஒரே ஒரு பொது IPv4 முகவரி மற்றும் ஒரே ஒரு TCP port 443 மட்டுமே உள்ளது. அதில் Gitea, உங்கள் செயலியின் staging நகல், ஒரு internal dashboard, ஒரு status page மற்றும் ஒரு webhook receiver என ஐந்து hostnames-களை ஒரே server-ல் இயக்க விரும்புகிறீர்கள். ஒரு reverse proxy என்பது :80 மற்றும் :443 ஆகியவற்றைத் தன் கட்டுப்பாட்டில் வைத்துக்கொண்டு, ஒவ்வொரு கோரிக்கையிலும் உள்ள Host header-ஐப் படித்து, சரியான container-க்கு அனுப்பும் ஒரு செயல்முறையாகும். Traefik இதைச் செய்கிறது; மேலும், நீங்கள் கைமுறையாக certbot-ஐ இயக்க வேண்டிய அவசியமின்றி, ஒவ்வொரு hostname-க்கும் தேவையான certificate-ஐ அதுவே பெற்று, புதுப்பித்துக்கொள்கிறது. Nginx மற்றும் Caddy ஆகியவையும் இந்த ஐந்து hostnames-களையும் சிறப்பாகக் கையாளும். எனவே, நீங்கள் எதையும் அமைப்பதற்கு முன்பு certificate கையாளுதல் மற்றும் ஒவ்வொரு செயலிக்குமான கட்டமைப்பு செலவு ஆகியவற்றின் அடிப்படையில் மூன்று proxy-களையும் ஒப்பிட்டுப் பார்ப்பது நல்லது.
Traefik-ஐ ஒரு nginx server {} தொகுதியிலிருந்து வேறுபடுத்துவது அதன் கட்டமைப்பு வரும் இடம்தான். Nginx-ல் நீங்கள் ஒரு கோப்பைத் திருத்தி reload செய்ய வேண்டும்; certificate-ன் ஆயுட்காலம் ஒரு தனி வேலையாகவே இருக்கும். நீங்கள் nginx-ல் certbot மூலம் Let's Encrypt certificates-ஐப் பெறும்போது பின்பற்றும் பணிப்பாய்வில், renewal timer என்பது web server-க்கு வெளியே இயங்கும். Traefik-ன் Docker provider, Docker event stream-ஐக் கண்காணித்து, உங்கள் container-களில் உள்ள labels-களைப் படிக்கிறது: Host() rule label கொண்ட ஒரு container-ஐத் தொடங்கினால், அது ஒரு நொடிக்குள் பயன்பாட்டுக்கு வந்துவிடும்; அதை நிறுத்தினால், அந்த route மறைந்துவிடும். இதுவே இதில் உள்ள சிக்கலும் கூட. கட்டமைப்பு labels-ல் இருப்பதால், அது ஒரே நேரத்தில் ஐந்து இடங்களில் சிதறி இருக்கும். ஒரு label தவறாக இருந்தால், எந்த எச்சரிக்கையும் இன்றி அந்த container-க்கு route கிடைக்காமல் போகும்; Traefik இது குறித்து எதையும் தெரிவிக்காது.
நான்கு முக்கிய கூறுகள்
- Entrypoints என்பவை listening sockets ஆகும். நீங்கள் இரண்டை வரையறுக்க வேண்டும்:
web,:80-லும் மற்றும்websecure,:443-லும். - Routers ஒரு கோரிக்கையை (
Host(...)) பொருத்தி, அதை ஒரு service-உடன் இணைக்கும். Certificates ஒவ்வொரு router-க்கும்tls.certresolverவழியாகக் கோரப்படும். - Services என்பவை backend ஆகும்; இது ஒரு container மற்றும் அது Docker network-க்குள் இயங்கும் port-ஐக் குறிக்கும்.
- Middlewares என்பவை router மற்றும் service-க்கு இடையில் செயல்படுபவை: basic auth, IP allow-lists, header rewrites, மற்றும் redirects போன்றவை இதில் அடங்கும்.
நீங்கள் கைமுறையாகச் செய்யும் வேலைகளுக்கு Traefik வைத்திருக்கும் பெயர்களே இந்த நான்கு கூறுகள்: router என்பது ஒரு server_name, service என்பது ஒரு proxy_pass இலக்கு, மற்றும் middlewares என்பது நீங்கள் nginx reverse proxy server block-ஐ வரி வரியாக உருவாக்கும்போது அமைக்கும் header மற்றும் auth directives ஆகும்.
Static configuration (entrypoints, providers, ACME) Traefik command line-ல் அல்லது traefik.yml-ல் வழங்கப்படுகிறது; இதை மாற்றினால் Traefik-ஐ restart செய்ய வேண்டும். Dynamic configuration (routers, services, middlewares) container labels-லிருந்து பெறப்பட்டு, உடனுக்குடன் (hot-reload) புதுப்பிக்கப்படும். இந்த இரண்டையும் குழப்பிக்கொள்வதுதான் "நான் கொடுத்த flag வேலை செய்யவில்லை" என்ற புகார்களுக்குப் பொதுவான காரணமாகும்.
Compose கோப்பு
proxy என்று பெயரிடப்பட்ட ஒரு பகிரப்பட்ட Docker network-தான் இதன் அடிப்படை. Traefik மற்றும் ஒரு container ஆகிய இரண்டும் ஒரே network-ல் இருந்தால் மட்டுமே Traefik-ஆல் அந்த container-ஐ அடைய முடியும்.
name: edge
networks:
proxy:
name: proxy
services:
traefik:
image: traefik:v3.5
restart: unless-stopped
command:
- --providers.docker=true
- --providers.docker.exposedByDefault=false
- --providers.docker.network=proxy
- --entryPoints.web.address=:80
- --entryPoints.websecure.address=:443
- --entryPoints.web.http.redirections.entryPoint.to=websecure
- --entryPoints.web.http.redirections.entryPoint.scheme=https
- --certificatesresolvers.le.acme.email=you@example.com
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.tlschallenge=true
# while you iterate, point at staging so a mistake costs nothing:
# - --certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
- --api.dashboard=true
- --log.level=INFO
- --accesslog=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./letsencrypt:/letsencrypt
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)
- traefik.http.routers.dashboard.entrypoints=websecure
- traefik.http.routers.dashboard.tls.certresolver=le
- traefik.http.routers.dashboard.service=api@internal
- traefik.http.routers.dashboard.middlewares=dashboard-auth
- traefik.http.middlewares.dashboard-auth.basicauth.users=admin:$$apr1$$REPLACE$$THIS
gitea:
image: gitea/gitea:1 # major-only pin keeps this demo copy-pasteable; pin an exact release in production
restart: unless-stopped
volumes:
- ./gitea:/data
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.routers.gitea.rule=Host(`git.example.com`)
- traefik.http.routers.gitea.entrypoints=websecure
- traefik.http.routers.gitea.tls.certresolver=le
- traefik.http.services.gitea.loadbalancer.server.port=3000முதலில் docker compose up -d, அதைத் தொடர்ந்து docker compose logs -f traefik. ஒவ்வொரு கூடுதல் application-ம் gitea தொகுப்பின் நகலாகும்; அதற்குத் தனி router பெயர், தனி Host() மற்றும் தனி internal port இருக்கும். ஒரு Docker-ல் TLS மற்றும் backups-உடன் இயங்கும் Nextcloud நிறுவல் இதே முறையில் அமையும்; அதன் published ports-ஐ நீக்கிவிட்டு, அதை proxy-உடன் இணைத்து, hostname மற்றும் certificate-ஐக் கையாள router labels-ஐப் பயன்படுத்தவும்.
அதில் உள்ள ஐந்து விவரங்கள் மிக முக்கியமானவை.
exposedByDefault=false, ஒரு container-ல் traefik.enable=true இருக்கும் வரை மட்டுமே அதை Traefik-க்குத் தெரியும்படி செய்கிறது. இதைத் தவிர்த்தால், நீங்கள் தொடங்கும் ஒவ்வொரு container-க்கும், எதையாவது சோதிக்க நீங்கள் இயக்கும் தற்காலிக postgres-க்குக் கூட, ஒரு route உருவாக்கப்படும்.
ஒரு container பல network-களுடன் இணைக்கப்பட்டிருக்கும்போது, எந்த network-ஐப் பயன்படுத்த வேண்டும் என்பதை providers.docker.network=proxy Traefik-க்குத் தெரிவிக்கிறது. இதைத் தவிர்த்தால், Traefik தவறான container IP-ஐத் தேர்ந்தெடுக்கக்கூடும்; இது application பிழை போன்ற தோற்றமளிக்கும் 502 பிழையாக வெளிப்படும்.
loadbalancer.server.port=3000 என்பது container-க்கு உள்ளே இருக்கும் port ஆகும்; Gitea அங்கு 3000-ல் இயங்குகிறது. எந்தவொரு app container-ம் port-ஐ வெளியிடவில்லை, Traefik மட்டுமே வெளியிடுகிறது என்பதைக் கவனிக்கவும்.
web entrypoint-ல் உள்ள redirect, plaintext கோரிக்கைகளை HTTPS-க்கு 308 மூலம் மாற்றுகிறது. Port 80 எப்படியும் திறந்தே இருக்கும்: ACME HTTP challenge-க்கும், வெறும் hostname-ஐத் தட்டச்சு செய்யும் பயனர்களுக்கும் அது தேவை.
basic-auth hash-ல் உள்ள இரட்டிப்பான $$ என்பது Compose-ன் escape முறை, அது தட்டச்சுப் பிழை அல்ல. இதை htpasswd -nbB admin 'your-password' (apache2-utils package) மூலம் உருவாக்கி, ஒவ்வொரு $-ஐயும் இரட்டிப்பாக்கவும்.
சான்றிதழ் மற்றும் acme.json சிக்கல்
tlschallenge=true ஆனது TLS-ALPN-01 முறையைத் தேர்ந்தெடுக்கிறது: Let's Encrypt உங்கள் server-ன் 443 port-க்கு இணைப்பை ஏற்படுத்தும், Traefik அந்தச் சவாலை TLS handshake-க்குள்ளேயே எதிர்கொள்ளும். இதற்கு மாற்றாக port 80-ல் இயங்கும் HTTP-01 முறை உள்ளது. Traefik-ன் command: பட்டியலில் உள்ள tlschallenge வரியை நீக்கிவிட்டு, அதற்குப் பதிலாக இந்த இரண்டையும் சேர்க்கவும்:
- --certificatesresolvers.le.acme.httpchallenge=true
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=webஇவை இரண்டில் எது வேண்டுமானாலும் வேலை செய்யும். இரண்டு முறைகளுக்கும், உங்கள் hostname-க்கான public DNS ஏற்கனவே உங்கள் VPS-ஐச் சுட்டிக்காட்ட வேண்டும். அப்போதுதான் சான்றிதழ் வழங்கும் அமைப்பு (certificate authority) அந்தப் பெயரைத் தீர்த்து (resolve), வெளியிலிருந்து இணைப்பை ஏற்படுத்த முடியும். முதலில் A (மற்றும் AAAA) record-ஐ உருவாக்கவும், dig +short git.example.com மூலம் அதை உறுதிப்படுத்தவும், அதன் பிறகு Traefik-ஐத் தொடங்கவும்.
இப்போது பலரைச் சிரமப்படுத்தும் ஒரு பொதுவான சிக்கல். Traefik தனது ACME account key மற்றும் வழங்கப்பட்ட அனைத்துச் சான்றிதழ்களையும் ஒரே acme.json கோப்பில் வைத்திருக்கும். அந்தக் கோப்பு group அல்லது world-readable நிலையில் இருந்தால், Traefik ஒரு பிழைச் செய்தியைக் காட்டி நின்றுவிடும்:
error: unable to get ACME account: permissions 644 for /letsencrypt/acme.json are too open, please use 600இதற்கான சரியான தீர்வு இதுதான்: அந்த directory-ஐ bind-mount செய்து, Traefik-ஐயே சரியான அனுமதியுடன் (mode) அந்தக் கோப்பை உருவாக்க அனுமதிக்கவும். நீங்கள் touch மூலம் acme.json கோப்பை உருவாக்கியிருந்தால், உங்கள் umask அதை 644 என்று மாற்றியிருக்கலாம். அதை host-ல் சரிசெய்யவும்:
chmod 600 ./letsencrypt/acme.json
docker compose restart traefikஅந்த directory-ஐ உங்கள் app volumes-உடன் சேர்த்து backup எடுக்கவும். அதை இழந்தாலும் மீண்டும் சான்றிதழ்களைப் பெற முடியும், ஆனால் ஒரே நேரத்தில் ஐந்து hostnames-க்குச் சான்றிதழ் கோரும்போது, Let's Encrypt-ன் rate limits சிக்கலைச் சந்திக்க நேரிடும்.
நீங்கள் சோதனைகளைச் செய்யும்போது staging CA-வைப் பயன்படுத்தவும். caserver வரியை uncomment செய்து, அனைத்து route-களும் சரியாக வேலை செய்வதை உறுதி செய்யவும். அதன் பிறகு அதை மீண்டும் comment செய்துவிட்டு, acme.json கோப்பை நீக்கவும்; அப்போதுதான் production சான்றிதழ்கள் புதிதாகக் கோரப்படும். Production Let's Encrypt, ஒரே தொகுப்பு hostnames-க்கு வாரத்திற்கு ஐந்து duplicate சான்றிதழ்களை மட்டுமே அனுமதிக்கும். மேலும், ஒரே பெயருக்குத் தொடர்ந்து தோல்வியடையும் சரிபார்ப்புகளை (failed validations) அது கட்டுப்படுத்தும். Staging முறை நம்பகத்தன்மையற்ற சான்றிதழ்களை வழங்கும், உங்கள் browser எச்சரிக்கை செய்யும். அந்த எச்சரிக்கை, உங்கள் அமைப்பு சரியாக வேலை செய்கிறது என்பதற்கான அறிகுறியாகும், மேலும் இதில் கட்டுப்பாடுகள் மிகக் குறைவு.
Dashboard என்பது ஒரு கட்டுப்பாட்டு இடைமுகம், demo அல்ல
பெரும்பாலான quickstart-கள் --api.insecure=true-ஐ அமைக்கும்; இது authentication இன்றி 8080 port-ல் dashboard-ஐ இயக்கும். பொது IP முகவரி கொண்ட ஒரு server-ல் இதைச் செய்யும்போது, உங்கள் routing topology, hostnames, middleware பெயர்கள் மற்றும் backend ports ஆகியவற்றை ஸ்கேன் செய்யும் எவருக்கும் அது வெளிப்படுத்திவிடும்.
மேலே உள்ள traefik service-ல் உள்ள labels இதற்கு மாற்றாகும்: மற்ற பயன்பாடுகளைப் போலவே, dashboard-ஐயும் ஒரு உண்மையான hostname-ல், TLS வழியாக, basicauth-க்கு பின்னால் route செய்யலாம். service=api@internal என்பது Traefik-ன் உள்ளமைக்கப்பட்ட API-உடன் router-ஐ இணைக்கும் காரணியாகும். இடமிருந்து வலமாக IP allow-list-ஐச் சேர்ப்பதன் மூலம் இதை மேலும் பலப்படுத்தலாம். உங்கள் அலுவலக IP முகவரி மாறக்கூடியது (dynamic) என்றால், அதே VPS-ல் நீங்கள் self-host செய்யும் WireGuard VPN வழங்கும் subnet வரம்பை அமைத்து, tunnel வழியாக மட்டும் dashboard-ஐ அணுகலாம்:
- traefik.http.middlewares.office.ipallowlist.sourcerange=10.0.0.7/32
- traefik.http.routers.dashboard.middlewares=office,dashboard-authஐந்து பயன்பாடுகளுக்குத் தனித்தனி கணக்குகள் தேவைப்படும்போது, ஒரே ஒரு basicauth கடவுச்சொல்லைப் பயன்படுத்துவது பாதுகாப்பானது அல்ல. அதே middleware slot-ல் ஒரு forwardauth-ஐப் பயன்படுத்தி, Authentik, ஒரு self-hosted single sign-on server மூலம் முடிவெடுக்கும்படி செய்யலாம். இதன் மூலம், dashboard மற்றும் அதன் அனைத்து route-களும் ஒரே login-க்கு பின்னால் அமையும்; இதை நீங்கள் ஒரே இடத்தில் இருந்து revoke செய்ய முடியும்.
Docker socket என்பது root அதிகாரம் கொண்டது
/var/run/docker.sock என்பது host-ல் இருந்து /-ஐ mount செய்யும் container-ஐ உருவாக்கக்கூடிய ஒரு API ஆகும். இதற்கான அணுகல் என்பது அந்த machine-ன் root அதிகாரத்திற்கு சமமானது; Traefik-க்கு labels-ஐ வாசிக்க இந்த அணுகல் தேவைப்படுகிறது.
Mount-ல் :ro-ஐ வைத்திருங்கள், ஆனால் அது எதை வழங்குகிறது என்பதில் தெளிவாக இருங்கள்: இது socket file-ஐ read-only ஆக மட்டுமே மாற்றுகிறது. இது Docker API-க்கு செல்லும் POST கோரிக்கைகளைத் தடுப்பதில்லை. உண்மையான பாதுகாப்பு நடவடிக்கை என்னவென்றால், Traefik-க்கு நேரடியாக socket-ஐ வழங்காமல், இடையில் ஒரு filtering proxy-ஐப் பயன்படுத்துவதாகும்:
dockerproxy:
image: tecnativa/docker-socket-proxy # pin the current tag
restart: unless-stopped
environment:
CONTAINERS: 1
NETWORKS: 1
POST: 0
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxyTraefik-ல் இருந்து socket volume-ஐ நீக்கிவிட்டு, provider-ஐ proxy-ஐ நோக்கிச் சுட்டிக்காட்டவும்:
--providers.docker.endpoint=tcp://dockerproxy:2375Traefik-ஆனது containers மற்றும் networks-ஐ வாசிக்கும் உரிமையை மட்டும் வைத்திருக்கும், எதையும் உருவாக்கும் திறனை இழந்துவிடும்.
Firewall, ports, மற்றும் அனைவரும் தவறு செய்யும் விதி
இரண்டு ports திறக்கப்பட்டுள்ளன, அதனுடன் SSH:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enableDocker-ன் published ports, ufw-ஐத் தவிர்க்கின்றன. Docker தனது சொந்த iptables விதிகளைச் சேர்க்கிறது; இவை ufw-ன் chains-க்கு முன்பே செயல்படுத்தப்படுகின்றன. எனவே, ports: ["3000:3000"] மூலம் தொடங்கப்படும் ஒரு container, ufw-ல் deny விதி இருந்தாலும் இணையத்திலிருந்து அணுகக்கூடியதாகவே இருக்கும். இதற்கான பாதுகாப்பு என்பது firewall அமைப்பில் இல்லை, அது ஒரு கட்டமைப்பு சார்ந்த அணுகுமுறை: Traefik மூலம் மட்டுமே ports-ஐ publish செய்யுங்கள், மற்ற அனைத்து container-களுக்கும் networks: [proxy]-ஐ மட்டும் கொடுத்துவிட்டு, வேறு எதையும் வழங்காதீர்கள். ஏதேனும் ஒரு சேவை கண்டிப்பாக host-ஐ அடைய வேண்டும் என்றால், அதை loopback-ல் bind செய்யுங்கள், "127.0.0.1:3000:3000".
பிழைகளைக் கண்டறிதல்: நீங்கள் உண்மையில் எதிர்கொள்ளும் பிழைகள்
404 page not found, இது Traefik மூலம் காட்டப்படுகிறது. எந்த router-ம் பொருந்தவில்லை என்று பொருள். நிகழ்தகவு வரிசையில்: container-ல் traefik.enable=true இல்லை (exposedByDefault=false அமைக்கப்படவில்லை); Host() விதி நீங்கள் உள்ளிட்ட பெயருடன் பொருந்தவில்லை; ஒரு label-ல் உள்ள router பெயர் மற்றொன்றிலிருந்து மாறுபடுகிறது (routers.gitea.rule மற்றும் routers.gitea.entrypoints ஒரே சொல்லாக இருக்க வேண்டும்); அல்லது hostname-ஐ backticks-க்கு பதிலாக quotes-க்குள் வைத்துள்ளீர்கள். Traefik v3-ல் matchers-க்குள் backticks கட்டாயம் தேவை.
502 Bad Gateway. ஒரு router பொருந்தியது, ஆனால் backend-ஐ அணுக முடியவில்லை. பெரும்பாலும் container proxy network-ல் இல்லை, docker inspect -f '{{json .NetworkSettings.Networks}}' gitea-ஐ சரிபார்க்கவும். மற்றொரு காரணம் தவறான loadbalancer.server.port: நீங்கள் published port-ஐக் கொடுத்துள்ளீர்கள், அல்லது application வேறு port-ல் இயங்குகிறது. Log-ல் முயற்சி விவரம் இருக்கும்: dial tcp 172.18.0.5:8080: connect: connection refused.
Browser எச்சரிக்கை செய்கிறது, certificate TRAEFIK DEFAULT CERT பெயரில் வழங்கப்பட்டுள்ளது. அந்த hostname-க்கு certificate இல்லை, Traefik அதன் self-signed placeholder-ஐ வழங்குகிறது. ACME வரிகளைப் படிக்கவும்:
unable to obtain ACME certificate for domains "git.example.com" ...
acme: error: 400 ... DNS problem: NXDOMAIN looking up A for git.example.comDNS இன்னும் server-ஐச் சுட்டிக்காட்டவில்லை. Record-ஐச் சரிசெய்து, TTL முடியும் வரை காத்திருந்து, Traefik-ஐ restart செய்யவும்.
Invalid response from http://git.example.com/.well-known/acme-challenge/... HTTP challenge-ல்: port 80 வெளியிலிருந்து Traefik-ஐ அடையவில்லை. இது பொதுவாக ufw அல்ல, VPS-க்கு முன்னால் உள்ள provider-level firewall ஆகும்.
Certificates வழங்கப்படவில்லை, உங்கள் DNS Cloudflare-ல் உள்ளது மற்றும் orange cloud ஆன் செய்யப்பட்டுள்ளது. Cloudflare அதன் edge-ல் TLS-ஐ முடித்துவிடுகிறது, அதனால் TLS-ALPN-01 அதன் வழியாகச் செயல்பட முடியாது. Certificate வழங்கும்போது record-ஐ DNS-only என மாற்றவும், அல்லது API token பயன்படுத்தி DNS-01 challenge-க்கு மாறவும். Wildcard certificates-க்கு DNS-01 மட்டுமே ஒரே வழி.
Redirect loop. Traefik-க்கு முன்னால் ஏதோ ஒன்று ஏற்கனவே TLS-ஐ முடித்துவிட்டு, plaintext-ஐ :80-க்கு அனுப்புகிறது; entrypoint redirect அதை மீண்டும் HTTPS-க்கு அனுப்புகிறது. இரண்டு redirect-களில் ஒன்றை நீக்கவும்.
தொடர்ச்சியான செயல்பாட்டை உறுதி செய்தல்
Docker-ன் unit boot-enabled நிலையில் இருக்க வேண்டும் (systemctl is-enabled docker), மேலும் restart: unless-stopped reboot-க்கு பிறகு stack-ஐ மீண்டும் இயக்கும். ஒரு குறிப்பிட்ட கட்டுப்பாட்டிற்கு, docker compose -f /srv/edge/compose.yml up -d-ஐ RemainAfterExit=yes உடன் இயக்கும் ஒரு சிறிய systemd unit உங்களுக்கு systemctl status edge மற்றும் வரிசைப்படுத்தும் வசதியை (ordering control) வழங்கும்.
Traefik tag-ஐ pin செய்யவும் (traefik:v3.5, ஒருபோதும் latest-ஐ பயன்படுத்த வேண்டாம்). v2-லிருந்து v3-க்கு மேம்படுத்தும்போது rule syntax மற்றும் provider பெயர்கள் மாறியுள்ளன; எனவே, கவனிக்கப்படாத latest தானாகவே புதிய config-ஐ ஏற்ற முயன்று, அது புரியாமல் தோல்வியடையலாம். திட்டமிட்டு மேம்படுத்தவும்: migration குறிப்புகளைப் படிக்கவும், tag-ஐ மாற்றவும், docker compose up -d traefik செய்யவும், log-ஐ கவனிக்கவும். நீங்கள் இன்னும் v2 tag-ல் இருந்தால், Traefik v2-லிருந்து v3-க்கு மாறுவதற்கான வழிகாட்டி ஒவ்வொரு பெயர் மாற்றம், compatibility mode மற்றும் உங்கள் certificates-ஐ பாதுகாக்கும் rollback முறை ஆகியவற்றை விளக்குகிறது.
./letsencrypt மற்றும் ஒவ்வொரு application-ன் data volume-ஐயும் backup எடுக்கவும். compose file மூலம் மீண்டும் உருவாக்க முடியாத எந்தவொரு state-ம் Traefik-ல் இல்லை.
அளவீடு அதிகரிக்கும்போது ஏற்படும் சிக்கல்கள்
முதல் தடையாக இருப்பது throughput அல்ல, அது ஒற்றை server ஆகும்: ஒரு VPS-ல் இயங்கும் ஒரு Traefik, ஐந்து applications-க்கு ஒற்றைப் புள்ளி தோல்வியாக (single point of failure) அமைகிறது. மேலும் acme.json என்பது flat-file சேமிப்பகம் என்பதால், இரண்டு Traefik instances ஒரே நேரத்தில் அதில் எழுதினால் அது சிதைந்துவிடும். எனவே, certificate சேமிப்பகத்தை கோப்பிலிருந்து மாற்ற வேண்டும் அல்லது TLS termination-ஐ வேறு இடத்தில் செய்ய வேண்டும்.
இரண்டாவது சிக்கல் நீண்ட கால இணைப்புகள் (long-lived connections). Server-sent events, பெரிய கோப்பு பதிவேற்றங்கள் மற்றும் மெதுவான clients ஆகியவை entrypoint-ன் பதிலளிப்பு நேர வரம்புகளை (timeouts) மீறக்கூடும்; இதற்கு --entryPoints.websecure.transport.respondingTimeouts.readTimeout மற்றும் அதன் writeTimeout, idleTimeout ஆகிய அமைப்புகளை மாற்றியமைக்க வேண்டும். WebSockets எந்த கூடுதல் அமைப்பும் இன்றி இயல்பாகவே செயல்படும்.
மூன்றாவது சிக்கல் வட்டு (disk) பயன்பாடு. --accesslog=true தகவல்களை stdout-க்கு எழுதும், Docker-ன் json-file driver அதை வரம்பின்றி சேமிக்கும். எனவே, Traefik service-ல் logging.options.max-size அமைப்பைச் சேர்க்கவும் அல்லது access log-ஐ ஒரு கோப்பில் எழுதி அதை rotate செய்யவும்.
இதற்கு orchestrator தேவையில்லை. உங்களுக்குக் கட்டுப்பாடுள்ள ஒரு server, ஒரு உண்மையான IP, மற்றும் உலகிற்குத் திறக்கப்பட்ட 80, 443 ports ஆகியவை மட்டுமே தேவை. ஒரு சிறிய VPS மட்டுமே இதற்கான முழுமையான சார்புப் பட்டியல் (dependency list) ஆகும்.
FAQ
நான் Traefik-ஐ பயன்படுத்தினாலும் certbot தேவையா?
தேவையில்லை. Traefik-ன் ACME resolver, அது route செய்யும் ஒவ்வொரு hostname-க்கும் சான்றிதழைப் பெற்றுப் புதுப்பித்துக்கொள்ளும், மேலும் அவற்றை acme.json-ல் சேமிக்கும். Nginx அல்லது பிற server-கள் தாங்களாகவே TLS termination செய்யும்போது மட்டுமே Certbot சரியான கருவியாகும்; ஒரே hostname-களுக்கு இரண்டையும் பயன்படுத்தினால் Let's Encrypt rate limits விரைவில் தீர்ந்துவிடும்.
Traefik வழியாக எனது container ஏன் 404 பிழையைத் தருகிறது?
Traefik வழங்கும் 404 பிழை, அந்த request-க்கு எந்த router-ம் பொருந்தவில்லை என்பதைக் குறிக்கிறது. அந்த container-ல் traefik.enable=true உள்ளதா (exposedByDefault=false அமைக்கப்பட்டால் இது கட்டாயம்) என்பதைச் சரிபார்க்கவும். Host() மதிப்பு நீங்கள் உள்ளிட்ட பெயருடன் ஒத்துப்போகிறதா என்பதையும், அந்த app-க்கான அனைத்து labels-களிலும் router பெயர் ஒரே மாதிரியாக உள்ளதா என்பதையும் உறுதிப்படுத்தவும். Traefik v3-ல் matcher-க்குள் quotes-க்கு பதிலாக backticks பயன்படுத்தப்பட வேண்டும்.
இங்கே 404 மற்றும் 502 பிழைகளுக்கு என்ன வித்தியாசம்?
404 என்பது routing நடக்கவில்லை என்பதைக் குறிக்கிறது; 502 என்பது router சரியாகப் பொருந்தி, backend இணைப்பை மறுத்துவிட்டது என்பதைக் குறிக்கிறது. பொதுவாக 502 பிழை ஏற்படக் காரணம், container proxy network-ல் இணைக்கப்படாமல் இருப்பது அல்லது loadbalancer.server.port என்பது container-க்குள் app இயங்கும் port-க்கு பதிலாக, வெளியிடப்பட்ட (published) port-ஐக் குறிப்பிடுவது ஆகும். Traefik எந்த முகவரிக்கு இணைக்க முயன்றது என்பதை access log-ல் காணலாம்.
Docker socket-ஐ read-only முறையில் mount செய்வது போதுமானதா?
:ro flag அந்த socket கோப்பை மட்டுமே read-only ஆக்குகிறது, அதன் பின்னால் உள்ள API-ஐ அல்ல. POST கோரிக்கைகள் அதன் வழியாகவே செல்லும், மேலும் Docker API அணுகல் என்பது host-ல் root பயனர் அணுகலுக்குச் சமமானது. மேலே காட்டப்பட்டுள்ள docker-socket-proxy container முறையே பாதுகாப்பானது; இது Traefik-க்கு container மற்றும் network தகவல்களை மட்டுமே படிக்க அனுமதிக்கும், எழுதுவதை (writes) முழுமையாகத் தடுக்கும்.
Traefik-ஆல் wildcard சான்றிதழை வழங்க முடியுமா?
DNS-01 challenge மூலம் மட்டுமே இது சாத்தியம், அதற்கு உங்கள் DNS provider-ன் API token தேவை. TLS-ALPN-01 மற்றும் HTTP-01 ஆகியவை ஒரு குறிப்பிட்ட hostname-ஐ மட்டுமே சரிபார்க்கும், அவற்றால் wildcard சான்றிதழை உருவாக்க முடியாது. உங்கள் VPS-க்கு முன்னால் Cloudflare போன்ற ஒரு CDN TLS termination செய்யும்போது, மற்ற இரண்டு முறைகளும் தோல்வியடைந்தால், DNS-01 முறையே தீர்வாகும்.