Загрузчик
Модуль 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). Больше ничего не требуется для его активации.
Как это работает
При старте загрузчик:
- Обнаруживает в реестре каждую запись с
meta.type: bootloader. - Сортирует их по
meta.orderпо возрастанию (наименьшие первыми). - Выполняет каждую последовательно как функцию Lua.
- Останавливается на первой ошибке, возвращающей
status = "error". - Сообщает по завершении общее число / успешных / неудачных / пропущенных.
Загрузчики автономны -- каждый проверяет свои условия, выполняет работу и возвращает структурированный результат.
Определение загрузчика
Загрузчик -- это любая запись 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 далее применяется политика рестарта супервизора.
См. Также
- Миграции - Загрузчик миграций и DSL
- Супервизия - Жизненный цикл сервиса и политика рестарта
- Обзор фреймворка - Использование модулей фреймворка