The development compose file runs the same services as production plus a Next.js dev server with hot reload and a mail catcher, so nothing sends real email while you work.
Getting started
cp backend/.env.example backend/.env
docker compose up -d
docker compose exec app php artisan migrate --seedPorts
| Service | Address |
|---|---|
| Frontend | http://localhost:3000 |
| API (via nginx) | http://localhost:8080 |
| Mail catcher | http://localhost:8025 |
| PostgreSQL | localhost:54320 |
| Redis | localhost:63790 |
Tests
docker compose exec app php artisan test
docker compose exec app ./vendor/bin/phpstan analyse --memory-limit=1GNoteThe frontend container installs its own node_modules into a named volume and shares the .next build directory with the host. Running a production build on the host while the dev server is up overwrites its chunks and breaks it until you clear .next and restart the container.
Queue and scheduler
Both run as containers in development too. If a job seems to do nothing — provisioning, email, billing — check the worker before debugging the code that dispatched it.