Easy!Appointments on AWS User Guide
Overview
This image runs Easy!Appointments, the open source, self hosted web application that lets your customers book appointments online. Customers pick a service, a provider and an available time slot on a public booking page, while you manage services, providers, secretaries, working plans and the appointment calendar from an admin backend.
Easy!Appointments is a CodeIgniter 3 PHP application installed under /var/www/easyappointments and served by nginx, which proxies dynamic requests to PHP 8.3 over php-fpm. The application data lives in a MariaDB database whose data directory, /var/lib/mysql, is a dedicated, independently resizable EBS data volume so the database is kept off the operating system disk.
The administrator account is created on the first boot of every deployed instance, and its password is generated freshly on each instance, so two instances launched from the same Amazon Machine Image never share a password. The credentials are written to /root/easy-appointments-credentials.txt with mode 0600 so that only the root user can read them.
Prerequisites
Before you deploy this image you need:
- An Amazon Web Services account where you can launch EC2 instances
- IAM permissions to launch instances, create security groups, and subscribe to AWS Marketplace products
- An EC2 key pair in the target Region for SSH access to the instance
- A VPC and subnet in the target Region, with a security group allowing inbound port 22 from your management network and port 80 for the booking page and admin backend
- The AWS CLI (version 2) installed locally if you plan to deploy from the command line
Step 1: Launch the Instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service, and select Launch instance. Under Application and OS Images choose AWS Marketplace AMIs and search for Easy!Appointments. Select the cloudimg listing and choose Select, then Continue on the subscription summary.
Pick an instance type of t3.medium or larger. Choose your EC2 key pair under Key pair (login). Under Network settings select your VPC and subnet, and either create or select a security group that opens port 22 from your management network and port 80 for the booking page and admin backend. Leave the root volume at the default size or larger.
Select Launch instance. First boot initialisation takes a few seconds after the instance state becomes Running and the status checks pass, while the database is created and the per instance administrator is provisioned.
Step 2: Launch the Instance from the AWS CLI
The following block launches an instance from the cloudimg Easy!Appointments Marketplace AMI into an existing subnet and security group. Replace <ami-id> with the AMI ID shown on the Marketplace listing, <key-name> with your EC2 key pair name, <subnet-id> with your subnet ID, and <security-group-id> with a security group that opens ports 22 and 80 as described above.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type t3.medium \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=easyappointments}]'
When the instance reaches the Running state and its status checks pass, note its public IP address or DNS name from the EC2 console or with aws ec2 describe-instances.
Step 3: Connect to Your Instance
Connect over SSH using your key pair and the login user for your operating system variant.
| OS variant | SSH login user |
|---|---|
| Ubuntu 24.04 | ubuntu |
ssh -i <key-name>.pem ubuntu@<public-ip>
Step 4: Retrieve the Administrator Password
The administrator password is unique to your instance and was generated on first boot. Read it as root:
sudo cat /root/easy-appointments-credentials.txt
The file lists the booking page URL, the admin backend login URL, the administrator login name (administrator) and the generated password. Keep this password somewhere safe.
Step 5: Sign In to the Admin Backend
The admin backend is served on port 80 by nginx. In a browser, go to:
http://<instance-public-ip>/index.php/login
Sign in with login name administrator and the password from the credentials file. After signing in you land on the appointment calendar, the central view where you manage bookings across your providers by day, week or month.

Step 6: Confirm Easy!Appointments Is Running
Over SSH, confirm the web server, the PHP processor and the database are active and that port 80 is listening:
sudo systemctl is-active nginx php8.3-fpm mariadb
sudo ss -tlnp | grep ':80 '
You should see all three services reported as active and nginx listening on port 80. The MariaDB database listens on the loopback interface only and is never exposed directly.
Step 7: Define Your Services
Open the Services menu in the backend. Each service is something a customer can book, with a duration, an optional price and a category. The image ships with one sample service so the booking flow works immediately. Select Add to create your own services, set the Duration, Price and Availabilities Type, and save.

Group related services with Categories from the same menu so they are presented together on the booking page.
Step 8: Add Providers and Their Working Plan
Open the Users menu and select Providers. A provider is a person customers book time with. For each provider, set their name and contact details, tick the Services they offer, and define their Working Plan, the weekly schedule of start and end times and breaks that determines which slots customers can book. You can also add Secretaries who manage appointments on behalf of one or more providers, and additional Admins.
Only the working hours you define are offered to customers, so set each provider's working plan before you share the booking page.
Step 9: Share the Public Booking Page
The public booking page is served at the root of the site and needs no login. Share this URL with your customers:
http://<instance-public-ip>/
Customers choose a service and a provider, pick an available date and time, and enter their details to confirm the appointment. The slots offered reflect each provider's working plan and any existing bookings, blocked periods or working plan exceptions.

Confirmed appointments appear immediately on the admin calendar, and confirmation and reminder emails can be sent once you configure an SMTP server under Settings.
Step 10: Configure Settings
Open the Settings menu (under the administrator account in the top right) to configure the application for your business:
- Business settings — your company name, email, working plan defaults, booking lead and cancellation times, and the time zone.
- General settings — the display name, the default language, the date and time format, and the appearance of the booking page.
- Localization — the language presented to customers on the booking page.
- Integrations — outbound email (SMTP) for confirmations and reminders, calendar synchronisation, and webhooks.
The company name and details you set here are shown to customers on the booking page and in the emails they receive.
Step 11: The Data Volume
The MariaDB database lives on a dedicated EBS volume mounted at /var/lib/mysql. This keeps the database off the operating system disk and lets you resize or snapshot it independently. Confirm the mount with:
df -h /var/lib/mysql
To grow the database store, expand the EBS volume in the AWS console, then grow the filesystem on the instance with sudo resize2fs on the underlying device. The application code under /var/www/easyappointments and any uploaded files in storage/uploads live on the root volume.
Step 12: Enable HTTPS
The booking page and admin backend are served over plain HTTP on port 80 by nginx. For production use, place them behind TLS so that customer details and the administrator password are encrypted in transit. Obtain a certificate for your domain, for example with a managed certificate on an Application Load Balancer in front of the instance, or with Certbot installed on the instance, then configure nginx to listen on 443 with your certificate and proxy to php-fpm exactly as the bundled site does for port 80.
After you point a domain name at the instance, set the application base URL to match so that links and redirects are correct. Edit the BASE_URL constant in /var/www/easyappointments/config.php, replacing the value with your https:// site address, then reload nginx:
sudo sed -i "s#const BASE_URL .*#const BASE_URL = 'https://your-domain.example';#" /var/www/easyappointments/config.php
sudo systemctl reload nginx
Restrict the security group so that ports 80 and 443 are reachable only from the networks that need to book or administer appointments.
Step 13: Backup and Maintenance
Back up the application by snapshotting the /var/lib/mysql EBS volume, which captures the entire database, and by archiving any uploaded files under /var/www/easyappointments/storage. You can also take a logical backup of the database over the loopback socket:
sudo mysqldump --protocol=socket easyappointments > easyappointments-backup.sql
Apply operating system security updates with sudo apt-get update && sudo apt-get upgrade and reboot when a new kernel is installed; nginx, php-fpm and MariaDB start automatically on boot.
Support
This image is published and supported by cloudimg. Support covers deployment, service and provider configuration, working plans, email and calendar integration, TLS, the database volume and backups. Contact cloudimg through the support channel listed on the AWS Marketplace listing.
All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.