SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-26

Traefik v2 থেকে v3 মাইগ্রেশন: কী কী পরিবর্তন হবে

Traefik v3-এ swarmMode বা pilot স্ট্যাটিক কনফিগারেশনে থাকলে সার্ভিস চালু হবে না। incompatible deprecated static option error সমাধান করে রুল মাইগ্রেট করার পূর্ণাঙ্গ গাইড দেখুন।

Traefik v2 এবং v3-এর মধ্যে পরিবর্তনসমূহ

Traefik v2 থেকে v3-এ মাইগ্রেশন মূলত নাম পরিবর্তনের কাজ, যার মধ্যে সবচেয়ে উল্লেখযোগ্য হলো ipWhiteList মিডলওয়্যারটির নাম পরিবর্তন হয়ে ipAllowList হওয়া। এর বাইরে, v3 রাউটার রুল সিনট্যাক্সকে আরও কঠোর করেছে (PathPrefix থেকে regex বৈশিষ্ট্য সরিয়ে ফেলা হয়েছে, বেশ কিছু ম্যাচারের নাম পরিবর্তন করা হয়েছে বা বাদ দেওয়া হয়েছে), কিছু প্রোভাইডার ও অপশন পুরোপুরি বাদ দিয়েছে, এবং বাকি সবকিছু আগের মতোই কাজ করছে: entrypoints, ACME সার্টিফিকেট সেটআপ, Docker লেবেল ওয়ার্কফ্লো এবং আপনার acme.json সবকিছুই অপরিবর্তিত রয়েছে। v3-এ একটি কম্প্যাটিবিলিটি মোডও রয়েছে যা v2-এর রুল সিনট্যাক্সকে কাজ করতে দেয়, ফলে আপনি প্রথমে বাইনারি আপগ্রেড করতে পারেন এবং একবারে সব পরিবর্তন না করে প্রতিটি সার্ভিসের রুল আলাদাভাবে রিরাইট করতে পারেন।

এই নির্দেশিকাটি Traefik reverse proxy নির্দেশিকা থেকে নেওয়া লেবেল-ভিত্তিক Docker Compose সেটআপের ওপর ভিত্তি করে তৈরি। সেই পেজটি v3-এর জন্য তৈরি; আর এটি সেই সার্ভারের জন্য যেখানে এখনো traefik:v2 ট্যাগ ব্যবহার করা হচ্ছে।

নাম পরিবর্তন এবং অপসারণ

  • ipWhiteList এখন ipAllowList হয়েছে, HTTP এবং TCP উভয় middleware-এর জন্যই। এর ভেতরের অপশনগুলো অপরিবর্তিত রয়েছে, তাই sourcerange তার পূর্বের অর্থই বজায় রেখেছে। বর্তমান v3 রিলিজগুলোতে, v3.5 সহ, পুরনো নামটি deprecated alias হিসেবে গ্রহণ করা হয় এবং তালিকার নিয়মগুলো বলবৎ থাকে, তাই এই নাম পরিবর্তনের ফলে কোনো কিছু অচল হয়ে পড়বে না। তবুও এটি পরিবর্তন করে নিন: এই alias-টি ভবিষ্যতে সরিয়ে ফেলার পরিকল্পনা রয়েছে এবং এটি তখন কোনো সতর্কবার্তা ছাড়াই deprecation তালিকা থেকে মুছে যাবে।
  • providers.docker.swarmMode=true সরিয়ে ফেলা হয়েছে। Swarm-এর নিজস্ব provider রয়েছে, যা providers.swarm.endpoint হিসেবে কনফিগার করা হয়।
  • pilot সেকশনটি পুরোপুরি বাদ দেওয়া হয়েছে।
  • experimental.http3 সরিয়ে ফেলা হয়েছে। HTTP/3 সরাসরি entrypoint-এ এনাবল করা হয়।
  • tls.caOptional-কে provider এবং forwardAuth middleware থেকে সরিয়ে ফেলা হয়েছে। যদি সেই middleware-টি একটি self-hosted Authentik SSO-এর সামনে থাকে, তবে caOptional লাইনটি মুছে ফেলাই এর জন্য সম্পূর্ণ মাইগ্রেশন, কারণ forwardAuth অ্যাড্রেস, ট্রাস্টেড হেডার এবং সেগুলোর পেছনের আউটপোস্ট v3-তে একইভাবে কাজ করে।
  • InfluxDB v1 metrics provider, Rancher provider এবং Marathon provider সরিয়ে ফেলা হয়েছে।
  • Tracing-কে OpenTelemetry-তে স্থানান্তর করা হয়েছে। ডেডিকেটেড ট্রেসিং ব্যাকএন্ডগুলো, যার মধ্যে Jaeger এবং Zipkin ইন্টিগ্রেশন অন্তর্ভুক্ত, সরিয়ে ফেলা হয়েছে এবং v3 এখন OTLP (OpenTelemetry protocol) এক্সপোর্ট করে।
  • headers middleware-এর ভেতরের deprecated ssl* অপশনগুলো (sslRedirect, sslHost এবং অন্যান্য) সরিয়ে ফেলা হয়েছে। Entrypoint রিডাইরেকশন এবং redirectScheme middleware সেগুলোর স্থলাভিষিক্ত হয়েছে।

