Traefik v3తో Docker Composeలో 5 యాప్స్ రన్ చేయడం ఎలా?
ఒకే IP మరియు పోర్ట్ 443 ద్వారా ఐదు అప్లికేషన్లను Traefik v3తో ఎలా నిర్వహించాలో తెలుసుకోండి. Host రూల్స్, ఆటోమేటిక్ TLS మరియు acme.json ఫైల్ వల్ల వచ్చే స్టార్టప్ లోపాలను పరిష్కరించండి.
ఒకే IP, ఐదు అప్లికేషన్లు, ఒకే పోర్ట్ 443
మీ VPS కి ఒకే పబ్లిక్ IPv4 అడ్రస్ మరియు ఒకే TCP పోర్ట్ 443 ఉన్నాయి. మీరు దానిపై Gitea, మీ అప్లికేషన్ యొక్క స్టేజింగ్ కాపీ, ఒక ఇంటర్నల్ డాష్బోర్డ్, ఒక స్టేటస్ పేజీ మరియు ఒక వెబ్హుక్ రిసీవర్ను నడపాలనుకుంటున్నారు. ఇవన్నీ ఐదు వేర్వేరు హోస్ట్నేమ్లతో, ఒకే సర్వర్లో ఉండాలి. రివర్స్ ప్రాక్సీ అనేది :80 మరియు :443 పోర్ట్లను నియంత్రించే ప్రక్రియ. ఇది ప్రతి అభ్యర్థనలోని Host హెడర్ను చదివి, సరైన కంటైనర్కు పంపుతుంది. Traefik ఈ పనిని చేస్తుంది. మీరు మాన్యువల్గా certbot రన్ చేయాల్సిన అవసరం లేకుండానే, ప్రతి హోస్ట్నేమ్కు సర్టిఫికేట్ను పొంది, దానిని రెన్యూ చేస్తుంది. Nginx మరియు Caddy కూడా ఈ ఐదు హోస్ట్నేమ్లను సమర్థవంతంగా నిర్వహించగలవు. కాబట్టి, మీరు ఇంకా నిర్ణయం తీసుకోకపోతే, ఒక ప్రాక్సీని ఎంచుకునే ముందు సర్టిఫికేట్ నిర్వహణ మరియు ప్రతి అప్లికేషన్కు అయ్యే కాన్ఫిగరేషన్ ఖర్చు ఆధారంగా మూడు ప్రాక్సీలను పోల్చి చూడటం మంచిది.
Traefik మరియు nginx server {} బ్లాక్ మధ్య ప్రధాన వ్యత్యాసం వాటి కాన్ఫిగరేషన్ వచ్చే విధానం. Nginx లో మీరు ఒక ఫైల్ను ఎడిట్ చేసి రీలోడ్ చేయాలి. సర్టిఫికేట్ లైఫ్ సైకిల్ అనేది ఒక ప్రత్యేక పనిగా మిగిలిపోతుంది. మీరు nginx లో certbot తో Let's Encrypt సర్టిఫికేట్లను జారీ చేసేటప్పుడు అనుసరించే వర్క్ఫ్లోలో, రెన్యూవల్ టైమర్ వెబ్ సర్వర్కు సంబంధం లేకుండా బయట ఉంటుంది. Traefik యొక్క Docker ప్రొవైడర్, Docker ఈవెంట్ స్ట్రీమ్ను గమనిస్తూ మీ కంటైనర్ల నుండి labels ను చదువుతుంది: Host() రూల్ లేబుల్ ఉన్న కంటైనర్ను స్టార్ట్ చేస్తే, అది సెకనులోపు రూట్ చేయబడుతుంది; దానిని ఆపివేస్తే, ఆ రూట్ తొలగించబడుతుంది. ఇదే ఇక్కడ ఉన్న చిక్కు కూడా. లేబుల్స్లో ఉండే కాన్ఫిగరేషన్ ఐదు వేర్వేరు చోట్ల ఉంటుంది. ఒకవేళ లేబుల్ తప్పుగా ఉంటే, ఎటువంటి హెచ్చరిక రాదు; కంటైనర్ కేవలం రూట్ అవ్వదు మరియు Traefik ఏమీ చెప్పదు.
నాలుగు ముఖ్యమైన అంశాలు
- Entrypoints అనేవి వినే (listening) సాకెట్లు. మీరు రెండింటిని నిర్వచించాలి:
webను:80పై మరియుwebsecureను:443పై. - Routers ఒక అభ్యర్థనను (
Host(...)) సరిపోల్చి, దానిని ఒక సర్వీస్కు అనుసంధానిస్తాయి. సర్టిఫికెట్లు ప్రతి router ద్వారా,tls.certresolverఉపయోగించి అభ్యర్థించబడతాయి. - Services అనేవి బ్యాకెండ్, అంటే ఒక కంటైనర్ మరియు అది Docker నెట్వర్క్ లోపల వినే పోర్ట్.
- Middlewares అనేవి router మరియు service మధ్య ఉంటాయి: basic auth, IP allow-lists, header rewrites, redirects వంటివి వీటిలో ఉంటాయి.
మీరు మాన్యువల్గా రాసే పనులకు Traefik లో ఈ నాలుగు పేర్లు ఉంటాయి: router అనేది ఒక server_name, service అనేది ఒక proxy_pass లక్ష్యం, మరియు middlewares అనేవి మీరు nginx రివర్స్ ప్రాక్సీ సర్వర్ బ్లాక్ను లైన్ బై లైన్ నిర్మించేటప్పుడు సెట్ చేసే హెడర్ మరియు అథెంటికేషన్ ఆదేశాలు.
Static configuration (entrypoints, providers, ACME) Traefik కమాండ్ లైన్ ద్వారా లేదా traefik.yml లో అందించబడుతుంది, దీనిని మార్చాలంటే Traefik ను రీస్టార్ట్ చేయాలి. Dynamic configuration (routers, services, middlewares) కంటైనర్ లేబుల్స్ నుండి వస్తుంది మరియు ఇది వెంటనే (hot-reloaded) అప్డేట్ అవుతుంది. ఈ రెండింటి మధ్య గందరగోళం చెందడమే "నేను ఇచ్చిన ఫ్లాగ్ ఎందుకు పనిచేయడం లేదు" అనే సమస్యకు ప్రధాన కారణం.
Compose ఫైల్
proxy అనే పేరుతో ఉన్న ఒక భాగస్వామ్య Docker నెట్వర్క్ దీనికి వెన్నెముక వంటిది. Traefik మరియు కంటైనర్ రెండూ ఒకే నెట్వర్క్లో ఉంటేనే Traefik దానిని చేరుకోగలదు.
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. ప్రతి అదనపు అప్లికేషన్, gitea బ్లాక్ యొక్క కాపీగా ఉంటుంది; దీనికి ప్రత్యేకమైన router పేరు, సొంత Host() మరియు అంతర్గత పోర్ట్ ఉంటాయి. TLS మరియు బ్యాకప్లతో Dockerలో Nextcloud ఇన్స్టాలేషన్ కూడా ఇదే పద్ధతిలో అమర్చవచ్చు. దాని published పోర్ట్లను తొలగించి, proxy నెట్వర్క్కు అనుసంధానించి, hostname మరియు సర్టిఫికేట్ నిర్వహణను router లేబుల్స్కు వదిలేయండి.
ఇక్కడ ఐదు ముఖ్యమైన అంశాలు ఉన్నాయి.
exposedByDefault=false లేబుల్ లేని కంటైనర్ను Traefik గుర్తించదు, కాబట్టి traefik.enable=true లేబుల్ తప్పనిసరి. దీనిని మర్చిపోతే, మీరు రన్ చేసే ప్రతి కంటైనర్కు, అంటే ఏదైనా పరీక్ష కోసం మీరు రన్ చేసే postgres కంటైనర్కు కూడా Traefik ఒక రూట్ను సృష్టిస్తుంది.
ఒక కంటైనర్ అనేక నెట్వర్క్లకు అనుసంధానించబడినప్పుడు, ఏ నెట్వర్క్ను వాడాలో providers.docker.network=proxy Traefikకు తెలియజేస్తుంది. ఇది లేకపోతే, Traefik తప్పుడు కంటైనర్ IPని ఎంచుకోవచ్చు; దీనివల్ల అప్లికేషన్ లోపంలా కనిపించే 502 error వస్తుంది.
loadbalancer.server.port=3000 అనేది కంటైనర్ లోపల ఉండే పోర్ట్; ఉదాహరణకు Gitea అక్కడ 3000 పోర్ట్లో వింటుంది. గమనించండి, ఏ అప్లికేషన్ కంటైనర్ కూడా పోర్ట్ను publish చేయదు, కేవలం Traefik మాత్రమే చేస్తుంది.
web ఎంట్రీ పాయింట్పై ఉన్న redirect, సాధారణ HTTP అభ్యర్థనలను HTTPSకు 308 కోడ్తో మళ్లిస్తుంది. పోర్ట్ 80 ఎల్లప్పుడూ తెరిచే ఉంటుంది: ACME HTTP ఛాలెంజ్ కోసం మరియు నేరుగా hostname టైప్ చేసే వినియోగదారుల కోసం ఇది అవసరం.
basic-auth హ్యాష్లోని రెట్టింపు $$ అనేది Compose ఎస్కేపింగ్ మాత్రమే, అది టైపింగ్ పొరపాటు కాదు. దీనిని htpasswd -nbB admin 'your-password' (apache2-utils ప్యాకేజీ) ఉపయోగించి రూపొందించండి, ఆపై ప్రతి $ ను రెట్టింపు చేయండి.
సర్టిఫికేట్ మరియు acme.json ట్రాప్
tlschallenge=true TLS-ALPN-01 ని ఎంచుకుంటుంది: Let's Encrypt మీ బాక్స్కు 443 పోర్ట్ ద్వారా కనెక్ట్ అవుతుంది మరియు Traefik ఆ TLS హ్యాండ్షేక్ లోపలే ఛాలెంజ్కు సమాధానం ఇస్తుంది. దీనికి ప్రత్యామ్నాయం HTTP-01, ఇది 80వ పోర్ట్ ద్వారా పనిచేస్తుంది. Traefik యొక్క command: జాబితాలోని tlschallenge లైన్ను ఈ క్రింది రెండింటితో మార్చండి:
- --certificatesresolvers.le.acme.httpchallenge=true
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=webఏ పద్ధతి అయినా పనిచేస్తుంది. రెండింటికీ మీ హోస్ట్నేమ్ యొక్క పబ్లిక్ DNS ఇప్పటికే మీ VPSకి పాయింట్ అయి ఉండాలి, అప్పుడే సర్టిఫికేట్ అథారిటీ ఆ పేరును రిజాల్వ్ చేసి బయటి నుండి కనెక్ట్ అవ్వగలదు. ముందుగా A (మరియు AAAA) రికార్డును సృష్టించి, dig +short git.example.com తో నిర్ధారించుకున్నాక, Traefik ను ప్రారంభించండి.
ఇప్పుడు చాలామంది సమయాన్ని వృథా చేసే ఒక ట్రాప్ గురించి. Traefik తన ACME అకౌంట్ కీని మరియు జారీ చేసిన ప్రతి సర్టిఫికేట్ను ఒకే acme.json ఫైల్లో ఉంచుతుంది. ఒకవేళ ఆ ఫైల్ గ్రూప్ లేదా వరల్డ్-రీడబుల్ (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 నే స్వయంగా సరైన మోడ్తో ఫైల్ను సృష్టించేలా చూడండి. మీరు touch ఉపయోగించి acme.json ని సృష్టించినట్లయితే, మీ umask దానిని 644గా మార్చి ఉండవచ్చు. హోస్ట్ మెషీన్ మీద దానిని ఇలా సరిచేయండి:
chmod 600 ./letsencrypt/acme.json
docker compose restart traefikఆ డైరెక్టరీని మీ యాప్ వాల్యూమ్లతో పాటు బ్యాకప్ తీసుకోండి. అది పోయినా సర్టిఫికేట్లు మళ్ళీ జారీ అవుతాయి కాబట్టి పెద్ద సమస్య కాదు, కానీ ఒకేసారి ఐదు హోస్ట్నేమ్లకు సర్టిఫికేట్లు జారీ చేయాల్సి వస్తే, మీరు రేట్ లిమిట్స్ (rate limits) పరిమితుల్లో చిక్కుకుంటారు.
మీరు ప్రయోగాలు చేస్తున్నప్పుడు staging CA ని ఉపయోగించండి. caserver లైన్ను అన్కమెంట్ (uncomment) చేసి, అన్ని రూట్లు పనిచేస్తున్నాయని నిర్ధారించుకున్నాక, దానిని మళ్ళీ కామెంట్ చేసి acme.json ని తొలగించండి. అప్పుడు ప్రొడక్షన్ సర్టిఫికేట్లు తాజాగా అభ్యర్థించబడతాయి. ప్రొడక్షన్ Let's Encrypt ఒకే రకమైన హోస్ట్నేమ్ల సెట్ కోసం వారానికి ఐదు duplicate సర్టిఫికేట్లను మాత్రమే అనుమతిస్తుంది, మరియు ఒకే పేరు కోసం పదేపదే విఫలమైన వాలిడేషన్లను నిరోధిస్తుంది. Staging ద్వారా జారీ అయ్యేవి ట్రస్ట్ లేని సర్టిఫికేట్లు, కాబట్టి మీ బ్రౌజర్ హెచ్చరిస్తుంది. ఆ హెచ్చరిక వచ్చిందంటే, మీ కాన్ఫిగరేషన్ పనిచేస్తుందని మరియు మీరు చాలా ఎక్కువ పరిమితులు ఉన్న వాతావరణంలో ఉన్నారని అర్థం.
డ్యాష్బోర్డ్ అనేది ఒక కంట్రోల్ సర్ఫేస్, డెమో కాదు
చాలా క్విక్స్టార్ట్లు --api.insecure=trueని సెట్ చేస్తాయి, ఇది ఎటువంటి ప్రమాణీకరణ (authentication) లేకుండా 8080 పోర్ట్లో డ్యాష్బోర్డ్ను అందిస్తుంది. పబ్లిక్ IP ఉన్న సర్వర్లో ఇలా చేయడం వల్ల, స్కాన్ చేసే ఎవరికైనా మీ రూటింగ్ టోపోలాజీ, హోస్ట్నేమ్లు, మిడిల్వేర్ పేర్లు మరియు బ్యాకెండ్ పోర్ట్లు తెలిసిపోతాయి.
పైన పేర్కొన్న traefik సర్వీస్లోని లేబుల్స్ దీనికి ప్రత్యామ్నాయం: డ్యాష్బోర్డ్ ఇతర అప్లికేషన్ల మాదిరిగానే, ఒక నిజమైన హోస్ట్నేమ్ ద్వారా, TLS పైన, basicauth వెనుక రూట్ చేయబడుతుంది. service=api@internal అనేది రూటర్ను Traefik యొక్క అంతర్నిర్మిత APIకి అనుసంధానిస్తుంది. IP allow-listని ఎడమ నుండి కుడికి వర్తింపజేయడం ద్వారా దీనిని మరింత సురక్షితం చేయండి. మీ ఆఫీసు IP అడ్రస్ డైనమిక్ అయితే, అదే VPSలో మీరు హోస్ట్ చేసుకున్న WireGuard VPN ద్వారా వచ్చే సబ్నెట్ను సెట్ చేయండి మరియు టన్నెల్ ద్వారా మాత్రమే డ్యాష్బోర్డ్ను యాక్సెస్ చేయండి:
- traefik.http.middlewares.office.ipallowlist.sourcerange=10.0.0.7/32
- traefik.http.routers.dashboard.middlewares=office,dashboard-authఐదు అప్లికేషన్లకు విడివిడి ఖాతాలు అవసరమైనప్పుడు, ఒకే basicauth పాస్వర్డ్ను ఉపయోగించడం సురక్షితం కాదు. అదే మిడిల్వేర్ స్లాట్లో ఒక forwardauthని ఉపయోగించి, Authentik, ఒక self-hosted single sign-on serverకి నిర్ణయాధికారాన్ని బదిలీ చేయవచ్చు. దీనివల్ల డ్యాష్బోర్డ్ మరియు దాని పక్కన ఉన్న ప్రతి రూట్ ఒకే లాగిన్ వెనుక ఉంటాయి, దీనిని మీరు ఒకే చోట నుండి రద్దు చేయవచ్చు.
Docker socket అనేది root
/var/run/docker.sock అనేది ఒక API, ఇది హోస్ట్ నుండి / ను మౌంట్ చేసే కంటైనర్ను సృష్టించగలదు. దీనికి యాక్సెస్ ఉండటం అంటే ఆ మెషీన్పై root యాక్సెస్ ఉండటంతో సమానం, మరియు labels చదవడానికి Traefik కు ఇది అవసరం.
మౌంట్పై :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 కంటైనర్లు మరియు నెట్వర్క్లను చదవగల సామర్థ్యాన్ని కలిగి ఉంటుంది, కానీ దేనినైనా సృష్టించే సామర్థ్యాన్ని కోల్పోతుంది.
ఫైర్వాల్, పోర్ట్లు మరియు అందరూ తప్పుగా అర్థం చేసుకునే నియమం
రెండు పోర్ట్లు తెరిచి ఉంచడం, మరియు SSH:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enableDocker పబ్లిష్ చేసిన పోర్ట్లు ufw ను దాటవేస్తాయి. Docker తన సొంత iptables నియమాలను జోడిస్తుంది, ఇవి ufw చైన్ల కంటే ముందే అమలు చేయబడతాయి. కాబట్టి, ports: ["3000:3000"] తో ప్రారంభించిన కంటైనర్, ufw లో deny నియమం ఉన్నప్పటికీ ఇంటర్నెట్ నుండి అందుబాటులోకి వస్తుంది. దీనికి పరిష్కారం ఫైర్వాల్ కాన్ఫిగరేషన్ కాదు, నిర్మాణపరమైన మార్పు: Traefik నుండి మాత్రమే పోర్ట్లను పబ్లిష్ చేయండి, మిగిలిన అన్ని కంటైనర్లకు networks: [proxy] మాత్రమే ఇవ్వండి. ఏదైనా సేవ ఖచ్చితంగా హోస్ట్ను చేరుకోవాల్సి వస్తే, దానిని loopback కు bind చేయండి, "127.0.0.1:3000:3000".
ట్రబుల్షూటింగ్: మీరు వాస్తవంగా చూసే లోపాలు
404 page not found, Traefik ద్వారా అందించబడింది. ఏ router మ్యాచ్ కాలేదు. సంభావ్యత క్రమంలో: కంటైనర్లో traefik.enable=true లేదు (exposedByDefault=false సెట్ చేయబడినప్పటికీ); Host() రూల్ మీరు టైప్ చేసిన పేరుతో సరిపోలడం లేదు; ఒక లేబుల్లోని router పేరు మరొక దానితో భిన్నంగా ఉంది (routers.gitea.rule మరియు routers.gitea.entrypoints ఒకే పదమై ఉండాలి); లేదా మీరు హోస్ట్నేమ్ను బ్యాక్టిక్స్ (backticks) కు బదులుగా కోట్స్ (quotes) లో ఉంచారు. Traefik v3 లో మ్యాచర్స్ (matchers) లోపల బ్యాక్టిక్స్ తప్పనిసరి.
502 Bad Gateway. ఒక router మ్యాచ్ అయ్యింది కానీ backend అందుబాటులో లేదు. దాదాపు ఎల్లప్పుడూ కంటైనర్ proxy నెట్వర్క్లో ఉండదు, docker inspect -f '{{json .NetworkSettings.Networks}}' gitea ని తనిఖీ చేయండి. మరొక కారణం తప్పుగా ఉన్న loadbalancer.server.port: మీరు దానికి పబ్లిష్ చేసిన పోర్ట్ను ఇచ్చారు, లేదా అప్లికేషన్ వేరే చోట వింటోంది (listens). లాగ్ ప్రయత్నాన్ని ఇలా పేర్కొంటుంది: dial tcp 172.18.0.5:8080: connect: connection refused.
బ్రౌజర్ హెచ్చరిస్తుంది, మరియు సర్టిఫికేట్ TRAEFIK DEFAULT CERT పేరుతో జారీ చేయబడింది. ఆ హోస్ట్నేమ్ కోసం సర్టిఫికేట్ లేదు మరియు Traefik దాని self-signed ప్లేస్హోల్డర్ను అందించింది. ACME లైన్లను చదవండి:
unable to obtain ACME certificate for domains "git.example.com" ...
acme: error: 400 ... DNS problem: NXDOMAIN looking up A for git.example.comDNS ఇంకా సర్వర్కు పాయింట్ చేయడం లేదు. రికార్డును సరిచేయండి, TTL ముగిసే వరకు వేచి ఉండండి, Traefik ను రీస్టార్ట్ చేయండి.
Invalid response from http://git.example.com/.well-known/acme-challenge/... HTTP ఛాలెంజ్పై: పోర్ట్ 80 వెలుపలి నుండి Traefik కు చేరుకోవడం లేదు, సాధారణంగా ఇది ufw కాకుండా VPS ముందు ఉండే ప్రొవైడర్-స్థాయి ఫైర్వాల్ వల్ల జరుగుతుంది.
సర్టిఫికేట్లు జారీ కావడం లేదు, మరియు మీ DNS క్లౌడ్ఫ్లేర్ (Cloudflare) లో ఆరెంజ్ క్లౌడ్ ఆన్లో ఉంది. క్లౌడ్ఫ్లేర్ దాని అంచున (edge) TLS ను ముగిస్తుంది (terminates) మరియు TLS-ALPN-01 దాని ద్వారా పూర్తి కాలేదు. జారీ చేసేటప్పుడు రికార్డును DNS-only కి సెట్ చేయండి, లేదా API టోకెన్తో DNS-01 ఛాలెంజ్కు మారండి. వైల్డ్కార్డ్లను జారీ చేసే ఏకైక ఛాలెంజ్ DNS-01 మాత్రమే.
Redirect loop. Traefik ముందు ఏదో ఒకటి ఇప్పటికే TLS ను ముగిస్తోంది మరియు ప్లెయిన్టెక్స్ట్ను :80 కి ఫార్వర్డ్ చేస్తోంది; ఎంట్రీపాయింట్ రీడైరెక్ట్ దానిని తిరిగి HTTPS కి పంపుతోంది. ఆ రెండు రీడైరెక్ట్లలో ఒకదానిని తొలగించండి.
సర్వీసును నిరంతరాయంగా ఉంచడం
Docker యూనిట్ బూట్ సమయంలో ప్రారంభమయ్యేలా (systemctl is-enabled docker) ఉండాలి, మరియు restart: unless-stopped రీబూట్ తర్వాత స్టాక్ను తిరిగి పునరుద్ధరిస్తుంది. స్పష్టమైన నియంత్రణ కోసం, docker compose -f /srv/edge/compose.yml up -d ను RemainAfterExit=yes తో నడిపే ఒక చిన్న systemd యూనిట్ మీకు systemctl status edge మరియు ఆర్డరింగ్ నియంత్రణను అందిస్తుంది.
Traefik ట్యాగ్ను పిన్ చేయండి (traefik:v3.5, ఎప్పుడూ latest వాడకండి). v2 నుండి v3 కి అప్గ్రేడ్ చేసినప్పుడు రూల్ సింటాక్స్ మరియు ప్రొవైడర్ పేర్లు మారాయి, కాబట్టి అప్రమత్తం లేకుండా చేసే latest, తనకు అర్థం కాని కాన్ఫిగరేషన్ను లోడ్ చేసే ప్రమాదం ఉంది. అప్గ్రేడ్ను జాగ్రత్తగా చేయండి: మైగ్రేషన్ నోట్స్ను చదవండి, ట్యాగ్ను మార్చండి, docker compose up -d traefik చేయండి, మరియు లాగ్ను గమనించండి. మీరు ఇంకా v2 ట్యాగ్పైనే ఉంటే, Traefik v2 నుండి v3 కి మైగ్రేషన్ గైడ్ ప్రతి పేరు మార్పు, కంపాటబిలిటీ మోడ్, మరియు మీ సర్టిఫికేట్లను భద్రపరిచే రోల్బ్యాక్ ప్రక్రియను వివరిస్తుంది.
./letsencrypt మరియు ప్రతి యాప్ యొక్క డేటా వాల్యూమ్ను బ్యాకప్ చేయండి. compose ఫైల్ నుండి మీరు తిరిగి నిర్మించలేని మరే ఇతర స్థితిని Traefik కలిగి ఉండదు.
స్కేల్ పెరిగినప్పుడు ఏవి విఫలమవుతాయి
మొదటి పరిమితి throughput కాదు, ఒకే సర్వర్: ఒక VPS పై ఉన్న ఒక Traefik ఐదు అప్లికేషన్లకు ఒకే point of failure గా మారుతుంది. అలాగే acme.json అనేది flat-file స్టోరేజ్ కాబట్టి, రెండు Traefik instances ఒకేసారి దానిపై వ్రాస్తే డేటా కరప్ట్ అవుతుంది. స్కేల్ పెంచాలంటే certificate స్టోరేజ్ను ఫైల్ నుండి వేరే చోటికి మార్చాలి లేదా TLS termination ను వేరే చోట నిర్వహించాలి.
రెండవది ఎక్కువ కాలం ఉండే connections. Server-sent events, పెద్ద ఫైల్ అప్లోడ్లు మరియు నెమ్మదిగా ఉండే క్లయింట్లు entrypoint యొక్క response timeouts ను దాటిపోవచ్చు; దీనిని నియంత్రించడానికి --entryPoints.websecure.transport.respondingTimeouts.readTimeout మరియు దాని writeTimeout, idleTimeout వంటివి ఉపయోగపడతాయి. WebSockets ఎటువంటి అదనపు కాన్ఫిగరేషన్ లేకుండానే పనిచేస్తాయి.
మూడవది డిస్క్. --accesslog=true stdout కు వ్రాస్తుంది, Docker యొక్క json-file డ్రైవర్ పరిమితి లేకపోతే దానిని నిరంతరం నిల్వ చేస్తుంది. Traefik సర్వీస్పై logging.options.max-size సెట్ చేయండి, లేదా access log ను ఒక ఫైల్లోకి వ్రాసి దానిని rotate చేయండి.
వీటిలో దేనికీ orchestrator అవసరం లేదు. మీకు నియంత్రణ ఉన్న ఒక సర్వర్, ఒక real IP, మరియు ప్రపంచానికి అందుబాటులో ఉండే 80, 443 పోర్ట్లు ఉంటే సరిపోతుంది; ఒక చిన్న VPS మాత్రమే దీనికి కావలసిన మొత్తం డిపెండెన్సీ.
FAQ
నేను Traefik ఉపయోగిస్తుంటే నాకు ఇంకా certbot అవసరమా?
అవసరం లేదు. Traefik యొక్క ACME resolver ప్రతి hostname కోసం certificate ను అభ్యర్థించి, renew చేస్తుంది మరియు వాటన్నింటినీ acme.json లో భద్రపరుస్తుంది. Nginx లేదా ఇతర సర్వర్లు స్వయంగా TLS termination చేస్తున్నప్పుడు మాత్రమే Certbot సరైన సాధనంగా ఉంటుంది; ఒకే hostname కోసం రెండింటినీ వాడటం వల్ల Let's Encrypt రేట్ పరిమితులు త్వరగా ముగిసిపోతాయి.
Traefik ద్వారా నా container ఎందుకు 404 error ను ఇస్తోంది?
Traefik ద్వారా 404 వస్తుందంటే, ఆ అభ్యర్థనకు సరిపోయే router ఏదీ లేదని అర్థం. ఆ container కు traefik.enable=true ఉందో లేదో తనిఖీ చేయండి (exposedByDefault=false సెట్ చేసినప్పుడు ఇది తప్పనిసరి), Host() విలువ మీరు టైప్ చేసిన పేరుతో సరిపోలుతుందో లేదో చూడండి, మరియు ఆ అప్లికేషన్ యొక్క ప్రతి label లో router పేరు ఒకేలా ఉండేలా చూసుకోండి. Traefik v3 లో matcher లోపల quotes కు బదులుగా backticks వాడాలి.
ఇక్కడ 404 మరియు 502 మధ్య తేడా ఏమిటి?
404 అంటే routing జరగలేదని అర్థం; 502 అంటే router సరిగ్గా మ్యాచ్ అయింది కానీ backend కనెక్షన్ను తిరస్కరించింది అని అర్థం. సాధారణంగా 502 రావడానికి కారణం, container proxy నెట్వర్క్కు కనెక్ట్ కాకపోవడం, లేదా loadbalancer.server.port లో container లోపల అప్లికేషన్ వినే port కు బదులుగా, బయట publish చేసిన port ను పేర్కొనడం. Traefik ఏ చిరునామాకు కనెక్ట్ అవ్వడానికి ప్రయత్నించిందో access log లో చూడవచ్చు.
Docker socket ను read-only గా mount చేయడం సరిపోతుందా?
:ro ఫ్లాగ్ socket ఫైల్ను మాత్రమే read-only చేస్తుంది, దాని వెనుక ఉన్న API ని కాదు. POST అభ్యర్థనలు ఇప్పటికీ దాని ద్వారా వెళ్తాయి, మరియు Docker API యాక్సెస్ ఉండటం అంటే host పై root యాక్సెస్ ఉన్నట్లే. పైన చూపిన docker-socket-proxy కంటైనర్ వాడటం మరింత సురక్షితం; ఇది Traefik కు కేవలం container మరియు network సమాచారాన్ని మాత్రమే చూపిస్తుంది మరియు write అభ్యర్థనలను పూర్తిగా నిరోధిస్తుంది.
Traefik wildcard certificate ను జారీ చేయగలదా?
కేవలం DNS-01 challenge ద్వారా మాత్రమే ఇది సాధ్యం, దీని కోసం మీ DNS ప్రొవైడర్ యొక్క API token అవసరం. TLS-ALPN-01 మరియు HTTP-01 పద్ధతులు ఒక్కో hostname ను మాత్రమే ధృవీకరిస్తాయి, కాబట్టి అవి wildcard certificate ను ఇవ్వలేవు. మీ VPS ముందు Cloudflare వంటి CDN ఉండి, TLS termination అక్కడే జరుగుతుంటే, మిగిలిన రెండు పద్ధతులు పని చేయవు; అప్పుడు DNS-01 మాత్రమే సరైన మార్గం.