На коленке сделанное, но рабочее решение для OctoberCMS - это та же Ларавель, только обернутая админкой.
Скрипт запускается с двумя аргументами - поддоменом и тем плагином, который добавляется к системе, помимо базового плагина, общего для всех клиентов.
Проверяется, корректный ли поддомен и не занят ли он, копируется основной код Октября и нужные плагины, создается новая БД под этот конкретный поддомен, ее параметры прописываются в настройки сайта, голым SQL вносится пара поправок, чтобы не лезть за этим в админку, а все остальное выполняет запуск artisan.
Nginx настроен так, что любая папка внутри /var/www, кроме начинающихся на подчеркивание, отображается на поддомен.
Добавляем сайт-одностраничник, работающий с сохраненными данными по поддоменам и запускающий на бэке этот скрипт с нужными ключами - и продажник может за минуту соорудить пробник проекта для потенциального клиента, не дергая программиста вообще.
#!/bin/bash
SUB=$1
PLUGIN=$2
if [[ "${SUB}" =~ ^[-0-9a-z]{2,12}$ ]]; then
FOLDER="/var/www/${SUB}"
if [ ! -d "${FOLDER}" ]; then
cp -a /var/www/_fish/October "${FOLDER}"
DB_PASSWORD=`date | md5sum | cut -c1-32`
DB_NAME=prefix_`echo "$SUB"|sed s/-/_/g`
DB_USER="${DB_NAME}"
sed -i "s/#DB_NAME#/${DB_NAME}/g;s/#DB_USER#/${DB_USER}/g;s/#DB_PASSWORD#/${DB_PASSWORD}/g" "${FOLDER}/public/config/database.php"
ROOT_USER=mysqladmin
ROOT_PASSWORD=123456
mysql -u${ROOT_USER} -p${ROOT_PASSWORD} -e "CREATE DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u${ROOT_USER} -p${ROOT_PASSWORD} -e "CREATE USER ${DB_USER}@localhost IDENTIFIED BY '${DB_PASSWORD}';"
mysql -u${ROOT_USER} -p${ROOT_PASSWORD} -e "GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO '${DB_USER}'@'localhost';"
mysql -u${ROOT_USER} -p${ROOT_PASSWORD} -e "FLUSH PRIVILEGES;"
cd "${FOLDER}"/public
php artisan october:up
ADMIN_PASSWORD=`echo ${DB_PASSWORD} | cut -c1-10`
ADMIN_HASH=`php -r "echo password_hash('${ADMIN_PASSWORD}', PASSWORD_BCRYPT);"`
mysql --database=${DB_NAME} -u${DB_USER} -p${DB_PASSWORD} <<-SQL
UPDATE \`backend_users\` SET \`password\` = '${ADMIN_HASH}' WHERE \`id\` = 1;
INSERT INTO \`system_parameters\` SET \`namespace\` = 'cms', \`group\` = 'theme', \`item\` = 'active', \`value\` = '\"theme\"';
SQL
/bin/cp -a /var/www/_fish/Plugins/base/public "${FOLDER}"
/bin/cp -a /var/www/_fish/Plugins/"${PLUGIN}"/public "${FOLDER}"
php artisan october:up
else
echo "Error: Subdomain already used or invalid"
fi
else
echo "Error: Invalid subdomain: " $SUB
fi