Add app-specific MinIO user with scoped bucket policy, update .env.example, docker-compose.yaml, and Nginx configuration accordingly
This commit is contained in:
parent
0ad515e6c4
commit
333677dedf
@ -15,9 +15,14 @@ SAREX_RABBITMQ_PASSWORD=rabbit
|
|||||||
SAREX_MINIO_ROOT_USER=minioadmin
|
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
|
||||||
|
# Отдельный пользователь приложения (не 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
|
SAREX_MINIO_REGION=us-east-1
|
||||||
# Внешний URL консоли MinIO (minio-домен, путь /console на верхнем nginx, https)
|
# Внешний URL консоли MinIO (корень minio-домена на верхнем nginx, https)
|
||||||
SAREX_MINIO_CONSOLE_URL=https://minio.sarex.local/console
|
SAREX_MINIO_CONSOLE_URL=https://minio.sarex.local
|
||||||
|
|
||||||
# --- Домены верхнего nginx (замени на реальные, заведи в DNS/hosts) ---
|
# --- Домены верхнего nginx (замени на реальные, заведи в DNS/hosts) ---
|
||||||
PLATFORM_DOMAIN=sarex.local # основной домен платформы (frontend + /api)
|
PLATFORM_DOMAIN=sarex.local # основной домен платформы (frontend + /api)
|
||||||
|
|||||||
@ -149,12 +149,13 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
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-домена
|
||||||
MINIO_BROWSER_REDIRECT_URL: ${SAREX_MINIO_CONSOLE_URL:-https://minio.sarex.local/console}
|
MINIO_BROWSER_REDIRECT_URL: ${SAREX_MINIO_CONSOLE_URL:-https://minio.sarex.local}
|
||||||
volumes:
|
volumes:
|
||||||
- sarex-minio-data:/data
|
- sarex-minio-data:/data
|
||||||
|
|
||||||
# Одноразовый init: ждёт MinIO и создаёт бакет sarex-media-storage
|
# Одноразовый init: ждёт MinIO, создаёт бакет и отдельного пользователя
|
||||||
|
# приложения со scoped-политикой (доступ только к своему бакету).
|
||||||
minio-init:
|
minio-init:
|
||||||
image: cr.yandex/crp3ccidau046kdj8g9q/mc:250724
|
image: cr.yandex/crp3ccidau046kdj8g9q/mc:250724
|
||||||
depends_on:
|
depends_on:
|
||||||
@ -167,11 +168,21 @@ services:
|
|||||||
echo 'waiting for minio...'; sleep 2;
|
echo 'waiting for minio...'; sleep 2;
|
||||||
done
|
done
|
||||||
mc mb -p "local/$$MINIO_BUCKET"
|
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:
|
environment:
|
||||||
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}
|
||||||
MINIO_BUCKET: ${SAREX_MINIO_BUCKET:-sarex-media-storage}
|
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"
|
restart: "no"
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@ -203,8 +214,8 @@ services:
|
|||||||
# S3 / объектное хранилище → MinIO (сервис minio)
|
# S3 / объектное хранилище → MinIO (сервис minio)
|
||||||
S3_HOST: http://minio:9000
|
S3_HOST: http://minio:9000
|
||||||
AWS_S3_ENDPOINT_URL: http://minio:9000
|
AWS_S3_ENDPOINT_URL: http://minio:9000
|
||||||
S3_LOGIN: ${SAREX_MINIO_ROOT_USER:-minioadmin}
|
S3_LOGIN: ${SAREX_MINIO_APP_USER:-sarex-app}
|
||||||
S3_PASSWORD: ${SAREX_MINIO_ROOT_PASSWORD:-minioadmin}
|
S3_PASSWORD: ${SAREX_MINIO_APP_PASSWORD:-sarex-app-secret}
|
||||||
S3_BUCKET: ${SAREX_MINIO_BUCKET:-sarex-media-storage}
|
S3_BUCKET: ${SAREX_MINIO_BUCKET:-sarex-media-storage}
|
||||||
S3_REGION: ${SAREX_MINIO_REGION:-us-east-1}
|
S3_REGION: ${SAREX_MINIO_REGION:-us-east-1}
|
||||||
tty: true
|
tty: true
|
||||||
|
|||||||
@ -103,15 +103,17 @@ server {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ============================== MinIO (отдельный домен) =====================
|
# ============================== MinIO (отдельный домен) =====================
|
||||||
|
# Консоль отдаётся с КОРНЯ домена (порт 9001) — так её статика (/static, /api,
|
||||||
|
# websocket) резолвится без сабпути. У сервиса minio:
|
||||||
|
# MINIO_BROWSER_REDIRECT_URL = https://<MINIO_DOMAIN>
|
||||||
|
# S3 API (:9000) здесь НЕ публикуется: backend ходит в minio:9000 по внутренней
|
||||||
|
# сети. Понадобится S3 наружу — заведи отдельный домен (напр. s3.<...>) на minio_s3.
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
listen 443 ssl;
|
listen 443 ssl;
|
||||||
server_name ${MINIO_DOMAIN};
|
server_name ${MINIO_DOMAIN};
|
||||||
|
|
||||||
# Веб-консоль администрирования (порт 9001). Требует у сервиса minio
|
location / {
|
||||||
# MINIO_BROWSER_REDIRECT_URL = http://<MINIO_DOMAIN>:9080/console
|
|
||||||
location = /console { return 301 /console/; } # без слэша → на /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;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
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 Connection $connection_upgrade;
|
||||||
proxy_set_header X-NginX-Proxy true;
|
proxy_set_header X-NginX-Proxy true;
|
||||||
chunked_transfer_encoding off;
|
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_buffering off;
|
||||||
proxy_request_buffering off;
|
proxy_request_buffering off;
|
||||||
proxy_max_temp_file_size 0;
|
proxy_max_temp_file_size 0;
|
||||||
proxy_pass http://minio_s3;
|
proxy_pass http://minio_console;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user