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>
This commit is contained in:
2026-06-04 18:13:42 +02:00
parent f57ae068b9
commit 236d37976c
11 changed files with 243 additions and 108 deletions
+18 -25
View File
@@ -1,4 +1,5 @@
# Déploiement production — stack complète (app + db + redis + nginx)
# 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:
@@ -10,25 +11,20 @@ services:
environment:
APP_ENV: production
APP_KEY: ${APP_KEY}
DB_CONNECTION: pgsql
DB_CONNECTION: ${DB_CONNECTION:-pgsql}
DB_HOST: db
DB_PORT: 5432
DB_PORT: ${DB_PORT:-5432}
DB_DATABASE: ${DB_DATABASE:-mesreleves}
DB_USERNAME: ${DB_USERNAME:-mesreleves}
DB_PASSWORD: ${DB_PASSWORD}
CACHE_STORE: redis
SESSION_DRIVER: redis
QUEUE_CONNECTION: redis
REDIS_HOST: redis
CACHE_STORE: database
SESSION_DRIVER: database
QUEUE_CONNECTION: database
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
volumes:
# Le code est monté depuis l'hôte : les mises à jour ne nécessitent pas de rebuild image
- .:/var/www/html
# Le storage est un volume nommé (uploads, logs, sessions — persisté indépendamment du code)
- app_storage:/var/www/html/storage
networks:
- internal
@@ -50,35 +46,32 @@ services:
- internal
db:
image: postgres:18-alpine
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:
- pgdata:/var/lib/postgresql
- dbdata:/var/lib/postgresql # PostgreSQL
# Pour MySQL, remplacer par : - dbdata:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DB_USERNAME:-mesreleves}"]
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
redis:
image: redis:7-alpine
container_name: mesreleves_redis
restart: unless-stopped
volumes:
- redisdata:/data
networks:
- internal
volumes:
pgdata:
redisdata:
dbdata:
app_storage:
networks: