README
¶
Lerd
Laravel Herd for Linux — a Podman-native local development environment for Laravel projects.
Lerd bundles Nginx, PHP-FPM, and optional services (MySQL, Redis, PostgreSQL, Meilisearch, MinIO) as rootless Podman containers, giving you automatic .test domain routing, per-project PHP/Node version isolation, and one-command TLS — all without touching your system's PHP or web server.
Lerd vs Laravel Sail
Laravel Sail is the official per-project Docker Compose solution. Lerd is a shared infrastructure approach, closer to what Laravel Herd does on macOS. Both are valid — they solve slightly different problems.
| Lerd | Laravel Sail | |
|---|---|---|
| Nginx | One shared container for all sites | Per-project |
| PHP-FPM | One container per PHP version, shared | Per-project container |
| Services (MySQL, Redis…) | One shared instance | Per-project (or manually shared) |
.test domains |
Automatic, zero config | Manual /etc/hosts or dnsmasq |
| HTTPS | lerd secure → trusted cert instantly |
Manual or roll your own mkcert |
| RAM with 5 projects running | ~200 MB | ~1–2 GB (5× stacks) |
| Requires changes to project files | No | Yes — needs docker-compose.yml committed |
| Works on legacy / client repos | Yes — just lerd link |
Only if you can add Sail |
| Defined in code (infra-as-code) | No | Yes |
| Team parity (all OS) | Linux only | macOS, Windows, Linux |
Choose Sail when: your team uses it, you need per-project service versions, or you want infrastructure defined in the repo.
Choose Lerd when: you work across many projects at once and don't want a separate stack per repo, you can't modify project files, you want instant .test routing, or you're on Linux and want the Herd experience.
Requirements
- Linux (Arch, Debian/Ubuntu, or Fedora-based)
- Podman (rootless, with systemd user session active)
- NetworkManager (for
.testDNS) systemctl --userfunctional (loginctl enable-linger $USERif needed)unzip(used during install to extract fnm)certutil/nss-tools(for mkcert to install the CA into Chrome/Firefox —nsson Arch,libnss3-toolson Debian/Ubuntu,nss-toolson Fedora)
Go is only needed to build from source. The released binary has no runtime dependencies.
Installation
One-line installer (recommended)
With curl:
curl -fsSL https://raw.githubusercontent.com/geodro/lerd/main/install.sh | bash
With wget:
wget -qO- https://raw.githubusercontent.com/geodro/lerd/main/install.sh | bash
This will:
- Check and offer to install missing prerequisites (Podman, NetworkManager, unzip)
- Download the latest
lerdbinary for your architecture (amd64 / arm64) - Install it to
~/.local/bin/lerd - Add
~/.local/binto your shell'sPATH(bash, zsh, or fish) - Automatically run
lerd installto complete environment setup
DNS setup:
lerd installwrites to/etc/NetworkManager/dnsmasq.d/and/etc/NetworkManager/conf.d/and restarts NetworkManager. This is the only step that requiressudo.
After install, reload your shell or open a new terminal so PATH takes effect.
Install from a local build
If you built from source and want to skip the GitHub download:
make build
bash install.sh --local ./build/lerd
Update
lerd update
Fetches the latest release from GitHub, downloads the binary for your architecture, and atomically replaces the running binary. No restart needed.
You can also re-run the installer:
curl -fsSL https://raw.githubusercontent.com/geodro/lerd/main/install.sh | bash -s -- --update
wget -qO- https://raw.githubusercontent.com/geodro/lerd/main/install.sh | bash -s -- --update
Uninstall
lerd uninstall
Stops all containers, disables and removes Quadlet units, removes the watcher service, removes the binary, and cleans up the PATH entry from your shell config. Prompts before deleting config and data directories.
To skip all prompts:
lerd uninstall --force
Check prerequisites only
bash install.sh --check
From source
git clone https://github.com/geodro/lerd
cd lerd
make build
make install # installs to ~/.local/bin/lerd
make install-installer # installs lerd-installer to ~/.local/bin/
lerd install will:
- Create XDG config and data directories
- Create the
lerdPodman network - Download static binaries: Composer, fnm, mkcert
- Install the mkcert CA into your system trust store
- Write and start the
lerd-dnsandlerd-nginxPodman Quadlet containers - Enable the
lerd-watcherbackground service (auto-discovers new projects) - Add
~/.local/share/lerd/binto your shell'sPATH
Quick start
# 1. Park your projects directory — any Laravel project inside is auto-registered
lerd park ~/Lerd
# 2. Visit your project in a browser
# ~/Lerd/my-app → http://my-app.test
# 3. Check everything is running
lerd status
That's it. Nginx is serving your project through PHP-FPM, all inside Podman containers on the lerd network.
Web UI
Lerd includes a browser dashboard, served at http://127.0.0.1:7073 by the lerd-ui systemd service (started automatically with lerd install).

