feat(A4): add MinIO service + storage abstraction (core/storage.py)

- Add MinIO service to docker-compose.yml (port 9000 API, 9001 console)
- Add minio-data volume for persistent object storage
- Create backend/app/core/storage.py: MinIOStorage + LocalStorage abstraction
  - MinIOStorage: boto3-based, auto-creates bucket, upload/download/exists/delete/presign
  - LocalStorage: fallback for dev (UPLOAD_DIR filesystem, backward compat)
  - get_storage() singleton: auto-selects based on MINIO_URL env var
- Add MINIO_URL/USER/PASSWORD/BUCKET env vars to all service definitions
- backend/pyproject.toml: docker>=6.1.0 → boto3>=1.34.0
- Add docker-compose.worker.yml: external render-worker for remote machines
- Fix .gitignore: 'core' rule was too broad, now only matches root /core dump
- Update .env.example: MinIO connection vars documented

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-06 15:51:06 +01:00
parent c8ecc29d40
commit c728358fb6
7 changed files with 263 additions and 2 deletions
+8
View File
@@ -27,6 +27,14 @@ MAX_UPLOAD_SIZE_MB=500
# Scale horizontally with: docker compose up --scale worker=N
CELERY_WORKER_CONCURRENCY=8
# MinIO (S3-compatible object storage for shared uploads)
# MinIO is started automatically via docker-compose.yml
MINIO_URL=http://minio:9000
MINIO_USER=minioadmin
MINIO_PASSWORD=minioadmin
MINIO_BUCKET=uploads
# MinIO console UI: http://localhost:9001 (user: minioadmin, password: minioadmin)
# Blender (render-worker)
# Blender >= 5.0.1 must be installed on the host at /opt/blender
# The render-worker container mounts it read-only via volumes: - /opt/blender:/opt/blender:ro