Files
mesreleves-php/docker-compose.prod.yml
T
yann64 236d37976c Compatibilité MySQL + suppression de Redis comme dépendance requise
DbCompat (app/Support/DbCompat.php) :
- like()           → ilike (pgsql) ou like (mysql)
- jsonRegexRaw()   → data::text ~* ? (pgsql) ou CAST(data AS CHAR) REGEXP ? (mysql)
- ftsRaw()         → to_tsvector/plainto_tsquery (pgsql) ou null/fallback LIKE (mysql)
- generatedJsonCol()       → syntaxe colonne générée JSON selon le SGBD
- generatedJsonNestedCol() → idem pour champs imbriqués

Migrations :
- create_releves_table : JSON/JSONB selon SGBD, colonnes générées adaptées,
  index GIN uniquement pour PostgreSQL

Controllers :
- LieuController (search + index) : ilike → DbCompat::like()
- Admin\UserController (index)     : ilike → DbCompat::like()
- RechercheController              : FTS + regex → DbCompat, fallback LIKE MySQL
- ExportController                 : regex → DbCompat::jsonRegexRaw()

UpdateService :
- backupDatabase()  : pg_dump (pgsql) ou mysqldump (mysql)
- restoreBackup()   : psql (pgsql) ou mysql (mysql)

Docker :
- docker-compose.yml       : suppression Redis (plus requis)
- docker-compose.mysql.yml : nouveau fichier pour dev MySQL
- docker-compose.prod.yml  : suppression Redis, DB_IMAGE configurable,
  CACHE_STORE/SESSION_DRIVER/QUEUE_CONNECTION → database par défaut

.env.example :
- DB_PORT commenté avec les deux valeurs (5432/3306)
- CACHE_STORE et QUEUE_CONNECTION commentés (database par défaut)
- Redis marqué optionnel

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-04 18:13:42 +02:00

80 lines
2.1 KiB
YAML

# Déploiement production — stack complète (app + db + nginx)
# Pas de Redis — cache/sessions/queue utilisent la base de données
# Usage : docker compose -f docker-compose.prod.yml up -d
services:
app:
build:
context: .
dockerfile: docker/Dockerfile
container_name: mesreleves_app
restart: unless-stopped
environment:
APP_ENV: production
APP_KEY: ${APP_KEY}
DB_CONNECTION: ${DB_CONNECTION:-pgsql}
DB_HOST: db
DB_PORT: ${DB_PORT:-5432}
DB_DATABASE: ${DB_DATABASE:-mesreleves}
DB_USERNAME: ${DB_USERNAME:-mesreleves}
DB_PASSWORD: ${DB_PASSWORD}
CACHE_STORE: database
SESSION_DRIVER: database
QUEUE_CONNECTION: database
depends_on:
db:
condition: service_healthy
volumes:
- .:/var/www/html
- app_storage:/var/www/html/storage
networks:
- internal
nginx:
image: nginx:alpine
container_name: mesreleves_nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro
- ./public:/var/www/html/public:ro
- app_storage:/var/www/html/storage:ro
depends_on:
- app
networks:
- internal
db:
image: ${DB_IMAGE:-postgres:18-alpine}
container_name: mesreleves_db
restart: unless-stopped
environment:
# PostgreSQL
POSTGRES_DB: ${DB_DATABASE:-mesreleves}
POSTGRES_USER: ${DB_USERNAME:-mesreleves}
POSTGRES_PASSWORD: ${DB_PASSWORD}
# MySQL (ignoré par PostgreSQL)
MYSQL_DATABASE: ${DB_DATABASE:-mesreleves}
MYSQL_USER: ${DB_USERNAME:-mesreleves}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- dbdata:/var/lib/postgresql # PostgreSQL
# Pour MySQL, remplacer par : - dbdata:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-mesreleves} || mysqladmin ping -h localhost -u${DB_USERNAME:-mesreleves} -p${DB_PASSWORD}"]
interval: 10s
timeout: 5s
retries: 5
networks:
- internal
volumes:
dbdata:
app_storage:
networks:
internal:
driver: bridge