Я разрабатываю веб-сайт для своей ассоциации Вот . Он использует Django 3.0.7 и PostgreSQL. Я следую этому учебнику , чтобы он работал в хорошем состоянии как в разработке, так и в производстве.
В режиме разработки все хорошо, сайт работает отлично, файлы stati c и медиа файлы обслуживается встроенным веб-сервером Django.
Я тестирую "ванильную" (взятую из учебника) продукцию на моем локальном компьютере, она тоже работает. Но руководство для меня не является полным, поэтому после его завершения я решил адаптировать код в соответствии со своими потребностями. Следуя руководству, я создал новый docker -compose и новый файл dockerfile для производства. Но между учебником и сайтом, который я хочу запустить в производство, есть 2 различия:
- Я хочу использовать TREAFIK для маршрутизации трафика c по другому URL-адресу (appli.amis-simserhof.fr ), потому что в будущем у меня будут другие проекты на том же сервере с другими поддоменами ..
- Я хочу защитить сайт с помощью HTTPS. Поэтому я использую CERTBOT (давайте зашифровать) для создания сертификатов. Я добавляю эти сертификаты в TREAFFIK, чтобы использовать HTTPS, и он работает.
Итак, я адаптировал файл docker -compose с моими новыми материалами:
version: '3.7'
services:
**traefik:
image: traefik:v1.7.12
command: [
"--loglevel=INFO",
"--api",
"--docker",
"--docker.domain=amis-simserhof.fr",
"--entrypoints=name:https address::443 tls:/etc/certs/fullchain.pem,/etc/certs/privkey.pem",
"--entrypoints=name:http address::80 redirect.entrypoint:https",
]
ports:
- 80:80 # http
- 443:443 # https
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /etc/letsencrypt/live/amis-simserhof.fr/fullchain.pem:/etc/certs/fullchain.pem
- /etc/letsencrypt/live/amis-simserhof.fr/privkey.pem:/etc/certs/privkey.pem**
web:
image: registry.gitlab.com/guillaumekoenigtncy/aas-web:latest
command: gunicorn aas.wsgi:application --bind 0.0.0.0:8000
expose:
- 8000
volumes:
- static_volume:/home/app/web/staticfiles
- media_volume:/home/app/web/mediafiles
environment:
- DEBUG=0
- SECRET_KEY=change_me
- DJANGO_ALLOWED_HOSTS=localhost appli.amis-simserhof.fr
- SQL_ENGINE=django.db.backends.postgresql
- SQL_DATABASE=postgres
- SQL_USER=postgres
- SQL_PASSWORD=postgres
- SQL_HOST=db
- SQL_PORT=5432
- DATABASE=postgres
labels:
- traefik.frontend.rule=HostRegexp:appli.amis-simserhof.fr
- traefik.frontend.entryPoints=https
depends_on:
- db
db:
image: postgres:12.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
**nginx:
image: registry.gitlab.com/guillaumekoenigtncy/aas-nginx:latest
volumes:
- static_volume:/home/app/web/staticfiles
- media_volume:/home/app/web/mediafiles
expose:
- 80
- 443
depends_on:
- web**
volumes:
postgres_data:
static_volume:
media_volume:
Я также создал файл докеров и файл конфигурации для nginx:
FROM nginx:1.19.0
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
upstream website {
server web:8000;
}
server {
listen 80;
listen [::]:80;
access_log off;
server_name appli.amis-simserhof.fr;
location / {
proxy_pass http://website;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /staticfiles/ {
alias /home/app/web/staticfiles/;
}
location /mediafiles/ {
alias /home/app/web/mediafiles/;
}
}
Проблема в том, что теперь файлы stati c не обслуживаются в производстве (я получил 404) . Когда я устанавливаю DEBUG в значение True в settings.py файлов проекта обслуживаются так, что это означает, что файлы stati c присутствуют в правильной папке, которую я установил в настройках.
STATIC_URL = "/staticfiles/"
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
MEDIA_URL = "/mediafiles/"
MEDIA_ROOT = os.path.join(BASE_DIR, "mediafiles")
In production, я правильно выполнил команду python manage.py collectstatic
. Я заглядываю внутрь обоих контейнеров, ngnix и web, и оба файла находятся в правильном каталоге.
Итак, я прихожу к выводу, что моя конфигурация не работает, но когда я внес в нее изменения, я увидел эти изменения в nginx логов контейнеров. Ошибок нет ...
Последние 2 дня пробую все: установить ssl в конфиге nginx и удалить его из траэфик (сайт недоступен), выставить или нет порты 80 и 443 в nginx или traefik (конфликты на открытых портах или слишком много ошибок перенаправления) добавьте или удалите / в конце или в начале блоков или псевдоним в конфигурации nginx (ничего не меняйте), et c.
Если у вас есть подсказки или подсказки, я был бы очень признателен ...
Хорошего дня :)