diff --git a/.env.example b/.env.example index b940f48..b0f307a 100644 --- a/.env.example +++ b/.env.example @@ -16,8 +16,8 @@ SAREX_MINIO_ROOT_USER=minioadmin SAREX_MINIO_ROOT_PASSWORD=minioadmin SAREX_MINIO_BUCKET=sarex-media-storage SAREX_MINIO_REGION=us-east-1 -# Внешний URL консоли MinIO (minio-домен, путь /console на верхнем nginx) -SAREX_MINIO_CONSOLE_URL=http://minio.sarex.local:9080/console +# Внешний URL консоли MinIO (minio-домен, путь /console на верхнем nginx, https) +SAREX_MINIO_CONSOLE_URL=https://minio.sarex.local/console # --- Домены верхнего nginx (замени на реальные, заведи в DNS/hosts) --- PLATFORM_DOMAIN=sarex.local # основной домен платформы (frontend + /api) diff --git a/.gitignore b/.gitignore index 9ccfd27..39128b2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,8 @@ CLAUDE.md tmp snapshots/* k3s/* -k3s-master/* \ No newline at end of file +k3s-master/* + +# самоподписанные TLS-сертификаты +nginx/certs/*.crt +nginx/certs/*.key \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml index 59abba2..368b0aa 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -150,7 +150,7 @@ services: MINIO_ROOT_USER: ${SAREX_MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${SAREX_MINIO_ROOT_PASSWORD:-minioadmin} # Консоль отдаётся через верхний nginx на minio-домене по пути /console - MINIO_BROWSER_REDIRECT_URL: ${SAREX_MINIO_CONSOLE_URL:-http://minio.sarex.local:9080/console} + MINIO_BROWSER_REDIRECT_URL: ${SAREX_MINIO_CONSOLE_URL:-https://minio.sarex.local/console} volumes: - sarex-minio-data:/data @@ -252,8 +252,8 @@ services: container_name: sarex-nginx restart: unless-stopped ports: - - "80:80" # 80/443 заняты k3s - - "443:443" # 80/443 заняты k3s + - "80:80" # http + - "443:443" # https (самоподписанный сертификат) environment: # подставляются envsubst'ом в шаблон при старте контейнера PLATFORM_DOMAIN: ${PLATFORM_DOMAIN:-sarex.local} @@ -261,6 +261,7 @@ services: MINIO_DOMAIN: ${MINIO_DOMAIN:-minio.sarex.local} volumes: - ./nginx/templates:/etc/nginx/templates:ro,z # :z — SELinux label для RedOS + - ./nginx/certs:/etc/nginx/certs:ro,z # TLS-сертификаты depends_on: # - backend # TODO: закомментированы в шаблоне nginx, пока в работе # - frontend diff --git a/nginx/gen-cert.sh b/nginx/gen-cert.sh new file mode 100644 index 0000000..0fbffb6 --- /dev/null +++ b/nginx/gen-cert.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +# Генерация самоподписанного TLS-сертификата для верхнего nginx. +# +# Использование: +# ./nginx/gen-cert.sh # домены по умолчанию +# ./nginx/gen-cert.sh sarex.local api.sarex.local # свои домены (первый → CN) +# DAYS=730 ./nginx/gen-cert.sh # свой срок действия +# +# Результат: nginx/certs/selfsigned.{crt,key} (в .gitignore). +# MSYS_NO_PATHCONV=1 нужен для Git Bash на Windows; на Linux он безвреден. +set -euo pipefail + +CERT_DIR="$(cd "$(dirname "$0")" && pwd)/certs" +DAYS="${DAYS:-365}" + +if [ "$#" -gt 0 ]; then + DOMAINS=("$@") +else + DOMAINS=(sarex.local admin.sarex.local minio.sarex.local) +fi + +# subjectAltName из списка доменов, CN — первый домен +SAN="" +for d in "${DOMAINS[@]}"; do SAN="${SAN}${SAN:+,}DNS:${d}"; done +CN="${DOMAINS[0]}" + +mkdir -p "$CERT_DIR" +cd "$CERT_DIR" # пишем относительными именами: не ломается конверсия путей в Git Bash +MSYS_NO_PATHCONV=1 openssl req -x509 -nodes -newkey rsa:2048 -days "$DAYS" \ + -keyout selfsigned.key \ + -out selfsigned.crt \ + -subj "/CN=${CN}" \ + -addext "subjectAltName=${SAN}" + +echo "OK: сертификат на ${DAYS} дней → $CERT_DIR/selfsigned.{crt,key}" +echo "SAN: ${SAN}" diff --git a/nginx/templates/default.conf.template b/nginx/templates/default.conf.template index f4c1dca..ec4979f 100644 --- a/nginx/templates/default.conf.template +++ b/nginx/templates/default.conf.template @@ -4,9 +4,17 @@ large_client_header_buffers 8 128k; client_max_body_size 5000M; # крупные загрузки (снимки, облака точек) -keepalive_timeout 300; tcp_nopush on; +# TLS (самоподписанный сертификат на все домены). Задаём на http-уровне — +# наследуется всеми server-блоками. Файлы монтируются из ./nginx/certs. +ssl_certificate /etc/nginx/certs/selfsigned.crt; +ssl_certificate_key /etc/nginx/certs/selfsigned.key; +ssl_protocols TLSv1.2 TLSv1.3; +ssl_ciphers HIGH:!aNULL:!MD5; +ssl_session_cache shared:SSL:10m; +http2 on; + gzip on; gzip_vary on; gzip_proxied any; @@ -33,7 +41,8 @@ proxy_set_header X-Forwarded-Proto $scheme; # ============================ Платформа (основной домен) ==================== server { - listen 80 default_server; + listen 80 default_server; + listen 443 ssl default_server; server_name ${PLATFORM_DOMAIN}; location = /healthz { @@ -78,6 +87,7 @@ server { # ======================= Admin: RabbitMQ management UI ====================== server { listen 80; + listen 443 ssl; server_name ${ADMIN_DOMAIN}; location / { @@ -95,10 +105,12 @@ server { # ============================== MinIO (отдельный домен) ===================== server { listen 80; + listen 443 ssl; server_name ${MINIO_DOMAIN}; # Веб-консоль администрирования (порт 9001). Требует у сервиса minio # MINIO_BROWSER_REDIRECT_URL = http://:9080/console + location = /console { return 301 /console/; } # без слэша → на /console/ location /console/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;