Skip to content

Artisan и безопасность

Templite добавляет 16 artisan-команд под префиксом cms:. Все запускаются через docker exec templite-app php artisan <command> (или нативно php artisan ..., если работаете без Docker).

Полный список команд

КомандаНазначение
cms:installПервичная установка CMS — миграции, сидеры, создание суперадмина
cms:updateОбновление CMS после composer update — публикация ассетов и миграции
cms:cache-clearОчистка кэша CMS
cms:check-securityАудит безопасности — дефолтные пароли, debug-режим, APP_KEY
cms:cleanup-expired-2fa-devicesУдаление истёкших доверенных устройств 2FA
cms:cleanup-expired-sessionsУдаление истёкших сессий менеджеров
cms:cleanup-exportsУдаление устаревших ZIP-архивов экспорта/импорта
cms:cleanup-schedule-historyОчистка истории расписания старше 7 дней
cms:compile-assetsКомпиляция CSS/JS-ассетов блоков для страниц
cms:make-actionГенерация PHP-класса Action
cms:make-blockГенерация блока (template/style/script/block.json)
cms:make-componentГенерация Blade-компонента
cms:reset-passwordСброс пароля менеджера админки
cms:resize-imagesПересоздание ресайзов изображений
cms:run-actionРучное выполнение Action по slug/ID
cms:process-scheduled-pagesПубликация/депубликация страниц по publish_at / unpublish_at

Команд cms:user:create, cms:user:password, cms:user:2fa, cms:install <package>, cms:publish, cms:cache:warm, cms:blocks:rebuild, cms:settings:export/import, cms:cities:import, cms:translations:export, cms:mcp:token, cms:images:regenerate не существует. Если нужна функциональность из этого списка — обычно она доступна через REST API или UI админки.


Установка и обновление

cms:install

Первичная установка CMS в Laravel-проекте.

bash
docker exec -it templite-app php artisan cms:install
ОпцияНазначение
--freshПересоздать все таблицы (migrate:fresh). Уничтожает существующие данные.
--skip-migrateПропустить миграции (если БД уже накатана)

Что делает:

  1. Чистит дефолтные Laravel-маршруты и welcome.blade.php.
  2. Публикует конфиг config/cms.php и pre-built ассеты админки.
  3. Создаёт служебные директории.
  4. Накатывает миграции CMS.
  5. Интерактивно создаёт суперадмина.
  6. Создаёт storage:link.
  7. Прописывает APP_INSTALLED=true в .env.
  8. Удаляет install.php, если он был.

Подробнее — Установка.

cms:update

bash
docker exec templite-app php artisan cms:update
ОпцияНазначение
--skip-migrateНе запускать миграции

Что делает:

  • Публикует обновлённые ассеты (vendor:publish --tag=cms-build + cms-assets).
  • Накатывает новые миграции.

Запускать после composer update templite/cms.


Менеджеры и безопасность

cms:reset-password

bash
docker exec -it templite-app php artisan cms:reset-password admin

Сброс пароля менеджера по логину. Интерактивно запрашивает новый пароль. Если оставить ввод пустым — генерирует случайный 16-символьный пароль и показывает его один раз.

Только для менеджеров

Это команда только для менеджеров админки (Manager модель). Для frontend-пользователей (User) аналогичной команды нет — используйте REST API PUT /api/cms/users/{id} или UI.

cms:check-security

bash
docker exec templite-app php artisan cms:check-security

Проверяет:

  1. Дефолтные пароли менеджеров — наличие паролей admin123, password, 123456, admin.
  2. APP_DEBUG=true в production — недопустимо.
  3. APP_KEY — установлен ли.

При нахождении проблем возвращает exit-code 1. Можно использовать в health-check скриптах.

cms:cleanup-expired-2fa-devices

bash
docker exec templite-app php artisan cms:cleanup-expired-2fa-devices

Удаляет истёкшие записи доверенных устройств 2FA (которые превысили CMS_TWO_FACTOR_TRUST_DAYS). Запускается через расписание автоматически.

cms:cleanup-expired-sessions

bash
docker exec templite-app php artisan cms:cleanup-expired-sessions

Удаляет истёкшие сессии менеджеров из БД (для драйвера сессий database). Запускается через расписание.


Кэш и ассеты

cms:cache-clear

bash
docker exec templite-app php artisan cms:cache-clear
docker exec templite-app php artisan cms:cache-clear --blocks
ОпцияНазначение
--blocksОчистить только кэш блоков (без глобальных настроек и Blade)

Без флагов — полная очистка кэша CMS (блоки, SCSS, глобальные настройки, файлы городов и языков).

Имя команды через дефис

Команда называется cms:cache-clear (через дефис), не cms:cache:clear (через двоеточие). Это распространённая опечатка.

cms:compile-assets

bash
docker exec templite-app php artisan cms:compile-assets
docker exec templite-app php artisan cms:compile-assets --page=42
ОпцияНазначение
--page=IDСкомпилировать ассеты только для конкретной страницы

Собирает CSS/JS-ассеты блоков для всех (или одной) страниц. Результат сохраняется в PageAsset и попадает в $assets шаблона страницы при рендере.

cms:resize-images

bash
docker exec templite-app php artisan cms:resize-images
docker exec templite-app php artisan cms:resize-images --all
ОпцияНазначение
--allПересоздать ресайзы для всех изображений (иначе только для тех, где они отсутствуют)

Используется после изменения default_image_sizes в config/cms.php или после добавления новых форматов (WebP/AVIF).


Блоки, Actions, Компоненты

cms:make-block, cms:make-action, cms:make-component

Генераторы кода. См. соответствующие разделы — Блоки, Actions, Компоненты.

bash
docker exec templite-app php artisan cms:make-block HeroBanner
docker exec templite-app php artisan cms:make-action SendContactForm
docker exec templite-app php artisan cms:make-component PriceTag
ОпцияНазначение
--storageСоздать в storage/cms/... вместо app/Cms/...
--type= (только для make-block)Slug типа блока

Расхождение путей make-команд и runtime

Без флага --storage команды создают файлы в app/Cms/Blocks/, app/Cms/Actions/, app/Cms/Components/ — runtime-резолверы (BlockRegistry, ActionRegistry, ComponentRegistry) сканируют другие пути (app/Blocks/, app/Actions/, app/View/Components/Cms/). Используйте --storage или переносите файлы вручную в правильную папку.

cms:run-action

bash
docker exec templite-app php artisan cms:run-action send-contact-form
docker exec templite-app php artisan cms:run-action 42

Запускает action вручную (по slug или ID). Используется для отладки. В реальной работе actions выполняются автоматически в рендере страницы или через HTTP /action/{slug}.


Очистки и housekeeping

cms:cleanup-exports

bash
docker exec templite-app php artisan cms:cleanup-exports
docker exec templite-app php artisan cms:cleanup-exports --days=14

Удаляет ZIP-архивы экспорта/импорта старше N дней (по умолчанию — стандартное значение из реализации).

cms:cleanup-schedule-history

bash
docker exec templite-app php artisan cms:cleanup-schedule-history

Очищает историю выполнения расписания (schedule_history) старше 7 дней.

cms:process-scheduled-pages

bash
docker exec templite-app php artisan cms:process-scheduled-pages

Обрабатывает страницы с publish_at / unpublish_at — поднимает status в 1 для тех, у кого publish_at <= now(), и опускает в 0 для тех, у кого unpublish_at < now().

Подключается к расписанию Laravel и запускается через cron каждую минуту (cron-контейнер делает schedule:run).


Расписание (Schedule)

Команды очистки и обработки запускаются автоматически через Laravel scheduler. Конфигурация — стандартный app/Console/Kernel.php или (в новых проектах) bootstrap/app.php.

В production-контейнере templite-cron (см. Развёртывание) запускает php artisan schedule:run --no-interaction каждую минуту:

sh
while true; do
    php /var/www/artisan schedule:run --no-interaction
    sleep 60
