SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor

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

Traefik v3-এ swarmMode এবং pilot স্ট্যাটিক কনফিগারেশনে কাজ করবে না। ইনকম্প্যাটিবল ডেপ্রিকেটেড কনফিগারেশন এরর সমাধান করুন এবং ধাপে ধাপে আপনার রাউটার রুলগুলো সঠিকভাবে আপডেট করুন।

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.7 অন্তর্ভুক্ত, এখনও পুরনো নামটিকে একটি deprecated alias হিসেবে গ্রহণ করে এবং তালিকাটি কার্যকর রাখে, তবে এর জন্য একটি deprecation warning লগ করে। তাই এই নাম পরিবর্তনটি কোনো কিছু অচল করে দেয় না। তবুও এটি পরিবর্তন করুন: পুরনো নামটি deprecated এবং v2.11 ইতিমধ্যেই ipAllowList বুঝতে পারে, তাই আপগ্রেডের আগেই এই পরিবর্তনটি কার্যকর করা সম্ভব।
  • 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 ঠিকানা, trusted header এবং তাদের পেছনের outpost—সবই v3-তে একইভাবে কাজ করে।
  • InfluxDB v1 metrics provider, Rancher provider এবং Marathon provider সরিয়ে ফেলা হয়েছে।
  • Tracing-কে OpenTelemetry-তে স্থানান্তর করা হয়েছে। ডেডিকেটেড tracing backend-গুলো, যার মধ্যে Jaeger এবং Zipkin ইন্টিগ্রেশন অন্তর্ভুক্ত, সরিয়ে ফেলা হয়েছে এবং v3 এখন এর পরিবর্তে OTLP (OpenTelemetry protocol) এক্সপোর্ট করে।
  • headers middleware-এর ভেতরের deprecated ssl* অপশনগুলো (sslRedirect, sslHost এবং বাকিগুলো) সরিয়ে ফেলা হয়েছে। Entrypoint redirection এবং redirectScheme middleware সেগুলোর জায়গা নিয়েছে।

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

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

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

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

  • কোটেশন বা উদ্ধৃতি চিহ্নের ব্যবহারে কোনো পরিবর্তন নেই। উভয় সংস্করণেই রুলের মান ব্যাকটিক (backticks) অথবা এস্কেপ করা ডাবল কোটেশনের মধ্যে লিখতে হয় এবং সিঙ্গেল কোটেশন গ্রহণ করা হয় না। তাই Host(app.example.com) এবং এস্কেপ করা ডাবল কোটেশনের Host("app.example.com") আগের মতোই কার্যকর।
  • PathPrefix এখন আর রেগুলার এক্সপ্রেশন বা {id}-স্টাইলের প্লেসহোল্ডার বোঝে না। v2-এর একটি রুল যেমন PathPrefix(/api/{version:v[0-9]+})-কে এখন একটি PathRegexp ম্যাচারে রূপান্তর করতে হবে, যা Go রেগুলার এক্সপ্রেশন সিনট্যাক্সে লেখা।
  • ম্যাচারে এখন একটিমাত্র মান ব্যবহার করা যায়। 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-তে একই কাজ করে।
  • দুটি নতুন ম্যাচারের সংযোজন হয়েছে: PathRegexp এবং QueryRegexp। রুলের ভেতরে ক্লায়েন্ট অ্যাড্রেস ম্যাচ করার জন্য ClientIP আগে থেকেই v2.11-এ ছিল এবং এটি অপরিবর্তিত রয়েছে।

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

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

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

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

