Easy!Appointments logo

Easy!Appointments

Open source appointment scheduling and booking platform

Alternative to: calendly, acuity scheduling, square appointments


Easy!Appointments is a highly customizable web application that lets customers book appointments with you through a sophisticated web interface. It manages customers, services and providers, enforces working plans and booking rules, and syncs appointments with Google Calendar. Email notifications keep everyone updated, and the self-hosted installer runs alongside an existing website on a single PHP/MySQL server.

Easy!Appointments Docker Compose example

Self-host Easy!Appointments on your own server, homelab, or VPS starting from this Docker Compose example. It runs Easy!Appointments in Docker containers using the official alextselegidis/easyappointments:latest, mysql:8.0 images, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  easyappointments:
    image: alextselegidis/easyappointments:latest
    restart: unless-stopped
    depends_on:
      - mysql
    environment:
      # Public URL where Easy!Appointments is reached.
      BASE_URL: "http://localhost"
      # Enable verbose debug output. Keep FALSE in production.
      DEBUG_MODE: "FALSE"
      # Hostname of the MySQL service on the compose network.
      DB_HOST: "mysql"
      # Database name.
      DB_NAME: "easyappointments"
      # Database user.
      DB_USERNAME: "easyappointments"
      # Database password (internal to the compose network).
      DB_PASSWORD: "easyappointments"
      # Mail transport: 'mail' (PHP mail) or 'smtp'.
      MAIL_PROTOCOL: "mail"
      # SMTP debug verbosity (0 disables).
      MAIL_SMTP_DEBUG: "0"
      # Whether SMTP requires authentication (0 = no).
      MAIL_SMTP_AUTH: "0"
      # SMTP server hostname (used when MAIL_PROTOCOL is smtp).
      MAIL_SMTP_HOST: "smtp.example.org"
      # SMTP server port.
      MAIL_SMTP_PORT: "587"
      # From address for outgoing mail.
      MAIL_FROM_ADDRESS: "no-reply@example.org"
      # From name for outgoing mail.
      MAIL_FROM_NAME: "Easy!Appointments"
      # Reply-to address for outgoing mail.
      MAIL_REPLY_TO_ADDRESS: "no-reply@example.org"

  mysql:
    image: mysql:8.0
    restart: unless-stopped
    volumes:
      - mysql:/var/lib/mysql
    environment:
      # Root password for the MySQL server (internal to the compose network).
      MYSQL_ROOT_PASSWORD: "changeme-root"
      # Database created on first startup.
      MYSQL_DATABASE: "easyappointments"
      # Application database user created on first startup.
      MYSQL_USER: "easyappointments"
      # Password for the application database user (matches DB_PASSWORD above).
      MYSQL_PASSWORD: "easyappointments"

volumes:
  mysql:

Values set to changeme are required — replace them with your own values before starting Easy!Appointments.

Prefer a managed setup? WinterFlow installs, configures, and updates Easy!Appointments for you using this same Docker Compose configuration.