Octane Support
Obsidian Admin Laravel now ships with official laravel/octane integration and RoadRunner-oriented defaults.
What is included in the repository:
laravel/octaneincomposer.json- RoadRunner PHP dependencies:
spiral/roadrunner-httpspiral/roadrunner-cli
config/octane.phpphp artisan octane:*commands- application-specific worker reset logic via
app/Listeners/Octane/PrepareObsidianRequestState.php
Important distinction
The repository now includes the Octane package, configuration, and a tracked .rr.yaml baseline template. The RoadRunner binary itself remains machine-specific.
That means:
- the project is in a real Octane installation state
- a fresh clone still needs a local RoadRunner binary before
octane:startcan run - the binary should stay local and is intentionally ignored via
.gitignore - the
.rr.yamlfile is committed so runtime defaults stay reproducible across contributors
Ignored local runtime files:
rr
First-time local setup
After composer install, initialize the local RoadRunner runtime once:
php artisan octane:install --server=roadrunnerThen start Octane:
php artisan octane:start --server=roadrunnerYou can also use the Composer shortcuts committed in the project:
composer run octane:install
composer run octane:startWhat is already hardened for long-lived workers
The codebase includes explicit request-state reset handling for Octane workers:
app/Listeners/Octane/PrepareObsidianRequestState.phpapp/Http/Middleware/AssignRequestId.phpapp/Http/Middleware/SetRequestLocale.phpapp/Support/ApiDateTime.php
Current support model
The default Docker stack still runs the API behind php-fpm.
That is intentional:
- Docker remains the lowest-friction default for contributors
- Octane is available as an explicit runtime choice
- production teams can decide whether they want
php-fpmorOctane + RoadRunner
Recommended wording
Use these descriptions when documenting the project:
ships with official Laravel Octane integrationRoadRunner-oriented Octane setupworker-safe request lifecycle guards
Avoid saying:
RoadRunner binary is committed in the repositoryDocker runs Octane by default
Docker Compose Octane Runtime
Use docker-compose.octane.yml for a full immutable RoadRunner runtime stack:
docker compose -f docker-compose.octane.yml up -d --buildOverride host ports when needed:
APP_HTTP_PORT=18080 REVERB_PUBLIC_PORT=16001 docker compose -f docker-compose.octane.yml up -d --buildServices included: octane, mysql, redis, horizon, scheduler, pulse-worker, and reverb.
This compose file builds the application image and does not bind-mount your workspace, so container startup always uses a Linux-compatible RoadRunner binary.