প্রতিটি হিট মানেই একটি লাইন যা এডিট করতে হবে। ipwhitelist হয়ে যাবে ipallowlist। HostHeader হয়ে যাবে Host। Headers হয়ে যাবে Header। PathPrefix এর ভেতরের একটি {...} প্লেসহোল্ডার একটি 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: v2.11-এ থাকা অবস্থায় মিডলওয়্যারের নাম পরিবর্তন করুন। আপনার compose ফাইলগুলোতে পুরনো নামগুলো খুঁজুন: grep -rn ipwhitelist docker-compose*.yml। প্রতিটি ipwhitelist লেবেল পরিবর্তন করে ipallowlist করুন এবং docker compose up -d ব্যবহার করে সেই সার্ভিসগুলো পুনরায় তৈরি করুন। v2.11 ভার্সনে ইতিমধ্যেই IPAllowList মিডলওয়্যারটি রয়েছে, তাই ফ্লিপ করার আগেই নতুন লেবেলগুলো কাজ করবে এবং IPWhiteList-এর অবলুপ্তির সতর্কবার্তা আপনার v2 লগ থেকে সরে যাবে। v2.11-এর চেয়ে পুরনো রিলিজগুলো নতুন নাম চেনে না, তাই যদি আপনি ধাপ 1-এ পুরনো কোনো v2 ভার্সন পিন করে থাকেন, তবে প্রথমে traefik:v2.11-এ আপডেট করুন। (যদি কোনোটি বাদ পড়ে যায়, বর্তমান v3 এখনো পুরনো নামটিকে একটি অবলুপ্ত alias হিসেবে গণ্য করে, তাই ফিল্টারিং কার্যকর থাকবে; তবে এটি রাত 2টায় ঠিক করার চেয়ে পরের ধাপে ঠিক করে নেওয়াই ভালো।)

ধাপ 4: ইমেজ ট্যাগ পরিবর্তন করুন। Traefik ইমেজটিকে বর্তমান v3 রিলিজে সেট করুন, 11 অক্টোবর 2026 অনুযায়ী এটি traefik:v3.7 (v3.7.14 হলো সর্বশেষ প্যাচ), তারপর:

docker compose up -d
docker compose logs -f traefik

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

এই ধাপটি যে সময়টুকু নেবে, সে বিষয়ে সতর্ক থাকুন। যে রাউটারটি এমন কোনো মিডলওয়্যারের নাম রেফার করে যা v3 চেনে না (যেমন কোনো টাইপো বা বাদ দেওয়া অপশন), সেটি নতুন Traefik চালু হওয়ার মুহূর্ত থেকে কাজ করা বন্ধ করে দেবে যতক্ষণ না আপনি এর লেবেল ঠিক করে অ্যাপ কন্টেইনারটি পুনরায় তৈরি করছেন। যদি কোনো রুট সাময়িক বন্ধ হওয়াও গ্রহণযোগ্য না হয়, তবে ফ্লিপ করার আগে সেই রাউটারের middlewares লেবেল থেকে সন্দেহজনক মিডলওয়্যারটি সরিয়ে ফেলুন এবং পরে পুনরায় যোগ করুন। এই এক মিনিটের জন্য রুটটি মিডলওয়্যার ছাড়া চলতে পারবে কি না, তা আগেই সিদ্ধান্ত নিন।

ধাপ 5: সার্ভিস অনুযায়ী রুল মাইগ্রেট করুন। একটি একটি করে অ্যাপ নিয়ে কাজ করুন: সেটির রুল v3 সিনট্যাক্সে পুনরায় লিখুন, docker compose up -d app ব্যবহার করে শুধুমাত্র সেই সার্ভিসটি পুনরায় তৈরি করুন এবং পরবর্তী ধাপে যাওয়ার আগে সেটি পরীক্ষা করুন। যদি কোনো সার্ভিসের রুল আপনি এখনো rewrite করতে না পারেন, তবে সেই নির্দিষ্ট রাউটারটিতে 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 ব্যর্থতার তথ্য সেখানে জমা হয়।

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

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

FAQ

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

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

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

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

Traefik v3 কি এখনও v2-এর rule syntax পড়তে পারে?

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

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

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

আপগ্রেডের পর Traefik v3 কেন চালু হতে ব্যর্থ হয়?

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