У меня есть приложение Django, которое используется для учета рабочего времени в моем учреждении. Он работает как контейнер Docker с веб-сервером Apache перед ним (он выполняет базовую аутентификацию HTTP с использованием LDAP, а затем перенаправляет на http://django:80/). Теперь мне нужно, чтобы Traefik был впереди всего, потому что мне нужно интегрировать Authelia вместо базовой аутентификации HTTP. Я хочу сначала протестировать все локально, поэтому это localhost.
Это мой docker-compose.yml
:
version: '3'
services:
web:
depends_on:
- django
- traefik
expose:
- "${VIRTUAL_PORT}"
networks:
- default
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.chronocommand.rule=Host(`localhost`)"
- "traefik.docker.network=proxy"
- "traefik.http.routers.chronocommand.entrypoints=web,websecure"
django:
expose:
- "80"
ports:
- "8080:80"
- "8000:8000"
- "3000:3000"
volumes:
- ./Services/Chronocommand:/src
traefik:
image: "traefik:v3.0"
ports:
- "80:80"
- "443:443"
- "8888:8080" # Traefik dashboard
networks:
- proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./Services/DevTraefik/:/etc/traefik
networks:
proxy:
external: true
это моя конфигурация траефика:
api:
dashboard: true
insecure: true
global:
checkNewVersion: true
sendAnonymousUsage: false
entryPoints:
web:
address: :80
websecure:
address: :443
http:
tls: true
providers:
docker:
exposedByDefault: false
file:
directory: /etc/traefik
watch: true
Когда я пытаюсь получить доступ к https://localhost, я ожидаю увидеть веб-приложение django, которое работает, если я получаю к нему доступ через http://localhost:8080. Вместо этого я получаю сообщение об ошибке «слишком много перенаправлений» в своем браузере и вижу в журнале Apache, что он пытается получить доступ к серверу несколько раз. Что я сделал не так?
Я догадываюсь о многих деталях вашего проекта. Но предположим, что это выглядит примерно так:
├── docker-compose.yml
└── Services
├── Apache
│ └── apache.conf
└── Chronocommand
├── chrono
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── db.sqlite3
├── Dockerfile
├── manage.py
└── requirements.txt
Содержимое приложения Django будет отличаться, но я просто создал стартовый проект Django.
🗎 docker-compose.yml
(Я настраиваю Traefik напрямую здесь, а не использую отдельный файл конфигурации.)
version: '3.8'
services:
apache:
container_name: apache
image: httpd:2.4
ports:
- "8080:8080"
volumes:
- ./Services/Apache/apache.conf:/usr/local/apache2/conf/httpd.conf
depends_on:
- django
labels:
- "traefik.http.routers.web.rule=Host(`localhost`)"
- "traefik.http.services.web.loadbalancer.server.port=8080"
django:
container_name: django
build:
context: Services/Chronocommand
ports:
- "8000:8000"
volumes:
- ./Services/Chronocommand:/src
command: python manage.py runserver 0.0.0.0:8000
traefik:
container_name: traefik
image: traefik:v3.0
ports:
- "80:80"
- "443:443"
- "8888:8080"
depends_on:
- apache
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
🗎 apache.conf
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ServerName localhost
ErrorLog /proc/self/fd/2
CustomLog /proc/self/fd/1 common
LogLevel debug
User www-data
Group www-data
Listen 8080
<VirtualHost *:8080>
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://django:8000/
ProxyPassReverse / http://django:8000/
</VirtualHost>
Вы можете протестировать следующее:
С вашим файлом
docker-compose.yml
возникли некоторые проблемы: ни уweb
, ни у службыdjango
нет изображения или контекста сборки.