এই অপসারণগুলো যতটা সাধারণ মনে হয় তার চেয়ে বেশি গুরুত্বপূর্ণ, কারণ Traefik-এর static configuration-এ অজানা কোনো অপশন থাকলে এটি চালু হতে অস্বীকার করে। কোনো অবশিষ্ট pilot বা swarmMode লাইন থাকলে তা বুট হওয়ার সময় কন্টেইনারটিকে থামিয়ে দেয় এবং একটি incompatible deprecated static option found মেসেজ দেখায় যা সেই অবশিষ্ট অপশনটির নাম উল্লেখ করে; আর যদি Traefik কোনো অপশন সম্পর্কে একেবারেই না জানে (যেমন টাইপো বা tls.caOptional), তবে এটি field not found মেসেজ দিয়ে থেমে যায়। ইমেজ ট্যাগ পরিবর্তন করার আগেই static configuration পরিষ্কার করে নিন।

Traefik কোনো middleware-এর নাম না চিনলে (টাইপো বা এমন কোনো নাম যা alias না রেখে সরাসরি সরিয়ে ফেলা হয়েছে) তা ভিন্নভাবে ব্যর্থ হয়: যে রাউটারটি সেটিকে রেফারেন্স করে সেটি কোনো রুট ছাড়াই এররসহ লোড হয়, ড্যাশবোর্ডে তা চিহ্নিত থাকে এবং API middleware "offce@docker" does not exist রিপোর্ট করে। সেই hostname-এ করা অনুরোধগুলো 404 এরর পায় কারণ রাউটারটি কখনোই চালু হয়নি। মনে রাখবেন, বর্তমান v3-তে ipwhitelist এই ক্যাটাগরিতে পড়ে না: এটি deprecated alias হিসেবে টিকে আছে, তাই নাম পরিবর্তন না করা লেবেলগুলোও নীরবে কাজ চালিয়ে যাবে।

রুল সিনট্যাক্সের পরিবর্তন

রুল বা নিয়মগুলো হলো সেই জায়গা যেখানে প্রকৃত rewriting বা পুনর্লিখন ঘটে। v3-এ আসা পরিবর্তনগুলো হলো:

  • ম্যাচারের ভেতরের ভ্যালুগুলোর চারপাশে ব্যাকটিক (backticks) ব্যবহার করা বাধ্যতামূলক। v2-এ ডাবল কোটেশন গ্রহণ করা হতো; v3-এ তা করা হয় না, তাই Host("app.example.com") অবশ্যই Host(app.example.com) হতে হবে।
  • PathPrefix এখন আর রেগুলার এক্সপ্রেশন বা {id}-স্টাইলের প্লেসহোল্ডার বোঝে না। v2-এর একটি রুল যেমন PathPrefix(/api/{version:v[0-9]+}) পরিবর্তন করে Go রেগুলার এক্সপ্রেশন সিনট্যাক্সে লেখা একটি PathRegexp ম্যাচারে রূপান্তর করতে হবে।
  • ম্যাচারে এখন একটি মাত্র ভ্যালু ব্যবহার করা যায়। v2-এ Host(app.example.com,www.example.com) ব্যবহারের অনুমতি ছিল; v3-এ Host(app.example.com) || Host(www.example.com) লিখতে হয়। ব্যতিক্রম হলো Header, HeaderRegexp, Query এবং QueryRegexp, যা এখনও একটি নাম এবং একটি ভ্যালু গ্রহণ করে।
  • Headers এবং HeadersRegexp-এর নাম পরিবর্তন করে Header এবং HeaderRegexp রাখা হয়েছে।
  • HostHeader সরিয়ে ফেলা হয়েছে। এর পরিবর্তে Host ব্যবহার করুন, যা v3-এ একই কাজ করে।
  • দুটি নতুন ম্যাচারের সংযোজন ঘটেছে: QueryRegexp এবং রুলের ভেতরে ক্লায়েন্ট অ্যাড্রেস ম্যাচ করার জন্য ClientIP

