Introduction
Renders Podman Quadlet units from your Laravel app's config, then installs them as systemd-managed containers on your host — no all-in-one runtime, no lock-in. Swap any bundled part (Caddy for Nginx, Postgres for MySQL) for your own.
Requirements
- Linux with systemd (rootless or system-wide) — macOS, Windows, and WSL are not supported
- Podman with the
quadletCLI plugin (podman quadlet --helpshould work)
Installation
composer require foxws/laravel-podman --dev
php artisan vendor:publish --tag="podman-config"
Only needed to render Quadlet units — install as a dev dependency and skip it in production. See Customizing for every config key.
Presets
| Preset | What it is |
|---|---|
development | App + services, working copy live-mounted for local editing. Enabled by default. |
frankenphp-octane | Production-style image, app code baked in. Commented out by default. |
devcontainer | VS Code/JetBrains Dev Containers image. Commented out by default. See Devcontainer. |
proxy | Caddy reverse proxy in front of the other services. Enabled by default. |
s3 | CORS policy for S3-compatible storage buckets. |
Custom presets: publish one (php artisan podman:publish frankenphp-octane) without touching the others — see Customizing.
Quick start
-
Render the default presets:
php artisan podman:setup -
Install
lpodonce per host — a dependency-free script, no PHP/Composer needed:curl -fsSL -o ~/.local/bin/lpod https://github.com/foxws/lpod/releases/latest/download/lpodchmod +x ~/.local/bin/lpod -
Install each rendered service (the only step that needs
podmanitself):lpod install development/app.quadlets --replacelpod install development/pgsql.quadlets --replacelpod install development/valkey.quadlets --replacelpod install proxy/proxy.quadlets --replace -
Set secrets, then start:
lpod my-app secretslpod pgsql secretslpod my-app uplpod my-app open
Trust the proxy's local certificate once — see Proxy.
Working on frontend assets? Vite's dev server is opt-in, not part of the default bundle (it needs pnpm install run first, or it'll crash-loop):
lpod install development/vite.quadlets --replace
lpod vite up
No PHP on the host? lpod setup renders the same way without it — see Setting up without PHP.
Commands reference
| Command | Description |
|---|---|
podman:setup | Generate the default set of presets in one go |
podman:publish PRESET | Publish a preset for customization |
podman:generate PRESET | Render a single preset |
podman:s3-setup | Create S3 buckets and a CORS policy (requires aws/aws-sdk-php) |
Installing, listing, removing, and setting secrets is lpod's job, not Artisan's. Full flag reference: Commands.
Warning:
lpod remove/lpod uninstalldelete the Podman volumes they own (databases, uploads, search indexes), with no undo — see Backing up volumes.
The lpod utility
lpod is a separate, dependency-free bash script — no PHP, Composer, or this package required to run it. This package ships one Composer binary, vendor/bin/lpod-setup, which renders presets inside a disposable container for hosts with Podman but no PHP. lpod setup is a shortcut for it. See lpod CLI.
Links
- CHANGELOG
- foxws/lpod — the CLI this package pairs with
- Podman Quadlet reference