پرش به محتویات

شب ۰۱: نگه‌داری Traefik با Docker Compose

بخش ۰۱ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثال‌ها مطابق منبع با Traefik Proxy v3.7 نوشته شده‌اند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزموده‌شده یا digest مشخصی را ثابت کنید. تمرین‌ها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.

فهرست کامل دورهٔ ترافیک در ۳۰ شب

هدف‌های یادگیری

  • ادارهٔ Traefik به‌عنوان سرویسی حیاتی روی یک میزبان، نه صرفاً یک کانتینر جانبی.
  • جداسازی تنظیمات زمان نصب، تنظیمات زندهٔ مسیریابی، وضعیت و اطلاعات محرمانه.
  • تعیین روش پشتیبان‌گیری، ارتقا، بازگشت و بازرسی دوره‌ای پیش از استقرار.

مدل بهره‌برداری

Compose ساده است، اما میزبان یک دامنهٔ خرابی است. فایل Compose و تنظیمات را در سامانهٔ کنترل نسخه نگه دارید؛ اطلاعات محرمانه را وارد Git نکنید و از وضعیت گواهی‌ها خارج از میزبان نسخهٔ پشتیبان بگیرید. استفاده از پراکسی Docker API با فیلتر دسترسی و احراز هویت ترجیح دارد. اگر /var/run/docker.sock را متصل می‌کنید، آن را فقط‌خواندنی mount کنید و به یاد داشته باشید که حالت فقط‌خواندنی فایل‌سیستم، API را بی‌خطر نمی‌کند.

حداقل‌های محیط عملیاتی:

  • نسخهٔ اصلاحی آزموده‌شده یا digest را ثابت کنید؛ دریافت خودکار latest را در محیط عملیاتی فعال نکنید.
  • مقدار exposedByDefault: false را تنظیم و مسیرها را صریحاً فعال کنید.
  • فقط پورت‌های ۸۰ و ۴۴۳ را منتشر کنید. داشبورد محافظت‌شده را در شبکهٔ داخلی مسیریابی کنید.
  • Traefik و برنامه‌های پشت آن را در شبکه‌ای اختصاصی قرار دهید.
  • بررسی سلامت، بودجهٔ منابع، سیاست راه‌اندازی مجدد و چرخش لاگ Docker را اضافه کنید.
  • فایل acme.json را با مجوز 0600 نگه دارید و پشتیبان‌های خارج از میزبان را رمزگذاری کنید.
  • دو نسخهٔ سالم شناخته‌شده و دستور مکتوب بازگشت را نگه دارید.

تمرین عملی: ساخت اسکلت آمادهٔ بهره‌برداری

# compose.yaml
services:
  traefik:
    image: ${TRAEFIK_IMAGE:-traefik:v3.7}
    restart: unless-stopped
    security_opt: [no-new-privileges:true]
    read_only: true
    tmpfs: [/tmp]
    command:
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --api.dashboard=true
      - --ping=true
      - --log.level=INFO
      - --accesslog=true
    ports: ["80:80", "443:443"]
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./state/acme.json:/acme.json
    networks: [proxy]
    healthcheck:
      test: [CMD, traefik, healthcheck, --ping]
      interval: 10s
      timeout: 3s
      retries: 3
    logging:
      options: {max-size: 10m, max-file: "5"}
    deploy:
      resources:
        limits: {cpus: "1.0", memory: 512M}
networks:
  proxy:
    name: proxy

فایل وضعیت گواهی را فقط در پوشهٔ آزمایشگاه بسازید:

mkdir -p state
touch state/acme.json
chmod 600 state/acme.json
export TRAEFIK_IMAGE=traefik:v3.7
docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker inspect --format '{{json .State.Health}}' "$(docker compose ps -q traefik)"

نسخهٔ پشتیبان و روال ارتقای قابل‌بازگشت را ثبت کنید:

docker compose config > rendered-compose.yaml
cp -p state/acme.json state/acme.json.backup
docker image inspect "$TRAEFIK_IMAGE" --format '{{index .RepoDigests 0}}'
docker compose logs --since=10m traefik

# Upgrade after review and backup:
TRAEFIK_IMAGE=traefik:v3.7 docker compose pull traefik
TRAEFIK_IMAGE=traefik:v3.7 docker compose up -d --no-deps traefik

روزانه سلامت، خطاهای اخیر، انقضای گواهی، فضای دیسک و یک درخواست آزمایشی HTTPS را بررسی کنید. هفتگی هشدارهای امنیتی ایمیج، رشد لاگ، موفقیت پشتیبان‌گیری و مسیرهای بلااستفاده را مرور کنید. پیش از ارتقا، یادداشت‌های مهاجرت را بخوانید، تنظیمات نهایی را تولید کنید، از وضعیت پشتیبان بگیرید، ایمیج را از پیش دریافت کنید، آستانه‌های توقف را تعیین کنید و digest ایمیج قبلی را نگه دارید.

نکته‌های عیب‌یابی

  • خطای permission denied برای acme.json: مالک، مجوز و راهبرد UID کانتینر را بررسی کنید؛ با 0777 مشکل را «حل» نکنید.
  • کانتینر سالم است اما ترافیک عبور نمی‌کند: فایروال میزبان، انتشار پورت و عضویت برنامه در شبکهٔ proxy را بررسی کنید.
  • مسیرها ناخواسته ظاهر می‌شوند: مقدار exposedByDefault برابر true است یا منبع دیگری برای تنظیمات ایستا اولویت گرفته است.
  • داشبورد روی :8080 در دسترس است: api.insecure=true فعال شده است؛ بیرون از آزمایشگاه موقت آن را حذف کنید.

خودآزمایی

  1. چرا docker.sock:ro همچنان دسترسی پرقدرتی است؟ نوشتن در فایل‌سیستم را محدود می‌کند، نه فراخوانی‌های پرقدرت Docker API را.
  2. کدام تغییرها به راه‌اندازی مجدد Traefik نیاز دارند؟ تنظیمات ایستا یا نصب؛ مسیریابی پویای ارائه‌دهندهٔ فایل معمولاً بازخوانی می‌شود.
  3. پیش از ارتقا چه سه چیزی باید آماده باشد؟ نسخه و تنظیمات سالم شناخته‌شده، پشتیبان و مراحل آزموده‌شدهٔ بازگشت و اعتبارسنجی.
  4. اثبات کنید: آیا می‌توانید digest ایمیج در حال اجرا، نتیجهٔ سلامت و آخرین پشتیبان موفق را مشخص کنید؟