Pular para o conteúdo

Bootloader

O modulo wippy/bootloader orquestra a inicializacao da aplicacao descobrindo e executando funcoes de bootloader em uma ordem definida na inicializacao. Outros modulos do framework (migracoes, criptografia, atualizacao de indices) registram bootloaders para executar seus proprios passos de inicializacao.

Adicione o modulo ao seu projeto:

Terminal window
wippy add wippy/bootloader
wippy install

Declare a dependencia e o host de aplicacao requerido:

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

O bootloader em si executa como wippy.bootloader:bootloader.service (um process.service com auto_start: true). Nada mais e necessario para ativa-lo.

Na inicializacao o bootloader:

  1. Descobre cada entrada com meta.type: bootloader no registro.
  2. Ordena-as por meta.order em ordem ascendente (menor primeiro).
  3. Executa cada uma sequencialmente como uma funcao Lua.
  4. Para no primeiro erro que retorna status = "error".
  5. Reporta os totais / sucessos / falhas / ignorados quando termina.

Os bootloaders sao autonomos — cada um verifica suas proprias condicoes, faz seu trabalho e reporta um resultado estruturado.

Um bootloader e qualquer entrada function.lua com 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
CampoObrigatorioDescricao
meta.typeSimDeve ser bootloader
meta.orderNaoOrdem de execucao (padrao 100); menor executa primeiro
meta.descriptionNaoResumo legivel por humanos
meta.requiresNaoDicas de dependencia exibidas nos logs

O method retorna uma tabela descrevendo o resultado:

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 }
StatusSignificado
successTrabalho concluido
skippedSem operacao (ja feito, pre-condicao nao atendida)
errorFalha — interrompe a sequencia de boot

Um bootloader que lanca um erro Lua e tratado como error.

Valores menores de order executam primeiro. Reserve ordens baixas para infraestrutura:

OrderUso Tipico
10Segredos e chaves de criptografia (fornecido pelo modulo)
20Migracoes de schema (fornecido por wippy/migration)
50Semeadura de dados, aquecimento de indice de busca
100Padrao — tarefas em nivel de aplicacao

Quando dois bootloaders compartilham uma ordem, a ordem de execucao entre eles nao e garantida.

Gera uma ENCRYPTION_KEY de 256 bits e a armazena atraves do env_storage configurado se nenhum valor estiver presente. Outros modulos (seguranca, rastreamento de uso) leem esta variavel para criptografia envelope. E ignorado quando a variavel ja existe.

Fornecido por wippy/migration. Descobre cada entrada com meta.type: migration, agrupa-as por meta.target_db e aplica as pendentes. Veja Migracoes.

O servico registra uma linha por bootloader (SUCCESS, FAILED, SKIPPED) com o ID da entrada, ordem e duracao. A linha de resumo final reporta os totais agregados. Um bootloader que falha aborta a inicializacao — a politica de reinicio do supervisor entao se aplica a bootloader.service.

Mantenha os bootloaders idempotentes. Eles podem executar novamente apos um reinicio por crash, entao verifique pre-condicoes (linha existe, arquivo presente, variavel env definida) antes de fazer o trabalho.