MAATRIX / Блог / Как установить и настроить EasyAppointments на VPS

Как установить и настроить EasyAppointments на VPS

MAATRIX

Салон, клиника, репетитор или консультант рано или поздно упирается в одну и ту же проблему — запись клиентов держится на звонках, сообщениях в мессенджерах и памяти администратора. Сервисы вроде Calendly или Acuity решают это красиво, но берут ежемесячную плату в валюте, привязаны к зарубежной карте и хранят данные клиентов на чужих серверах. EasyAppointments — открытая система онлайн-записи, которую можно поставить на свой VPS: своя база клиентов, своя форма записи на сайте, никакой подписки за пользователя. Ниже — установка с нуля: PHP, MySQL, веб-сервер, SSL и настройка специалистов, услуг и уведомлений, чтобы форма записи заработала на вашем домене.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что понадобится перед установкой

EasyAppointments — лёгкое PHP-приложение с базой MySQL, по требованиям к железу близкое к обычной CMS. Тяжёлых вычислений тут нет — только формы, календарь и рассылка писем-напоминаний.

РесурсМинимумКомфортно
CPU1 vCPU1-2 vCPU
RAM1 ГБ2 ГБ
Диск10 ГБ SSD20 ГБ SSD
ОСUbuntu 22.04/24.04, Debian 12Ubuntu 24.04 LTS

Дополнительно понадобится:

  • домен или поддомен с A-записью на IP сервера — форма записи на голом IP и без SSL выглядит подозрительно для клиентов и не даст выпустить сертификат;
  • доступ по SSH с правами root или sudo;
  • почтовый ящик или SMTP-сервер для отправки уведомлений и напоминаний клиентам — без этого EasyAppointments умеет копить записи, но не сможет о них сообщить;
  • 15-20 минут на установку и первичную настройку.

Ставим классическим способом — PHP + MySQL + Nginx напрямую на сервере. Это проще диагностировать и обновлять, чем Docker-стек, а EasyAppointments по ресурсам и так лёгкий.

Подготовка сервера: PHP, MySQL, зависимости

Обновите систему и поставьте базовые пакеты:

apt update && apt -y upgrade
apt -y install curl unzip git software-properties-common

EasyAppointments требует PHP 8.1 или новее с набором расширений для работы с базой, изображениями и датами:

apt -y install php php-fpm php-mysqli php-mbstring php-xml php-gd php-curl php-zip php-intl php-bcmath
php -v

Если в репозитории вашей ОС стоит более старая версия PHP, добавьте PPA Ondřej Surý (для Ubuntu/Debian) и поставьте нужную версию явно — принцип тот же, что и для других PHP-приложений на этом блоге:

add-apt-repository ppa:ondrej/php
apt update
apt -y install php8.3 php8.3-fpm php8.3-mysqli php8.3-mbstring php8.3-xml php8.3-gd php8.3-curl php8.3-zip php8.3-intl php8.3-bcmath

Дальше — MySQL (подойдёт и MariaDB, EasyAppointments одинаково хорошо работает с обеими СУБД):

apt -y install mysql-server
mysql_secure_installation

На вопросы secure_installation отвечайте да везде: задать root-пароль, удалить анонимных пользователей, запретить удалённый вход root, удалить тестовую базу, обновить привилегии. Создайте базу и пользователя под приложение:

mysql -u root -p
CREATE DATABASE easyappointments CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'easyappt'@'localhost' IDENTIFIED BY 'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES ON easyappointments.* TO 'easyappt'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Пароль сгенерируйте случайный (openssl rand -base64 24) и сохраните — он понадобится в конфиге приложения на следующем шаге. Кодировка utf8mb4 важна, если клиенты будут вводить имена и комментарии на русском и с эмодзи — без неё часть символов может обрезаться при сохранении.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка EasyAppointments

Проще и надёжнее не собирать приложение из исходников, а взять готовый релиз со страницы github.com/alextselegidis/easyappointments/releases — там лежит уже собранный архив без Composer и сборщиков фронтенда. Скачайте актуальный релиз и распакуйте в веб-каталог:

cd /var/www
wget https://github.com/alextselegidis/easyappointments/releases/latest/download/easyappointments.zip
unzip easyappointments.zip -d easyappointments
cd easyappointments

Если ссылка на архив в релизе называется иначе — откройте страницу релизов в браузере и возьмите актуальный файл вручную, названия ассетов между версиями иногда меняются.

Настройте подключение к базе и адрес сайта в конфигурационных файлах каталога application/config/:

nano application/config/config.php

Пропишите базовый URL с вашим доменом и https:

$config['base_url'] = 'https://booking.example.com/';

Дальше — доступ к базе данных:

nano application/config/database.php
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'easyappt';
$db['default']['password'] = 'ЗАМЕНИТЕ_НА_СЛОЖНЫЙ_ПАРОЛЬ';
$db['default']['database'] = 'easyappointments';

Права на каталоги — приложению нужно писать кэш, логи и загруженные файлы (например, аватары специалистов):

chown -R www-data:www-data /var/www/easyappointments
find /var/www/easyappointments -type d -exec chmod 755 {} \;
find /var/www/easyappointments -type f -exec chmod 644 {} \;
chmod -R 775 /var/www/easyappointments/storage

Таблицы в базе EasyAppointments создаёт сам при первом обращении через браузер — отдельно накатывать SQL-дамп вручную не нужно, это произойдёт после того, как заработает веб-сервер (следующий шаг).

Nginx и SSL-сертификат

Ставим Nginx, если его ещё нет:

apt -y install nginx

В отличие от многих современных PHP-фреймворков, EasyAppointments не использует отдельную папку public/ — веб-сервер смотрит прямо в корень распакованного приложения. Создайте конфиг /etc/nginx/sites-available/easyappointments:

server {
    listen 80;
    server_name booking.example.com;
    root /var/www/easyappointments;

    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    client_max_body_size 10M;
}

Проверьте, что fastcgi_pass указывает на реальную версию PHP-FPM (ls /run/php/), и активируйте сайт:

ln -s /etc/nginx/sites-available/easyappointments /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Теперь SSL. Certbot с плагином для Nginx сам пропишет редирект на https и настроит автопродление по крону:

apt -y install certbot python3-certbot-nginx
certbot --nginx -d booking.example.com

Если форма записи будет встраиваться на несколько ваших доменов или сайт уже стоит за прокси, посмотрите настройку Nginx как реверс-прокси — принцип тот же, только запрос сначала попадает на фронтовый Nginx, а потом уходит на бэкенд с EasyAppointments. Для более глубокого разбора самого SSL и типичных проблем с выпуском сертификата есть отдельный гайд про Let's Encrypt на VPS.

Первый запуск и настройка: специалисты, услуги, уведомления

Откройте https://booking.example.com в браузере — приложение обнаружит, что таблиц в базе ещё нет, и запустит мастер установки: он создаст структуру базы данных и попросит указать компанию и учётные данные первого администратора. Задайте сложный пароль администратора сразу — менять его задним числом менее удобно.

После входа в панель администратора настройка идёт в четыре шага:

  • Специалисты (Providers). В разделе Users → Providers добавьте каждого сотрудника, который принимает клиентов: имя, контакты, рабочий график (Working Plan) с отдельными днями и перерывами, список услуг, которые этот специалист оказывает.
  • Услуги (Services). В Services задайте название, длительность приёма, цену и, при необходимости, категорию — стрижка, консультация, диагностика и так далее. Длительность услуги — это и есть шаг, с которым генерируются свободные слоты в календаре записи.
  • Уведомления. В Settings → Business указывается рабочая почта компании, а отправка писем клиентам и специалистам (подтверждение, напоминание, отмена) идёт через SMTP — стандартный PHP mail() без внешнего SMTP на большинстве VPS попадает в спам или не доходит вовсе. Если своего почтового сервера нет, проще подключить внешний SMTP-провайдер рассылок; если он уже поднят на этом сервере, конфигурация похожа на настройку почтового сервера Postfix.
  • Синхронизация с Google Calendar (опционально). В Settings → Integrations можно включить двустороннюю синхронизацию с календарём специалиста — понадобится OAuth-клиент из Google Cloud Console (Client ID и Client Secret). Без этого шага приложение прекрасно работает как самостоятельный календарь.

Готовая публичная форма записи доступна клиентам по адресу вашего домена — её можно дать прямой ссылкой или встроить на существующий сайт через <iframe>. Отдельно от неё есть REST API для интеграций (например, для передачи заявок из своей CRM), включается в Settings → API вместе с генерацией ключа доступа.

Бэкапы, обновление и частые проблемы

Данные EasyAppointments живут в двух местах: база MySQL (клиенты, записи, услуги, специалисты) и каталог storage (загруженные файлы, кэш, логи). Бэкапить нужно оба.

Дамп базы:

mysqldump -u easyappt -p easyappointments > easyappointments_db_$(date +%F).sql

Архив каталога storage:

tar -czf easyappointments_storage_$(date +%F).tar.gz -C /var/www/easyappointments storage

Вынесите оба шага в cron и складывайте копии за пределы сервера. Как настроить регулярные задания по расписанию — в статье про cron-задачи на VPS; а если нужно, чтобы бэкапы клиентской базы ещё и шифровались перед выгрузкой во внешнее хранилище, посмотрите бэкап с шифрованием — та же схема подходит для пары «MySQL + storage».

Обновление до новой версии — замена файлов приложения с сохранением конфигов и базы:

cd /var/www
wget https://github.com/alextselegidis/easyappointments/releases/latest/download/easyappointments.zip -O update.zip
unzip -o update.zip -d easyappointments_new
cp easyappointments/application/config/{config,database}.php easyappointments_new/application/config/
mv easyappointments easyappointments_old && mv easyappointments_new easyappointments
chown -R www-data:www-data /var/www/easyappointments

Перед обновлением снимите свежий дамп базы — новая версия при первом обращении может применить миграции к структуре таблиц, откатывать это без бэкапа придётся вручную. Старую папку удаляйте только убедившись, что всё работает.

Из проблем, которые встречаются на практике:

  • Белый экран или ошибка 500 после установки. В девяти случаях из десяти — права на каталог storage, перепроверьте команды chmod выше; логи ошибок PHP смотрите в /var/log/nginx/error.log и логе PHP-FPM.
  • Письма-напоминания и подтверждения не приходят. Без настроенного SMTP в Settings приложение либо вообще не отправляет почту, либо письма улетают в спам. Проверьте настройки SMTP отдельно кнопкой тестовой отправки, если она есть в вашей версии интерфейса.
  • Форма записи открывается, но слоты не показываются. Обычно это рассинхрон часового пояса сервера и часового пояса, заданного в настройках компании, либо у специалиста не заполнен рабочий график на нужный день недели — проверьте Working Plan у конкретного провайдера.
  • 404 при переходе по ссылкам внутри приложения. Признак того, что try_files в конфиге Nginx настроен не так, как в примере выше — без корректного $args в правиле переписывания маршрутизация CodeIgniter внутри приложения ломается.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Нужен ли Docker для установки?

Нет, официальный путь — обычная установка PHP-приложения на веб-сервер, как показано выше. Docker-образы есть в сообществе, но не являются официально поддерживаемым способом.

Можно ли принимать оплату онлайн прямо при записи?

Из коробки это именно система записи, а не платёжная система. Приём оплаты подключается через интеграции или сторонние сервисы, встроенного эквайринга нет.

Сколько специалистов выдержит один VPS начального уровня?

Для одной точки или небольшой сети (единицы-десятки специалистов) минимальной конфигурации из таблицы выше хватает с запасом — узкое место скорее в почтовых рассылках, чем в базе данных.

Поддерживается ли русский язык интерфейса и SMS-напоминания?

Русская локализация интерфейса есть и переключается в настройках. SMS-напоминаний в базовой поставке нет — нужна интеграция со сторонним SMS-шлюзом через API.

Как перенести EasyAppointments на другой сервер?

Дамп базы данных, каталог storage, повторная установка с тем же config.php и database.php (поменяв base_url, если меняется домен). Отдельного инструмента миграции не требуется.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →