diff --git a/config/nginx/oknardia-app--external-nginx.conf b/config/nginx/oknardia-app--external-nginx.conf index d0dda07..26ede80 100644 --- a/config/nginx/oknardia-app--external-nginx.conf +++ b/config/nginx/oknardia-app--external-nginx.conf @@ -1,27 +1,20 @@ # config/nginx/oknardia-app--external-nginx.conf # ============================================================================== -# ЭТАЛОННЫЙ КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker) +# КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker + Production) # ============================================================================== # -# ВНИМАНИЕ: -# Этот файл является шаблоном. При первом деплое он копируется -# в `/home/user/path-to-oknardia-app/config/nginx/oknardia-app--external-nginx.conf`, -# а затем (уже на хосте, руками) через силинк в `/etc/nginx/sites-available/` и активируется. -# При последующих деплоях `oknardia-app--external-nginx.conf` НЕ ПЕРЕЗАПИСЫВАЕТСЯ, -# чтобы не затереть SSL-сертификаты и ручные правки. +# ИНФОРМАЦИЯ: +# 1. Этот файл используется как шаблон при деплое +# 2. При первом деплое пути `/home/user/path-to-oknardia-app` заменяются на реальный путь через sed +# 3. Сгенерированный конфиг скопируется в `/etc/nginx/sites-available/oknardia` +# 4. Последующие деплои ОБНОВЛЯЮТ этот файл автоматически (sed + копирование) # -# Если вы изменили этот файл в репозитории и хотите применить изменения на проде: -# вам нужно обновить файл в `/home/user/path-to-oknardia-app/config/nginx/oknardia-app--external-nginx.conf` вручную (diff + copy). -# -# Так же (рядом) будет создан образец этого файла `nginx_oknardia.conf.example`, который будет обновляться при деплоях -# из репозитория, чтобы вы могли видеть, что изменилось и при необходимости перенести эти изменения на прод. -# -# Предполагаемая структура на сервере: -# /home/user/path-to-oknardia-app/ -# ├── docker-compose.yml -# ├── .env -# ├── media/ <-- Сюда Nginx смотрит напрямую (Docker volume) -# └── ... +# АРХИТЕКТУРА: +# - Nginx (порты 80/443) <-> Gunicorn контейнер (localhost:8000) +# - Медиа файлы отдаются из `/home/user/path-to-oknardia-app/media/` напрямую +# - Ошибки 5xx берутся из `media/_error` (копируются контейнером при старте) +# - Sitemap.xml отдается через Django/WhiteNoise (в media/_serv_sitemap/) +# - Static файлы (/static/) тоже отдаются через Django/WhiteNoise # 1. Описываем, где живет наш Django в Docker upstream oknardia-django { @@ -70,9 +63,8 @@ server { # --- МЕДИА ФАЙЛЫ (Загруженный контент) --- # Nginx отдает их напрямую с диска хоста, не дергая Docker. + # Сюда входит: загруженные картинки, документы, свитмапы, ошибки 5xx # Путь должен совпадать с тем, где лежит volume на хост-машине. - # ВАЖНО: Убедитесь, что пользователь nginx (www-data) имеет права на чтение этой папки! - # ТРЕБУЕТСЯ ЗАМЕНА ПРИ ДЕПЛОЕ: /home/user/path-to-oknardia-app -> ваш реальный путь location /media/ { alias /home/user/path-to-oknardia-app/media/; expires 30d; # Кешируем картинки на месяц @@ -81,11 +73,9 @@ server { # --- СТРАНИЦЫ ОШИБОК (Custom Error Pages) --- # Если Django упал (502) или сработал тайм-аут (504), Nginx должен отдать статический HTML. - # Эти файлы должны лежать в папке, доступной Nginx (например, в `media/_error`). + # Эти файлы копируются в `media/_error` при старте контейнера Docker. # - # ВАЖНО: - # 1. Файлы 50x.html (500, 502, 503, 504) копируются в `media/_error` при старте контейнера (см. docker-compose.prod.yml -> command). - # 2. error_page директива перехватывает ошибки от апстрима (Gunicorn). + # ВАЖНО: error_page директива перехватывает ошибки от апстрима (Gunicorn). error_page 500 /500.html; error_page 502 /502.html; error_page 503 /503.html; @@ -96,8 +86,6 @@ server { location = /503.html { root /home/user/path-to-oknardia-app/media/_error; internal; } location = /504.html { root /home/user/path-to-oknardia-app/media/_error; internal; } - # 404 (и другие) тоже нужно кастомизировать... обычно Django сам отдает 404. - # Но, например, Nginx отдаст 404 при ошике доступа к media-файлам (они храняться на хосте, а не в контейнере) error_page 400 /400.html; error_page 401 /401.html; error_page 403 /403.html; @@ -112,7 +100,6 @@ server { location = /413.html { root /home/user/path-to-oknardia-app/media/_error; internal; } location = /429.html { root /home/user/path-to-oknardia-app/media/_error; internal; } - # Указываем единую страницу (на реконструкции) для всех прочих ошибок error_page 405 406 407 408 409 410 411 412 414 415 416 417 418 421 422 423 424 425 426 428 431 451 /under_reconstruction.html; location = /under_reconstruction.html { root /home/user/path-to-oknardia-app/media/_error; internal; } @@ -141,10 +128,11 @@ server { } } -# 3. Редирект с www на без-www (SEO best practice) +# 3. Редирект с www на основной домен (SEO best practice) server { server_name www.tmp.oknardia.ru; listen 80; - return 301 $scheme://oknardia.ru$request_uri; # Всегда редиректим на основной домен + listen [::]:80; + return 301 $scheme://tmp.oknardia.ru$request_uri; } diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 46ea758..9cbfc64 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -40,7 +40,7 @@ services: python manage.py regenerate_seria_prerender && python manage.py make_rating && mkdir -p /nginx_configs_host/nginx && - sed \"s|/home/user/app/oknardia-site|$${HOST_PROJECT_PATH}|g\" /home/app/config/nginx/oknardia-app--external-nginx.conf > /nginx_configs_host/nginx/oknardia-app--external-nginx.conf.example && + sed \"s|/home/user/path-to-oknardia-app|$${HOST_PROJECT_PATH}|g\" /home/app/config/nginx/oknardia-app--external-nginx.conf > /nginx_configs_host/nginx/oknardia-app--external-nginx.conf.example && if [ ! -f /nginx_configs_host/nginx/oknardia-app--external-nginx.conf ]; then cp /nginx_configs_host/nginx/oknardia-app--external-nginx.conf.example /nginx_configs_host/nginx/oknardia-app--external-nginx.conf; echo 'INIT: Created new nginx config with correct paths';