WIUNIX ACADEMY
آموزش راهاندازی Traefik با Let’s Encrypt و HTTP/3 در اوبونتو و دبیان
صفحهٔ 5 از 6؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من11 مقدار قابلتغییر
مرز API خصوصی و دامنهٔ عمومی را کنترل کنید
با تونل باز، دو درخواست محلی اول روی کامپیوتر شما اجرا میشوند؛ داشبورد هم در http://127.0.0.1:8080/dashboard/ در دسترس است. وضعیت روتها را ببینید ولی پاسخ API و جزئیات عملیاتی را منتشر نکنید. درخواست HTTPS آخر مربوط به دامنهٔ عمومی است و نباید JSON مدیریتی Traefik برگرداند. در بکاند فایل آزمایشی، پاسخ آن 404 است. برای برنامهٔ واقعی، /api خود برنامه را از API مدیریتی Traefik تشخیص دهید؛ صرف کد 200 یا 404 کافی نیست.
curl --fail --silent --show-error --noproxy '*' 'http://127.0.0.1:8080/api/http/routers'
curl --silent --show-error --head --noproxy '*' 'http://127.0.0.1:8080/dashboard/'
curl --silent --show-error --noproxy '*' --output /dev/null --write-out 'Public API path status: %{http_code}\n' 'https://app.example.com/api/http/routers'
قدم بعدی
تمدید، انقضا و فایل وضعیت را مانیتور کنید
تمدید را خود Traefik انجام میدهد؛ Certbot یا نویسندهٔ دوم به فایل ACME اضافه نکنید. پیشفرض فعلی مدت ۹۰ روز و شروع تمدید از ۳۰ روز مانده به انقضاست، اما profile و طول عمر گواهیها در حال تغییرند؛ تاریخ واقعی notAfter، خطاهای صدور و راهنمای جاری resolver را کنترل کنید. پورت 80 و فایل وضعیت پایدار، قابل نوشتن و با مجوز 0600 باید حفظ شوند. از بیرون، اعتبار TLS، متن پاسخ و زمان باقیمانده را مانیتور کنید و زودتر از مهلت بازیابی سازمان هشدار عملی بدهید. برای این راهنما منتظر تمدید واقعی عمومی نماندهایم و چنین آزمونی ادعا نمیشود.
سرور لینوکسی اختصاصی
sudo stat -c '%a %U:%G %n' '/var/lib/traefik-academy' '/var/lib/traefik-academy/acme-production.json'
sudo journalctl -u traefik-academy.service --since '24 hours ago' --no-pager
bash -o pipefail <<'CERT'
openssl s_client -connect 'app.example.com:443' -servername 'app.example.com' -verify_hostname 'app.example.com' -verify_return_error </dev/null 2>/dev/null | openssl x509 -noout -issuer -dates -checkend 1209600
CERT
وضعیت محفوظ و بدون خطای تمدید است؛ اعتبار گواهی از آستانهٔ نمونهٔ ۱۴روزه بیشتر است.
خطای گواهی؛ DNS، دسترسی یا مجوز فایل
ابتدا خطای دقیق ACME را بخوانید. A یا AAAA اشتباه، CAA محدودکننده، بستهبودن TCP80 ورودی، سرویس رقیب، ساعت غلط و نداشتن حق نوشتن در فایل وضعیت علتهای متفاوتاند. همان علت را اصلاح کنید و فرصت تلاش عادی بعدی را بدهید؛ زمان retry اعلامشدهٔ CA را رعایت کنید. فایل وضعیت را پاک نکنید و production را پشتسرهم ریاستارت نکنید. بررسیهای زیر محلیاند؛ DNS و HTTP عمومی را از بیرون هم کنترل کنید.
dig A app.example.com
dig AAAA app.example.com
dig CAA app.example.com
timedatectl status
sudo ss -lntp 'sport = :80'
sudo -u traefik-academy test -w '/var/lib/traefik-academy/acme-production.json'
sudo journalctl -u traefik-academy.service --since '15 minutes ago' --no-pager
خطای 502، پاسخ 404 یا روت غیرفعال
502 معمولاً به بکاند قطعشده یا نشانی اشتباه مربوط است؛ پاسخ دقیق محلی را با URL و پورت file provider مقایسه کنید. هر دو سرویس از loopback همین میزبان استفاده میکنند. 404 ممکن است به ناهماهنگی Host یا بارگذارینشدن روت مربوط باشد. پیش از تغییر DNS، وضعیت روت خصوصی و لاگ را ببینید. اگر ویرایش پویا خراب شد، فایل روت سالمِ متعلق به root را برگردانید؛ بکاند را عمومی نکنید و TLS را برای پنهانکردن خطا خاموش نکنید.
sudo systemctl is-active academy-traefik-origin.service traefik-academy.service
curl --fail --silent --show-error --noproxy '*' 'http://127.0.0.1:8081/health.txt'
curl --fail --silent --show-error --noproxy '*' 'http://127.0.0.1:8080/api/http/routers'
sudo journalctl -u traefik-academy.service --since '10 minutes ago' --no-pager
HTTPS کار میکند ولی HTTP/3 نه
نداشتن قابلیت کلاینت را از بستهبودن UDP جدا کنید. HTTP3 در Features کلاینت، شنوندهٔ واقعی UDP443، روت TLS و مسیر فایروال را بررسی کنید. هدر h3 همراه با شکست --http3-only یعنی آزمون QUIC ناموفق است، حتی اگر مرورگر با fallback سایت را باز کند. entrypoint UDP جداگانه روی 443 نسازید؛ HTTP3 همین پورت را گرفته است. پرچمهای experimental مثالهای v2 را اضافه نکنید.
sudo ss -lnup 'sport = :443'
sudo journalctl -u traefik-academy.service --since '10 minutes ago' --no-pager
اگر بعداً Docker provider را انتخاب کردید
در این راهنما فقط file provider فعال است. کشف سرویس Docker به API مدیریتی پرقدرت نیاز دارد؛ اتصال docker.sock با :ro درخواستهای API را به عملیات خواندن محدود نمیکند و مرز امنیتی نیست. پیش از انتخاب این روش، دسترسی احرازهویتشده و دارای مجوز یا فیلتر را جدا بررسی کنید، exposedByDefault=false و فعالسازی صریح هر سرویس و شبکه و پورت را در نظر بگیرید و API داکر را عمومی نکنید. وجود socket proxy بهتنهایی ایمنبودن مجوزها را ثابت نمیکند. برای میانبر، سوکت خام به این پیکربندی اضافه نکنید.