Использование обратного прокси 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

Итак, как мне добиться нужной маршрутизации?

Спасибо за помощь!

Вернуться на верх