Приложение для доставки еды, построенное на Laravel 12, RoadRunner, Temporal и PostgreSQL.
- PHP 8.4
- Laravel 12 — фреймворк
- Laravel Octane — высокопроизводительный сервер приложений, используется только для http
- RoadRunner 2025.1 — application server, нужен для temporal
- Temporal 1.29 — оркестрация workflow-процессов
- PostgreSQL 15 — база данных (для Temporal и для приложения)
- Docker & Docker Compose — контейнеризация
| Сервис | Контейнер | Порт | Описание |
|---|---|---|---|
postgresql |
food_delivery_postgres |
5432 | БД для Temporal |
temporal |
food_delivery_temporal |
7233 | Temporal Server (gRPC) |
temporal-ui |
food_delivery_temporal_ui |
8080 | Веб-интерфейс Temporal |
app-postgresql |
food_delivery_app_postgresql |
5433 | БД приложения |
app |
food_delivery_app |
8000 | Laravel-приложение (RoadRunner) |
- Docker >= 20.10
- Docker Compose >= 2.0
git clone git@github.com:agoalofalife-screencasts/temporal-course.git food-delivery
cd food-deliverycp .env.example .envПриложение использует двухступенчатую сборку. Сначала нужно собрать базовый образ с PHP и расширениями (protobuf, gRPC, pgsql и др.): Это долгий процесс на моем M1 - заняло около 4 часов!!
docker build -f docker/Dockerfile.base -t food-delivery-base .docker compose up -d --buildЭта команда:
- Соберёт образ приложения (установит Composer-зависимости, скопирует RoadRunner)
- Поднимет PostgreSQL для Temporal
- Запустит Temporal Server и дождётся его готовности
- Поднимет PostgreSQL для приложения
- Запустит Laravel-приложение через RoadRunner
docker exec food_delivery_app php artisan key:generatedocker exec food_delivery_app php artisan migrate- Приложение: http://localhost:8000
- Temporal UI: http://localhost:8080
# Логи всех сервисов
docker compose logs -f
# Логи конкретного сервиса
docker compose logs -f app
docker compose logs -f temporal# Остановить все сервисы
docker compose down
# Остановить и удалить volumes (БД будут очищены)
docker compose down -vdocker compose up -d --build appdocker exec food_delivery_app php artisan <команда>docker exec food_delivery_app php artisan testdocker exec food_delivery_app composer install
docker exec food_delivery_app composer require <пакет>docker/
Dockerfile.base # Базовый образ: PHP 8.4 + расширения (protobuf, gRPC, pgsql, zip, sockets, pcntl)
Dockerfile # Образ приложения: Composer + RoadRunner + код проекта
- HTTP-сервер на порту
8000 - 2 воркера для HTTP-запросов
- Temporal-воркеры для выполнения Activities
- Адрес Temporal задаётся через переменную окружения
TEMPORAL_ADDRESS
Xdebug настроен на отладку только Activity-воркеров Temporal.
Конфигурация состоит из трёх частей и применяется автоматически при docker compose up --build:
1. Установка Xdebug в контейнере (docker/Dockerfile):
xdebug.mode=debug
xdebug.start_with_request=trigger # сессия стартует только при наличии триггера
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.idekey=PHPSTORM
xdebug.log=/tmp/xdebug.log
xdebug.discover_client_host=02. Сетевая связность контейнер → хост (docker-compose.yml):
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- PHP_IDE_CONFIG=serverName=food-deliveryextra_hosts нужен на Linux, чтобы host.docker.internal резолвился внутри контейнера. На macOS он работает «из коробки», но строка не мешает.
3. Триггер только для Activity-воркеров (.rr.yaml):
temporal:
activities:
num_workers: 2
command: "/usr/bin/env XDEBUG_TRIGGER=PHPSTORM php ./vendor/bin/roadrunner-temporal-worker"/usr/bin/env XDEBUG_TRIGGER=PHPSTORM ставит переменную окружения только для процессов Activity-воркеров. RoadRunner не поддерживает блок env: под temporal.activities, поэтому используется этот inline-приём с явным путём к /usr/bin/env (чтобы не зависеть от PATH).
-
PHP → Servers → создать сервер:
-
Name:
food-delivery(должно совпадать сPHP_IDE_CONFIG=serverName=...) -
Host:
localhost -
Port:
8000 -
Debugger: Xdebug
-
Включить Use path mappings и сопоставить:
Project file (host) Path on server (container) /Users/<you>/.../food-delivery//app/
-
-
PHP → Debug → Xdebug:
- Debug port:
9003 - Включить Can accept external connections
- Debug port:
-
На верхней панели IDE кликнуть «Start Listening for PHP Debug Connections» (иконка телефонной трубки с жуком должна стать зелёной). Без этого шага никаких подключений не будет.
Убедитесь, что PostgreSQL для Temporal полностью запустился. Temporal зависит от healthcheck базы данных:
docker compose ps
docker compose logs temporalЕсли базовый образ не собран, приложение не запустится. Убедитесь, что выполнен шаг 3 (сборка food-delivery-base).
