Перейти к содержимому

Загрузчик

Модуль wippy/bootloader управляет инициализацией приложения, обнаруживая и запуская функции загрузчика в определённом порядке при старте. Другие модули фреймворка (миграции, шифрование, обновление индекса) регистрируют загрузчики для выполнения собственных шагов инициализации.

Добавьте модуль в проект:

Окно терминала
wippy add wippy/bootloader
wippy install

Объявите зависимость и необходимый хост приложения:

version: "1.0"
namespace: app
entries:
- name: processes
kind: process.host
lifecycle:
auto_start: true
- name: os_env
kind: env.storage.os
- name: dep.bootloader
kind: ns.dependency
component: wippy/bootloader
version: "*"
parameters:
- name: application_host
value: app:processes
- name: env_storage
value: app:os_env

Сам загрузчик работает как wippy.bootloader:bootloader.service (process.service с auto_start: true). Больше ничего не требуется для его активации.

При старте загрузчик:

  1. Обнаруживает в реестре каждую запись с meta.type: bootloader.
  2. Сортирует их по meta.order по возрастанию (наименьшие первыми).
  3. Выполняет каждую последовательно как функцию Lua.
  4. Останавливается на первой ошибке, возвращающей status = "error".
  5. Сообщает по завершении общее число / успешных / неудачных / пропущенных.

Загрузчики автономны — каждый проверяет свои условия, выполняет работу и возвращает структурированный результат.

Загрузчик — это любая запись function.lua с meta.type: bootloader:

- name: seed_defaults
kind: function.lua
meta:
type: bootloader
order: 50
description: Seed default rows for a new install
source: file://seed_defaults.lua
method: run
modules:
- logger
imports:
sql: :sql
ПолеОбязательноОписание
meta.typeДаДолжно быть bootloader
meta.orderНетПорядок выполнения (по умолчанию 100); меньшие выполняются первыми
meta.descriptionНетЧеловекочитаемое описание
meta.requiresНетПодсказки о зависимостях, отображаемые в логах

Метод method возвращает таблицу, описывающую результат:

local function run()
local ok, err = apply_seed()
if err then
return {
status = "error",
message = "seed failed: " .. tostring(err)
}
end
if not ok then
return {
status = "skipped",
message = "already seeded"
}
end
return {
status = "success",
message = "seeded default rows"
}
end
return { run = run }
СтатусЗначение
successРабота выполнена
skippedБез действий (уже выполнено, предусловие не соблюдено)
errorСбой — останавливает последовательность загрузки

Загрузчик, выбрасывающий ошибку Lua, обрабатывается как error.

Меньшие значения order выполняются первыми. Резервируйте низкие значения для инфраструктуры:

OrderТипичное использование
10Секреты и ключи шифрования (предоставляется модулем)
20Миграции схемы (предоставляется wippy/migration)
50Заполнение данных, прогрев поискового индекса
100По умолчанию — задачи уровня приложения

Когда два загрузчика имеют одинаковый порядок, последовательность выполнения между ними не гарантируется.

Генерирует 256-битный ENCRYPTION_KEY и сохраняет его через настроенный env_storage, если значение отсутствует. Другие модули (безопасность, отслеживание использования) читают эту переменную для envelope-шифрования. Пропускается, если переменная уже существует.

Предоставляется wippy/migration. Обнаруживает каждую запись с meta.type: migration, группирует их по meta.target_db и применяет ожидающие. См. Миграции.

Сервис записывает в лог по одной строке на каждый загрузчик (SUCCESS, FAILED, SKIPPED) с ID записи, порядком и длительностью. Итоговая строка сводки сообщает агрегированные счётчики. Сбойный загрузчик прерывает старт — к bootloader.service далее применяется политика рестарта супервизора.

Делайте загрузчики идемпотентными. Они могут запускаться повторно после рестарта при падении, поэтому проверяйте предусловия (строка существует, файл присутствует, env-переменная установлена) перед выполнением работы.