Railway

Deploy Easy!Appointments — Self-Hosted Booking Scheduler

Self-host a booking page — appointments for clinics, salons & more

Deploy Easy!Appointments — Self-Hosted Booking Scheduler

Just deployed

/var/lib/mysql

Just deployed

Deploy and Host Easy!Appointments on Railway

Easy!Appointments is a free, open-source appointment scheduling platform — a self-hosted alternative to Calendly and Acuity that gives you a public booking page where customers self-serve, plus an admin backend to manage providers, services, working hours, and appointments. It's built for any business that runs on bookings: clinics, salons, tutors, consultants, and therapists. This template runs it with MySQL and the Railway-specific Apache fix already handled, so you go from deploy to a working booking site in minutes.


What This Template Deploys

ServicePurpose
Easy!AppointmentsThe booking page, admin backend, and API (PHP/Apache)
MySQL 8Appointments, customers, providers, services, and settings

The app talks to MySQL over Railway's private network, and only Easy!Appointments has a public domain. A persistent volume keeps the MySQL data across redeploys.


About Hosting

Easy!Appointments is straightforward, but two Railway-specific things determine a smooth start — both handled here.

The Apache configuration gotcha is already solved. Easy!Appointments runs on a PHP/Apache image, and those images have an Apache MPM issue that breaks them on Railway out of the box. This template's startup script works around it, templates your environment variables into config.php and email.php at boot, and wires HTTPS through Railway's edge so URLs are correct from the first request — the setup work a raw Docker deploy makes you do by hand.

Setup happens in a web wizard, not environment variables. The key thing to expect: after deploying, open your Railway URL and Easy!Appointments detects the empty database and redirects you to a one-page installation wizard, where you enter your admin account and company details. There's no env-var path for creating the admin — the wizard is the official flow. So "deploy, open the URL, complete the wizard" is the whole first-run process.

BASE_URL must match your Railway domain. Easy!Appointments builds booking links and email URLs from BASE_URL, so it must be your Railway public domain, or customer-facing links break. This template sets it for you.

It uses MySQL, not PostgreSQL. Unlike many self-hosted apps, Easy!Appointments runs on MySQL 8, which this template provisions and wires automatically — no database setup on your part.

Configure email for notifications. Appointment confirmations and reminders rely on email, so set the MAIL_* variables with your SMTP provider. Bookings work without it, but customers won't get confirmation emails until SMTP is configured.

The app itself is light on resources; RAM usage rises mainly with concurrent customers and Google Calendar sync activity, so most deployments run comfortably on modest settings.

Typical cost: ~$5–10/month on Railway for the app and MySQL. Easy!Appointments is GPL-licensed and free — versus Calendly and Acuity, which bill per user or seat every month.


How It Compares

Easy!Appointments (self-hosted)CalendlyAcuitySimplyBook.me
Cost modelFlat infraPer user/monthPer user/monthTiered
Data ownershipFull — your infraVendorVendorVendor
Public booking pageYesYesYesYes
Providers & servicesFull managementLimitedYesYes
Google Calendar syncYesYesYesYes
Self-hostableYesNoNoNo

Calendly and Acuity are polished but bill per user every month and keep your customer data on their servers. Easy!Appointments gives you the same self-serve booking page and provider/service management — with Google Calendar sync — self-hosted, so your customer data stays yours and you pay flat infrastructure cost instead of per-seat fees that grow with your team.


Deploy in Under 5 Minutes

  1. Click Deploy on Railway — Easy!Appointments and MySQL build and wire together (~3 minutes)
  2. Confirm BASE_URL is your Railway public domain
  3. Open your Railway URL — it redirects to the installation wizard automatically
  4. Complete the wizard: create your admin account and enter your company details
  5. Add your services, providers, and working hours, then share your public booking page

Set the MAIL_* variables to enable appointment confirmation and reminder emails.


Common Use Cases

  • Clinics and health practices — let patients book appointments online with the right provider and service
  • Salons and spas — self-serve booking for stylists and treatments with working-hour rules
  • Tutors and consultants — a public booking page for sessions, synced to your calendar
  • Group sessions — support multiple attendees per time slot for classes and workshops
  • Any booking business — replace per-seat SaaS scheduling with a scheduler you own outright

Configuration

VariableRequiredDescription
BASE_URLRequiredYour Railway public domain — booking links and email URLs build from it
DB_HOSTAuto-injectedMySQL host via Railway reference variable
DB_NAMEAuto-injectedDatabase name (easyappointments)
DB_USERNAME / DB_PASSWORDAuto-injectedMySQL credentials from the Railway service
MAIL_SMTP_HOSTOptionalSMTP host for confirmation and reminder emails
MAIL_SMTP_PORT / MAIL_SMTP_USER / MAIL_SMTP_PASSOptionalSMTP port and credentials
MAIL_FROM_ADDRESS / MAIL_FROM_NAMEOptionalSender identity on outgoing emails
GOOGLE_SYNC_FEATUREOptionaltrue to enable Google Calendar sync (with Google API credentials)

Setup is a web wizard, not env vars. After deploy, open your Railway URL — it redirects to the installation wizard where you create the admin account and enter company details. There's no environment-variable path for this; the wizard is the official first-run flow.

Set BASE_URL and configure email. BASE_URL must be your Railway domain or booking and email links break. Set the MAIL_* variables so customers receive appointment confirmations and reminders.


Dependencies for Easy!Appointments Hosting

  • Railway account — ~$5–10/month for the app and MySQL
  • MySQL 8 (included and wired automatically)
  • Optional: SMTP credentials for appointment confirmation and reminder emails
  • Optional: Google API credentials for two-way Google Calendar sync

Deployment Dependencies

Implementation Details

The template runs the official alextselegidis/easyappointments image alongside a managed MySQL 8 database, connected over the private network with only the app exposed. Because the PHP/Apache base image has an Apache MPM issue that breaks it on Railway, the startup script works around it, templates the environment variables into config.php and email.php at boot, and ensures HTTPS URLs generate correctly through Railway's edge from the first request.

Easy!Appointments has no env-var path for initial admin setup: on first launch it detects the empty database and redirects to a one-page web wizard where the admin account and company details are entered, after which it creates the schema and signs you in. BASE_URL must match the public domain so booking and email links resolve. Email is configured through the MAIL_* variables, and optional two-way Google Calendar/CalDAV sync is available with credentials. MySQL holds all data on a persistent volume — the component to back up. The app is lightweight, with resource needs rising under concurrent booking and calendar-sync load.


Frequently Asked Questions

How do I set up the admin account? Through the installation wizard, not environment variables. After deploying, open your Railway URL — it redirects to a one-page wizard where you create your admin account and enter company details. That's the official setup flow.

Which database does it use? MySQL 8, which this template provisions and wires automatically. Unlike many self-hosted apps it's MySQL rather than PostgreSQL, but you don't need to configure it — it's handled.

Do customers get confirmation emails? Yes, once you set the MAIL_* SMTP variables. Bookings work without email, but confirmations and reminders require SMTP configuration.

Can it sync with Google Calendar? Yes — two-way Google Calendar and CalDAV sync is supported. Enable GOOGLE_SYNC_FEATURE and add your Google API credentials to connect providers' calendars.

Why must BASE_URL match my domain? Easy!Appointments builds public booking links and email URLs from it. If it doesn't match your Railway domain, those customer-facing links break.

Is it good for a clinic or salon? Yes — it's built for exactly that: providers, services, working plans, group sessions, and a self-serve booking page, with your data on your own infrastructure.


Why Deploy Easy!Appointments on Railway?

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying Easy!Appointments on Railway you get a self-hosted booking platform with the setup handled — MySQL wired, the Apache gotcha solved, HTTPS URLs correct from the first request, and a clear installation wizard to finish. A Calendly alternative for your clinic, salon, or practice, with your customer data on infrastructure you own.


Template Content

More templates in this category

View Template
Rocky Linux
[Jul'26] Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀

codestorm
36
View Template
Foundry Virtual Tabletop
A Self-Hosted & Modern Roleplaying Platform

Lucas
71
View Template
Letta Code Remote
Run a Letta Code agent 24/7. No inbound ports, just deploy.

Letta
51