Позволить локально размещенному докеризованному приложению django быть доступным из Интернета через локальный докеризованный экземпляр traefik?

Проблема:

Из браузера на моей машине windows я могу получить доступ к странице django по умолчанию через:

  • localhost:5000
  • 192.168.1.100:5000
  • Но не через мой домен example.com

С той же машины windows:

  • Я могу получить доступ к приборной панели traefik через monitor.example.com

Итак, я знаю, что маршрутизация из Интернета во внутренний контейнер docker работает.

Примечание: django app является минимально необходимым для того, чтобы django app отображало django default page


Моя домашняя лабораторная установка

  • Использование Cloudflare для указания example.com на мой внешний IP-адрес
  • Локальный пограничный маршрутизатор перенаправляет порты 80, 443 на главный сервер docker (x.x.x.165)
  • docker-main server hosting traefik docker instance
  • docker desktop на windows хостинг простого приложения django (x.x.x.100)

Примечание: используйте сертификаты cloudflare origin, а не letsencrypt

Файл traefik docker-compose.yml имеет следующий вид:

networks:
  mynet:
    external: true

services:
  traefik:
    image: docker.io/library/traefik:2.11.2
    container_name: traefik
    ports:
      - 80:80
      - 443:443
      # -- (Optional) Enable Dashboard, don't do in production
      - 8080:8080
    environment:
      - CF_DNS_API_TOKEN=[cloudflare token]
      - TZ=[local timezone]
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./config/traefik.yml:/etc/traefik/traefik.yml:ro    # For the static configuration 
      - ./config/config.yml:/etc/traefik/config.yml:ro      # For any dynamic configuration you add
      - ./certs:/certs:ro                               # location for the certs
      - ./logs:/var/log/traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=admin:[password]"
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"
      - "traefik.http.routers.traefik.entrypoints=web"
      - "traefik.http.routers.traefik.rule=Host(`monitor.example.com`)"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=websecure"
      - "traefik.http.routers.traefik-secure.rule=Host(`monitor.example.com`)"
      - "traefik.http.routers.traefik-secure.service=api@internal"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
    networks:
      - mynet

Traefik config.yml для приложения django выглядит так:

  • примечание: удалены другие конфигурации маршрутизации
tls:
  certificates:
    - certFile: /certs/[origin cert].crt
      keyFile: /certs/[origin cert].key
http:
  routers:
    django:
      rule: "Host(`example.com`) || Host(`www.example.com`)"
      entryPoints:
        - "web"
      service: django

  services:
    django:
      loadBalancer:
        servers:
          - url: "http://192.168.1.100:5000"

В файле traefik.yml:

global:
  checkNewVersion: false
  sendAnonymousUsage: false

log:
 level: INFO

api:
  dashboard: true
  insecure: true

entryPoints:
  web:
    address: :80
    # http:                # commenting this out to just try getting http working first
    #   redirections:
    #     entryPoint:
    #       to: websecure
    #       scheme: https     
  websecure:
    address: :443

serversTransport:
  insecureSkipVerify: true

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: mynet
  file:
    filename: /etc/traefik/config.yml
    watch: true

Файл django docker-compose имеет следующий вид:

  • Это урезанная версия от django-cookiecutter, включая Dockerfile, удаляя ненужные вещи в справочных целях
  • .
volumes:
  production_postgres_data: {}
  production_postgres_data_backups: {}
  production_django_media: {}

networks: 
  mynet:
    external: true

services:
  django:
    build:
      context: .
      dockerfile: ./compose/production/django/Dockerfile
    image: project_production_django
    container_name: project_production_django
    volumes:
      - production_django_media:/app/project/media
    depends_on:
      - postgres
    env_file:
      - ./.envs/.production/.django
      - ./.envs/.production/.postgres
    networks:
      - mynet
    ports:
      - 5000:5000
    command: /start

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    image: project_production_postgres
    container_name: project_production_postgres
    volumes:
      - production_postgres_data:/var/lib/postgresql/data
      - production_postgres_data_backups:/backups
    env_file:
      - ./.envs/.production/.postgres
    networks:
      - mynet

В настройках django у меня

ALLOWED_HOSTS = ["localhost", "127.0.0.1", "192.168.1.100", ".example.com",]

Требуется ли еще какая-либо информация?

Так чего же мне не хватает... :o (

)

Заранее спасибо

Я не смог понять, как использовать config.yml для указания на мой сервис django, т.е. какой URL использовать.

Однако мне удалось заставить его работать, добавив ярлыки к сервису django в файле docker compose, взятом из django-cookiecutter.

Напоминание: я не использую certresolver/LetsEncrypt, а использую сертификаты сервера происхождения от cloudflare.

Очевидно, замените example.com на ваше доменное имя.

volumes:
  production_postgres_data: {}
  production_postgres_data_backups: {}
  # production_traefik: {}
  production_django_media: {}

networks: 
  mynet:
    external: true

services:
  django:
    build:
      context: .
      dockerfile: ./compose/production/django/Dockerfile
    image: project_production_django
    volumes:
      - production_django_media:/app/project/media
    depends_on:
      - postgres
    env_file:
      - ./.envs/.production/.django
      - ./.envs/.production/.postgres
    labels:
      - "traefik.enable=true"           # This option overrides the provider value of exposedByDefault.
      - "traefik.http.routers.django.rule=Host(`example.com`)"
      - "traefik.http.services.django.loadbalancer.server.port=5000"
      - "traefik.http.routers.django.tls=true"
    networks:
      - mynet
    ports:
      - 5000:5000
    command: /start

  postgres:
    build:
      context: .
      dockerfile: ./compose/production/postgres/Dockerfile
    image: project_production_postgres
    # container_name: project_production_postgres
    volumes:
      - production_postgres_data:/var/lib/postgresql/data
      - production_postgres_data_backups:/backups
    env_file:
      - ./.envs/.production/.postgres
    networks:
      - mynet
Вернуться на верх