Загрузчик

Модуль 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 По умолчанию -- задачи уровня приложения

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

Встроенные загрузчики

Ключ шифрования (порядок 10)

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

Загрузчик миграций (порядок 20)

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

Наблюдение за статусом загрузки

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

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

См. Также