done

Управление расписанием через UI/API — раздел Настройки ядра → Расписание (/cms/core-settings). REST-эндпоинты — /api/cms/core-settings/schedule/... (см. REST API).


Production security checklist

Удаление install.php

После первой установки CMS обязательно удалить public/install.php. Этот файл предоставляет полный доступ к настройке БД и админам — оставлять на production опасно.

cms:install удаляет его автоматически в конце процесса. Если по какой-то причине файл остался — удалите вручную:

bash
docker exec templite-app rm public/install.php

Или заблокируйте в Nginx:

nginx
location = /install.php {
    return 404;
}

Чек-лист перед запуском в production

Перед публикацией

  1. Удалён install.php в public/.
  2. cms:check-security не выдаёт ошибок: нет дефолтных паролей, APP_DEBUG=false, APP_KEY установлен.
  3. Все пароли сменены с дефолтных (DB, Redis, ADMIN_PASSWORD).
  4. APP_KEY уникальный, не из dev-окружения.
  5. SANCTUM_STATEFUL_DOMAINS содержит реальный домен.
  6. Swagger UI закрыт или L5_SWAGGER_GENERATE_ALWAYS=false.
  7. 2FA включена для всех менеджеров (CMS_TWO_FACTOR_MODE=required).
  8. Автобэкапы БД и storage/ настроены (см. Развёртывание).
  9. SSL терминируется на NPM с Force SSL и HTTP/2.
  10. Файрвол открывает наружу только 80/443. Внутренние порты (3306, 6379) — только локально или через docker-сеть.

2FA для менеджеров

Настраивается через .env:

dotenv
CMS_TWO_FACTOR_MODE=required           # off | optional | required
CMS_TWO_FACTOR_TRUST_DAYS=0            # 0 = всегда спрашивать

Подробнее — Первый вход в админку.

Rate limiting

ЭндпоинтЛимит
POST /api/cms/auth/login5/min
POST /api/cms/auth/two-factor/verify5/min
POST /api/cms/user-auth/{guard}/login5/min
POST /api/cms/user-auth/{guard}/register3/min
Code-editing endpoints (*/code)10/min
Heavy ops (upload, compile, cache)10/min
Общийчерез throttle:cms-api middleware

Не настраивается через .env напрямую — конфигурируется в RouteServiceProvider / контейнере limiters Laravel.

Бэкапы

Минимум — ежедневный дамп MySQL и снапшот папки public_html/storage/. Не входит в поставку CMS, настраивается через cron хоста.

bash
# Daily MySQL dump
0 2 * * * docker compose -f docker-compose.prod.yml exec -T db \
    mysqldump -u root -p"$DB_ROOT_PASSWORD" templite_cms \
    > /backups/db-$(date +\%F).sql

# Daily storage archive
30 2 * * * tar -czf /backups/storage-$(date +\%F).tar.gz public_html/storage

Подводные камни

Подводные камни

  • Имя команды очистки кэша — cms:cache-clear (через дефис, не cms:cache:clear).
  • Команды cms:make-* без --storage создают файлы в app/Cms/..., runtime ищет в других папках. Используйте --storage или переносите вручную.
  • cms:reset-password только для менеджеров. Для frontend-пользователей (User) нет аналогичной команды — используйте REST API или UI.
  • MCP-токены не выпускаются через artisan. Используйте REST POST /api/cms/core-settings/mcp/generate-token или UI «Настройки ядра» → MCP.
  • cms:install <package> не существует. Composer-пакеты устанавливаются обычным composer require <vendor/package>. Если пакет требует публикации миграций — php artisan vendor:publish --tag=<package-name>-migrations + php artisan migrate.
  • cms:cleanup-* команды запускаются автоматически через Laravel scheduler в production. Запускать вручную имеет смысл только при отладке.
  • cms:check-security не проверяет всё. Это базовый аудит (пароли, debug, APP_KEY). Полная проверка production — checklist выше плюс внешний security-audit.

Связанные разделы

Распространяется под лицензией MIT.