(Ломоносовы наших дней, как сказать production по-русски?)
У нашей лаборатории есть сервер. Когда-то его брали, чтобы запустить на нём веб-интерфейс для научного кода, разработанного в нашей же исследовательской группе. Код написан в «лучших» традициях научного программирования, для работы требует FFTW и BLAS, а также базу данных MySQL со строго определённым содержимым. Веб-интерфейс сделан на Perl5, всё это более-менее хорошо работает.
Прошло время. Обстоятельства потребовали разместить на этом же сервере: NextCloud, ещё научный код (Python3, 1,3-гигабайтное виртуальное окружение), MediaWiki для другой исследовательской группы, а сейчас ещё и статический сайт для третьей исследовательской группы.
NextCloud из архива, как ни странно, есть не просит (но им почти не пользуются) и даже может сам себя обновлять без особых проблем. Научный код активно сопротивляется попыткам его опакетить и поэтому живёт прямо в системах контроля версий. (Было хуже. Когда мы начинали, научный код жил в виде папки на общем диске.) Он даже работает в двух экземплярах на разных поддоменах, один - для обкатки новых функций, другой - стабильная версия для всего мира. MediaWiki не простая, а семантическая, поэтому в дистрибутивную копию MW пришлось распаковать zip-архивы с расширениями. Коллегам со статическим сайтом нужен доступ по SFTP, чтобы сайт изредка редактировать. Всему этому нужны свои файлы конфигурации для nginx.
Как это всё разворачивать, чтобы ничего не забыть и не сойти с ума? Читал про Ansible, cdist, Chef, CFEngine, Puppet, но это скорее про организацию целой кучи машин; некоторые из них запускают специальный сервер обновления конфигурации. Для нашего одного VPS это из пушки по воробьям. Мне проще и безопаснее подключиться по SSH с аутентификацией по ключу, чем разбираться, как обезопасить ещё один сервер.
Сейчас всё сделано через пачку sh-скриптов общей длиной менее 500 строк кода, аккуратно написанных так, чтобы они были идемпотентными. Если что-то падает, безопасно исправить ошибку и перезапустить скрипт с самого начала. Чтобы убедиться, что скрипты работоспособны, почти все изменения в состояния сервера я сначала вношу в скрипт, а потом запускаю скрипт, чтобы их применить.
Но сложность скриптов только растёт, и там уже происходит очень много всего: пользователей создать, файлы распаковать, конфигурацию подложить, базу создать, права раздать, сертификаты получить. Как сделать систему, которую, если что, сможет поддерживать другой человек?