Add app-specific MinIO user with scoped bucket policy, update .env.example, docker-compose.yaml, and Nginx configuration accordingly

This commit is contained in:
emelinda 2026-07-22 17:59:57 +03:00
parent 0ad515e6c4
commit 333677dedf
3 changed files with 32 additions and 27 deletions

View File

@ -15,9 +15,14 @@ SAREX_RABBITMQ_PASSWORD=rabbit
SAREX_MINIO_ROOT_USER=minioadmin
SAREX_MINIO_ROOT_PASSWORD=minioadmin
SAREX_MINIO_BUCKET=sarex-media-storage
# Отдельный пользователь приложения (не root) — под ним backend/celery ходят в S3.
# Секрет минимум 8 символов. Политика ограничена бакетом SAREX_MINIO_BUCKET.
SAREX_MINIO_APP_USER=sarex-app
SAREX_MINIO_APP_PASSWORD=sarex-app-secret
SAREX_MINIO_APP_POLICY=sarex-app-rw
SAREX_MINIO_REGION=us-east-1
# Внешний URL консоли MinIO (minio-домен, путь /console на верхнем nginx, https)
SAREX_MINIO_CONSOLE_URL=https://minio.sarex.local/console
# Внешний URL консоли MinIO (корень minio-домена на верхнем nginx, https)
SAREX_MINIO_CONSOLE_URL=https://minio.sarex.local
# --- Домены верхнего nginx (замени на реальные, заведи в DNS/hosts) ---
PLATFORM_DOMAIN=sarex.local # основной домен платформы (frontend + /api)

View File

@ -149,12 +149,13 @@ services:
environment:
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:-https://minio.sarex.local/console}
# Консоль отдаётся через верхний nginx с корня minio-домена
MINIO_BROWSER_REDIRECT_URL: ${SAREX_MINIO_CONSOLE_URL:-https://minio.sarex.local}
volumes:
- sarex-minio-data:/data
# Одноразовый init: ждёт MinIO и создаёт бакет sarex-media-storage
# Одноразовый init: ждёт MinIO, создаёт бакет и отдельного пользователя
# приложения со scoped-политикой (доступ только к своему бакету).
minio-init:
image: cr.yandex/crp3ccidau046kdj8g9q/mc:250724
depends_on:
@ -167,11 +168,21 @@ services:
echo 'waiting for minio...'; sleep 2;
done
mc mb -p "local/$$MINIO_BUCKET"
echo "bucket $$MINIO_BUCKET ready"
# Пользователь приложения (не root) с доступом только к своему бакету
mc admin user add local "$$MINIO_APP_USER" "$$MINIO_APP_PASSWORD"
printf '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:*"],"Resource":["arn:aws:s3:::%s","arn:aws:s3:::%s/*"]}]}' \
"$$MINIO_BUCKET" "$$MINIO_BUCKET" > /tmp/app-policy.json
mc admin policy create local "$$MINIO_APP_POLICY" /tmp/app-policy.json || true
mc admin policy attach local "$$MINIO_APP_POLICY" --user "$$MINIO_APP_USER" || true
echo "bucket $$MINIO_BUCKET + user $$MINIO_APP_USER 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}
MINIO_APP_USER: ${SAREX_MINIO_APP_USER:-sarex-app}
MINIO_APP_PASSWORD: ${SAREX_MINIO_APP_PASSWORD:-sarex-app-secret}
MINIO_APP_POLICY: ${SAREX_MINIO_APP_POLICY:-sarex-app-rw}
restart: "no"
# ---------------------------------------------------------------------------
@ -203,8 +214,8 @@ services:
# 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_LOGIN: ${SAREX_MINIO_APP_USER:-sarex-app}
S3_PASSWORD: ${SAREX_MINIO_APP_PASSWORD:-sarex-app-secret}
S3_BUCKET: ${SAREX_MINIO_BUCKET:-sarex-media-storage}
S3_REGION: ${SAREX_MINIO_REGION:-us-east-1}
tty: true

View File

@ -103,15 +103,17 @@ server {
}
# ============================== MinIO (отдельный домен) =====================
# Консоль отдаётся с КОРНЯ домена (порт 9001) — так её статика (/static, /api,
# websocket) резолвится без сабпути. У сервиса minio:
# MINIO_BROWSER_REDIRECT_URL = https://<MINIO_DOMAIN>
# S3 API (:9000) здесь НЕ публикуется: backend ходит в minio:9000 по внутренней
# сети. Понадобится S3 наружу — заведи отдельный домен (напр. s3.<...>) на minio_s3.
server {
listen 80;
listen 443 ssl;
server_name ${MINIO_DOMAIN};
# Веб-консоль администрирования (порт 9001). Требует у сервиса minio
# MINIO_BROWSER_REDIRECT_URL = http://<MINIO_DOMAIN>:9080/console
location = /console { return 301 /console/; } # без слэша → на /console/
location /console/ {
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@ -121,23 +123,10 @@ server {
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-NginX-Proxy true;
chunked_transfer_encoding off;
proxy_pass http://minio_console;
}
# S3 API (endpoint) на корне — Range/стриминг крупных объектов.
# Путь не переписываем, иначе ломается подпись SigV4.
location / {
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;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
# крупные загрузки объектов через консоль
proxy_buffering off;
proxy_request_buffering off;
proxy_max_temp_file_size 0;
proxy_pass http://minio_s3;
proxy_pass http://minio_console;
}
}