version: "3.8" services: treasure-api: image: registry.gitlab.com/treasure-hunt4/treasure-api:latest restart: unless-stopped depends_on: - treasure-api-migrate ports: - "8000:80" # API dispo sur http://IP_DU_SERVEUR:8000 environment: APP_ENV: "${APP_ENV}" APP_KEY: "${APP_KEY}" APP_DEBUG: "false" DB_CONNECTION: "mysql" DB_HOST: "mysql" DB_PORT: 3306 DB_DATABASE: "${DB_DATABASE}" DB_USERNAME: "${DB_USERNAME}" DB_PASSWORD: "${DB_PASSWORD}" treasure-api-migrate: image: registry.gitlab.com/treasure-hunt4/treasure-api:latest restart: "no" depends_on: - mysql environment: APP_ENV: "production" APP_KEY: "${APP_KEY}" DB_CONNECTION: "mysql" DB_HOST: "mysql" DB_PORT: 3306 DB_DATABASE: "${DB_DATABASE}" DB_USERNAME: "${DB_USERNAME}" DB_PASSWORD: "${DB_PASSWORD}" # On attend que MySQL soit prêt et on retente la migration jusqu'à succès command: > sh -c " echo '⏳ Waiting for MySQL on mysql:3306...'; php -r ' $host = getenv(\"DB_HOST\") ?: \"mysql\"; $port = getenv(\"DB_PORT\") ?: \"3306\"; $db = getenv(\"DB_DATABASE\") ?: \"\"; $user = getenv(\"DB_USERNAME\") ?: \"\"; $pass = getenv(\"DB_PASSWORD\") ?: \"\"; while (true) { try { new PDO(\"mysql:host={$host};port={$port};dbname={$db}\", $user, $pass); break; } catch (Throwable $e) { echo \"MySQL not ready: {$e->getMessage()}\\n\"; sleep(2); } } '; echo '✅ MySQL is up, running migrations...'; until php artisan migrate --force --no-interaction; do echo '❌ Migration failed, retrying in 5s...'; sleep 5; done; echo '✅ Migrations applied.'; " mysql: image: mysql:8.0 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD}" MYSQL_DATABASE: "${DB_DATABASE}" MYSQL_USER: "${DB_USERNAME}" MYSQL_PASSWORD: "${DB_PASSWORD}" volumes: - mysql-data:/var/lib/mysql ports: - "3308:3306" # Optionnel, pour accès externe à MySQL healthcheck: test: [ "CMD", "mysqladmin", "ping", "-h", "localhost", "-p${MYSQL_ROOT_PASSWORD}", ] interval: 5s timeout: 5s retries: 10 start_period: 10s volumes: mysql-data: