Add Nginx reverse proxy, infrastructure services (Postgres, Redis, RabbitMQ, MinIO), and application setup to docker-compose.yaml with updated .env.example and Nginx configuration
This commit is contained in:
parent
eb2748170a
commit
93e9d9fed0
17
.env.example
17
.env.example
@ -3,3 +3,20 @@ K3S_TOKEN=gVadzB0OtWGDAM9rmlZvHiwfITsP8bxo
|
|||||||
# Внешний адрес (IP или домен), по которому к kube-apiserver обращаются извне.
|
# Внешний адрес (IP или домен), по которому к kube-apiserver обращаются извне.
|
||||||
# Попадёт в TLS-сертификат (--tls-san). Без него внешний kubectl упадёт на x509.
|
# Попадёт в TLS-сертификат (--tls-san). Без него внешний kubectl упадёт на x509.
|
||||||
K3S_API_HOST=10.0.0.10
|
K3S_API_HOST=10.0.0.10
|
||||||
|
|
||||||
|
# --- Инфраструктура для apps/django (sarex-backend) ---
|
||||||
|
# Должны совпадать со значениями, которые Django получает в k3s (Vault/Secret).
|
||||||
|
SAREX_POSTGRES_DB=sarex_db
|
||||||
|
SAREX_POSTGRES_USER=sarex
|
||||||
|
SAREX_POSTGRES_PASSWORD=sarex
|
||||||
|
SAREX_RABBITMQ_VHOST=api
|
||||||
|
SAREX_RABBITMQ_USER=rabbit
|
||||||
|
SAREX_RABBITMQ_PASSWORD=rabbit
|
||||||
|
SAREX_MINIO_ROOT_USER=minioadmin
|
||||||
|
SAREX_MINIO_ROOT_PASSWORD=minioadmin
|
||||||
|
SAREX_MINIO_BUCKET=sarex-media-storage
|
||||||
|
SAREX_MINIO_REGION=us-east-1
|
||||||
|
|
||||||
|
# Образы приложения (приватный реестр cr.yandex — нужен docker login)
|
||||||
|
SAREX_BACKEND_IMAGE=cr.yandex/crp3ccidau046kdj8g9q/sarex-backend-dev:latest
|
||||||
|
SAREX_FRONTEND_IMAGE=cr.yandex/crp3ccidau046kdj8g9q/sarex-frontend-dev:latest
|
||||||
|
|||||||
@ -83,7 +83,198 @@ services:
|
|||||||
retries: 12
|
retries: 12
|
||||||
start_period: 20s
|
start_period: 20s
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Инфраструктурные зависимости apps/django (sarex-backend).
|
||||||
|
# Django деплоится в k3s и ходит сюда — про связность k3s→compose см. README.
|
||||||
|
# Креды/версии взяты из sarex-backend/docker-compose.yaml и apps/django/.env.example.
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
postgres:
|
||||||
|
image: postgres:12-alpine
|
||||||
|
container_name: postgres
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: ${SAREX_POSTGRES_DB:-sarex_db}
|
||||||
|
POSTGRES_USER: ${SAREX_POSTGRES_USER:-sarex}
|
||||||
|
POSTGRES_PASSWORD: ${SAREX_POSTGRES_PASSWORD:-sarex}
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
volumes:
|
||||||
|
- sarex-postgres-data:/var/lib/postgresql/data
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -U ${SAREX_POSTGRES_USER:-sarex} -d ${SAREX_POSTGRES_DB:-sarex_db}"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 12
|
||||||
|
start_period: 10s
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
container_name: redis
|
||||||
|
restart: unless-stopped
|
||||||
|
command: ["redis-server", "--save", "60", "1", "--loglevel", "warning"]
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
volumes:
|
||||||
|
- sarex-redis-data:/data
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "redis-cli", "ping"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 12
|
||||||
|
start_period: 5s
|
||||||
|
|
||||||
|
rabbitmq:
|
||||||
|
image: bitnami/rabbitmq:3.11.23
|
||||||
|
container_name: rabbitmq
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
RABBITMQ_VHOST: ${SAREX_RABBITMQ_VHOST:-api}
|
||||||
|
RABBITMQ_USERNAME: ${SAREX_RABBITMQ_USER:-rabbit}
|
||||||
|
RABBITMQ_PASSWORD: ${SAREX_RABBITMQ_PASSWORD:-rabbit}
|
||||||
|
RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT: 200MB
|
||||||
|
ports:
|
||||||
|
- "5672:5672" # AMQP
|
||||||
|
- "15672:15672" # management UI
|
||||||
|
volumes:
|
||||||
|
- sarex-rabbitmq-data:/bitnami/rabbitmq/mnesia
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
|
||||||
|
interval: 15s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 12
|
||||||
|
start_period: 30s
|
||||||
|
|
||||||
|
minio:
|
||||||
|
image: minio/minio:latest
|
||||||
|
container_name: minio
|
||||||
|
restart: unless-stopped
|
||||||
|
command: ["server", "/data", "--console-address", ":9001"]
|
||||||
|
environment:
|
||||||
|
MINIO_ROOT_USER: ${SAREX_MINIO_ROOT_USER:-minioadmin}
|
||||||
|
MINIO_ROOT_PASSWORD: ${SAREX_MINIO_ROOT_PASSWORD:-minioadmin}
|
||||||
|
ports:
|
||||||
|
- "9000:9000" # S3 API
|
||||||
|
- "9001:9001" # web console
|
||||||
|
volumes:
|
||||||
|
- sarex-minio-data:/data
|
||||||
|
|
||||||
|
# Одноразовый init: ждёт MinIO и создаёт бакет sarex-media-storage
|
||||||
|
minio-init:
|
||||||
|
image: minio/mc:latest
|
||||||
|
depends_on:
|
||||||
|
- minio
|
||||||
|
entrypoint:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
until mc alias set local http://minio:9000 "$$MINIO_ROOT_USER" "$$MINIO_ROOT_PASSWORD"; do
|
||||||
|
echo 'waiting for minio...'; sleep 2;
|
||||||
|
done
|
||||||
|
mc mb -p "local/$$MINIO_BUCKET"
|
||||||
|
echo "bucket $$MINIO_BUCKET ready"
|
||||||
|
environment:
|
||||||
|
MINIO_ROOT_USER: ${SAREX_MINIO_ROOT_USER:-minioadmin}
|
||||||
|
MINIO_ROOT_PASSWORD: ${SAREX_MINIO_ROOT_PASSWORD:-minioadmin}
|
||||||
|
MINIO_BUCKET: ${SAREX_MINIO_BUCKET:-sarex-media-storage}
|
||||||
|
restart: "no"
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Приложение sarex (backend + celery + frontend).
|
||||||
|
# Образы приватные (cr.yandex) — нужен `docker login cr.yandex`.
|
||||||
|
# Для локальной сборки backend раскомментируй build (репозиторий — соседний).
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
backend:
|
||||||
|
image: ${SAREX_BACKEND_IMAGE:-cr.yandex/crp3ccidau046kdj8g9q/sarex-backend-dev:latest}
|
||||||
|
# build:
|
||||||
|
# context: ../../generic/sarex-backend
|
||||||
|
# dockerfile: Dockerfile
|
||||||
|
container_name: sarex-backend
|
||||||
|
restart: unless-stopped
|
||||||
|
environment: &sarex-backend-env
|
||||||
|
ALLOWED_HOSTS: "*"
|
||||||
|
DJANGO_SETTINGS_MODULE: config.settings.production
|
||||||
|
JWT_PRIVATE_KEY: "JWT"
|
||||||
|
JWT_PUBLIC_KEY: "JPK"
|
||||||
|
DJANGO_POSTGRES_HOST: postgres
|
||||||
|
DJANGO_POSTGRES_DATABASE: ${SAREX_POSTGRES_DB:-sarex_db}
|
||||||
|
DJANGO_POSTGRES_USER: ${SAREX_POSTGRES_USER:-sarex}
|
||||||
|
DJANGO_POSTGRES_PASSWORD: ${SAREX_POSTGRES_PASSWORD:-sarex}
|
||||||
|
DJANGO_REDIS_HOST: redis
|
||||||
|
DJANGO_RABBIT_HOSTNAME: rabbitmq
|
||||||
|
DJANGO_RABBIT_USER: ${SAREX_RABBITMQ_USER:-rabbit}
|
||||||
|
DJANGO_RABBIT_PASS: ${SAREX_RABBITMQ_PASSWORD:-rabbit}
|
||||||
|
DJANGO_RABBIT_VHOST: ${SAREX_RABBITMQ_VHOST:-api}
|
||||||
|
# S3 / объектное хранилище → MinIO (сервис minio)
|
||||||
|
S3_HOST: http://minio:9000
|
||||||
|
AWS_S3_ENDPOINT_URL: http://minio:9000
|
||||||
|
S3_LOGIN: ${SAREX_MINIO_ROOT_USER:-minioadmin}
|
||||||
|
S3_PASSWORD: ${SAREX_MINIO_ROOT_PASSWORD:-minioadmin}
|
||||||
|
S3_BUCKET: ${SAREX_MINIO_BUCKET:-sarex-media-storage}
|
||||||
|
S3_REGION: ${SAREX_MINIO_REGION:-us-east-1}
|
||||||
|
tty: true
|
||||||
|
ports:
|
||||||
|
- "8000:8000" # HTTP API (uWSGI), migrate выполняется в entrypoint
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_healthy
|
||||||
|
rabbitmq:
|
||||||
|
condition: service_healthy
|
||||||
|
minio-init:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
|
||||||
|
celery:
|
||||||
|
image: ${SAREX_BACKEND_IMAGE:-cr.yandex/crp3ccidau046kdj8g9q/sarex-backend-dev:latest}
|
||||||
|
container_name: sarex-celery
|
||||||
|
restart: unless-stopped
|
||||||
|
entrypoint: celery -A config worker -l info -E -Q default -n default_worker.%h --concurrency=1 -B
|
||||||
|
environment:
|
||||||
|
<<: *sarex-backend-env
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_healthy
|
||||||
|
redis:
|
||||||
|
condition: service_healthy
|
||||||
|
rabbitmq:
|
||||||
|
condition: service_healthy
|
||||||
|
minio-init:
|
||||||
|
condition: service_completed_successfully
|
||||||
|
|
||||||
|
frontend:
|
||||||
|
image: ${SAREX_FRONTEND_IMAGE:-cr.yandex/crp3ccidau046kdj8g9q/sarex-frontend-dev:latest}
|
||||||
|
container_name: sarex-frontend
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8080:80" # web UI
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
|
||||||
|
# Верхний reverse-proxy: единая точка входа → backend / frontend / minio
|
||||||
|
nginx:
|
||||||
|
image: nginx:1.27-alpine
|
||||||
|
container_name: sarex-nginx
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "9080:80" # 80/443 заняты k3s
|
||||||
|
volumes:
|
||||||
|
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro,z # :z — SELinux label для RedOS
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
- frontend
|
||||||
|
- minio
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "wget", "-qO-", "http://localhost/healthz"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 6
|
||||||
|
start_period: 10s
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
k3s-server-data:
|
k3s-server-data:
|
||||||
k3s-worker-data:
|
k3s-worker-data:
|
||||||
gitea-data:
|
gitea-data:
|
||||||
|
sarex-postgres-data:
|
||||||
|
sarex-redis-data:
|
||||||
|
sarex-rabbitmq-data:
|
||||||
|
sarex-minio-data:
|
||||||
|
|||||||
81
nginx/nginx.conf
Normal file
81
nginx/nginx.conf
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
worker_processes auto;
|
||||||
|
pid /var/run/nginx.pid;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
use epoll;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
keepalive_timeout 300;
|
||||||
|
large_client_header_buffers 8 128k;
|
||||||
|
client_max_body_size 5000M; # крупные загрузки (снимки, облака точек)
|
||||||
|
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_proxied any;
|
||||||
|
gzip_comp_level 6;
|
||||||
|
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
|
||||||
|
|
||||||
|
access_log /var/log/nginx/access.log;
|
||||||
|
error_log /var/log/nginx/error.log;
|
||||||
|
|
||||||
|
# корректная поддержка websocket/keep-alive для upstream'ов
|
||||||
|
map $http_upgrade $connection_upgrade {
|
||||||
|
default upgrade;
|
||||||
|
'' close;
|
||||||
|
}
|
||||||
|
|
||||||
|
upstream backend { server backend:8000; }
|
||||||
|
upstream frontend { server frontend:80; }
|
||||||
|
upstream minio_s3 { server minio:9000; }
|
||||||
|
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
|
||||||
|
# healthcheck самого nginx
|
||||||
|
location = /healthz {
|
||||||
|
access_log off;
|
||||||
|
add_header Content-Type text/plain;
|
||||||
|
return 200 "ok\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Django backend: REST API + админка ---
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://backend;
|
||||||
|
}
|
||||||
|
location /admin/ {
|
||||||
|
proxy_pass http://backend;
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- MinIO: объекты бакета ---
|
||||||
|
# Путь НЕ переписываем — иначе ломается подпись SigV4. Чтобы медиа
|
||||||
|
# открывались из браузера, задай backend'у S3_HOST = http://<хост>:9080
|
||||||
|
# (сейчас в compose там http://minio:9000, внутренний адрес).
|
||||||
|
location /sarex-media-storage/ {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Connection "";
|
||||||
|
proxy_pass http://minio_s3;
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Frontend SPA (host-приложение само отдаёт статику и роутинг) ---
|
||||||
|
location / {
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection $connection_upgrade;
|
||||||
|
proxy_pass http://frontend;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user