The UI gives you a visual overview of your entire Lerd environment without touching the terminal:
- Sites tab — lists all registered projects with their domain, path, PHP version, Node version, and per-site controls:
- HTTPS toggle — enable or disable TLS with one click; updates
APP_URLin.envautomatically - PHP / Node dropdowns — change the version per site; writes
.php-version/.node-versioninto the project and regenerates the nginx vhost on the fly - Queue toggle — start or stop the Laravel queue worker for a site; amber when running; click the logs link next to the toggle to open the live log drawer for that worker
- Unlink button — remove a site from nginx without touching the terminal; for parked sites the directory is left on disk (run
lerd linkto re-register it) - Click any row — opens the live PHP-FPM log drawer at the bottom of the screen
- HTTPS toggle — enable or disable TLS with one click; updates
- Services tab — shows all available services (MySQL, Redis, PostgreSQL, Meilisearch, MinIO, Mailpit, Soketi) with their current status. Start or stop any service with one click; each panel shows the correct
.envconnection values with a one-click copy button. - System tab — health check panel for DNS, nginx, PHP-FPM containers, and the autostart toggle.
- Updates — shows the current and latest version. When an update is available, a notice with the version number is shown alongside an instruction to run
lerd updatein a terminal (the update requiressudofor sysctl/sudoers steps and cannot run in the background).
System Tray
lerd tray launches a system tray applet that gives you at-a-glance status and one-click control without opening a browser.
lerd tray # launch (detaches from terminal automatically)
lerd tray --mono=false # use the red colour icon instead of monochrome white
The tray detaches from the terminal immediately — your shell prompt returns straight away.
Menu layout
🟢 Running ← overall status (disabled, informational)
🟢 nginx
🟢 dns
─────────────────
Open Dashboard ← opens http://127.0.0.1:7073
Stop Lerd ← toggles between Start / Stop Lerd
─────────────────
── Services ──
🟢 mysql ← click to stop
🔴 redis ← click to start
─────────────────
── PHP ──
✔ 8.4 ← current default (click to switch)
8.3
─────────────────
Autostart at login: ✔ On ← click to toggle
Check for update...
Stop Lerd & Quit ← runs lerd stop then exits the tray
The menu refreshes every 5 seconds. Clicking a service toggles it on/off. Clicking a PHP version sets it as the global default. "Stop Lerd & Quit" stops the entire environment before closing.
Autostart
To have the tray start automatically when you log in:
lerd autostart tray enable
lerd autostart tray disable
The tray is also started automatically by lerd start if it isn't already running.
Desktop environment compatibility
The tray uses the StatusNotifierItem (SNI) / AppIndicator protocol (DBus-based).
| Environment | Status |
|---|---|
| KDE Plasma | Works out of the box |
| GNOME | Requires the AppIndicator and KStatusNotifierItem Support extension |
| Sway / Hyprland with waybar | Works with "tray" module in waybar config |
| i3 with i3bar | Requires snixembed to bridge SNI → XEmbed |
| XFCE / LXQt | Works out of the box |
Build requirements
The tray uses CGO and requires libappindicator3 at build time:
| Distro | Package |
|---|---|
| Arch | libappindicator-gtk3 |
| Debian / Ubuntu | libappindicator3-dev |
| Fedora | libappindicator-gtk3-devel |
For headless / CI builds without AppIndicator:
make build-nogui # produces ./build/lerd-nogui — lerd tray returns an error
Commands
Setup & lifecycle
| Command | Description |
|---|---|
lerd install |
One-time setup: directories, network, binaries, DNS, nginx, watcher |
lerd start |
Start DNS, nginx, PHP-FPM containers, and all installed services |
lerd stop |
Stop DNS, nginx, PHP-FPM containers, and all running services |
lerd update |
Update to the latest release |
lerd uninstall |
Stop all containers and remove Lerd |
lerd uninstall --force |
Same, skipping all confirmation prompts |
lerd autostart enable |
Start Lerd automatically on every login |
lerd autostart disable |
Disable autostart on login |
lerd tray |
Launch the system tray applet (detaches from terminal) |
lerd autostart tray enable |
Start the tray applet automatically on graphical login |
lerd autostart tray disable |
Disable tray autostart |
lerd dns:check |
Verify that *.test resolves to 127.0.0.1 |
lerd status |
Health summary: DNS, nginx, PHP-FPM containers, services, cert expiry |
lerd logs [-f] [target] |
Show logs for the current project's FPM container, nginx, a service name, or a PHP version |
Project setup
| Command | Description |
|---|---|
lerd setup |
Interactive project bootstrap — checkbox list of steps to run in sequence |
lerd setup --all |
Run all setup steps without prompting (useful in CI) |
lerd setup --skip-open |
Same as above but don't open the browser at the end |
Site management
| Command | Description |
|---|---|
lerd park [dir] |
Register all Laravel projects inside dir (defaults to cwd) |
lerd unpark [dir] |
Remove a parked directory and unlink all its sites |
lerd link [name] |
Register the current directory as a site |
lerd link [name] --domain foo.test |
Register with a custom domain |
lerd unlink [name] |
Stop serving the site; for parked dirs keeps the registry entry so the watcher won't re-register it |
lerd sites |
Table view of all registered sites |
lerd open [name] |
Open the site in the default browser |
lerd share [name] |
Expose the site publicly via ngrok or Expose (auto-detected) |
lerd secure [name] |
Issue a mkcert TLS cert and enable HTTPS for a site — updates APP_URL in .env |
lerd unsecure [name] |
Remove TLS and switch back to HTTP — updates APP_URL in .env |
lerd env |
Configure .env for the current project with lerd service connection settings |
Domain naming: directories with real TLDs are automatically normalised — dots are replaced with dashes and the TLD is stripped before appending
.test. For exampleadmin.astrolov.com→admin-astrolov.test.
Unlink behaviour for parked sites: when you unlink a site that lives inside a parked directory, the vhost is removed but the registry entry is kept and marked as ignored — the watcher will not re-register it on its next scan. Running
lerd linkin that directory clears the ignored flag and restores the site.
PHP
| Command | Description |
|---|---|
lerd use <version> |
Set the global PHP version and build the FPM image if needed |
lerd isolate <version> |
Pin PHP version for cwd — writes .php-version |
lerd php:list |
List all installed PHP-FPM versions |
lerd php:rebuild |
Force-rebuild all installed PHP-FPM images (run after lerd update if needed) |
lerd fetch [version...] |
Pre-build PHP FPM images for the given (or all supported) versions so first use isn't slow |
lerd php [args...] |
Run PHP in the project's container |
lerd artisan [args...] |
Run php artisan in the project's container |
lerd xdebug on [version] |
Enable Xdebug for a PHP version — rebuilds the FPM image and restarts the container |
lerd xdebug off [version] |
Disable Xdebug — rebuilds without Xdebug and restarts |
lerd xdebug status |
Show Xdebug enabled/disabled for all installed PHP versions |
If no version is given, the version is resolved from the current directory (.php-version or composer.json, falling back to the global default).
Xdebug is configured with:
xdebug.mode=debugxdebug.start_with_request=yesxdebug.client_host=host.containers.internal(reaches your host IDE from the container)xdebug.client_port=9003
Node
| Command | Description |
|---|---|
lerd isolate:node <version> |
Pin Node version for cwd — writes .node-version, runs fnm install |
lerd node [args...] |
Run node using the project's version via fnm |
lerd npm [args...] |
Run npm using the project's version via fnm |
lerd npx [args...] |
Run npx using the project's version via fnm |
Services
| Command | Description |
|---|---|
lerd service start <name> |
Start a service (auto-installs on first use) |
lerd service stop <name> |
Stop a service container |
lerd service restart <name> |
Restart a service container |
lerd service status <name> |
Show systemd unit status |
lerd service list |
Show all services and their current state |
Available services: mysql, redis, postgres, meilisearch, minio, mailpit, soketi.
Database shortcuts
Reads DB_CONNECTION, DB_DATABASE, DB_USERNAME, and DB_PASSWORD from the project's .env and runs the appropriate command inside the service container.
| Command | Description |
|---|---|
lerd db:create [name] |
Create a database and a <name>_testing database for the current project |
lerd db:import <file.sql> |
Import a SQL dump into the current site's database |
lerd db:export [-o file.sql] |
Export the current site's database (defaults to <database>.sql) |
lerd db:shell |
Open an interactive MySQL or PostgreSQL shell for the current project |
lerd db create [name] |
Same as db:create (subcommand form) |
lerd db import <file.sql> |
Same as db:import (subcommand form) |
lerd db export |
Same as db:export (subcommand form) |
lerd db shell |
Same as db:shell (subcommand form) |
lerd db:create name resolution (first match wins):
- Explicit
[name]argument DB_DATABASEfrom the project's.env- Project name derived from the registered site name (or directory name)
A <name>_testing database is always created alongside the main one. If a database already exists the command reports it instead of failing.
Supports DB_CONNECTION=mysql / mariadb (via lerd-mysql) and pgsql / postgres (via lerd-postgres).
Sharing sites
lerd share exposes the current site via a public tunnel. Requires ngrok or Expose to be installed.
| Command | Description |
|---|---|
lerd share |
Share the current site (auto-detects ngrok or Expose) |
lerd share <name> |
Share a named site |
lerd share --ngrok |
Force ngrok |
lerd share --expose |
Force Expose |
The tunnel forwards to nginx's local port with the site's domain as the Host header, so nginx routes the request to the right vhost even though the incoming request has the public tunnel URL as its host.
Queue workers
Lerd can run Laravel queue workers as persistent systemd user services. The worker runs php artisan queue:work inside the project's PHP-FPM container and restarts automatically on failure.
| Command | Description |
|---|---|
lerd queue:start |
Start a queue worker for the current project |
lerd queue:stop |
Stop the queue worker for the current project |
lerd queue start |
Same as queue:start (subcommand form) |
lerd queue stop |
Same as queue:stop (subcommand form) |
Options for queue:start:
| Flag | Default | Description |
|---|---|---|
--queue |
default |
Queue name to process |
--tries |
3 |
Max attempts before marking a job as failed |
--timeout |
60 |
Seconds a job may run before timing out |
Example:
cd ~/Lerd/my-app
lerd queue:start --queue=emails,default --tries=5 --timeout=120
# Systemd unit: lerd-queue-my-app.service
# Logs: journalctl --user -u lerd-queue-my-app -f
Queue workers are also controllable from the Sites tab in the web UI — the amber toggle starts/stops the worker and the logs link opens a live log drawer in the browser.
Shell completion
lerd completion bash # add to ~/.bashrc
lerd completion zsh # add to ~/.zshrc
lerd completion fish # add to ~/.config/fish/completions/lerd.fish
PHP version resolution
When serving a request, Lerd picks the PHP version for a project in this order:
.lerd.yamlin the project root —php_versionfield (explicit lerd override)composer.json—require.phpconstraint (e.g.^8.4→8.4).php-versionfile in the project root (plain text, e.g.8.2)- Global default in
~/.config/lerd/config.yaml
To pin a project permanently:
cd ~/Lerd/my-app
lerd isolate 8.2
# writes .php-version: 8.2 — commit this if you like
To change the global default:
lerd use 8.4
Node version resolution
.nvmrcin the project root.node-versionin the project rootpackage.json—engines.nodefield- Global default in
~/.config/lerd/config.yaml
To pin a project:
cd ~/Lerd/my-app
lerd isolate:node 20
# writes .node-version and runs: fnm install 20
HTTPS / TLS
Lerd uses mkcert — a locally-trusted CA that your browser will accept without warnings.
cd ~/Lerd/my-app
lerd secure
# Issues a cert for my-app.test, regenerates the SSL vhost, reloads nginx
# Updates APP_URL=https://my-app.test in .env if it exists
# Visit https://my-app.test — no certificate warning
lerd unsecure
# Removes the cert, switches back to HTTP vhost
# Updates APP_URL=http://my-app.test in .env if it exists
Certificates are stored in ~/.local/share/lerd/certs/sites/.
Project bootstrap — lerd setup
lerd setup automates the standard steps for getting a fresh Laravel clone running locally. Run it from the project root:
cd ~/Projects/my-app
lerd setup
A checkbox list appears with all available steps pre-selected based on the current project state. Toggle steps with space, confirm with enter, then watch them run sequentially.
→ Registering site...
Linked: my-app -> my-app.test (PHP 8.4, Node 24)
? Select setup steps to run:
◉ composer install
◉ npm ci
◉ lerd env
◯ lerd mcp:inject
◉ php artisan migrate
◯ php artisan db:seed
◉ npm run build
◯ lerd secure
◉ lerd open
lerd link always runs first (before the checkbox UI appears) to ensure the site is registered with the correct PHP version. This is mandatory — it handles both freshly cloned projects and projects already auto-registered by a parked directory.
Smart defaults:
| Step | Default | Condition |
|---|---|---|
composer install |
✅ on | only if vendor/ is missing |
npm ci |
✅ on | only if node_modules/ is missing and package.json exists |
lerd env |
✅ on | always |
lerd mcp:inject |
☐ off | opt-in |
php artisan migrate |
✅ on | always |
php artisan db:seed |
☐ off | opt-in |
npm run build |
✅ on | only if package.json exists |
lerd secure |
☐ off | opt-in |
lerd open |
✅ on | always |
If a step fails, you are prompted to continue or abort:
✗ migrate failed: exit status 1
Continue with remaining steps? [y/N]:
Flags:
| Flag | Description |
|---|---|
--all / -a |
Select all steps without showing the prompt (CI/automation) |
--skip-open |
Skip opening the browser at the end |
Environment setup — lerd env
lerd env sets up the .env file for a Laravel project in one command:
cd ~/Lerd/my-app
lerd env
What it does:
- Creates
.envfrom.env.exampleif no.envexists yet - Detects which services the project uses by inspecting the existing env keys —
DB_CONNECTION,REDIS_HOST,MAIL_HOST,SCOUT_DRIVER,FILESYSTEM_DISK,BROADCAST_CONNECTION, etc. - Writes lerd connection values for each detected service (hosts, ports, credentials) — preserving all comments and line order
- Creates the project database (and a
<name>_testingdatabase) inside the running service container; reports if they already exist - Starts any referenced service that is not already running
- Sets
APP_URLto the project's registered.testdomain (https://if secured,http://otherwise) - Generates
APP_KEYviaphp artisan key:generateif the key is missing or empty
Example output:
Creating .env from .env.example...
Detected mysql — applying lerd connection values
Detected redis — applying lerd connection values
Detected mailpit — applying lerd connection values
Setting APP_URL=http://my-app.test
Generating APP_KEY...
Done.
Running lerd env on a project that already has a .env is safe — it only updates connection-related keys and leaves everything else untouched.
AI assistant integration (MCP)
Lerd ships a Model Context Protocol server, letting AI assistants (Claude Code, JetBrains Junie, and any other MCP-compatible tool) manage your dev environment directly — run migrations, start services, toggle queue workers, and inspect logs without leaving the chat.
Injecting the config
Run this once from a Laravel project root:
cd ~/Lerd/my-app
lerd mcp:inject
This writes three files:
| File | Purpose |
|---|---|
.mcp.json |
MCP server entry for Claude Code |
.claude/skills/lerd/SKILL.md |
Skill file that teaches Claude about lerd tools |
.junie/mcp/mcp.json |
MCP server entry for JetBrains Junie |
The command merges into existing configs — other MCP servers (e.g. laravel-boost, herd) are left untouched. Re-running it is safe.
To target a different directory:
lerd mcp:inject --path ~/Lerd/another-app
Available MCP tools
Once the MCP server is connected, your AI assistant has access to:
| Tool | Description |
|---|---|
sites |
List all registered lerd sites (name, domain, path, PHP version, queue status) |
artisan |
Run php artisan in the PHP-FPM container — migrations, generators, seeders, cache, tinker |
service_start |
Start an infrastructure service (mysql, redis, postgres, …) |
service_stop |
Stop a service |
queue_start |
Start a queue worker for a site |
queue_stop |
Stop a queue worker |
logs |
Fetch recent container logs (nginx, any service, PHP version, or site name) |
Example interactions
You: run migrations for the whitewaters project
AI: → sites() # finds path /home/user/Lerd/whitewaters
→ artisan(path: "/home/user/Lerd/whitewaters", args: ["migrate"])
✓ Ran 3 migrations in 42ms
You: the app is throwing 500s — check the logs
AI: → logs(target: "8.4", lines: 50)
PHP Fatal error: Class "App\Jobs\ProcessOrder" not found ...
Configuration
Global config — ~/.config/lerd/config.yaml
Created automatically on first run with sensible defaults:
php:
default_version: "8.5"
node:
default_version: "22"
nginx:
http_port: 80
https_port: 443
dns:
tld: "test"
parked_directories:
- ~/Lerd
services:
mysql: { enabled: true, image: "mysql:8.0", port: 3306 }
redis: { enabled: true, image: "redis:7-alpine", port: 6379 }
postgres: { enabled: false, image: "postgres:16-alpine", port: 5432 }
meilisearch: { enabled: false, image: "getmeili/meilisearch:v1.7", port: 7700 }
minio: { enabled: false, image: "minio/minio:latest", port: 9000 }
mailpit: { enabled: false, image: "axllent/mailpit:latest", port: 1025 }
soketi: { enabled: false, image: "quay.io/soketi/soketi:latest-16-alpine", port: 6001 }
Per-project config — .lerd.yaml
Optional file in a project root to override site settings:
php_version: "8.2"
node_version: "18"
domain: "my-app.test" # override the auto-generated domain
secure: true
Directory layout
~/.config/lerd/
└── config.yaml
~/.config/containers/systemd/ # Podman Quadlet units (auto-loaded)
~/.config/systemd/user/
└── lerd-watcher.service
~/.local/share/lerd/
├── bin/ # mkcert, fnm, static PHP binaries
├── nginx/
│ ├── nginx.conf
│ ├── conf.d/ # one .conf per site (auto-generated)
│ └── logs/
├── certs/
│ ├── ca/
│ └── sites/ # per-domain .crt + .key
├── data/ # Podman volume bind-mounts
│ ├── mysql/
│ ├── redis/
│ ├── postgres/
│ ├── meilisearch/
│ └── minio/
├── dnsmasq/
│ └── lerd.conf
└── sites.yaml
Architecture
All containers join the rootless Podman network lerd. Communication between Nginx and PHP-FPM uses container names as hostnames:
Browser → 127.0.0.1:80 → lerd-nginx
└─ fastcgi_pass lerd-php84-fpm:9000
└─ lerd-php84-fpm (mounts ~/Lerd read-only)
*.test → DNS → 127.0.0.1
└─ lerd-dns (dnsmasq, host network, port 5300)
← NetworkManager forwards .test queries here
| Component | Technology |
|---|---|
| CLI | Go + Cobra, single static binary |
| Web server | Podman Quadlet — nginx:alpine |
| PHP-FPM | Podman Quadlet per version — locally built image with all Laravel extensions |
| PHP CLI | php binary inside the FPM container (podman exec) |
| Composer | composer.phar via bundled PHP CLI |
| Node | fnm binary, version per project |
| Services | Podman Quadlet containers |
| DNS | dnsmasq container + NetworkManager integration |
| TLS | mkcert — locally trusted CA |
Building
The default build requires CGO and libappindicator3 for the system tray (see Build requirements above).
make build # → ./build/lerd (CGO, with tray support)
make build-nogui # → ./build/lerd-nogui (no CGO, no tray)
make install # build + install to ~/.local/bin/lerd
make test # go test ./...
make clean # remove ./build/
Cross-compile for arm64 (without tray):
CGO_ENABLED=0 GOARCH=arm64 GOOS=linux go build -tags nogui -o ./build/lerd-arm64 ./cmd/lerd
Service credentials (defaults)
Services run as Podman containers on the lerd network. Two sets of hostnames apply:
- From host tools (e.g. TablePlus, Redis CLI): use
127.0.0.1 - From your Laravel app (PHP-FPM runs inside the
lerdnetwork): use container hostnames (e.g.lerd-mysql)
lerd service start <name> prints the correct .env variables to paste into your project.
| Service | Host (host tools) | Host (Laravel .env) |
Port | User | Password | DB |
|---|---|---|---|---|---|---|
| MySQL | 127.0.0.1 | lerd-mysql | 3306 | root | lerd |
lerd |
| PostgreSQL | 127.0.0.1 | lerd-postgres | 5432 | postgres | lerd |
lerd |
| Redis | 127.0.0.1 | lerd-redis | 6379 | — | — | — |
| Meilisearch | 127.0.0.1 | lerd-meilisearch | 7700 | — | — | — |
| MinIO | 127.0.0.1 | lerd-minio | 9000 | lerd |
lerdpassword |
— |
| Mailpit SMTP | 127.0.0.1 | lerd-mailpit | 1025 | — | — | — |
| Soketi | 127.0.0.1 | lerd-soketi | 6001 | — | — | — |
MinIO console is available at http://127.0.0.1:9001.
Mailpit web UI is available at http://127.0.0.1:8025.
Soketi metrics are available at http://127.0.0.1:9601.
Troubleshooting
.test domains not resolving
lerd dns:check
# If it fails:
sudo systemctl restart NetworkManager
lerd dns:check
Nginx not serving a site
lerd status # check nginx and FPM are running
podman logs lerd-nginx # nginx error log
cat ~/.local/share/lerd/nginx/conf.d/my-app.test.conf # check generated vhost
PHP-FPM container not running
systemctl --user status lerd-php84-fpm
systemctl --user start lerd-php84-fpm
podman logs lerd-php84-fpm
Permission denied on port 80/443
Rootless Podman cannot bind to ports below 1024 by default. Allow it:
sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80
# Make permanent:
echo 'net.ipv4.ip_unprivileged_port_start=80' | sudo tee /etc/sysctl.d/99-lerd.conf
Watcher service not running
systemctl --user status lerd-watcher
systemctl --user start lerd-watcher
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
lerd
command
|
|
|
internal
|
|
|
envfile
Package envfile provides helpers for reading and updating .env files while preserving comments, blank lines, and line order.
|
Package envfile provides helpers for reading and updating .env files while preserving comments, blank lines, and line order. |
|
version
Package version holds build-time version information injected via ldflags.
|
Package version holds build-time version information injected via ldflags. |
|
pkg
|
|