Deploy Easy!Appointments | Open Source Appointment Scheduler on Railway
Self host Easy!Appointments. Booking, calendar sync, email notifications.
EasyAppointments
Just deployed
MySQL
Just deployed
/var/lib/mysql

Deploy and Host Easy!Appointments on Railway
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.

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.
Template Content
EasyAppointments
alextselegidis/easyappointments:1.5.2MySQL
mysql:9.4