refactor: structure docker-compose/ + scripts deploy.sh et setup.sh
CI / Lint & Format (push) Failing after 20s
CI / Tests (push) Has been skipped
CI / Security Scan (push) Failing after 9s
CI / Docker Build (push) Has been skipped

This commit is contained in:
2026-06-23 22:17:26 -04:00
parent a9c5a5900d
commit a626ab4981
7 changed files with 565 additions and 197 deletions
+66
View File
@@ -0,0 +1,66 @@
# ═══════════════════════════════════════════════════════════════
# Imago — Configuration de production
# ═══════════════════════════════════════════════════════════════
# Copiez ce fichier en .env dans le répertoire racine du projet :
# cp docker-compose/.env.example .env
#
# Puis éditez .env avec vos valeurs.
# ── Application ──────────────────────────────────────────────
APP_NAME=Imago
DEBUG=false
SECRET_KEY=changez-moi-par-une-valeur-longue-et-aleatoire
# ── Ports (exposés sur l'hôte) ───────────────────────────────
ADMIN_PORT=3001
BACKEND_PORT=8001
# ── Stockage ─────────────────────────────────────────────────
# "local" = fichiers sur disque
# "s3" = MinIO / AWS S3 / Cloudflare R2
STORAGE_BACKEND=local
UPLOAD_DIR=/app/data/uploads
THUMBNAILS_DIR=/app/data/thumbnails
MAX_UPLOAD_SIZE_MB=50
# Volume de stockage (défaut: volume Docker nommé "uploads"/"thumbnails")
# Pour NFS : UPLOAD_VOLUME=/NFS/IMAGO/uploads
# UPLOAD_VOLUME=
# THUMBNAIL_VOLUME=
# URLs signées pour le stockage local
SIGNED_URL_SECRET=changez-moi-en-prod
# ── Sauvegardes DB ───────────────────────────────────────────
# BACKUP_DIR=./backups
# ── AI ───────────────────────────────────────────────────────
AI_ENABLED=true
AI_PROVIDER=openrouter
OPENROUTER_API_KEY=sk-or-v1-votre-cle
OPENROUTER_MODEL=qwen/qwen2.5-vl-72b-instruct
# ── OCR ──────────────────────────────────────────────────────
OCR_ENABLED=true
TESSERACT_CMD=/usr/bin/tesseract
OCR_LANGUAGES=fra+eng
# ── CORS ─────────────────────────────────────────────────────
# Format JSON : ["http://localhost:3000", "https://votre-domaine.com"]
CORS_ORIGINS=["http://localhost:3000", "http://localhost:3001"]
# ── Authentification ─────────────────────────────────────────
ADMIN_API_KEY=
JWT_SECRET_KEY=changez-moi-jwt-secret
JWT_ALGORITHM=HS256
# ── Rate Limiting ────────────────────────────────────────────
RATE_LIMIT_FREE_UPLOAD=20
RATE_LIMIT_FREE_AI=50
RATE_LIMIT_STANDARD_UPLOAD=100
RATE_LIMIT_STANDARD_AI=200
RATE_LIMIT_PREMIUM_UPLOAD=500
RATE_LIMIT_PREMIUM_AI=1000
# ── Redis (interne Docker — ne pas changer sauf besoin spécifique)
# REDIS_URL=redis://redis:***@REDIS_URL=redis://redis:***@...
+106
View File
@@ -0,0 +1,106 @@
# =============================================================================
# Imago — Production (images pré-buildées, stockage local)
# =============================================================================
# Usage:
# 1. Copier .env.example → .env et remplir les secrets
# 2. docker compose -f docker-compose/docker-compose.prod.yml up -d
#
# Docker Compose lit automatiquement le fichier .env du répertoire courant.
# =============================================================================
services:
# ── Admin Panel (React + Nginx) ───────────────────────────
admin:
image: docker-registry.dev.home:5000/imago-admin:latest
ports:
- "${ADMIN_PORT:-3001}:80"
depends_on:
- backend
restart: unless-stopped
# ── API Backend ────────────────────────────────────────────
backend:
image: docker-registry.dev.home:5000/imago-backend:latest
ports:
- "${BACKEND_PORT:-8001}:8000"
env_file:
- .env
environment:
DATABASE_URL: postgresql+asyncpg://imago:imago@db:5432/imago
REDIS_URL: redis://redis:***@db:5432/imago
REDIS_URL: redis://redis:6379/0
STORAGE_BACKEND: ${STORAGE_BACKEND:-local}
UPLOAD_DIR: ${UPLOAD_DIR:-/app/data/uploads}
THUMBNAILS_DIR: ${THUMBNAILS_DIR:-/app/data/thumbnails}
MAX_UPLOAD_SIZE_MB: ${MAX_UPLOAD_SIZE_MB:-50}
SIGNED_URL_SECRET: ${SIGNED_URL_SECRET:-changez-moi-en-prod}
volumes:
- ${UPLOAD_VOLUME:-uploads}:/app/data/uploads
- ${THUMBNAIL_VOLUME:-thumbnails}:/app/data/thumbnails
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
# ── ARQ Worker ────────────────────────────────────────────
worker:
image: docker-registry.dev.home:5000/imago-backend:latest
command: python worker.py
env_file:
- .env
environment:
DATABASE_URL: postgresql+asyncpg://imago:imago@db:5432/imago
REDIS_URL: redis://redis:***@db:5432/imago
REDIS_URL: redis://redis:6379/0
STORAGE_BACKEND: ${STORAGE_BACKEND:-local}
UPLOAD_DIR: ${UPLOAD_DIR:-/app/data/uploads}
THUMBNAILS_DIR: ${THUMBNAILS_DIR:-/app/data/thumbnails}
MAX_UPLOAD_SIZE_MB: ${MAX_UPLOAD_SIZE_MB:-50}
SIGNED_URL_SECRET: ${SIGNED_URL_SECRET:-changez-moi-en-prod}
volumes:
- ${UPLOAD_VOLUME:-uploads}:/app/data/uploads
- ${THUMBNAIL_VOLUME:-thumbnails}:/app/data/thumbnails
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
# ── Base de données ───────────────────────────────────────
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: imago
POSTGRES_PASSWORD: imago
POSTGRES_DB: imago
volumes:
- pgdata:/var/lib/postgresql/data
- ${BACKUP_DIR:-./backups}:/backups
healthcheck:
test: ["CMD-SHELL", "pg_isready -U imago -d imago"]
interval: 5s
timeout: 5s
retries: 5
restart: unless-stopped
# ── Redis ─────────────────────────────────────────────────
redis:
image: redis:7-alpine
command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru
volumes:
- redisdata:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 3
restart: unless-stopped
volumes:
pgdata:
redisdata:
uploads:
thumbnails:
+117
View File
@@ -0,0 +1,117 @@
# =============================================================================
# Imago — Développement local (build from source, stack complet)
# =============================================================================
# Usage:
# docker compose -f docker-compose/docker-compose.yml up -d
#
# Ce compose build les images depuis le code source et démarre tous les
# services nécessaires : PostgreSQL, Redis, MinIO (S3), API, Worker.
# =============================================================================
services:
# ── Base de données ───────────────────────────────────────
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: imago
POSTGRES_PASSWORD: imago
POSTGRES_DB: imago
ports:
- "5432:5432"
volumes:
- pgdata_dev:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U imago -d imago"]
interval: 5s
timeout: 5s
retries: 5
# ── Redis ─────────────────────────────────────────────────
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redisdata_dev:/data
command: redis-server --appendonly yes
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 5
# ── MinIO (stockage S3 local) ─────────────────────────────
minio:
image: minio/minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000"
- "9001:9001"
volumes:
- miniodata_dev:/data
# ── API Backend ───────────────────────────────────────────
backend:
build:
context: ..
dockerfile: Dockerfile
ports:
- "8000:8000"
env_file:
- ../.env
environment:
DATABASE_URL: postgresql+asyncpg://imago:imago@db:5432/imago
REDIS_URL: redis://redis:6379/0
STORAGE_BACKEND: s3
S3_BUCKET: imago
S3_ENDPOINT_URL: http://minio:9000
S3_ENDPOINT_PUBLIC: http://localhost:9000
S3_ACCESS_KEY: minioadmin
S3_SECRET_KEY: minioadmin
S3_REGION: us-east-1
volumes:
- uploads_dev:/app/data/uploads
- thumbnails_dev:/app/data/thumbnails
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
# ── ARQ Worker ────────────────────────────────────────────
worker:
build:
context: ..
dockerfile: Dockerfile
command: python worker.py
env_file:
- ../.env
environment:
DATABASE_URL: postgresql+asyncpg://imago:imago@db:5432/imago
REDIS_URL: redis://redis:6379/0
STORAGE_BACKEND: s3
S3_BUCKET: imago
S3_ENDPOINT_URL: http://minio:9000
S3_ACCESS_KEY: minioadmin
S3_SECRET_KEY: minioadmin
S3_REGION: us-east-1
volumes:
- uploads_dev:/app/data/uploads
- thumbnails_dev:/app/data/thumbnails
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
volumes:
pgdata_dev:
redisdata_dev:
miniodata_dev:
uploads_dev:
thumbnails_dev: