diff --git a/compose.override.yaml b/compose.override.yaml index 187de4f..a9b7d4f 100644 --- a/compose.override.yaml +++ b/compose.override.yaml @@ -1,7 +1,27 @@ +version: '3.7' services: + php: + environment: + XDEBUG_MODE: off + extra_hosts: + - "host.docker.internal:host-gateway" + depends_on: + - mailer + ###> symfony/mercure-bundle ### mercure: ports: - "80" ###< symfony/mercure-bundle ### + +###> symfony/mailer ### + mailer: + image: axllent/mailpit + ports: + - "1025:1025" + - "8025:8025" + environment: + MP_SMTP_AUTH_ACCEPT_ANY: 1 + MP_SMTP_AUTH_ALLOW_INSECURE: 1 +###< symfony/mailer ### diff --git a/compose.yaml b/compose.yaml index 6b45d88..d8324a1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,31 +1,133 @@ +version: '3.7' services: -###> symfony/mercure-bundle ### - mercure: - image: dunglas/mercure - restart: unless-stopped + php: + build: + context: . + dockerfile: docker/php/Dockerfile + args: + USER_ID: ${USER_ID:-1000} + GROUP_ID: ${GROUP_ID:-1000} + container_name: escapepage-php + volumes: + - ./:/var/www/html:delegated + - /etc/hosts:/etc/hosts:ro environment: - # Uncomment the following line to disable HTTPS, - #SERVER_NAME: ':80' + APP_ENV: ${APP_ENV:-dev} + depends_on: + - database + - mercure + networks: + backend: + ipv4_address: 172.20.0.10 + restart: unless-stopped + + php-worker: + build: + context: . + dockerfile: docker/php/Dockerfile + args: + USER_ID: ${USER_ID:-1000} + GROUP_ID: ${GROUP_ID:-1000} + container_name: escapepage-php-worker + volumes: + - ./:/var/www/html:delegated + - /etc/hosts:/etc/hosts:ro + environment: + APP_ENV: ${APP_ENV:-dev} + depends_on: + - database + - mercure + command: ["php", "bin/console", "messenger:consume", "async", "-vv"] + networks: + backend: + ipv4_address: 172.20.0.11 + restart: unless-stopped + + nginx: + image: nginx:1.29.4-alpine + container_name: escapepage-nginx + ports: + - "8080:80" + - "8443:443" + volumes: + - ./:/var/www/html:ro + - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro + - ./docker/nginx/ssl:/etc/nginx/ssl:ro + - /etc/hosts:/etc/hosts:ro + depends_on: + - php + networks: + backend: + ipv4_address: 172.20.0.12 + restart: unless-stopped + + mailer: + image: axllent/mailpit:latest + container_name: escapepage-mailer + ports: + - "8025:8025" + volumes: + - /etc/hosts:/etc/hosts:ro + networks: + backend: + ipv4_address: 172.20.0.13 + restart: unless-stopped + + mercure: + image: dunglas/mercure:v0.21 + container_name: escapepage-mercure + environment: + SERVER_NAME: ":80" MERCURE_PUBLISHER_JWT_KEY: ${MERCURE_JWT_SECRET} MERCURE_SUBSCRIBER_JWT_KEY: ${MERCURE_JWT_SECRET} - # Set the URL of your Symfony project (without trailing slash!) as value of the cors_origins directive + MERCURE_CORS_ALLOWED_ORIGINS: ${MERCURE_CORS_ALLOWED_ORIGINS:-http://localhost:8080} + MERCURE_PUBLISH_ALLOWED_ORIGINS: ${MERCURE_CORS_ALLOWED_ORIGINS:-http://localhost:8080} MERCURE_EXTRA_DIRECTIVES: | cors_origins ${MERCURE_CORS_ALLOWED_ORIGINS:-http://localhost:8080} - # Comment the following line to disable the development mode - command: /usr/bin/caddy run --config /etc/caddy/dev.Caddyfile - healthcheck: - test: ["CMD", "curl", "-f", "https://localhost/healthz"] - timeout: 5s - retries: 5 - start_period: 60s + # Allow anonymous subscribers in dev only + anonymous + ports: + - "8090:80" volumes: - - mercure_data:/data - - mercure_config:/config -###< symfony/mercure-bundle ### + - /etc/hosts:/etc/hosts:ro + networks: + backend: + ipv4_address: 172.20.0.14 + restart: unless-stopped -volumes: -###> symfony/mercure-bundle ### - mercure_data: - mercure_config: -###< symfony/mercure-bundle ### +###> doctrine/doctrine-bundle ### + database: + image: mysql:8.0 + container_name: escapepage-db + environment: + MYSQL_DATABASE: ${DB_NAME:-app} + MYSQL_USER: ${DB_USER:-app} + MYSQL_PASSWORD: ${DB_PASSWORD:-!ChangeMe!} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 30s + command: ["--default-authentication-plugin=mysql_native_password", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] + volumes: + - ./var/volumes/db:/var/lib/mysql:rw + - ./docker/mysql/init:/docker-entrypoint-initdb.d:ro + - /etc/hosts:/etc/hosts:ro + # Uncomment the two lines below if you need to access MySQL from your host (workbench, etc.) + ports: + - "3306:3306" + networks: + backend: + ipv4_address: 172.20.0.15 + restart: unless-stopped +###< doctrine/doctrine-bundle ### + +networks: + backend: + driver: bridge + ipam: + config: + - subnet: 172.20.0.0/16 diff --git a/doc/FILES.md b/doc/FILES.md index 92b1493..b84feb0 100644 --- a/doc/FILES.md +++ b/doc/FILES.md @@ -3,8 +3,8 @@ Use this index to quickly locate files and directories during development and in discussions. ## Top-Level -- docker/compose.yaml / docker/compose.override.yaml — Docker services. -- docker/ — Docker build contexts and configs (php Dockerfile, nginx vhost, compose files). +- compose.yaml / compose.override.yaml — Docker services. +- docker/ — Docker build contexts and configs (php Dockerfile, nginx vhost). - composer.json / composer.lock — Dependencies and scripts. - importmap.php — Importmap configuration for JS dependencies. - phpunit.dist.xml — PHPUnit configuration. diff --git a/doc/docker.md b/doc/docker.md index ea506ca..1fe0ac1 100644 --- a/doc/docker.md +++ b/doc/docker.md @@ -21,36 +21,36 @@ App will be served at http://localhost:8080 Alternatively (manual): ``` -docker compose -f docker/compose.yaml -f docker/compose.override.yaml up -d --build +docker compose up -d --build ``` ### 2) Install dependencies The setup script already runs composer install. To run manually: ``` -docker compose -f docker/compose.yaml -f docker/compose.override.yaml exec php composer install +docker compose exec php composer install ``` ### 3) Prepare DB The setup script already prepares the DB. To run manually: ``` -docker compose -f docker/compose.yaml -f docker/compose.override.yaml exec php php bin/console doctrine:database:create --if-not-exists -docker compose -f docker/compose.yaml -f docker/compose.override.yaml exec php php bin/console doctrine:migrations:migrate -n +docker compose exec php php bin/console doctrine:database:create --if-not-exists +docker compose exec php php bin/console doctrine:migrations:migrate -n ``` ### 4) Run tests ``` -docker compose -f docker/compose.yaml -f docker/compose.override.yaml exec php vendor/bin/phpunit +docker compose exec php vendor/bin/phpunit ``` ### 5) Logs ``` -docker compose -f docker/compose.yaml -f docker/compose.override.yaml logs -f nginx -docker compose -f docker/compose.yaml -f docker/compose.override.yaml logs -f php +docker compose logs -f nginx +docker compose logs -f php ``` ### 6) Stop ``` -docker compose -f docker/compose.yaml -f docker/compose.override.yaml down +docker compose down ``` ## Notes diff --git a/docker/compose.override.yaml b/docker/compose.override.yaml deleted file mode 100644 index 828ec7b..0000000 --- a/docker/compose.override.yaml +++ /dev/null @@ -1,23 +0,0 @@ - -services: - php: - environment: - XDEBUG_MODE: off - extra_hosts: - - "host.docker.internal:host-gateway" - depends_on: - - mailer - -###> doctrine/doctrine-bundle ### -###< doctrine/doctrine-bundle ### - -###> symfony/mailer ### - mailer: - image: axllent/mailpit - ports: - - "1025:1025" - - "8025:8025" - environment: - MP_SMTP_AUTH_ACCEPT_ANY: 1 - MP_SMTP_AUTH_ALLOW_INSECURE: 1 -###< symfony/mailer ### diff --git a/docker/compose.yaml b/docker/compose.yaml deleted file mode 100644 index a904226..0000000 --- a/docker/compose.yaml +++ /dev/null @@ -1,137 +0,0 @@ - -version: '3.7' - -services: - php: - build: - context: .. - dockerfile: docker/php/Dockerfile - args: - USER_ID: ${USER_ID:-1000} - GROUP_ID: ${GROUP_ID:-1000} - container_name: escapepage-php - volumes: - - ../:/var/www/html:delegated - - /etc/hosts:/etc/hosts:ro - environment: - APP_ENV: ${APP_ENV:-dev} - depends_on: - - database - - mercure - networks: - backend: - ipv4_address: 172.20.0.10 - restart: unless-stopped - - php-worker: - build: - context: .. - dockerfile: docker/php/Dockerfile - args: - USER_ID: ${USER_ID:-1000} - GROUP_ID: ${GROUP_ID:-1000} - container_name: escapepage-php-worker - volumes: - - ../:/var/www/html:delegated - - /etc/hosts:/etc/hosts:ro - environment: - APP_ENV: ${APP_ENV:-dev} - depends_on: - - database - - mercure - command: ["php", "bin/console", "messenger:consume", "async", "-vv"] - networks: - backend: - ipv4_address: 172.20.0.11 - restart: unless-stopped - - nginx: - image: nginx:1.29.4-alpine - container_name: escapepage-nginx - ports: - - "8080:80" - - "8443:443" - volumes: - - ../:/var/www/html:ro - - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - - ./nginx/ssl:/etc/nginx/ssl:ro - - /etc/hosts:/etc/hosts:ro - depends_on: - - php - networks: - backend: - ipv4_address: 172.20.0.12 - restart: unless-stopped - - mailer: - image: axllent/mailpit:latest - container_name: escapepage-mailer - ports: - - "8025:8025" - volumes: - - /etc/hosts:/etc/hosts:ro - networks: - backend: - ipv4_address: 172.20.0.13 - restart: unless-stopped - - mercure: - image: dunglas/mercure:v0.21 - container_name: escapepage-mercure - environment: - SERVER_NAME: ":80" - MERCURE_PUBLISHER_JWT_KEY: ${MERCURE_JWT_SECRET} - MERCURE_SUBSCRIBER_JWT_KEY: ${MERCURE_JWT_SECRET} - MERCURE_CORS_ALLOWED_ORIGINS: ${MERCURE_CORS_ALLOWED_ORIGINS:-http://localhost:8080} - MERCURE_PUBLISH_ALLOWED_ORIGINS: ${MERCURE_CORS_ALLOWED_ORIGINS:-http://localhost:8080} - MERCURE_EXTRA_DIRECTIVES: | - cors_origins ${MERCURE_CORS_ALLOWED_ORIGINS:-http://localhost:8080} - # Allow anonymous subscribers in dev only - anonymous - ports: - - "8090:80" - volumes: - - /etc/hosts:/etc/hosts:ro - networks: - backend: - ipv4_address: 172.20.0.14 - restart: unless-stopped - -###> doctrine/doctrine-bundle ### - database: - image: mysql:8.0 - container_name: escapepage-db - environment: - MYSQL_DATABASE: ${DB_NAME:-app} - MYSQL_USER: ${DB_USER:-app} - MYSQL_PASSWORD: ${DB_PASSWORD:-!ChangeMe!} - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root} - healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-uroot", "-p${MYSQL_ROOT_PASSWORD:-root}"] - interval: 10s - timeout: 5s - retries: 10 - start_period: 30s - command: ["--default-authentication-plugin=mysql_native_password", "--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci"] - volumes: - - ../var/volumes/db:/var/lib/mysql:rw - - ./mysql/init:/docker-entrypoint-initdb.d:ro - - /etc/hosts:/etc/hosts:ro - # Uncomment the two lines below if you need to access MySQL from your host (workbench, etc.) - ports: - - "3306:3306" - networks: - backend: - ipv4_address: 172.20.0.15 - restart: unless-stopped -###< doctrine/doctrine-bundle ### - -###> doctrine/doctrine-bundle ### -###< doctrine/doctrine-bundle ### - -networks: - backend: - driver: bridge - ipam: - config: - - subnet: 172.20.0.0/16 diff --git a/docker/restart.sh b/docker/restart.sh index b5e1390..5a689d5 100644 --- a/docker/restart.sh +++ b/docker/restart.sh @@ -4,7 +4,7 @@ set -euo pipefail # Script to completely restart the project as requested echo "Stopping and removing containers..." -dc() { (cd "$(dirname "$0")/.." && docker compose -f docker/compose.yaml "$@"); } +dc() { (cd "$(dirname "$0")/.." && docker compose "$@"); } dc down --remove-orphans echo "Clearing Docker build cache..." diff --git a/docker/setup.sh b/docker/setup.sh index d3880ee..1f3fafd 100644 --- a/docker/setup.sh +++ b/docker/setup.sh @@ -28,7 +28,7 @@ else fi # Helper to run docker compose from the project root -dc() { (cd "$ROOT_DIR" && $DOCKER_COMPOSE -f docker/compose.yaml "$@"); } +dc() { (cd "$ROOT_DIR" && $DOCKER_COMPOSE "$@"); } REBUILD=1 RECREATE=0 @@ -132,12 +132,12 @@ Open the app: $APP_URL Mailpit (dev): $MAILPIT_URL Common commands: - (cd "$DOCKER_DIR" && $DOCKER_COMPOSE logs -f nginx) - (cd "$DOCKER_DIR" && $DOCKER_COMPOSE logs -f php) - (cd "$DOCKER_DIR" && $DOCKER_COMPOSE logs -f php-worker) - (cd "$DOCKER_DIR" && $DOCKER_COMPOSE exec php bash) - (cd "$DOCKER_DIR" && $DOCKER_COMPOSE exec php npm run watch) - (cd "$DOCKER_DIR" && $DOCKER_COMPOSE down) + (cd "$ROOT_DIR" && $DOCKER_COMPOSE logs -f nginx) + (cd "$ROOT_DIR" && $DOCKER_COMPOSE logs -f php) + (cd "$ROOT_DIR" && $DOCKER_COMPOSE logs -f php-worker) + (cd "$ROOT_DIR" && $DOCKER_COMPOSE exec php bash) + (cd "$ROOT_DIR" && $DOCKER_COMPOSE exec php npm run watch) + (cd "$ROOT_DIR" && $DOCKER_COMPOSE down) You can re-run this script any time. Use --no-build to skip rebuilding images. EOT