minor: Улучшены комментарии nginx конфига и исправлен sed паттерн для корректной замены путей

- Уточнены комментарии про архитектуру (медиа, ошибки, sitemap через Django)
- Исправлен sed паттерн: было '/home/user/app/oknardia-site' -> '/home/user/path-to-oknardia-app'
- Улучшен www редирект для правильной подстановки домена
- Убраны дублирующиеся комментарии про требуемую замену
This commit is contained in:
2026-05-20 18:35:07 +03:00
parent 2d7e0813d6
commit 3c10b490b3
2 changed files with 19 additions and 31 deletions

View File

@@ -1,27 +1,20 @@
# config/nginx/oknardia-app--external-nginx.conf # config/nginx/oknardia-app--external-nginx.conf
# ============================================================================== # ==============================================================================
# ЭТАЛОННЫЙ КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker) # КОНФИГУРАЦИОННЫЙ ФАЙЛ NGINX (Reverse Proxy для Docker + Production)
# ============================================================================== # ==============================================================================
# #
# ВНИМАНИЕ: # ИНФОРМАЦИЯ:
# Этот файл является шаблоном. При первом деплое он копируется # 1. Этот файл используется как шаблон при деплое
# в `/home/user/path-to-oknardia-app/config/nginx/oknardia-app--external-nginx.conf`, # 2. При первом деплое пути `/home/user/path-to-oknardia-app` заменяются на реальный путь через sed
# а затем (уже на хосте, руками) через силинк в `/etc/nginx/sites-available/` и активируется. # 3. Сгенерированный конфиг скопируется в `/etc/nginx/sites-available/oknardia`
# При последующих деплоях `oknardia-app--external-nginx.conf` НЕ ПЕРЕЗАПИСЫВАЕТСЯ, # 4. Последующие деплои ОБНОВЛЯЮТ этот файл автоматически (sed + копирование)
# чтобы не затереть SSL-сертификаты и ручные правки.
# #
# Если вы изменили этот файл в репозитории и хотите применить изменения на проде: # АРХИТЕКТУРА:
# вам нужно обновить файл в `/home/user/path-to-oknardia-app/config/nginx/oknardia-app--external-nginx.conf` вручную (diff + copy). # - Nginx (порты 80/443) <-> Gunicorn контейнер (localhost:8000)
# # - Медиа файлы отдаются из `/home/user/path-to-oknardia-app/media/` напрямую
# Так же (рядом) будет создан образец этого файла `nginx_oknardia.conf.example`, который будет обновляться при деплоях # - Ошибки 5xx берутся из `media/_error` (копируются контейнером при старте)
# из репозитория, чтобы вы могли видеть, что изменилось и при необходимости перенести эти изменения на прод. # - Sitemap.xml отдается через Django/WhiteNoise (в media/_serv_sitemap/)
# # - Static файлы (/static/) тоже отдаются через Django/WhiteNoise
# Предполагаемая структура на сервере:
# /home/user/path-to-oknardia-app/
# ├── docker-compose.yml
# ├── .env
# ├── media/ <-- Сюда Nginx смотрит напрямую (Docker volume)
# └── ...
# 1. Описываем, где живет наш Django в Docker # 1. Описываем, где живет наш Django в Docker
upstream oknardia-django { upstream oknardia-django {
@@ -70,9 +63,8 @@ server {
# --- МЕДИА ФАЙЛЫ (Загруженный контент) --- # --- МЕДИА ФАЙЛЫ (Загруженный контент) ---
# Nginx отдает их напрямую с диска хоста, не дергая Docker. # Nginx отдает их напрямую с диска хоста, не дергая Docker.
# Сюда входит: загруженные картинки, документы, свитмапы, ошибки 5xx
# Путь должен совпадать с тем, где лежит volume на хост-машине. # Путь должен совпадать с тем, где лежит volume на хост-машине.
# ВАЖНО: Убедитесь, что пользователь nginx (www-data) имеет права на чтение этой папки!
# ТРЕБУЕТСЯ ЗАМЕНА ПРИ ДЕПЛОЕ: /home/user/path-to-oknardia-app -> ваш реальный путь
location /media/ { location /media/ {
alias /home/user/path-to-oknardia-app/media/; alias /home/user/path-to-oknardia-app/media/;
expires 30d; # Кешируем картинки на месяц expires 30d; # Кешируем картинки на месяц
@@ -81,11 +73,9 @@ server {
# --- СТРАНИЦЫ ОШИБОК (Custom Error Pages) --- # --- СТРАНИЦЫ ОШИБОК (Custom Error Pages) ---
# Если Django упал (502) или сработал тайм-аут (504), Nginx должен отдать статический HTML. # Если Django упал (502) или сработал тайм-аут (504), Nginx должен отдать статический HTML.
# Эти файлы должны лежать в папке, доступной Nginx (например, в `media/_error`). # Эти файлы копируются в `media/_error` при старте контейнера Docker.
# #
# ВАЖНО: # ВАЖНО: error_page директива перехватывает ошибки от апстрима (Gunicorn).
# 1. Файлы 50x.html (500, 502, 503, 504) копируются в `media/_error` при старте контейнера (см. docker-compose.prod.yml -> command).
# 2. error_page директива перехватывает ошибки от апстрима (Gunicorn).
error_page 500 /500.html; error_page 500 /500.html;
error_page 502 /502.html; error_page 502 /502.html;
error_page 503 /503.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 = /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; } 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 400 /400.html;
error_page 401 /401.html; error_page 401 /401.html;
error_page 403 /403.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 = /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; } 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; 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; } 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 {
server_name www.tmp.oknardia.ru; server_name www.tmp.oknardia.ru;
listen 80; listen 80;
return 301 $scheme://oknardia.ru$request_uri; # Всегда редиректим на основной домен listen [::]:80;
return 301 $scheme://tmp.oknardia.ru$request_uri;
} }

View File

@@ -40,7 +40,7 @@ services:
python manage.py regenerate_seria_prerender && python manage.py regenerate_seria_prerender &&
python manage.py make_rating && python manage.py make_rating &&
mkdir -p /nginx_configs_host/nginx && 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 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; 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'; echo 'INIT: Created new nginx config with correct paths';