Add script to generate a self-signed TLS certificate for Nginx and update configurations to enable HTTPS with default and custom domains.

This commit is contained in:
emelinda 2026-07-22 17:04:52 +03:00
parent ea23b885c4
commit 0ad515e6c4
5 changed files with 61 additions and 8 deletions

View File

@ -16,8 +16,8 @@ SAREX_MINIO_ROOT_USER=minioadmin
SAREX_MINIO_ROOT_PASSWORD=minioadmin SAREX_MINIO_ROOT_PASSWORD=minioadmin
SAREX_MINIO_BUCKET=sarex-media-storage SAREX_MINIO_BUCKET=sarex-media-storage
SAREX_MINIO_REGION=us-east-1 SAREX_MINIO_REGION=us-east-1
# Внешний URL консоли MinIO (minio-домен, путь /console на верхнем nginx) # Внешний URL консоли MinIO (minio-домен, путь /console на верхнем nginx, https)
SAREX_MINIO_CONSOLE_URL=http://minio.sarex.local:9080/console SAREX_MINIO_CONSOLE_URL=https://minio.sarex.local/console
# --- Домены верхнего nginx (замени на реальные, заведи в DNS/hosts) --- # --- Домены верхнего nginx (замени на реальные, заведи в DNS/hosts) ---
PLATFORM_DOMAIN=sarex.local # основной домен платформы (frontend + /api) PLATFORM_DOMAIN=sarex.local # основной домен платформы (frontend + /api)

6
.gitignore vendored
View File

@ -6,4 +6,8 @@ CLAUDE.md
tmp tmp
snapshots/* snapshots/*
k3s/* k3s/*
k3s-master/* k3s-master/*
# самоподписанные TLS-сертификаты
nginx/certs/*.crt
nginx/certs/*.key

View File

@ -150,7 +150,7 @@ services:
MINIO_ROOT_USER: ${SAREX_MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_USER: ${SAREX_MINIO_ROOT_USER:-minioadmin}
MINIO_ROOT_PASSWORD: ${SAREX_MINIO_ROOT_PASSWORD:-minioadmin} MINIO_ROOT_PASSWORD: ${SAREX_MINIO_ROOT_PASSWORD:-minioadmin}
# Консоль отдаётся через верхний nginx на minio-домене по пути /console # Консоль отдаётся через верхний 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: volumes:
- sarex-minio-data:/data - sarex-minio-data:/data
@ -252,8 +252,8 @@ services:
container_name: sarex-nginx container_name: sarex-nginx
restart: unless-stopped restart: unless-stopped
ports: ports:
- "80:80" # 80/443 заняты k3s - "80:80" # http
- "443:443" # 80/443 заняты k3s - "443:443" # https (самоподписанный сертификат)
environment: environment:
# подставляются envsubst'ом в шаблон при старте контейнера # подставляются envsubst'ом в шаблон при старте контейнера
PLATFORM_DOMAIN: ${PLATFORM_DOMAIN:-sarex.local} PLATFORM_DOMAIN: ${PLATFORM_DOMAIN:-sarex.local}
@ -261,6 +261,7 @@ services:
MINIO_DOMAIN: ${MINIO_DOMAIN:-minio.sarex.local} MINIO_DOMAIN: ${MINIO_DOMAIN:-minio.sarex.local}
volumes: volumes:
- ./nginx/templates:/etc/nginx/templates:ro,z # :z — SELinux label для RedOS - ./nginx/templates:/etc/nginx/templates:ro,z # :z — SELinux label для RedOS
- ./nginx/certs:/etc/nginx/certs:ro,z # TLS-сертификаты
depends_on: depends_on:
# - backend # TODO: закомментированы в шаблоне nginx, пока в работе # - backend # TODO: закомментированы в шаблоне nginx, пока в работе
# - frontend # - frontend

36
nginx/gen-cert.sh Normal file
View File

@ -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}"

View File

@ -4,9 +4,17 @@
large_client_header_buffers 8 128k; large_client_header_buffers 8 128k;
client_max_body_size 5000M; # крупные загрузки (снимки, облака точек) client_max_body_size 5000M; # крупные загрузки (снимки, облака точек)
keepalive_timeout 300;
tcp_nopush on; 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 on;
gzip_vary on; gzip_vary on;
gzip_proxied any; gzip_proxied any;
@ -33,7 +41,8 @@ proxy_set_header X-Forwarded-Proto $scheme;
# ============================ Платформа (основной домен) ==================== # ============================ Платформа (основной домен) ====================
server { server {
listen 80 default_server; listen 80 default_server;
listen 443 ssl default_server;
server_name ${PLATFORM_DOMAIN}; server_name ${PLATFORM_DOMAIN};
location = /healthz { location = /healthz {
@ -78,6 +87,7 @@ server {
# ======================= Admin: RabbitMQ management UI ====================== # ======================= Admin: RabbitMQ management UI ======================
server { server {
listen 80; listen 80;
listen 443 ssl;
server_name ${ADMIN_DOMAIN}; server_name ${ADMIN_DOMAIN};
location / { location / {
@ -95,10 +105,12 @@ server {
# ============================== MinIO (отдельный домен) ===================== # ============================== MinIO (отдельный домен) =====================
server { server {
listen 80; listen 80;
listen 443 ssl;
server_name ${MINIO_DOMAIN}; server_name ${MINIO_DOMAIN};
# Веб-консоль администрирования (порт 9001). Требует у сервиса minio # Веб-консоль администрирования (порт 9001). Требует у сервиса minio
# MINIO_BROWSER_REDIRECT_URL = http://<MINIO_DOMAIN>:9080/console # MINIO_BROWSER_REDIRECT_URL = http://<MINIO_DOMAIN>:9080/console
location = /console { return 301 /console/; } # без слэша → на /console/
location /console/ { location /console/ {
proxy_set_header Host $host; proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Real-IP $remote_addr;