← شروع آموزش

WIUNIX ACADEMY

آموزش راه‌اندازی Traefik با Let’s Encrypt و HTTP/3 در اوبونتو و دبیان

صفحهٔ 3 از 6؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Ubuntu 26.04 LTSبررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من11 مقدار قابل‌تغییر
09

قدم بعدی

فایل روت‌های پویا را باز کنید

file provider یک پوشه را دنبال می‌کند؛ این سناریوی سرویس میزبان، bind mount کانتینری ندارد. تغییر روت پویا معمولاً خودکار بارگذاری می‌شود، ولی تغییر entrypoint و ACME به راه‌اندازی مجدد کنترل‌شده نیاز دارد. فایل JSON تولیدشدهٔ ACME را دستی ویرایش نکنید.

Bash

سرور لینوکسی اختصاصی

sudoedit '/etc/traefik-academy/dynamic/routes.yml'
از کجا بدانم درست انجام شد؟

ویرایشگر فایل روت پویا باز است.

روت برنامه و مدیریت خصوصی

محتوای فایل: فقط Host دقیق دامنه از مسیر TLS به بک‌اند می‌رسد. قانون API و داشبورد به entrypoint مدیریت روی loopback محدود است. کلاینت با فرستادن URL دلخواه، بک‌اند انتخاب نمی‌کند و به هدرهای forwarded هم اعتماد عمومی نداده‌ایم. برای بک‌اند روی میزبان دیگر، HTTPS با احراز هویت و اعتبارسنجی گواهی و روت بررسی‌شده لازم است؛ insecureSkipVerify را روشن نکنید.

yaml · /etc/traefik-academy/dynamic/routes.yml
http:
  routers:
    app:
      rule: "Host(`app.example.com`)"
      entryPoints: [websecure]
      service: marker
      tls:
        certResolver: le
        options: modern
    admin:
      rule: "PathPrefix(`/api`) || PathPrefix(`/dashboard`)"
      entryPoints: [admin]
      service: api@internal
  services:
    marker:
      loadBalancer:
        servers:
          - url: "http://127.0.0.1:8081"
tls:
  options:
    modern:
      minVersion: VersionTLS12
10

قدم بعدی

فایل سرویس محدودشدهٔ پروکسی را باز کنید

فقط قابلیت لازم برای اتصال به پورت‌های زیر 1024 داده می‌شود. پردازه با کاربر اختصاصیِ بدون ورود اجرا می‌شود، تنظیمات root را می‌خواند و فقط در پوشهٔ ACME می‌نویسد. به آن حساب root، عضویت گروه‌های پرقدرت یا Docker socket ندهید.

Bash

سرور لینوکسی اختصاصی

test ! -e /etc/systemd/system/traefik-academy.service &&
sudoedit /etc/systemd/system/traefik-academy.service
از کجا بدانم درست انجام شد؟

ویرایشگر سرویس تازهٔ پروکسی باز است.

محتوای سرویس پروکسی

محتوای فایل: systemd فایل‌سیستم را محدود می‌کند و فقط CAP_NET_BIND_SERVICE را نگه می‌دارد. ReadWritePaths جای مالکیت معمول فایل را نمی‌گیرد؛ پوشهٔ وضعیت همچنان باید متعلق به کاربر سرویس باشد. جداسازی کامل شبکه فعال نیست، چون DNS، ACME، شنونده‌های عمومی و بک‌اند همان میزبان لازم‌اند.

ini · /etc/systemd/system/traefik-academy.service
[Unit]
Description=Academy Traefik HTTPS and HTTP3 edge
Wants=network-online.target
After=network-online.target academy-traefik-origin.service

[Service]
Type=simple
User=traefik-academy
Group=traefik-academy
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik-academy/traefik.yml
Restart=on-failure
RestartSec=5s
UMask=0077
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/traefik-academy

[Install]
WantedBy=multi-user.target
11

قدم بعدی

سرویس را با staging بالا بیاورید

مجوز خواندن تنظیمات را اعمال و نحو unitهای systemd را پیش از اجرا بررسی کنید. این ابزار YAML خود Traefik را بررسی نمی‌کند؛ بارگذاری آن را از لاگ شروع و وضعیت روت در API خصوصی کنترل کنید. اجرای این مرحله با CA آزمایشی تماس می‌گیرد و ممکن است حساب و سفارش بسازد؛ پیش از اجرای عمومی خود، توافق‌نامهٔ جاری صادرکننده را بررسی کنید. برای تکرار صدور، سرویس را در حلقه ری‌استارت نکنید. پورت 80 برای چالش‌های آینده باز می‌ماند.

Bash

سرور لینوکسی اختصاصی

sudo chown root:traefik-academy '/etc/traefik-academy/traefik.yml' '/etc/traefik-academy/dynamic/routes.yml'
sudo chmod 0640 '/etc/traefik-academy/traefik.yml' '/etc/traefik-academy/dynamic/routes.yml'
sudo systemd-analyze verify /etc/systemd/system/academy-traefik-origin.service /etc/systemd/system/traefik-academy.service
sudo systemctl daemon-reload
sudo systemctl enable --now academy-traefik-origin.service
curl --fail --silent --show-error --noproxy '*' 'http://127.0.0.1:8081/health.txt'
sudo systemctl enable --now traefik-academy.service
sudo systemctl status traefik-academy.service --no-pager
sudo journalctl -u traefik-academy.service --since '10 minutes ago' --no-pager
sudo ss -lntup
از کجا بدانم درست انجام شد؟

متن دقیق آزمایشی، پروکسی فعال و بدون خطای YAML یا provider یا ACME؛ مدیریت و بک‌اند فقط loopback و پورت‌های عمومی مطابق طرح هستند.

12

قدم بعدی

گواهی آزمایشی را بدون اعتماد دائمی بررسی کنید

از کلاینت مستقل، نام‌ها، صادرکننده و تاریخ گواهی را ببینید. ریشه‌های staging عمداً مورد اعتماد عمومی نیستند. فقط برای همین فایل فاقد اطلاعات حساس، درخواست دوم موقتاً بررسی اعتماد را کنار می‌گذارد تا روت مشخص شود؛ رمز وارد نکنید، ریشهٔ آزمایشی نصب نکنید، هشدار مرورگر را دور نزنید و این پرچم را برای production به کار نبرید. گواهی باید دامنهٔ app.example.com و صادرکنندهٔ آزمایشی را نشان دهد؛ TRAEFIK DEFAULT CERT یعنی هنوز صدور موفق نشده است. این بررسیِ زنجیرهٔ نامعتبر، تأیید TLS مورد اعتماد نیست.

Bash

کلاینت مستقل خارج از سرور

openssl s_client -connect 'app.example.com:443' -servername 'app.example.com' </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
curl --insecure --fail --silent --show-error --noproxy '*' 'https://app.example.com/health.txt'
curl --silent --show-error --head --noproxy '*' 'http://app.example.com/health.txt'
از کجا بدانم درست انجام شد؟

SAN و صادرکنندهٔ staging درست‌اند، پاسخ academy-traefik-origin-ok است و HTTP به همان دامنه با HTTPS می‌رود.

همهٔ آموزش‌های آکادمی ↗