Traefik Docker Compose একাধিক অ্যাপ রিভার্স প্রক্সি সেটআপ
Traefik v3 দিয়ে Docker Compose-এ পাঁচটি অ্যাপ একটি IP-এ চালান। Host rule রাউটিং, Let's Encrypt TLS স্বয়ংক্রিয়, এবং acme.json ফাইলের পারমিশন ফাঁদ যেটি startup আটকে দেয় সব এই গাইডে।
একটি IP, পাঁচটি অ্যাপ, একটি পোর্ট 443
আপনার VPS-এ একটি পাবলিক IPv4 ঠিকানা এবং একটি TCP পোর্ট 443 আছে। আপনি এতে Gitea, আপনার অ্যাপের একটি staging কপি, একটি অভ্যন্তরীণ ড্যাশবোর্ড, একটি স্ট্যাটাস পেজ এবং একটি webhook রিসিভার চান — পাঁচটি হোস্টনেম, একটি বক্স। একটি রিভার্স প্রক্সি হলো সেই প্রসেস যেটি :80 এবং :443 দখল করে, প্রতিটি অনুরোধে Host হেডার পড়ে এবং সেটি সঠিক কন্টেইনারে পাঠায়। Traefik এই কাজটি করে, এবং এটি নিজে থেকেই প্রতিটি হোস্টনেমের জন্য একটি সার্টিফিকেট সংগ্রহ ও নবায়ন করে — আপনাকে নিজে হাতে কখনো certbot চালাতে হয় না।
Traefik-কে nginx-এর server {} ব্লক থেকে আলাদা করে রাখে তার কনফিগারেশনের উৎস। nginx-এ আপনি একটি ফাইল এডিট করে রিলোড করেন, এবং সার্টিফিকেটের জীবনচক্র একটি আলাদা কাজ হিসেবেই থেকে যায় — ঠিক সেই ওয়ার্কফ্লোটি, যেটি আপনি অনুসরণ করেন যখন আপনি nginx-এ certbot দিয়ে Let's Encrypt সার্টিফিকেট ইস্যু করেন, যেখানে একটি নবায়ন টাইমার সম্পূর্ণভাবে ওয়েব সার্ভারের বাইরে থাকে। Traefik-এর Docker প্রোভাইডার Docker ইভেন্ট স্ট্রিম পর্যবেক্ষণ করে এবং আপনার কন্টেইনার থেকে লেবেল পড়ে: একটি কন্টেইনার শুরু করুন যেটিতে Host() রুল লেবেল আছে, এবং এক সেকেন্ডের মধ্যেই এটি রাউট করা যাবে; এটি বন্ধ করুন এবং রুটটি মুছে যাবে। এটিই হলো ফাঁদ। লেবেলে থাকা কনফিগারেশন একসাথে পাঁচ জায়গায় থাকে, এবং একটি ভুল লেবেল নীরব থাকে — কন্টেইনারটি কেবল রাউট হয় না, এবং Traefik কিছুই বলে না।
চারটি নাম
- Entrypoints হলো লিসনিং সকেট। আপনি দুটি নির্ধারণ করবেন:
:80-এwebএবং:443-এwebsecure। - Routers একটি অনুরোধ (
Host(...)) মিলিয়ে সেটিকে একটি সার্ভিসের সাথে যুক্ত করে। প্রতিটি router-এর জন্যtls.certresolver-এর মাধ্যমে সার্টিফিকেট অনুরোধ করা হয়। - Services হলো ব্যাকএন্ড — একটি কন্টেইনার এবং Docker নেটওয়ার্কের ভেতরে এটি যে পোর্টে শোনে।
- Middlewares router এবং সার্ভিসের মাঝে অবস্থান করে: basic auth, IP allow-lists, header rewrites, redirects।
স্ট্যাটিক কনফিগারেশন (entrypoints, providers, ACME) Traefik-এর কমান্ড লাইনে বা traefik.yml-এ দেওয়া হয়, এবং এটি পরিবর্তন করলে Traefik রিস্টার্ট করতে হয়। ডায়নামিক কনফিগারেশন (routers, services, middlewares) কন্টেইনার লেবেল থেকে আসে এবং hot-reload হয়। এই দুটিকে গুলিয়ে ফেলাই "my flag does nothing"-এর সাধারণ কারণ।
compose ফাইলটি
proxy নামের একটি শেয়ার্ড Docker নেটওয়ার্ক হল মূল ভিত্তি। 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=3000docker compose up -d, তারপর docker compose logs -f traefik। প্রতিটি অতিরিক্ত অ্যাপ হল gitea ব্লকের একটি অনুলিপি, যার নিজস্ব রাউটার নাম, নিজস্ব Host() এবং নিজস্ব অভ্যন্তরীণ পোর্ট থাকে। একটি TLS এবং ব্যাকআপ সহ Docker-এ চলমান Nextcloud ইনস্টল একইভাবে যুক্ত হয় — এর প্রকাশিত পোর্টগুলি বাদ দিন, এটি proxy-এ যুক্ত করুন, এবং রাউটার লেবেলগুলিকে হোস্টনাম ও সার্টিফিকেট পরিচালনা করতে দিন।
এখানে পাঁচটি বিবরণ গুরুত্বপূর্ণ।
exposedByDefault=false একটি কন্টেইনারকে Traefik-এর কাছে অদৃশ্য করে দেয় যতক্ষণ না এতে traefik.enable=true যুক্ত থাকে। এটি বাদ দিলে আপনার শুরু করা প্রতিটি কন্টেইনার — যার মধ্যে কোনো কিছু পরীক্ষা করতে চালানো অস্থায়ী postgres-ও অন্তর্ভুক্ত — এর জন্য একটি রুট তৈরি হয়ে যায়।
providers.docker.network=proxy Traefik-কে জানায় কোন নেটওয়ার্ক ব্যবহার করতে হবে যখন একটি কন্টেইনার একাধিক নেটওয়ার্কে যুক্ত থাকে। এটি বাদ দিলে Traefik ভুল কন্টেইনার IP বেছে নিতে পারে, যা 502 হিসেবে প্রকাশ পায় এবং অ্যাপ্লিকেশন ত্রুটির মতো দেখায়।
loadbalancer.server.port=3000 হল কন্টেইনারের ভেতরের পোর্ট; Gitea সেখানে 3000-এ শোনে। লক্ষ্য করুন যে কোনো অ্যাপ কন্টেইনারই কোনো পোর্ট প্রকাশ করে না — কেবল Traefik করে।
web এন্ট্রিপয়েন্টের রিডাইরেক্ট প্লেইনটেক্সট অনুরোধগুলিকে HTTPS-এ একটি 308-এ পরিণত করে। পোর্ট 80 যাই হোক খোলা থাকে: ACME HTTP চ্যালেঞ্জের এটি প্রয়োজন, এবং যারা কেবল একটি হোস্টনাম টাইপ করে তাদেরও প্রয়োজন।
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-এ সংরক্ষণ করে। সেই ফাইলটি যদি গ্রুপ বা অন্য সবার পাঠযোগ্য হয়, Traefik এর সাথে কাছাকাছি একটি লাইন প্রিন্ট করে এবং থেমে যায়:
error: unable to get ACME account: permissions 644 for /letsencrypt/acme.json are too open, please use 600পরিষ্কার সমাধান হলো উপরের পদ্ধতি: ডিরেক্টরিটি বাইন্ড-মাউন্ট করুন এবং Traefik-কে নিজেই সঠিক মোডে ফাইলটি তৈরি করতে দিন। আপনি যদি touch দিয়ে acme.json তৈরি করে থাকেন, তবে আপনার umask এটিকে 644 করে দিয়েছে। হোস্টে এটি ঠিক করুন:
chmod 600 ./letsencrypt/acme.json
docker compose restart traefikআপনার অ্যাপ ভলিউমগুলোর সাথে সেই ডিরেক্টরির ব্যাকআপ নিন। এটি হারানো সহনীয় — সার্টিফিকেট পুনরায় ইস্যু হয় — কিন্তু একসাথে পাঁচটি হোস্টনেম পুনরায় ইস্যু করলে আপনি রেট লিমিটে পৌঁছে যাবেন।
কাজ চলাকালীন স্টেজিং CA ব্যবহার করুন। caserver লাইনটি আনকমেন্ট করুন, প্রতিটি রুট কার্যকর করুন, তারপর এটি কমেন্ট করুন এবং acme.json মুছে ফেলুন যাতে প্রোডাকশন সার্টিফিকেট সম্পূর্ণ নতুন করে অনুরোধ করা হয়। প্রোডাকশন Let's Encrypt সপ্তাহে পাঁচটি ডুপ্লিকেট সার্টিফিকেট অনুমোদন করে একই হোস্টনেমের সেটের জন্য, এবং একই নামের জন্য বারবার ব্যর্থ ভ্যালিডেশন থ্রোটল করে। স্টেজিং অবিশ্বস্ত সার্টিফিকেট ইস্যু করে — আপনার ব্রাউজার সতর্ক করবে, এবং সেই সতর্কতাই প্রমাণ যে কাজ হয়েছে — অনেক শিথিল লিমিট সহ।
ড্যাশবোর্ড একটি নিয়ন্ত্রণ পৃষ্ঠ, নয় একটি ডেমো
বেশিরভাগ কুইকস্টার্ট --api.insecure=true সেট করে, যা পোর্ট 8080-এ কোনো প্রমাণীকরণ ছাড়াই ড্যাশবোর্ড পরিবেশন করে। একটি পাবলিক IP সম্পন্ন সার্ভারে এটি আপনার রাউটিং টপোলজি, হোস্টনাম, মিডলওয়্যার নাম এবং ব্যাকএন্ড পোর্ট যে কাউকেই দেখিয়ে দেয় যে কেউ স্ক্যান করলেই এগুলো পেয়ে যাবে।
উপরে traefik সার্ভিসের লেবেলগুলো হলো এর বিকল্প: ড্যাশবোর্ড অন্য যেকোনো অ্যাপের মতোই রাউট করা হয়েছে, একটি আসল হোস্টনামে, TLS-এর মাধ্যমে, basicauth-এর পেছনে। service=api@internal হলো যা রাউটারকে Traefik-এর অন্তর্নির্মিত API-এর সাথে সংযুক্ত করে। একটি IP অনুমোদন-তালিকা যুক্ত করে এটিকে আরও কঠোর করুন, যা বাম থেকে ডানে প্রয়োগ হবে। আপনার অফিসের ঠিকানা যদি পরিবর্তনশীল হয়, তবে রেঞ্জটি একই VPS-এ আপনার নিজে হোস্ট করা একটি WireGuard VPN দ্বারা বরাদ্দকৃত সাবনেটে সেট করুন এবং ড্যাশবোর্ডে কেবল টানেলের মাধ্যমেই প্রবেশ করুন:
- traefik.http.middlewares.office.ipallowlist.sourcerange=10.0.0.7/32
- traefik.http.routers.dashboard.middlewares=office,dashboard-authDocker socket হলো root
/var/run/docker.sock একটি API যা হোস্ট থেকে / মাউন্ট করে একটি কন্টেইনার তৈরি করতে পারে। এটি ব্যবহার করা মেশিনে root অ্যাক্সেসের সমান, এবং লেবেল পড়ার জন্য Traefik-এর এটি প্রয়োজন।
মাউন্টে :ro রাখুন, কিন্তু এটি কী দেয় তা স্পষ্ট করে বুঝুন: এটি socket ফাইলটিকে শুধু পঠনযোগ্য করে তোলে। এটি Docker API-তে যাওয়া POST রিকোয়েস্ট আটকায় না। প্রকৃত সমাধান হলো Traefik-কে সকেট দেওয়া বন্ধ করা, এবং মাঝখানে একটি ফিল্টারিং প্রক্সি বসানো:
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 ভলিউম বাদ দিন এবং প্রোভাইডারকে প্রক্সির দিকে নির্দেশ করুন:
--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-এ বাইন্ড করুন — "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-টি backtick-এর বদলে উদ্ধৃতিচিহ্নে রেখেছেন। Traefik v3-এ matcher-এর ভেতরে backtick প্রয়োজন।
502 Bad Gateway. একটি router মিলেছে কিন্তু backend পাওয়া যায়নি। প্রায় সবসময় container-টি proxy নেটওয়ার্কে নেই — docker inspect -f '{{json .NetworkSettings.Networks}}' gitea যাচাই করুন। অন্য সম্ভাবনা হলো ভুল loadbalancer.server.port: আপনি একটি published port দিয়েছেন, অথবা অ্যাপটি অন্য কোথাও listen করছে। লগ চেষ্টাটির নাম দেখায়: dial tcp 172.18.0.5:8080: connect: connection refused।
ব্রাউজার সতর্ক করে, এবং সার্টিফিকেটটি TRAEFIK DEFAULT CERT-এর নামে ইস্যু করা। সেই hostname-এর জন্য কোনো সার্টিফিকেট নেই এবং 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 এখনও এই সার্ভারের দিকে নির্দেশ করছে না। রেকর্ড ঠিক করুন, TTL অপেক্ষা করুন, Traefik পুনরায় চালু করুন।
HTTP challenge-এ Invalid response from http://git.example.com/.well-known/acme-challenge/...: port 80 বাইরে থেকে Traefik-এ পৌঁছাচ্ছে না — সাধারণত VPS-এর সামনে একটি provider-level firewall এর কারণ, ufw নয়।
সার্টিফিকেট কখনো ইস্যু হয় না, এবং আপনার DNS Cloudflare-এ অরেঞ্জ ক্লাউড চালু অবস্থায়। Cloudflare তার edge-এ TLS সমাপ্ত করে এবং TLS-ALPN-01 এর মধ্য দিয়ে সম্পূর্ণ হতে পারে না। ইস্যু করার সময় রেকর্ডটি DNS-only এ সেট করুন, অথবা একটি API token সহ DNS-01 challenge-এ পরিবর্তন করুন। DNS-01 হলো wildcard ইস্যু করে এমন একমাত্র challenge।
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 নিয়ন্ত্রণ দেয়।
Traefik tag নির্দিষ্ট করে রাখুন (traefik:v3.5, কখনো latest নয়)। v2 থেকে v3 এ আপগ্রেড করলে rule syntax এবং provider নাম পরিবর্তন হয়েছে, এবং একটি অনিরীক্ষিত latest এমন একটি config আনন্দের সাথে reload করবে যা এটি আর বোঝে না। ইচ্ছাকৃতভাবে আপগ্রেড করুন: migration notes পড়ুন, tag আপগ্রেড করুন, docker compose up -d traefik, এবং log পর্যবেক্ষণ করুন। আপনি যদি এখনও একটি v2 tag-এ থাকেন, তবে Traefik v2 থেকে v3 migration guide প্রতিটি নাম পরিবর্তন, compatibility mode, এবং আপনার certificates সংরক্ষণ করে এমন একটি rollback সম্পর্কে বিস্তারিত জানায়।
./letsencrypt এবং প্রতিটি app-এর data volume ব্যাক আপ করুন। Traefik compose file ছাড়া আর কোনো state ধরে রাখে না যা আপনি পুনরায় তৈরি করতে পারবেন না।
স্কেল বাড়ালে কী কী সমস্যা হয়
প্রথম সীমাবদ্ধতা থ্রুপুট নয়, এটি হলো একটি একক বক্স: একটি VPS-এ একটি Traefik হলো পাঁচটি অ্যাপের জন্য একটি একক বিভ্রান্তির বিন্দু, এবং acme.json হলো ফ্ল্যাট-ফাইল স্টোরেজ — দুটি Traefik ইনস্ট্যান্স এটি লিখলে তা নষ্ট হয়ে যাবে। স্কেল আউট করার অর্থ হলো সার্টিফিকেট স্টোরেজ ফাইল থেকে বের করে আনা, অথবা TLS অন্য কোথাও টার্মিনেট করা।
দ্বিতীয় সীমাবদ্ধতা হলো দীর্ঘস্থায়ী সংযোগ। সার্ভার-সেন্ট ইভেন্ট, বড় আপলোড এবং ধীর ক্লায়েন্টরা এন্ট্রিপয়েন্টের রেসপন্ডিং টাইমআউটের মুখোমুখি হয়; --entryPoints.websecure.transport.respondingTimeouts.readTimeout এবং এর writeTimeout ও idleTimeout সিবলিংস হলো কন্ট্রোল নব। WebSocket অতিরিক্ত কনফিগারেশন ছাড়াই পাস হয়।
তৃতীয় সীমাবদ্ধতা হলো ডিস্ক। --accesslog=true stdout-এ লেখে, এবং Docker-এর json-file ড্রাইভার সীমা না থাকলে এটি চিরকাল ধরে রাখে। Traefik সার্ভিসে logging.options.max-size সেট করুন, অথবা অ্যাক্সেস লগ একটি ফাইলে লিখে তা রোটেট করুন।
এর কোনোটির জন্যই অর্কেস্ট্রেটরের প্রয়োজন নেই। এর জন্য একটি সার্ভার প্রয়োজন যা আপনি নিয়ন্ত্রণ করেন, যার একটি আসল IP এবং বিশ্বের জন্য খোলা পোর্ট 80 ও 443 রয়েছে — একটি ছোট VPS-ই হলো পুরো ডিপেন্ডেন্সি লিস্ট।
FAQ
আমি যদি Traefik চালাই, তবুও কি আমার certbot-এর প্রয়োজন আছে?
না। Traefik-এর ACME resolver প্রতিটি hostname-এর জন্য সার্টিফিকেট অনুরোধ করে এবং নবায়ন করে। এটি সমস্ত সার্টিফিকেট acme.json-এ সংরক্ষণ করে। nginx বা অন্য কোনো সার্ভার যদি নিজে TLS সমাপ্ত করে, তবে certbot সঠিক টুল। একই hostname-এর বিরুদ্ধে উভয় টুল চালালে কেবল Let's Encrypt-এর রেট লিমিট নষ্ট হয়।
আমার কন্টেইনার কেন Traefik-এর মাধ্যমে 404 রিটার্ন করছে?
Traefik থেকে 404 পাওয়ার অর্থ হলো কোনো রাউটারই অনুরোধের সাথে মিলেনি। যাচাই করুন যে কন্টেইনারটিতে traefik.enable=true লেবেল রয়েছে (exposedByDefault=false সেট করা থাকলে এটি বাধ্যতামূলক)। নিশ্চিত করুন যে Host() মান আপনার টাইপ করা নামের সাথে মিলে যায়। প্রতিটি অ্যাপের সমস্ত লেবেলে রাউটারের নাম অভিন্ন হতে হবে। Traefik v3-এ ম্যাচারের ভেতরে ব্যাকটিক ব্যবহার করতে হয়, কোট নয়।
এখানে 404 এবং 502-এর মধ্যে পার্থক্য কী?
404 মানে রাউটিং আদৌ ঘটেনি। 502 মানে একটি রাউটার মিলেছে কিন্তু ব্যাকএন্ড সংযোগ প্রত্যাখ্যান করেছে। 502-এর সাধারণ কারণ দুটি হলো কন্টেইনারটি proxy নেটওয়ার্কে যুক্ত নয়, এবং loadbalancer.server.port কন্টেইনারের ভেতরে অ্যাপ যে পোর্টে শোনে তার বদলে একটি প্রকাশিত পোর্ট নির্দেশ করছে। অ্যাক্সেস লগ Traefik যে ঠিকানায় ডায়াল করেছিল তার নাম উল্লেখ করে।
Docker সকেট রিড-ওনলি মোডে মাউন্ট করা কি যথেষ্ট?
:ro ফ্ল্যাগ কেবল সকেট ফাইলটিকে রিড-ওনলি করে, এর পেছনের API-কে নয়। POST অনুরোধ এখনও এর উপর দিয়ে যায়। Docker API অ্যাক্সেস হোস্টে root অ্যাক্সেসের সমতুল্য। উপরে দেখানো docker-socket-proxy কন্টেইনারটি হলো শক্তিশালী ব্যবস্থা। এটি Traefik-কে কেবল কন্টেইনার এবং নেটওয়ার্ক রিড অ্যাক্সেস দেয় এবং রাইট সম্পূর্ণভাবে ব্লক করে।
Traefik কি wildcard সার্টিফিকেট ইস্যু করতে পারে?
কেবল DNS-01 চ্যালেঞ্জের মাধ্যমে, আপনার DNS প্রোভাইডারের একটি API টোকেন সহ। TLS-ALPN-01 এবং HTTP-01 প্রত্যেকে একটি একক hostname যাচাই করে এবং wildcard তৈরি করতে পারে না। যখন Cloudflare-এর মতো একটি CDN আপনার VPS-এর সামনে TLS সমাপ্ত করে এবং অন্য দুটি চ্যালেঞ্জ সম্পূর্ণ হয় না, তখনও DNS-01 সমাধান।