Self-hosted, white-label booking and reservation platform for hotels and short-stay apartments.
328
Self-hosted, white-label booking platform for hotels and short-stay apartments. Laravel 13, Vue 3, Postgres, Typesense.
Source and deployment examples: https://github.com/hesham-fouda/locanda
This image carries the application and nothing else — no database, no cache, no reverse proxy, no process supervisor. Bring your own, or use one of the compose files in the repository.
| Tag | What it is |
|---|---|
beta | The newest release while Locanda is pre-1.0. Use this today. |
0.0.1 | One exact release. Pin it if you want a build that never moves. |
0.0 | The newest patch in the 0.0 series. |
latest | Will appear with the first stable release. It does not exist yet. |
Built for linux/amd64 and linux/arm64.
curl -O https://raw.githubusercontent.com/hesham-fouda/locanda/main/docker-compose.minimal.yml
mv docker-compose.minimal.yml docker-compose.yml
docker compose up -d
That brings up Locanda and Postgres, with photographs on a local volume. Open the published port and the first-run wizard handles markets, currency, tax and the first administrator.
Five more shapes are in the repository — the full stack with Redis, Typesense and MinIO; a managed database; nothing but the app; and overlays for an existing Traefik or Caddy.
docker run -d -p 8080:80 \
-e APP_URL=https://stay.example.com \
-e DB_HOST=postgres -e DB_DATABASE=locanda \
-e DB_USERNAME=locanda -e DB_PASSWORD=secret \
-v locanda-storage:/app/storage/app \
heshamfouda/locanda:beta
One image, four roles, chosen by the command. A Laravel deployment is not one process: webhook delivery and calendar imports are queued, and calendar polling is scheduled. A web-only stack serves every page correctly while quietly never reading a calendar again.
| Command | What it does |
|---|---|
web (default) | Serves the application on port 80 |
worker | Drains the queue; recycles hourly, bounded retries |
scheduler | Runs scheduled work, including calendar sync |
migrate | Applies migrations and exits, for an orchestrator to wait on |
Anything else is run as given, so docker run … php artisan tinker works.
Postgres is required. Not a preference: double booking is prevented by an
EXCLUDE USING gist constraint, the rate and stay rules use generated columns
with a CHECK, and search uses ilike and jsonb. The schema does not build
on anything else. The image defaults DB_CONNECTION to pgsql for that reason.
| Variable | Default | Notes |
|---|---|---|
APP_KEY | generated | Made on first boot and kept in the storage volume if unset |
APP_URL | http://localhost | Signed URLs and OAuth callbacks are built from it |
DB_HOST DB_PORT DB_DATABASE DB_USERNAME DB_PASSWORD | — | Required |
REDIS_HOST REDIS_PASSWORD | — | Optional; the database drivers work without it |
QUEUE_CONNECTION CACHE_STORE SESSION_DRIVER | database | Set to redis when you have one |
SCOUT_DRIVER | collection | typesense for ranked search |
FILESYSTEM_DISK | public | Photographs on the volume; s3 for a bucket |
TZ | Etc/UTC | Container clock and log timestamps |
LOCANDA_AUTO_MIGRATE | false | Migrate on start. Prefer the migrate role with more than one container |
LOCANDA_QUEUES | default | Which queues the worker drains |
/app/storage/app
Photographs on the public disk and the generated application key. Deliberately
not /app/storage — each container keeps its own compiled views there, and
sharing that directory has containers clearing it under each other at boot.
Logs go to the container's output, so docker logs has them.
www-data, not root. The entrypoint starts as root only long
enough to fix ownership on a freshly mounted volume.migrate role,
or LOCANDA_AUTO_MIGRATE=true for a single container.v0.0.1. The catalogue, pricing, availability, checkout, reviews, two-way iCal sync, outbound webhooks and the operator panel are built. No payment provider is wired up yet, so bookings are pay-on-arrival.
Source-available, not OSI open source: free for individuals, non-profits and
businesses earning under USD 5,000/month; a commercial subscription is required
at or above that. See LICENSE.md in the repository.
Content type
Image
Digest
sha256:53f57903c…
Size
109.7 MB
Last updated
about 2 months ago
docker pull heshamfouda/locanda:beta