version: "3.9" services: mysql: image: mysql:8.4 container_name: gameovergne-mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: gameovergne_app MYSQL_USER: gameovergne MYSQL_PASSWORD: gameovergne # 🔒 Persistant + accessible depuis l'extérieur volumes: - ./mysql-data:/var/lib/mysql ports: - "3306:3306" # pour te connecter depuis ton Mac / un client SQL networks: - gameovergne restart: unless-stopped healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-u", "root", "-proot"] interval: 10s timeout: 5s retries: 10 spring: image: registry.vincent-guillet.fr/gameovergne-api:dev-latest container_name: gameovergne-api depends_on: mysql: condition: service_healthy environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/gameovergne_app?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC SPRING_DATASOURCE_USERNAME: gameovergne SPRING_DATASOURCE_PASSWORD: gameovergne SERVER_PORT: 3000 # pense bien à avoir prestashop.base-url / prestashop.basic-auth dans application.properties ou via env si besoin networks: - gameovergne - traefik restart: unless-stopped labels: - traefik.enable=true - traefik.docker.network=traefik # API sous /gameovergne-api - traefik.http.routers.gameovergne-api.rule=Host(`dev.vincent-guillet.fr`) && PathPrefix(`/gameovergne-api`) - traefik.http.routers.gameovergne-api.entrypoints=edge - traefik.http.routers.gameovergne-api.service=gameovergne-api - traefik.http.services.gameovergne-api.loadbalancer.server.port=3000 - traefik.http.routers.gameovergne-api.middlewares=gameovergne-api-stripprefix - traefik.http.middlewares.gameovergne-api-stripprefix.stripprefix.prefixes=/gameovergne-api angular: image: registry.vincent-guillet.fr/gameovergne-client:dev-latest container_name: gameovergne-client depends_on: - spring networks: - gameovergne - traefik restart: unless-stopped labels: - traefik.enable=true - traefik.docker.network=traefik # FRONT sous /gameovergne (avec et sans slash final) - traefik.http.routers.gameovergne-client.rule=Host(`dev.vincent-guillet.fr`) && (Path(`/gameovergne`) || PathPrefix(`/gameovergne/`)) - traefik.http.routers.gameovergne-client.entrypoints=edge - traefik.http.routers.gameovergne-client.service=gameovergne-client - traefik.http.routers.gameovergne-client.middlewares=gameovergne-slash,gameovergne-client-stripprefix # Redirige /gameovergne vers /gameovergne/ - traefik.http.middlewares.gameovergne-slash.redirectregex.regex=^https?://([^/]+)/gameovergne$ - traefik.http.middlewares.gameovergne-slash.redirectregex.replacement=https://$${1}/gameovergne/ - traefik.http.middlewares.gameovergne-slash.redirectregex.permanent=true # Enlève /gameovergne avant d'envoyer vers Nginx (le conteneur Angular) - traefik.http.middlewares.gameovergne-client-stripprefix.stripprefix.prefixes=/gameovergne # Service vers Nginx (port 80 dans le conteneur) - traefik.http.services.gameovergne-client.loadbalancer.server.port=80 # Proxy Presta via /gameovergne/ps -> même service, même StripPrefix - traefik.http.routers.gameovergne-ps.rule=Host(`dev.vincent-guillet.fr`) && PathPrefix(`/gameovergne/ps`) - traefik.http.routers.gameovergne-ps.entrypoints=edge - traefik.http.routers.gameovergne-ps.service=gameovergne-client - traefik.http.routers.gameovergne-ps.middlewares=gameovergne-client-stripprefix networks: traefik: external: true gameovergne: driver: bridge