সুসংবাদ হলো: ব্যাকটিক ব্যবহার করে লেখা একটি সাধারণ Host(app.example.com) রুল ইতিমধ্যেই v3 সিনট্যাক্সে বৈধ। বেশিরভাগ ছোট Compose সেটআপে ঠিক এটিই ব্যবহৃত হয়, যার মানে হলো বেশিরভাগ লেবেল কোনো রুল এডিট ছাড়াই মাইগ্রেট করা সম্ভব।

শুরু করার আগে আপনার লেবেলগুলো অডিট করুন

আপনি একটি সার্চের মাধ্যমেই আপনার মাইগ্রেশনের পরিধি পরিমাপ করতে পারেন, কারণ প্রতিটি ব্রেকিং লেবেল পরিবর্তনের একটি নির্দিষ্ট প্যাটার্ন থাকে যা grep দিয়ে খুঁজে পাওয়া সম্ভব:

grep -rnE 'ipwhitelist|HostHeader|Headers\(|PathPrefix\(`[^`]*\{|Host\(`[^`]*`,' docker-compose*.yml

প্রতিটি হিট মানেই একটি লাইন যা এডিট করতে হবে। ipwhitelist হয়ে যাবে ipallowlistHostHeader হয়ে যাবে HostHeaders হয়ে যাবে HeaderPathPrefix এর ভেতরের একটি {...} প্লেসহোল্ডার একটি PathRegexp ম্যাচারে পরিণত হবে। Host() এর ভেতরের একটি কমা || দ্বারা যুক্ত দুটি Host() ম্যাচারে পরিণত হবে। কোনো হিট না পাওয়ার অর্থ হলো আপনার লেবেলগুলো ইতিমধ্যেই বৈধ v3 সিনট্যাক্সে আছে এবং মাইগ্রেশনটি শুধুমাত্র স্ট্যাটিক কনফিগারেশন ও ইমেজ ট্যাগের মধ্যে সীমাবদ্ধ থাকবে। যদি স্ক্রিন ভর্তি হিট আসে, তবে এটি ভেবে দেখার উপযুক্ত সময় যে এই বক্সের জন্য এটিই সঠিক প্রক্সি কি না, এবং Traefik কীভাবে Nginx এবং Caddy-এর সাথে তুলনীয় তা আপনাকে অন্যান্য প্রক্সিগুলোর ক্ষেত্রে অ্যাপ প্রতি প্রয়োজনীয় কনফিগারেশন খরচের সাথে এই রিরাইটিং খরচের তুলনা করতে সাহায্য করবে।

যা অপরিবর্তিত থাকে

Entrypoints এবং সেগুলোর HTTP-to-HTTPS redirect, উভয় challenge টাইপসহ ACME resolvers, exposedByDefault, router এবং service labels, loadbalancer.server.port, এবং dashboard—সবই v3-এ v2-এর মতোই কাজ করে। আপনার certificates-ও কার্যকর থাকবে, কারণ v3 সেই acme.json ফাইলটিই পড়া অব্যাহত রাখে যা v2 তৈরি করেছিল। শুরু করার আগে ফাইলটির ব্যাকআপ অবশ্যই রাখুন, কারণ রোলব্যাক করার সময় এটি হারিয়ে গেলে আপনি সরাসরি Let's Encrypt-এর duplicate-certificate rate limit-এর কবলে পড়বেন:

cp ./letsencrypt/acme.json ./letsencrypt/acme.json.v2-backup

মাইগ্রেশন পাথ

ধাপ 1: বর্তমানে যা চালাচ্ছেন তা পিন করুন। যেকোনো traefik:latest বা traefik:v2 ট্যাগ পরিবর্তন করে আপনার বর্তমান রিলিজ ভার্সনটি সেট করুন, উদাহরণস্বরূপ traefik:v2.11, এবং পুরো compose ডিরেক্টরিটিকে git-এ কমিট করুন। পরবর্তী প্রতিটি ধাপ একটি checkout-এর মাধ্যমে আগের অবস্থায় ফিরিয়ে আনা সম্ভব। যদি docker compose up -d <service> ব্যবহার করে একটি সিঙ্গেল সার্ভিস পুনরায় তৈরি করা আপনার কাছে সহজ মনে না হয়, তবে Docker Compose-এর বেসিক গাইড দেখে নিন, কারণ এই মাইগ্রেশনটি সেই অপারেশনগুলোর ওপর ভিত্তি করেই তৈরি।

ধাপ 2: স্ট্যাটিক কনফিগারেশন পরিষ্কার করুন এবং কম্প্যাটিবিলিটি মোড চালু করুন। v3-এ বাদ দেওয়া প্রতিটি অপশন (pilot, swarmMode, tls.caOptional, experimental.http3) মুছে ফেলুন, তারপর v3-কে নির্দেশ দিন যেন এটি ডিফল্টভাবে রুলগুলোকে v2 সিনট্যাক্স হিসেবে গণ্য করে। traefik.yml-এ নিচের অংশটি যোগ করুন:

core:
  defaultRuleSyntax: v2

অথবা compose command: লিস্টে একটি ফ্ল্যাগ হিসেবে যোগ করুন: --core.defaultRuleSyntax=v2। কম্প্যাটিবিলিটি মোড শুধুমাত্র রুল সিনট্যাক্সের ক্ষেত্রে কাজ করে। এটি বাদ দেওয়া অপশনগুলোকে ফিরিয়ে আনে না এবং আপনার জন্য মিডলওয়্যারের নাম পরিবর্তন করে দেয় না।

ধাপ 3: মিডলওয়্যার রিনেমের প্রস্তুতি নিন। আপনার compose ফাইলগুলোতে পুরনো নামগুলো খুঁজুন: grep -rn ipwhitelist docker-compose*.yml। প্রতিটি ipwhitelist লেবেল পরিবর্তন করে ipallowlist করুন, তবে এখনই পরিবর্তনটি প্রয়োগ করবেন না, কারণ নতুন নামটি v2-এ বিদ্যমান নেই। এই এডিটগুলো পরবর্তী ধাপের পরিবর্তনের সাথে একসাথে কার্যকর হবে। (যদি কোনোটি ভুলবশত বাদ পড়ে যায়, বর্তমান v3 সেটিকে একটি deprecated alias হিসেবে গণ্য করবে, তাই রুলগুলো কার্যকর থাকবে; তবে পরবর্তী সুযোগেই তা ঠিক করে নিন।)

ধাপ 4: ইমেজ ট্যাগ পরিবর্তন করুন। Traefik ইমেজটিকে বর্তমান v3 রিলিজ ভার্সনে সেট করুন, যা লেখার সময় traefik:v3.5 ছিল, তারপর:

docker compose up -d
docker compose logs -f traefik

যেহেতু কম্প্যাটিবিলিটি মোড চালু আছে, আপনার v2 রুলগুলো কাজ করবে এবং যেহেতু up -d সেই সার্ভিসগুলোকেও পুনরায় তৈরি করেছে যাদের মিডলওয়্যার লেবেল আপনি পরিবর্তন করেছেন, তাই রাউটারগুলো সঠিকভাবে চালু হবে। একটি সুস্থ লগ ফাইলে কোনো field not found লাইন বা does not exist লাইন থাকবে না।

এই ধাপটি যে সময়টুকু নেবে সে বিষয়ে সচেতন থাকুন। যে রাউটারটি এমন কোনো মিডলওয়্যার নাম রেফারেন্স করে যা v3 চেনে না (যেমন টাইপো বা বাদ দেওয়া অপশন), সেটি নতুন Traefik চালু হওয়ার মুহূর্ত থেকে অ্যাপ কন্টেইনার পুনরায় তৈরি না হওয়া পর্যন্ত ডাউন থাকবে। একটি সিঙ্গেল বক্সে docker compose up -d-এর পুরো লিস্ট প্রসেস করতে কয়েক সেকেন্ড সময় লাগে। যদি কোনো রুট কোনোভাবেই বন্ধ করা না যায়, তবে ফ্লিপ করার আগে সেই রাউটারের middlewares লেবেল থেকে রিনেম করা মিডলওয়্যারটি সরিয়ে ফেলুন এবং পরে পুনরায় যোগ করুন। এই সময়ের মধ্যে IP allow list ছাড়া রুটটি চলতে পারবে কি না তা আগেই সিদ্ধান্ত নিন।

ধাপ 5: সার্ভিস অনুযায়ী রুল মাইগ্রেট করুন। প্রতিটি অ্যাপ ধরে ধরে কাজ করুন: এর রুলটিকে v3 সিনট্যাক্সে লিখুন, docker compose up -d app দিয়ে শুধুমাত্র সেই সার্ভিসটি পুনরায় তৈরি করুন এবং পরবর্তী ধাপে যাওয়ার আগে পরীক্ষা করুন। যদি কোনো সার্ভিসের রুল আপনি এখনই পরিবর্তন করতে না পারেন, তবে সেই রাউটারে traefik.http.routers.app.ruleSyntax=v2 লেবেলটি ব্যবহার করুন এবং কাজ চালিয়ে যান।

ধাপ 6: কম্প্যাটিবিলিটি মোড বন্ধ করুন। যখন প্রতিটি রুল v3 সিনট্যাক্সে চলে আসবে, তখন defaultRuleSyntax এবং যেকোনো ruleSyntax লেবেল মুছে ফেলুন, Traefik রিস্টার্ট করুন এবং ড্যাশবোর্ডে নিশ্চিত করুন যে প্রতিটি রাউটার গ্রিন দেখাচ্ছে। কম্প্যাটিবিলিটি মোড চালু রেখে স্থায়ীভাবে কাজ করবেন না: Traefik v3.4-এ এই দুটি অপশনকেই deprecated করেছে এবং পরবর্তী মেজর ভার্সনে এগুলো সরিয়ে ফেলা হবে। তাই এগুলো শুধুমাত্র একটি অন্তর্বর্তীকালীন সমাধান, চূড়ান্ত গন্তব্য নয়।

পরিবর্তনের আগে ও পরে: একটি সার্ভিসের লেবেল

এখানে একটি অ্যাপ রয়েছে যা একই সাথে সব গুরুত্বপূর্ণ পরিবর্তন বহন করছে: একটি মাল্টি-ভ্যালু Host, একটি PathPrefix প্লেসহোল্ডার এবং একটি ipWhiteList মিডলওয়্যার। v2 ব্লকটি নিচে দেওয়া হলো:

  app:
    image: app:1.4
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.app.rule=Host(`app.example.com`,`www.example.com`) && PathPrefix(`/api/{version:v[0-9]+}`)
      - traefik.http.routers.app.entrypoints=websecure
      - traefik.http.routers.app.tls.certresolver=le
      - traefik.http.routers.app.middlewares=office
      - traefik.http.middlewares.office.ipwhitelist.sourcerange=10.0.0.0/24
      - traefik.http.services.app.loadbalancer.server.port=8080

এবং একই সার্ভিসকে v3-এ মাইগ্রেট করার পর যা দাঁড়ায়:

  app:
    image: app:1.4
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.routers.app.rule=(Host(`app.example.com`) || Host(`www.example.com`)) && PathRegexp(`^/api/v[0-9]+`)
      - traefik.http.routers.app.entrypoints=websecure
      - traefik.http.routers.app.tls.certresolver=le
      - traefik.http.routers.app.middlewares=office
      - traefik.http.middlewares.office.ipallowlist.sourcerange=10.0.0.0/24
      - traefik.http.services.app.loadbalancer.server.port=8080

দুটি লেবেল পরিবর্তিত হয়েছে। রুলটি তার মাল্টি-ভ্যালু Host-কে দুটি ম্যাচারে বিভক্ত করেছে যা || দ্বারা যুক্ত, এবং প্লেসহোল্ডারটিকে PathRegexp দিয়ে প্রতিস্থাপন করেছে। এছাড়া মিডলওয়্যার লেবেলটি ipwhitelist-এর পরিবর্তে ipallowlist ব্যবহার করেছে। এন্ট্রি পয়েন্ট, সার্টিফিকেট রিজলভার, রাউটার-টু-মিডলওয়্যার ওয়্যারিং এবং সার্ভিস পোর্ট অপরিবর্তিত রয়েছে।

ড্যাশবোর্ডের মাধ্যমে প্রতিটি সার্ভিস পরীক্ষা করুন

প্রতিবার পরিবর্তনের পর ড্যাশবোর্ডের HTTP routers পেজটি খুলুন। প্রতিটি রাউটার সবুজ রঙের হওয়া উচিত। কোনো রাউটারে error ব্যাজ থাকলে সেটি তার সুনির্দিষ্ট সমস্যাটি নির্দেশ করে; সাধারণত নতুন নামে কোনো middleware না থাকা অথবা rule v3 পার্স করতে না পারার কারণে এমনটি হয়। এরপর বাইরের নেটওয়ার্ক থেকে প্রতিটি hostname আলাদাভাবে নিশ্চিত করুন:

curl -sI https://app.example.com/api/v1/status

একটি 200 অথবা আপনার অ্যাপের স্বাভাবিক redirect নির্দেশ করে যে রাউটিং এবং TLS উভয়ই সঠিকভাবে কাজ করছে। Traefik থেকে আসা একটি 404 মানে হলো রাউটারটি চালু হয়নি; ড্যাশবোর্ডে ফিরে গিয়ে এর error বার্তাটি পড়ুন। কাজ করার সময় দ্বিতীয় একটি টার্মিনালে docker compose logs -f traefik খোলা রাখুন, কারণ কন্টেইনার রিস্টার্ট হওয়ার সাথে সাথেই যেকোনো parsing ব্যর্থতার তথ্য সেখানে জমা হয়।

রোলব্যাক করার সততা

v3-এ প্রতিটি সার্ভিস সফলভাবে রাউট না হওয়া এবং বাস্তবে পরীক্ষা না করা পর্যন্ত v2 compose ফাইল, এর স্ট্যাটিক কনফিগারেশন এবং acme.json ব্যাকআপ সংরক্ষণ করুন। রোলব্যাক করার অর্থ হলো প্রি-মাইগ্রেশন কমিট চেকআউট করা এবং docker compose up -d চালানো। এটি অবশ্যই সম্পূর্ণ ফাইল হতে হবে, শুধুমাত্র ইমেজ ট্যাগ নয়। কারণ v3-এর লেবেলগুলো v2-এর ক্ষেত্রে ভুলভাবে কাজ করবে, ঠিক যেভাবে v2-এর লেবেলগুলো v3-তে ভুল ছিল: v2-তে ipallowlist বিদ্যমান নেই এবং একটি PathRegexp ম্যাচিং রুল সেখানে পার্স হবে না। যদি মাইগ্রেশনের সময় acme.json হারিয়ে যায় বা ক্ষতিগ্রস্ত হয়, তবে v2 শুরু করার আগে ব্যাকআপ কপিটি রিস্টোর করুন। এতে রোলব্যাক করার সময় একসাথে পাঁচটি সার্টিফিকেট ইস্যু করে আপনার Let's Encrypt রেট লিমিট খরচ হবে না।

FAQ

Traefik v3-এর জন্য কি আমাকে প্রতিটি রাউটার রুল নতুন করে লিখতে হবে?

না। ব্যাকটিক (backticks) ব্যবহার করে লেখা সাধারণ Host(app.example.com) রুল উভয় ভার্সনেই কাজ করে এবং বেশিরভাগ Compose সেটআপের জন্য এটিই যথেষ্ট। শুধুমাত্র তখনই নতুন করে লেখার প্রয়োজন হয় যদি কোনো রুলে v2-এর নির্দিষ্ট ফিচার ব্যবহার করা হয়ে থাকে: যেমন Path এবং PathPrefix-এর ভেতরে regex বা প্লেসহোল্ডার, একটি Host()-এর ভেতরে একাধিক হোস্টনেম, ব্যাকটিকের পরিবর্তে কোটেশন মার্ক, অথবা বাদ দেওয়া হয়েছে এমন Headers, HeadersRegexp এবং HostHeader ম্যাচারের ব্যবহার।

Traefik v3-এ ipWhiteList-এর কী হয়েছে?

এর নাম পরিবর্তন করে ipAllowList রাখা হয়েছে, তবে এর ভেতরের কনফিগারেশন একই রয়েছে। তাই v2-এর একটি লেবেল যেমন traefik.http.middlewares.office.ipwhitelist.sourcerange=10.0.0.0/24, নতুন ভার্সনে ipallowlist দিয়ে একই কাজ করবে। v3.5 সহ বর্তমান v3 রিলিজগুলোতে পুরনো নামটি এখনো deprecated alias হিসেবে কাজ করে, তাই নাম পরিবর্তন না করলেও লেবেলটি আগের মতোই কাজ করবে। তবে এটিকে স্থায়ী সমাধান হিসেবে না দেখে দ্রুত নাম পরিবর্তন করে ফেলাই ভালো। কারণ এই alias ভবিষ্যতে সরিয়ে ফেলা হবে এবং Traefik যদি কোনো middleware-এর নাম চিনতে না পারে, তবে সেটি সরাসরি রাউটার এরর এবং 404 রেসপন্স দেবে। ড্যাশবোর্ডে এই এরর দেখা যাবে এবং ওই হোস্টনেমে আসা রিকোয়েস্টগুলো 404 এরর দেখাবে।

Traefik v3 কি এখনো v2-এর রুল সিনট্যাক্স পড়তে পারে?

হ্যাঁ। মাইগ্রেশনের সময় v2 সিনট্যাক্স ডিফল্ট হিসেবে রাখতে স্ট্যাটিক কনফিগারেশনে core.defaultRuleSyntax: v2 সেট করুন। ডিফল্ট সেটিংস পরিবর্তন করার পর যেসব রাউটার বাকি থাকবে, সেগুলোর জন্য প্রতিটির ক্ষেত্রে ruleSyntax=v2 লেবেল ব্যবহার করুন। তবে উভয়কেই অস্থায়ী সমাধান হিসেবে গণ্য করুন: Traefik v3.4-এ এগুলোকে deprecated করা হয়েছে এবং পরবর্তী মেজর ভার্সনে এগুলো পুরোপুরি সরিয়ে ফেলা হবে।

আপগ্রেডের পর কি আমার Let's Encrypt সার্টিফিকেটগুলো অক্ষত থাকবে?

হ্যাঁ। Traefik v3 আগের মতোই v2-এর লেখা acme.json ফাইলটি পড়তে পারে, তাই শুধুমাত্র বাইনারি পরিবর্তনের কারণে সার্টিফিকেট নতুন করে ইস্যু করার প্রয়োজন হয় না। তবে কাজ শুরু করার আগে ফাইলটির একটি ব্যাকআপ নিরাপদ স্থানে রাখুন। কারণ রোলব্যাক বা ভুলবশত ভলিউম ডিলিট হয়ে গেলে acme.json হারিয়ে যেতে পারে, যার ফলে সব সার্টিফিকেট একসাথে নতুন করে ইস্যু করতে হবে। মনে রাখবেন, Let's Encrypt একই হোস্টনেমের জন্য প্রতি সপ্তাহে মাত্র পাঁচটি ডুপ্লিকেট সার্টিফিকেট ইস্যু করার অনুমতি দেয়।

আপগ্রেডের পর Traefik v3 কেন স্টার্ট হচ্ছে না?

প্রায় সব ক্ষেত্রেই এর কারণ হলো স্ট্যাটিক কনফিগারেশনে এমন কোনো অপশন রয়ে গেছে যা v3-এ সরিয়ে ফেলা হয়েছে। Traefik অপরিচিত কোনো অপশন পেলে স্টার্ট হতে অস্বীকার করে। পরিচিত অপশনগুলোর (pilot, providers.docker.swarmMode, experimental.http3) ক্ষেত্রে লগ ফাইলে incompatible deprecated static option found মেসেজটি দেখাবে এবং সমস্যার কারণটি উল্লেখ করবে। আর যদি এমন কোনো অপশন থাকে যা v3 কখনোই চিনত না, যেমন tls.caOptional, তবে সেটি field not found মেসেজসহ নোডটি দেখাবে। প্রতিটি অপশন ডিলিট বা প্রতিস্থাপন করুন এবং তারপর কন্টেইনারটি পুনরায় স্টার্ট করুন।