Вводные
- CMS, например OpenCart, использующая MySQL
- Сайт развернут на VDS и есть возможностью использовать node.js
- Нужно организовать обмен с CMS
- Web сервер NGINX
Варианты решения
- Использование модулей работающих с форматом CommerceML и настройкой типового функционала в 1С, пример https://github.com/KirilLoveVE/opencart2-exchange1c или платные аналоги
- Использование модулей которые реализуют обертку SQL запросов и ответных обработок к ним
- Использование прямого подключения к MySQL
- Использование REST API, только платный вариант и со своими проблемами
- Использование HTTP обертки для MySQL
К данному варианту решения подтолкнула статья про PostgREST //infostart.ru/1c/articles/1217831/
Реализация
Для решения задачи использую https://github.com/o1lab/xmysql
Устанавливаю пакет
npm install -g xmysql
Запускаю сервис
xmysql -h localhost -u opencartuser -p yHL0nVwQrQ5k9PSAYAcU -d opencart
Если подключение прошло успешно, то вижу
Generating REST APIs at the speed of your thought..
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Database : opencart
Number of Tables : 136
REST APIs Generated : 2593
Xmysql took : 0.3 seconds
API's base URL : localhost:3000
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Создаю перенаправление на обертку на уровне nginx
Проверяю работоспособность
Нужно понимать что доступ через обертку имеет полные права на базу и идет без проверки прав доступа, имеет смысл поставить на уровне конфигурации сайта NGINX ограничения по IP (документация) и использовать аутентификацию, например basic (документация). Так же имеет смысл настроить HTTPS и при возможности организовать VPN канал от сервера 1С до VDS.
Останавливаю xmysql.
Для запуска в качестве сервиса использую pm2 https://pm2.keymetrics.io/
Добавляю сервис xmysql в pm2 (ссылка на источник)
sudo pm2 start --name "xmysql-api" xmysql -- -h localhost -u opencartuser -p yHL0nVwQrQ5k9PSAYAcU -d opencart
Настраиваю pm2 для автоматического запуска
sudo pm2 startup
sudo systemctl enable pm2-root
Сохраняю настройки запущенных сервисов.
sudo pm2 save
В моем случае (тестовый сервер) сервис pm2 запускается из под root, что некорректно с точки зрения безопасности, имеет смысл добавить пользователя с ограниченными правами и работать с pm2 из под него.
Перезапускаю сервер, проверяю работоспособность.
Захожу на сайт "http://oc.malikov.pro/index.php?route=product/product&product_id=43"
Получаю данные товара "GET http://xmysql.malikov.pro/api/oc_product/43"
Обновляю цену "PATCH http://xmysql.malikov.pro/api/oc_product/43"
{
"price": 600
}
Проверяю на сайте
Итог
При отсутствии API для CMS с базой на MySQL можно относительно просто и безопасно организовать работу с данными.
Для фиксации внешних идентификаторов в 1С можно использовать наработки из //infostart.ru/1c/articles/1256935/
Благодарю за внимание.