Использование обратного прокси Traefik для размещения WordPress и Django
Я новичок в задачах, связанных с развертыванием, поэтому то, о чем я спрашиваю, может быть очень просто реализовать, но тем не менее это сложно для меня.
На одном домене мне нужен публичный сайт на базе WordPress (около 3-4 страниц), а также ссылка для входа во внутреннее приложение Django v3.2 для управления. И то, и другое плюс некоторые дополнительные возможности (redis, postgres) будут обслуживаться через docker-compose.
Я использую cookiecutter-django для моего Django приложения. Он использует Traefik по умолчанию в качестве reverse-proxy для производственной конфигурации. Я просмотрел документацию по Traefik и не смог понять, как я могу реализовать пути для моего случая использования. В настоящее время у меня есть WP сайт и Django приложение, работающие отдельно, поэтому мне просто нужно выяснить, как развернуть их вместе в одном домене, только с разными путями.
В качестве примера того, чего мне нужно достичь, предположим, что мой сайт WordPress имеет страницы home
, about
и contact
, поэтому я хочу, чтобы полный URL был example.com
, example.com/about
и example.com/contact
соответственно.
Любые другие ссылки следует пересылать на Django.
Для тех, кто не использовал cookiecutter-django, структура файлов и конфигурация по умолчанию состоит в том, чтобы иметь отдельный traefik.yml и Dockerfile для Traefik, и отдельные Dockerfiles для Django и Postgres плюс любые другие дополнения.
Я еще не поместил WP в docker-compose, но могу сделать это достаточно легко. Мне просто нужно понять, как я попрошу Traefik перенести запросы в соответствующий контейнер.
Вот production.yml, сгенерированный cookiecutter-django:
version: '3'
volumes:
production_postgres_data: {}
production_postgres_data_backups: {}
production_traefik: {}
services:
# Let's assume I'll have a wordpress container here, and its dependencies (db, etc)
django:
build:
context: .
dockerfile: ./compose/production/django/Dockerfile
image: {{project_slug}}_production_django
depends_on:
- postgres
- redis
env_file:
- /var/.envs/.django
- /var/.envs/.postgres
command: /start
postgres:
build:
context: .
dockerfile: ./compose/production/postgres/Dockerfile
image: {{project_slug}}_production_postgres
volumes:
- production_postgres_data:/var/lib/postgresql/data:Z
- production_postgres_data_backups:/backups:z
env_file:
- /var/.envs/.postgres
traefik:
build:
context: .
dockerfile: ./compose/production/traefik/Dockerfile
image: {{project_slug}}_production_traefik
depends_on:
- django
volumes:
- production_traefik:/etc/traefik/acme:z
ports:
- "0.0.0.0:80:80"
- "0.0.0.0:443:443"
redis:
image: redis:6
А traefik.yml
следующим образом:
log:
level: INFO
entryPoints:
web:
# http
address: ":80"
http:
# https://docs.traefik.io/routing/entrypoints/#entrypoint
redirections:
entryPoint:
to: web-secure
web-secure:
# https
address: ":443"
certificatesResolvers:
letsencrypt:
# https://docs.traefik.io/master/https/acme/#lets-encrypt
acme:
email: "support@example.com"
storage: /etc/traefik/acme/acme.json
# https://docs.traefik.io/master/https/acme/#httpchallenge
httpChallenge:
entryPoint: web
http:
routers:
web-secure-router:
rule: "Host(`example.com`) || Host(`www.example.com`)"
entryPoints:
- web-secure
middlewares:
- csrf
service: django
tls:
# https://docs.traefik.io/master/routing/routers/#certresolver
certResolver: letsencrypt
middlewares:
csrf:
# https://docs.traefik.io/master/middlewares/headers/#hostsproxyheaders
# https://docs.djangoproject.com/en/dev/ref/csrf/#ajax
headers:
hostsProxyHeaders: ["X-CSRFToken"]
services:
django:
loadBalancer:
servers:
- url: http://django:5000
providers:
# https://docs.traefik.io/master/providers/file/
file:
filename: /etc/traefik/traefik.yml
watch: true
А Dockerfile для Traefik таков:
FROM traefik:v2.5.3
RUN mkdir -p /etc/traefik/acme \
&& touch /etc/traefik/acme/acme.json \
&& chmod 600 /etc/traefik/acme/acme.json
COPY ./compose/production/traefik/traefik.yml /etc/traefik
Итак, как мне добиться нужной маршрутизации?
Спасибо за помощь!