diff --git a/config/nginx/lpon--external-nginx.conf b/config/nginx/lpon--external-nginx.conf index 1e48fa4..ac5a720 100644 --- a/config/nginx/lpon--external-nginx.conf +++ b/config/nginx/lpon--external-nginx.conf @@ -1,81 +1,58 @@ -# Разработка сайта LPON.RU -# == Конфикурационный файл nginx cadpoint.conf +# ============================================================================== +# Внешний Nginx (Reverse Proxy) для сайта lpon.ru +# +# "Подготовительный" конфиг для Certbot. +# Certbot найдет этот файл и автоматически модифицирует его для работы с SSL. +# ============================================================================== -# Описываем апстрим-потоки которые должен подключить Nginx -# Для каждого сайта надо настроить свйо поток, со своим уникальным именем. -# Если будете настраивать несколько python (django) сайтов - измените название upstream - -# конфигурируем сервер +# --- Основной сервер, который будет обрабатывать запросы --- server { - server_name lpon.ru; # доменное имя сайта - listen 443 ssl; # managed by Certbot - root /home/web/lpon-ru/public; - location = / { - try_files /index.html =404; - # try_files /index.html; - } - ssl_certificate /etc/letsencrypt/live/lpon.ru/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/lpon.ru/privkey.pem; # managed by Certbot - include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot - - charset utf-8; # кодировка по умолчанию - access_log /home/web/lpon-ru/logs/lpon-access.log; # логи с доступом - error_log /home/web/lpon-ru/logs/lpon-error.log; # логи с ошибками - client_max_body_size 100M; # максимальный объем файла для загрузки на сайт (max upload size) - error_page 404 /404.html; - error_page 500 /500.html; - - location /media { alias /home/web/lpon-ru/public/media; } # Расположение media-файлов Django - location /static { alias /home/web/lpon-ru/public/static; } # Расположение static-файлов Django - - location /robots.txt { root /home/web/lpon-ru/public; } # Расположение robots.txt - location /favicon.ico { root /home/web/lpon-ru/public; } # Расположение favicon.ico - location /favicon.gif { root /home/web/lpon-ru/public; } # Расположение favicon - location /favicon.png { root /home/web/lpon-ru/public; } # Расположение favicon - # location /favicon.svg { root /home/web/lpon-ru/public; } # Расположение favicon - # location /author.txt { root /home/web/lpon-ru/public; } # Расположение author.txt - location = /404.html { - root /home/web/lpon-ru/index.html; - internal; - } - # location = /500.html { - # root /home/web/cadpoint/cadpoint/templates/500.html; - # internal; - # } - location ~ \.(html|htm|ico|svg|png|gif|jpg|jpeg)$ { - root /home/web/lpon-ru/public; # Расположение статичных *.xml, *.html и *.txt - } -} - -# переадресация с www на "без" www -server { - server_name www.lpon.ru; - return 301 http://lpon.ru$request_uri; - - listen 443 ssl; # managed by Certbot - ssl_certificate /etc/letsencrypt/live/lpon.ru/fullchain.pem; # managed by Certbot - ssl_certificate_key /etc/letsencrypt/live/lpon.ru/privkey.pem; # managed by Certbot - include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot -} - -# переадресация с http на https -server { - if ($host = lpon.ru) { - return 301 https://$host$request_uri; - } # managed by Certbot - server_name lpon.ru; + # На этом этапе слушаем только порт 80. Certbot добавит порт 443. listen 80; - return 404; # managed by Certbot + listen [::]:80; + + # Все домены, которые будет обслуживать этот сервер. + # Certbot выпустит сертификаты для всех перечисленных доменов. + server_name lpon.ru t.lpon.ru; + + # --- ЛОГИ --- + access_log /var/log/nginx/lpon.access.log; + error_log /var/log/nginx/lpon.error.log; + + # --- ПРОКСИРОВАНИЕ НА DOCKER-КОНТЕЙНЕР --- + # Вся логика сайта находится в Docker, поэтому мы просто перенаправляем все запросы. + location / { + # Адрес и порт, на котором слушает ваш Docker-контейнер + proxy_pass http://127.0.0.1:8020; + + # --- ВАЖНЫЕ ЗАГОЛОВКИ ДЛЯ ПРОКСИРОВАНИЯ --- + # Передаем реальный IP-адрес клиента + proxy_set_header X-Real-IP $remote_addr; + # Передаем информацию о всех прокси-серверах на пути + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # Передаем протокол (http или https) + proxy_set_header X-Forwarded-Proto $scheme; + # Передаем имя хоста, которое запросил клиент + proxy_set_header Host $host; + + # Увеличиваем таймауты для стабильности + proxy_connect_timeout 60s; + proxy_send_timeout 60s; + proxy_read_timeout 60s; + } + + # Устанавливаем максимальный размер тела запроса (для загрузки файлов и т.д.) + client_max_body_size 100M; } -# переадресация с http на https для www +# --- СЕРВЕР ДЛЯ РЕДИРЕКТА С WWW НА БЕЗ WWW (HTTP) --- +# Этот блок будет ловить запросы к www.lpon.ru по HTTP и перенаправлять их на lpon.ru по HTTP. +# Certbot потом добавит редирект на HTTPS. server { - if ($host = www.lpon.ru) { - return 301 https://$host$request_uri; - } # managed by Certbot - server_name www.lpon.ru; listen 80; - return 404; # managed by Certbot + listen [::]:80; + server_name www.lpon.ru; + + # Редирект на lpon.ru, сохраняя путь запроса + return 301 http://lpon.ru$request_uri; } diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 687e1ca..845f9ab 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -26,6 +26,24 @@ services: # Переменные окружения env_file: - .env + # КОМАНДА ЗАПУСКА (Замена entrypoint.sh) + # Выполняем цепочку команд внутри контейнера при запуске: + # с. Создаем папку nginx в примонтированном томе конфигов (если нет) + # d. Копирование конфига Nginx с авто-заменой путей через sed (замену реального пути на хосте получаем + # через переменную окружения HOST_PROJECT_PATH) + # e. Инициализация боевого конфига (если нет) + command: > + sh -c "mkdir -p /nginx_configs_host/nginx && + sed \"s|/home/user/app/lpon-site|${HOST_PROJECT_PATH:-/home/default_user/projects/lpon-site}|g\" /nginx_configs_host/nginx/lpon-app--external-nginx.conf > /nginx_configs_host/nginx/nginx_lpon.conf.example && + if [ ! -f /nginx_configs_host/nginx/lpon-app--external-nginx.conf ]; then + cp /nginx_configs_host/nginx/nginx_lpon.conf.example /nginx_configs_host/nginx/lpon-app--external-nginx.conf; + echo 'INIT: Created new nginx config with correct paths'; + fi" + # Тома (Volumes) + volumes: + # Конфиги (Монтируем папку ./config с хоста в /nginx_configs_host внутри контейнера) + # Это нужно, чтобы скрипт запуска мог положить туда .example конфиг и "боевой" конфиг (если его еще нет). + - ./config:/nginx_configs_host ports: # Пробрасываем порт 8020 на хосте на стандартный порт 80 внутри контейнера # Внешний Nginx будет проксировать запросы на хост:8020