# لایه تولید — TLS با Let's Encrypt و انتشار روی پورت‌های استاندارد ۸۰/۴۴۳. # پیش‌نیاز: متغیرهای DOMAIN و ACME_EMAIL در .env؛ به‌علاوه رکورد DNS دامنه به این سرور. # # docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build # # همه درخواست‌های HTTP به HTTPS هدایت می‌شوند و مسیریابی‌ها فقط روی دامنه DOMAIN پاسخ می‌دهند. services: traefik: command: !override - --providers.docker=true - --providers.docker.exposedbydefault=false - --entrypoints.web.address=:80 - --entrypoints.web.http.redirections.entrypoint.to=websecure - --entrypoints.web.http.redirections.entrypoint.scheme=https - --entrypoints.websecure.address=:443 - --certificatesresolvers.le.acme.email=${ACME_EMAIL:?ACME_EMAIL را در .env تنظیم کنید} - --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json - --certificatesresolvers.le.acme.httpchallenge=true - --certificatesresolvers.le.acme.httpchallenge.entrypoint=web ports: !override - "80:80" - "443:443" volumes: !override - /var/run/docker.sock:/var/run/docker.sock:ro - letsencrypt_data:/letsencrypt backend: environment: # سایت هم‌مبدأ است — CORS لازم نیست CORS_ORIGINS: '[]' SITE_URL: https://${DOMAIN:?DOMAIN را در .env تنظیم کنید} labels: - traefik.enable=true - traefik.http.routers.api.rule=Host(`${DOMAIN}`) && PathPrefix(`/api`) - traefik.http.routers.api.entrypoints=websecure - traefik.http.routers.api.tls.certresolver=le - traefik.http.routers.seo.rule=Host(`${DOMAIN}`) && (PathPrefix(`/blog/`) || Path(`/blog`) || PathPrefix(`/projects/`) || Path(`/projects`) || Path(`/en`) || PathPrefix(`/en/`) || PathPrefix(`/robots.txt`) || PathPrefix(`/sitemap.xml`)) - traefik.http.routers.seo.entrypoints=websecure - traefik.http.routers.seo.tls.certresolver=le minio: labels: - traefik.enable=true - traefik.http.routers.media.rule=Host(`${DOMAIN}`) && PathPrefix(`/media`) - traefik.http.routers.media.entrypoints=websecure - traefik.http.routers.media.tls.certresolver=le frontend: labels: - traefik.enable=true - traefik.http.routers.web.rule=Host(`${DOMAIN}`) && PathPrefix(`/`) - traefik.http.routers.web.entrypoints=websecure - traefik.http.routers.web.tls.certresolver=le volumes: letsencrypt_data: