---
title: "Deploy Easy!Appointments | Open Source Appointment Scheduler on Railway"
description: "Self host Easy!Appointments. Booking, calendar sync, email notifications."
category: "Other"
url: https://railway.com/deploy/easy-appointments
---

# Deploy Easy!Appointments | Open Source Appointment Scheduler on Railway

Self host Easy!Appointments. Booking, calendar sync, email notifications.

**[Deploy Easy!Appointments | Open Source Appointment Scheduler on Railway on Railway](https://railway.com/template/easy-appointments)**

- **Creator:** Heimdall
- **Category:** Other
- **Total deploys:** 8

## Template content

### EasyAppointments https://cdn.jsdelivr.net/gh/selfhst/icons/png/easy-appointments.png

- **Image:** alextselegidis/easyappointments:1.5.2
- **Start command:** `/bin/sh -c 'echo "$STARTUP_B64" | base64 -d > /tmp/start.sh && bash /tmp/start.sh'`
- **Public domain:** Yes

### MySQL https://devicons.railway.app/i/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`

## Documentation

![Easy!Appointments logo](https://easyappointments.org/wp-content/uploads/2022/03/social-card.png)

# Deploy and Host Easy!Appointments on Railway

[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/easy-appointments?referralCode=QXdhdr)

Easy!Appointments is a free, open-source web appointment scheduler that lets customers book time slots with service providers — perfect for clinics, salons, consultants, tutors, or any business that runs on bookings. Self-host Easy!Appointments and you keep full control of customer data without paying per-user SaaS fees forever.

This Railway template runs the official `alextselegidis/easyappointments:1.5.2` Docker image alongside a managed MySQL 8 database. The startup script handles the Apache MPM gotcha that breaks `php:*-apache` images on Railway, templates your env vars into Easy!Appointments' `config.php` and `email.php` at boot, and wires HTTPS through Railway's edge proxy so your generated URLs are correct from the first request.

## Getting Started with Easy!Appointments on Railway

After the deploy finishes, open the public Railway URL in your browser. Easy!Appointments self-detects that the database is empty and redirects you to `/index.php/installation` — a one-page web wizard. Enter your admin first name, last name, email, username, password, language, and phone number, plus your company name and link, then submit. Easy!Appointments creates the schema, seeds a sample service and provider, and signs you in as the new administrator. From there you can configure your services, working hours, and customer-facing booking page.

![Easy!Appointments dashboard screenshot](https://res.cloudinary.com/asset-cloudinary/image/upload/v1777655960/94ebe522-5878-47a9-8f1c-171dc3ed504b.png)

## About Hosting Easy!Appointments

Easy!Appointments is a PHP + CodeIgniter application backed by MySQL. It exposes a public booking page where your customers self-serve, plus an admin backend where you manage providers, services, working plans, customers, and appointments.

Key features:

- Customer-facing booking page (no account required to book)
- Multi-provider, multi-service scheduling with per-provider working plans
- Two-way Google Calendar sync (OAuth 2.0)
- Email notifications via SMTP or PHP `mail()`
- REST API and webhook support for integrations
- Multi-language support out of the box

The app talks to MySQL over Railway's private network. The Easy!Appointments container is the only service with a public domain.

## Why Deploy Easy!Appointments on Railway

The template gets you from zero to a working booking site in minutes:

- Managed MySQL 8 with persistent volume — no DB setup work
- HTTPS, custom domains, and TLS handled by Railway's edge
- Private networking between app and DB out of the box
- Apache MPM and entrypoint gotchas already worked around in the startup script
- One-click redeploys when you bump the image tag

## Common Use Cases

- Clinics and therapists running an appointment-only schedule
- Hair salons, barbers, and beauty studios with multiple staff
- Tutors, coaches, and consultants selling 1-on-1 sessions
- Small service businesses replacing Calendly or Acuity to avoid per-seat SaaS pricing

## Dependencies for Easy!Appointments

- **EasyAppointments** — `alextselegidis/easyappointments:1.5.2` (PHP 8.2 + Apache, port 80)
- **MySQL** — Railway-managed MySQL 8

### Environment Variables Reference

| Variable | Description | Required |
|---|---|---|
| `BASE_URL` | Public app URL — pin to `https://${{RAILWAY_PUBLIC_DOMAIN}}` | Yes |
| `DB_HOST` / `DB_NAME` / `DB_USERNAME` / `DB_PASSWORD` | MySQL connection (reference `${{MySQL.*}}`) | Yes |
| `STARTUP_B64` | Base64 startup script (env templating + MPM fix) | Yes |
| `LANGUAGE` | Default UI language (`english`, `german`, `french`, ...) | No |
| `DEBUG_MODE` | `TRUE` or `FALSE` — leave `FALSE` in production | No |
| `MAIL_PROTOCOL` | `mail` or `smtp` | No |
| `MAIL_SMTP_HOST` / `MAIL_SMTP_USER` / `MAIL_SMTP_PASS` / `MAIL_SMTP_PORT` | Outbound email settings | No |
| `MAIL_FROM_ADDRESS` / `MAIL_FROM_NAME` / `MAIL_REPLY_TO_ADDRESS` | Sender identity for notifications | No |
| `GOOGLE_SYNC_FEATURE` | `TRUE` to enable Google Calendar two-way sync | No |
| `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` / `GOOGLE_API_KEY` | Google OAuth credentials | If sync on |

### Deployment Dependencies

- Runtime: PHP 8.2 + Apache 2.4 (in image)
- Database: MySQL 8 (Postgres not supported)
- Docker Hub: https://hub.docker.com/r/alextselegidis/easyappointments
- GitHub: https://github.com/alextselegidis/easyappointments
- Image source: https://github.com/alextselegidis/easyappointments-docker

## Minimum Hardware Requirements for Self-Hosting Easy!Appointments

| Resource | Minimum | Recommended |
|---|---|---|
| CPU | 0.5 vCPU | 1 vCPU |
| RAM | 256 MB | 512 MB – 1 GB |
| Storage | 1 GB (DB + uploads) | 5 GB |
| Runtime | PHP 8.2 + MySQL 8 | PHP 8.2 + MySQL 8 |

The app itself is light. RAM ceiling rises with concurrent customers and Google Calendar sync activity.

## How to Self-Host Easy!Appointments Outside Railway

The fastest path is the official Docker image plus a MySQL container:

```
docker run -d --name eaa-mysql \
  -e MYSQL_ROOT_PASSWORD=changeme \
  -e MYSQL_DATABASE=easyappointments \
  -v eaa-mysql:/var/lib/mysql \
  mysql:8

docker run -d --name easyappointments \
  -p 8080:80 \
  -e BASE_URL=http://localhost:8080 \
  -e DEBUG_MODE=FALSE \
  -e DB_HOST=eaa-mysql \
  -e DB_NAME=easyappointments \
  -e DB_USERNAME=root \
  -e DB_PASSWORD=changeme \
  --link eaa-mysql:eaa-mysql \
  alextselegidis/easyappointments:1.5.2
```

Or build from source with Composer + npm:

```
git clone https://github.com/alextselegidis/easyappointments.git
cd easyappointments
composer install --no-dev
npm install && npm run build
cp config-sample.php config.php   # edit DB + BASE_URL
php -S 0.0.0.0:8080 -t .
```

Then visit `http://localhost:8080` to run the install wizard.

## Is Easy!Appointments Free?

Yes — Easy!Appointments is open source under GPL-3.0 with no paid tiers, no per-user fees, and no booking commissions. There is no upstream cloud-hosted version. Your only cost is the infrastructure you run it on. On Railway, that's the small monthly compute + storage + bandwidth bill for the app container and the managed MySQL service — no Easy!Appointments licence on top.

## Easy!Appointments vs Calendly vs Cal.com

| Feature | Easy!Appointments | Calendly | Cal.com |
|---|---|---|---|
| Open source | Yes (GPL-3.0) | No | Yes (AGPL-3.0) |
| Self-hostable | Yes | No | Yes |
| Pricing model | Free | $10–$20+/user/mo | Free OSS, paid cloud |
| Customer-facing public booking page | Yes | Yes | Yes |
| Multi-provider | Yes | Teams plan | Yes |
| Google Calendar sync | Yes | Yes | Yes |

Easy!Appointments is the leanest option for a small business that just wants a self-hosted booking page and admin panel; Cal.com is heavier but has a richer integration ecosystem.

## FAQ

**What is Easy!Appointments and why self-host it?**
Easy!Appointments is an open-source PHP web app that lets your customers book appointments online. Self-hosting on Railway means your customer data lives on infrastructure you control and you avoid Calendly-style per-user SaaS fees.

**What does this Railway template deploy?**
Two services — the `alextselegidis/easyappointments:1.5.2` app container and a Railway-managed MySQL 8 database, wired together over the private network with Easy!Appointments exposed on a public HTTPS URL.

**Why is MySQL included in the template?**
Easy!Appointments stores all appointment, customer, provider, and admin data in MySQL — and only MySQL (the image ships `pdo_mysql` only, so Postgres is not an option). The managed Railway MySQL service is added so the template works on first deploy with no manual DB setup.

**How do I create the first admin user on Easy!Appointments?**
Visit the deployed URL and you'll be redirected to the install wizard at `/index.php/installation`. Fill in your admin details and company info, submit, and Easy!Appointments creates the schema and signs you in. There is no env-var path for this; the wizard is the official setup flow.

**Does Easy!Appointments support Google Calendar sync on Railway?**
Yes. Set `GOOGLE_SYNC_FEATURE=TRUE` and supply `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET`, and `GOOGLE_API_KEY` from a Google Cloud OAuth 2.0 project, then enable sync per provider in the admin UI.

**Can I send appointment confirmation emails from self-hosted Easy!Appointments?**
Yes. Set `MAIL_PROTOCOL=smtp`, fill in your SMTP host/port/user/pass, and set `MAIL_FROM_ADDRESS` and `MAIL_FROM_NAME`. Easy!Appointments will send booking, cancellation, and reminder emails via your SMTP provider.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — [Jul'26] 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/easy-appointments
