Поддержка внутренней системы курьерской службы для юрлиц: кабинет клиентов и рабочее место диспетчеров на ColdFusion, ночные скрипты на Perl, быстрые отчёты и новый API, через который клиенты создают отправления из своих программ. Систему ведёт Евгений Росляков. Сайты и веб-системы он делает с 2016 года, живёт в Москве и работает удалённо с компаниями из любых городов. Он самозанятый, заключает договор перед началом работ и передаёт юрлицам закрывающие документы.
Служба возит документы и небольшие грузы по Москве и в регионы. Клиенты у неё — компании.
Система работает с 2005 года. Диспетчеры и клиенты сидят в веб-интерфейсе на ColdFusion. По ночам запускаются скрипты на Perl: импортируют реестры отправлений от клиентов, считают тарифы, строят отчёты. Всё лежит в одной SQL-базе.
За двадцать лет накопилось вот что. Сервер Adobe ColdFusion давно без обновлений, а купить новую лицензию в России нельзя. В старых формах нашлись места, где запрос к базе собирается склейкой строк, то есть открыт для SQL-инъекций. Отчёты строились долго. Скрипты на Perl никто не проверял, и когда они падали ночью, об этом узнавали утром от диспетчеров.
Плюс крупные клиенты потребовали API: они хотят создавать отправления из своих систем, а не выгружать реестры файлами.
Переписывать всё с нуля заказчик не хотел, и правильно: система работает и знает все тонкости тарифов. Её надо было сохранить, закрыть уязвимости и открыть для интеграций.
Сначала аудит: что где лежит, какие версии, какие скрипты и когда запускаются, какие запросы тяжёлые. Я составил список рисков и порядок работ, чтобы заказчик видел, что делается первым и почему.
С ColdFusion от Adobe всё просто: новую лицензию не продадут. Но код на CFML работает и на открытом движке Lucee. Язык тот же, поэтому систему переписывать не пришлось. Правки понадобились только в несовместимых местах: несколько устаревших тегов и функций, отличия в работе с датами. Приложение переехало на Lucee и на новый сервер, после чего я прошёл по сценариям диспетчеров и клиентов.
Дальше безопасность. Формы, где значения из полей подставлялись в SQL-запрос текстом, переделал на параметризованные запросы. Значение теперь уходит в базу отдельно от команды, и типичный путь для инъекции закрыт.
Скрипты на Perl привёл в порядок. Обновил модули, добавил журнал: каждый запуск записывает, что обработал и чем закончил. Для разбора реестров и расчёта тарифов написал тесты на реальных примерах. При сбое диспетчер получает письмо, а не узнаёт утром по звонкам.
Тяжёлые запросы к SQL-базе в отчётах переписал. Посмотрел планы выполнения, добавил индексы там, где база читала всю таблицу, убрал вложенные подзапросы, которые считались многократно.
Затем сделал REST API поверх той же базы. Методы: создать отправление, рассчитать стоимость, получить статус, посмотреть историю. Обмен в формате JSON. У каждого клиента свой ключ доступа, частота запросов ограничена, чтобы чужая ошибка в цикле не положила систему. Для программистов клиентов написал описание API с примерами запросов и ответов.
Система работает на живом, поддерживаемом движке и больше не зависит от лицензии, которую нельзя купить. Диспетчеры почти не заметили перехода: экраны прежние, привычные кнопки на тех же местах.
Уязвимые формы закрыты. Ночные задачи пишут журнал, а сбой приходит письмом, поэтому утром диспетчерам не приходится выяснять, что случилось. Отчёты открываются заметно быстрее, ночной расчёт перестал наползать на утро.
Крупные клиенты подключились к API. Отправление создаётся прямо из их программы, а диспетчер получает его уже в системе. Меньше ручной загрузки реестров, меньше опечаток в адресах.
Не всё сделано. Часть интерфейса выглядит так же, как в 2005 году: работе это не мешает, а менять его стоит вместе с диспетчерами. База по-прежнему одна и без реплики. Копии есть, но если сервер откажет, подниматься придётся из копии, и заказчик отложил отказоустойчивость на период после сезона.
Я остался на постоянной поддержке: слежу за журналами, обновляю то, что устаревает, помогаю новым клиентам с API.
Если у вас есть система, которую боятся трогать, а лицензий на её платформу уже не купить, пришлите мне на freelance.ru описание: на чём она написана и что в ней нельзя останавливать. Скажу, стоит ли её сохранять.