Позволить локально размещенному докеризованному приложению 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