شب ۰۱: نگهداری 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فعال شده است؛ بیرون از آزمایشگاه موقت آن را حذف کنید.
خودآزمایی¶
- چرا
docker.sock:roهمچنان دسترسی پرقدرتی است؟ نوشتن در فایلسیستم را محدود میکند، نه فراخوانیهای پرقدرت Docker API را. - کدام تغییرها به راهاندازی مجدد Traefik نیاز دارند؟ تنظیمات ایستا یا نصب؛ مسیریابی پویای ارائهدهندهٔ فایل معمولاً بازخوانی میشود.
- پیش از ارتقا چه سه چیزی باید آماده باشد؟ نسخه و تنظیمات سالم شناختهشده، پشتیبان و مراحل آزمودهشدهٔ بازگشت و اعتبارسنجی.
- اثبات کنید: آیا میتوانید digest ایمیج در حال اجرا، نتیجهٔ سلامت و آخرین پشتیبان موفق را مشخص کنید؟