3 Commits

Author SHA1 Message Date
3ab38b4885 mod: алиас sitemap sitemap.xml 2026-05-20 19:25:10 +03:00
4b038302c3 add: Добавлен алиас /sitemap.xml -> /media/_serv_sitemap/sitemap.xml в nginx конфиг
- Поисковики ищут sitemap.xml в корне сайта
- Nginx теперь проксирует /sitemap.xml на /media/_serv_sitemap/sitemap.xml
- Установлен кеш на 1 день (чаще обновляется, чем картинки)
2026-05-20 18:38:02 +03:00
3c10b490b3 minor: Улучшены комментарии nginx конфига и исправлен sed паттерн для корректной замены путей
- Уточнены комментарии про архитектуру (медиа, ошибки, sitemap через Django)
- Исправлен sed паттерн: было '/home/user/app/oknardia-site' -> '/home/user/path-to-oknardia-app'
- Улучшен www редирект для правильной подстановки домена
- Убраны дублирующиеся комментарии про требуемую замену
2026-05-20 18:35:07 +03:00
2 changed files with 28 additions and 31 deletions

View File

@@ -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,22 +63,28 @@ 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; # Кешируем картинки на месяц
add_header Cache-Control "public, no-transform";
}
# --- SITEMAP.XML ---
# Sitemap хранится в media/_serv_sitemap/ но должен быть доступен из корня
# для поисковиков (они ищут http://example.com/sitemap.xml)
location = /sitemap.xml {
alias /home/user/path-to-oknardia-app/media/_serv_sitemap/sitemap.xml;
expires 7d; # Кешируем на неделю (редко меняется)
add_header Cache-Control "public";
}
# --- СТРАНИЦЫ ОШИБОК (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 +95,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 +109,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 +137,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;
}

View File

@@ -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';