2026-01-07 18:39:21 +00:00
version : '3.8'
services :
# --- INFRASTRUCTURE ---
postgres :
image : postgres:16-alpine
container_name : veza_postgres_staging
restart : unless-stopped
environment :
POSTGRES_USER : veza
2026-02-11 21:43:09 +00:00
POSTGRES_PASSWORD : ${STAGING_DB_PASSWORD:?STAGING_DB_PASSWORD must be set}
2026-01-07 18:39:21 +00:00
POSTGRES_DB : veza_staging
volumes :
- postgres_staging_data:/var/lib/postgresql/data
healthcheck :
test : [ "CMD-SHELL" , "pg_isready -U veza" ]
interval : 10s
timeout : 5s
retries : 5
redis :
image : redis:7-alpine
container_name : veza_redis_staging
restart : unless-stopped
command : redis-server --save 60 1 --loglevel warning
volumes :
- redis_staging_data:/data
healthcheck :
test : [ "CMD" , "redis-cli" , "ping" ]
interval : 10s
rabbitmq :
image : rabbitmq:3-management-alpine
container_name : veza_rabbitmq_staging
restart : unless-stopped
environment :
RABBITMQ_DEFAULT_USER : veza
2026-02-11 21:43:09 +00:00
RABBITMQ_DEFAULT_PASS : ${STAGING_RABBITMQ_PASSWORD:?STAGING_RABBITMQ_PASSWORD must be set}
2026-01-07 18:39:21 +00:00
volumes :
- rabbitmq_staging_data:/var/lib/rabbitmq
healthcheck :
test : rabbitmq-diagnostics -q ping
interval : 20s
# --- APPLICATION SERVICES ---
backend :
build :
context : ./veza-backend-api
dockerfile : Dockerfile.production
container_name : veza_backend_staging
restart : unless-stopped
environment :
- APP_ENV=staging
- DB_HOST=postgres
- DB_PORT=5432
- DB_USER=veza
2026-02-11 21:43:09 +00:00
- DB_PASSWORD=${STAGING_DB_PASSWORD:?STAGING_DB_PASSWORD must be set}
2026-01-07 18:39:21 +00:00
- DB_NAME=veza_staging
2026-03-02 18:33:42 +00:00
- DATABASE_URL=postgresql://veza:${STAGING_DB_PASSWORD:?STAGING_DB_PASSWORD must be set}@postgres:5432/veza_staging?sslmode=${STAGING_DB_SSLMODE:-disable}
2026-01-07 18:39:21 +00:00
- REDIS_URL=redis://redis:6379
2026-02-11 21:43:09 +00:00
- RABBITMQ_URL=amqp://veza:${STAGING_RABBITMQ_PASSWORD:?STAGING_RABBITMQ_PASSWORD must be set}@rabbitmq:5672/%2f
2026-01-07 18:39:21 +00:00
- JWT_SECRET=${STAGING_JWT_SECRET}
- ENABLE_CLAMAV=false
- LOG_DIR=/var/log/veza
- LOG_LEVEL=INFO
# Cookie Security Settings (Staging)
- COOKIE_SECURE=true # true en staging (HTTPS requis)
- COOKIE_SAME_SITE=strict # strict pour sécurité maximale
- COOKIE_DOMAIN=${STAGING_COOKIE_DOMAIN:-.staging.veza.app}
- COOKIE_HTTP_ONLY=true
- COOKIE_PATH=/
- CORS_ALLOWED_ORIGINS=${STAGING_CORS_ORIGINS:-https://staging.veza.app,https://staging-api.veza.app}
feat(v0.501): Sprint 1 -- infrastructure foundations
- Add MinIO S3-compatible storage to docker-compose (dev, staging, prod)
- Create migrations 103-108 (waveform_url, user_folders, user_files,
user_storage_quotas, gear_items.is_public, gear_images)
- Add Go models: UserFile, UserFolder, StorageQuota, GearImage
- Add WaveformURL to Track model, IsPublic + GearImages to GearItem model
2026-02-22 17:10:25 +00:00
- AWS_S3_ENDPOINT=http://minio:9000
- AWS_S3_BUCKET=veza-files
- AWS_ACCESS_KEY_ID=${STAGING_S3_ACCESS_KEY:?STAGING_S3_ACCESS_KEY must be set}
- AWS_SECRET_ACCESS_KEY=${STAGING_S3_SECRET_KEY:?STAGING_S3_SECRET_KEY must be set}
- AWS_REGION=us-east-1
2026-04-30 13:39:30 +00:00
# v1.0.10 polish: enable the S3 stack and route track uploads through
# MinIO end-to-end. Without these two flags, defaults (local +
# disabled) win and the AWS_S3_* credentials above are inert.
- AWS_S3_ENABLED=true
- TRACK_STORAGE_BACKEND=s3
2026-02-22 20:20:35 +00:00
- HLS_STREAMING=true
- HLS_STORAGE_DIR=/data/hls
2026-01-07 18:39:21 +00:00
volumes :
- veza_logs_staging:/var/log/veza
2026-02-22 20:20:35 +00:00
- hls_staging_data:/data/hls
2026-01-07 18:39:21 +00:00
depends_on :
postgres :
condition : service_healthy
redis :
condition : service_healthy
rabbitmq :
condition : service_healthy
ports :
- "8080:8080"
2026-02-22 16:36:03 +00:00
healthcheck :
test : [ "CMD" , "wget" , "--quiet" , "--tries=1" , "--spider" , "http://localhost:8080/api/v1/health" ]
interval : 10s
timeout : 5s
retries : 3
feat(chat): Sprint 4 -- Docker cleanup, frontend migration to Go WS
- Remove Rust chat-server from docker-compose.yml, staging.yml, prod.yml
- Remove VITE_WS_URL from docker frontend env vars (auto-derived from API_URL)
- Update env.ts: derive WS_URL from API_URL (/api/v1/ws) when not explicitly set
- Remove 127.0.0.1:8081 dev hack from useChat.ts
- Add missing types: EditMessage, DeleteMessage, FetchHistory, SearchMessages,
SyncMessages, MessageEdited, MessageDeleted, SearchResults, SyncChunk
- Update MSW chat/token handler to return ws_url: /api/v1/ws
- Update .env.example and .env.storybook
2026-02-22 19:46:58 +00:00
# Chat Server removed in v0.502 -- chat is now handled by backend WebSocket at /api/v1/ws
2026-02-22 16:36:03 +00:00
stream-server :
build :
context : ./veza-stream-server
dockerfile : Dockerfile.production
container_name : veza_stream_staging
restart : unless-stopped
environment :
2026-03-02 18:33:42 +00:00
- DATABASE_URL=postgresql://veza:${STAGING_DB_PASSWORD:?STAGING_DB_PASSWORD must be set}@postgres:5432/veza_staging?sslmode=${STAGING_DB_SSLMODE:-disable}
2026-02-22 16:36:03 +00:00
- REDIS_URL=redis://redis:6379
- JWT_SECRET=${STAGING_JWT_SECRET:?STAGING_JWT_SECRET must be set}
- PORT=3001
2026-02-22 20:20:35 +00:00
- HLS_OUTPUT_DIR=/data/hls
volumes :
- hls_staging_data:/data/hls
2026-02-22 16:36:03 +00:00
depends_on :
postgres :
condition : service_healthy
redis :
condition : service_healthy
healthcheck :
test : [ "CMD" , "wget" , "--quiet" , "--tries=1" , "--spider" , "http://localhost:3001/health" ]
interval : 10s
timeout : 5s
retries : 3
2026-01-07 18:39:21 +00:00
frontend :
build :
context : ./apps/web
dockerfile : Dockerfile.production
container_name : veza_frontend_staging
restart : unless-stopped
environment :
2026-02-22 16:36:03 +00:00
- VITE_API_URL=/api/v1
- VITE_STREAM_URL=ws://caddy/stream
2026-01-07 18:39:21 +00:00
- VITE_APP_ENV=staging
2026-02-22 16:36:03 +00:00
depends_on :
- backend
- stream-server
healthcheck :
test : [ "CMD" , "wget" , "--quiet" , "--tries=1" , "--spider" , "http://localhost:5173" ]
interval : 10s
timeout : 5s
retries : 3
caddy :
image : caddy:2-alpine
container_name : veza_caddy_staging
restart : unless-stopped
2026-01-07 18:39:21 +00:00
ports :
2026-02-22 16:36:03 +00:00
- "80:80"
- "443:443"
volumes :
- ./config/caddy/Caddyfile.staging:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
2026-01-07 18:39:21 +00:00
depends_on :
- backend
2026-02-22 16:36:03 +00:00
- stream-server
- frontend
2026-01-07 18:39:21 +00:00
feat(v0.501): Sprint 1 -- infrastructure foundations
- Add MinIO S3-compatible storage to docker-compose (dev, staging, prod)
- Create migrations 103-108 (waveform_url, user_folders, user_files,
user_storage_quotas, gear_items.is_public, gear_images)
- Add Go models: UserFile, UserFolder, StorageQuota, GearImage
- Add WaveformURL to Track model, IsPublic + GearImages to GearItem model
2026-02-22 17:10:25 +00:00
minio :
2026-04-20 18:32:01 +00:00
image : minio/minio:RELEASE.2025-09-07T16-13-09Z
feat(v0.501): Sprint 1 -- infrastructure foundations
- Add MinIO S3-compatible storage to docker-compose (dev, staging, prod)
- Create migrations 103-108 (waveform_url, user_folders, user_files,
user_storage_quotas, gear_items.is_public, gear_images)
- Add Go models: UserFile, UserFolder, StorageQuota, GearImage
- Add WaveformURL to Track model, IsPublic + GearImages to GearItem model
2026-02-22 17:10:25 +00:00
container_name : veza_minio_staging
restart : unless-stopped
command : server /data --console-address ":9001"
environment :
MINIO_ROOT_USER : ${STAGING_S3_ACCESS_KEY:?STAGING_S3_ACCESS_KEY must be set}
MINIO_ROOT_PASSWORD : ${STAGING_S3_SECRET_KEY:?STAGING_S3_SECRET_KEY must be set}
volumes :
- minio_staging_data:/data
healthcheck :
test : [ "CMD" , "mc" , "ready" , "local" ]
interval : 10s
timeout : 5s
retries : 5
minio-init :
2026-04-20 18:32:01 +00:00
image : minio/mc:RELEASE.2025-09-07T05-25-40Z
feat(v0.501): Sprint 1 -- infrastructure foundations
- Add MinIO S3-compatible storage to docker-compose (dev, staging, prod)
- Create migrations 103-108 (waveform_url, user_folders, user_files,
user_storage_quotas, gear_items.is_public, gear_images)
- Add Go models: UserFile, UserFolder, StorageQuota, GearImage
- Add WaveformURL to Track model, IsPublic + GearImages to GearItem model
2026-02-22 17:10:25 +00:00
depends_on :
minio :
condition : service_healthy
entrypoint : >
/bin/sh -c "
mc alias set veza http://minio:9000 $${MINIO_ROOT_USER} $${MINIO_ROOT_PASSWORD};
mc mb --ignore-existing veza/veza-files;
exit 0;
"
environment :
MINIO_ROOT_USER : ${STAGING_S3_ACCESS_KEY:?STAGING_S3_ACCESS_KEY must be set}
MINIO_ROOT_PASSWORD : ${STAGING_S3_SECRET_KEY:?STAGING_S3_SECRET_KEY must be set}
2026-01-07 18:39:21 +00:00
volumes :
postgres_staging_data :
redis_staging_data :
rabbitmq_staging_data :
veza_logs_staging :
2026-02-22 16:36:03 +00:00
caddy_data :
caddy_config :
feat(v0.501): Sprint 1 -- infrastructure foundations
- Add MinIO S3-compatible storage to docker-compose (dev, staging, prod)
- Create migrations 103-108 (waveform_url, user_folders, user_files,
user_storage_quotas, gear_items.is_public, gear_images)
- Add Go models: UserFile, UserFolder, StorageQuota, GearImage
- Add WaveformURL to Track model, IsPublic + GearImages to GearItem model
2026-02-22 17:10:25 +00:00
minio_staging_data :
2026-02-22 20:20:35 +00:00
hls_staging_data :
2026-01-07 18:39:21 +00:00