---
title: "Deploy QloApps"
description: "Hotel management software with a built-in booking website"
category: "Other"
url: https://railway.com/deploy/qloapps
---

# Deploy QloApps

Hotel management software with a built-in booking website

**[Deploy QloApps on Railway](https://railway.com/template/qloapps)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/qloapps/manifest.json

- **Creator:** A3A
- **Category:** Other

## Template content

### MySQL https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mysql.svg

- **Image:** mysql:9.4
- **Start command:** `docker-entrypoint.sh mysqld --innodb-use-native-aio=0 --disable-log-bin --performance_schema=0 --innodb-buffer-pool-size=1G`

### qloapps https://raw.githubusercontent.com/Qloapps/QloApps/v1.7.0/img/logo.jpg

- **Source:** https://github.com/gridalpha/qloapps-railway
- **Health check:** /healthz
- **Public domain:** Yes

### mailpit https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/mailpit.svg

- **Image:** axllent/mailpit:latest
- **Health check:** /livez
- **Public domain:** Yes

## Documentation

# Deploy and Host QloApps on Railway

QloApps is a free, open-source hotel management suite bundling three products a property
normally buys separately: a Property Management System for the front desk, a
commission-free booking engine, and a public hotel website with a room-search widget on
the homepage. Built by Webkul on the PrestaShop 1.6 core, it suits independent hotels,
guest houses, hostels and small chains that want direct bookings without paying an OTA
15–20% per reservation. Arrivals, departures, room allocation, rates, refunds and
invoices live in the same back office as the storefront that took the booking.

Deploy QloApps on Railway and you get a working hotel out of the box. The template runs
three services: `qloapps`, the Apache/PHP application serving the public site and the back
office; `MySQL`, the managed database holding rooms, rates, guests and orders; and
`mailpit`, a private SMTP server capturing booking confirmations and password resets so
you can watch mail working before choosing a relay. The app reaches both over the private
network; only the storefront and the inbox get public URLs. A volume at `/data` holds room
photography, uploads, invoices, module code and the shop's settings file, so everything
survives a redeploy.

![Diagram of the QloApps, MySQL and Mailpit services on Railway](https://res.cloudinary.com/rroe4rtk/image/upload/v1788845371/qloapps-architecture.png)

## Getting Started with QloApps on Railway

Set `QLO_ADMIN_EMAIL` and `QLO_ADMIN_PASSWORD` before you deploy; those become the hotel
manager account, and nothing else is required. The first boot creates the database role,
installs the schema and seeds a demo property called Hotel Prime with four room types,
photographs and pricing — about a minute, after which `/healthz` answers.

Open the public URL and you land on a real hotel website with a working availability
search. For the back office, append `QLO_ADMIN_DIR` — `/backoffice/` by default — and sign
in. QloApps refuses to serve one at `/admin`, so change it to something private.

Your first useful action is **Hotel Reservation System → Manage Hotel**: replace the demo
property with your own name, address and contact details, then open **Catalog → Manage
Room Types** for real rooms and rates. Book a room from the storefront to confirm the whole
path works — it appears at once under **Customers → Booking Carts**, and the confirmation
email lands in the Mailpit inbox on its own URL, protected by `MP_UI_AUTH`. Point
`QLO_SMTP_HOST`, `QLO_SMTP_PORT`, `QLO_SMTP_USER` and `QLO_SMTP_PASSWORD` at your provider
to send real mail; set `QLO_INSTALL_FIXTURES=0` before the first deploy for an empty shop.

![QloApps hotel homepage with its room availability search bar](https://res.cloudinary.com/rroe4rtk/image/upload/v1788845373/qloapps-hotel-homepage.png)
![Room type page showing nightly price and rooms left](https://res.cloudinary.com/rroe4rtk/image/upload/v1788845375/qloapps-room-type-booking.png)
![Back office booking calendar with room availability by date](https://res.cloudinary.com/rroe4rtk/image/upload/v1788845379/qloapps-front-desk-calendar.png)

## About Hosting QloApps

QloApps replaces the usual three-vendor stack — website builder, booking widget and PMS —
with one application and one database, inheriting PrestaShop's catalogue, tax, currency
and invoice engine, applied to rooms and nights.

- Room-type catalogue with occupancy rules, bed types, amenities and galleries
- Availability calendar and front-desk booking screen for walk-in guests
- Advance payment, cancellation and refund rules; invoices and credit slips
- Multi-property, multi-currency, multi-language and per-country tax rules
- PrestaShop's modules and themes, plus a channel manager for OTAs

The architecture is deliberately small. `qloapps` serves the storefront, the back office
and the API from one origin, because the session cookie has to be same-origin. `MySQL`
stores everything transactional, and the app never connects as its superuser: each boot
creates a dedicated `qloapps` database and a role granted only on it, then runs as that
role, so a third-party module cannot reach anything else.

## Why Deploy QloApps on Railway

Railway removes the server administration a PHP application normally drags along.

- Managed MySQL with backups, no `my.cnf` to tune
- Private networking between the app, database and mail server
- HTTPS and a domain on the first deploy, custom domains in a click
- One volume for photography, invoices and uploads
- Health checks, logs and scaling, nothing to configure

## Common Use Cases

- **Independent hotels and B&Bs** taking commission-free direct bookings instead of paying
  an OTA on every reservation
- **Hostels and guest houses** needing occupancy and rate management without a per-room
  PMS subscription
- **Small chains** running several properties from one back office

## Dependencies for QloApps

- **qloapps** — built from [gridalpha/qloapps-railway](https://github.com/gridalpha/qloapps-railway),
  packaging [QloApps 1.7.0](https://github.com/Qloapps/QloApps) on `php:8.3-apache` with
  the extensions it requires (`gd`, `intl`, `zip`, `soap`, `bcmath`, `pdo_mysql`,
  `mysqli`, `exif`, `opcache`). It installs the shop headlessly, so there is no wizard and
  no window in which the site has no owner.
- **MySQL** — `mysql:9.4`. Rooms, rates, reservations, guests, invoices and every
  configuration value live here.
- **mailpit** — `axllent/mailpit:latest`, SMTP on private port 1025 with a web inbox. It
  never forwards mail, so confirmations are captured until you set a relay.


### Environment Variables Reference

| Variable | Purpose |
|---|---|
| `QLO_ADMIN_EMAIL` | Email address of the hotel manager account |
| `QLO_ADMIN_PASSWORD` | Password for that account; at least 8 characters |
| `QLO_ADMIN_DIR` | Back office directory; cannot be `admin` |
| `QLO_INSTALL_FIXTURES` | `1` installs the demo property, `0` starts empty |
| `QLO_PUBLIC_DOMAIN` | Set this when you attach a custom domain |
| `QLO_SMTP_HOST` | SMTP server; point at your relay to send real mail |
| `MP_UI_AUTH` | `user:password` for the Mailpit inbox |

### Deployment Dependencies

Source: https://github.com/gridalpha/qloapps-railway — upstream:
https://github.com/Qloapps/QloApps and https://qloapps.com/documentation/

## Hardware Requirements for Self-Hosting QloApps

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB app, 512 MB MySQL | 2 GB app, 1 GB MySQL |
| Storage | 5 GB volume | 10 GB+ once photography grows |
| Runtime | PHP 8.1–8.4, MySQL 5.7+ | PHP 8.3, MySQL 9 |

Apache runs prefork because mod_php requires it, and each worker holds a full PHP
interpreter. The image sizes the pool from the container's memory limit, so a bigger plan
raises concurrency.

## Self-Hosting QloApps

To run it locally, clone the deployment repository and build the image:

```
git clone https://github.com/gridalpha/qloapps-railway.git
cd qloapps-railway
docker build -t qloapps .
```

Then start MySQL and the application. The entrypoint creates the database and its scoped
role itself, so the only credential you supply is the admin connection string:

```
docker network create qlonet
docker run -d --name qlo-mysql --network qlonet \
  -e MYSQL_ROOT_PASSWORD=change-me mysql:9.4
docker run -d --name qloapps --network qlonet -p 8080:8080 -v qlo-data:/data \
  -e PORT=8080 -e MYSQL_URL="mysql://root:change-me@qlo-mysql:3306/mysql" \
  -e QLO_DB_PASSWORD="a-long-random-string" \
  -e QLO_ADMIN_EMAIL="manager@yourhotel.com" \
  -e QLO_ADMIN_PASSWORD="a-strong-password" qloapps
```

The site is then on `http://localhost:8080`, the back office on `/backoffice/`. Upstream's
`webkul/qloapps_docker` bundles its own MySQL and needs a human to finish a browser
installer, which is why this template builds its own image.

## Is QloApps Free to Self-Host?

QloApps is free and open source under the Open Software License 3.0 — no per-room fee, no
per-booking commission, no licence key. Webkul sells optional add-ons such as a channel
manager, payment gateways and themes, but the core PMS, booking engine and website are
complete without them. Self-hosting costs only the infrastructure the three services use.

## FAQ

**What is QloApps?**

An open-source hotel management system combining a Property Management System, a
commission-free booking engine and a hotel website in one application, built on the
PrestaShop 1.6 core by Webkul under the OSL 3.0 licence. It is free to self-host.

**What does this Railway template deploy?**

Three services: the QloApps application on Apache with PHP 8.3, a managed MySQL 9.4
database, and a Mailpit SMTP server with a web inbox, plus a volume at `/data` for
photography, uploads, invoices and the shop's settings file.

**Why does the template include a database and a mail server?**

QloApps keeps every room, rate, reservation and configuration value in MySQL, so it cannot
run without one. It also mails on its core flow — booking confirmations, account welcomes,
password resets — and PHP's `mail()` does not work in a container, so a template with no
SMTP would look fine while dropping every message.

**How do I log in to the QloApps back office after deploying?**

Append your `QLO_ADMIN_DIR` value to the public URL — `/backoffice/` unless you changed
it — and sign in with `QLO_ADMIN_EMAIL` and `QLO_ADMIN_PASSWORD`. QloApps blocks a back
office in a directory named `admin`, which is why the path is not `/admin`.

**Can I use my own domain with self-hosted QloApps?**

Yes. Attach the domain to the `qloapps` service and set `QLO_PUBLIC_DOMAIN` to that
hostname; the shop URL and every generated link are re-applied from it on the next boot.



## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/qloapps
