Meilisearch
Adicione a camada complementar oficial para indexação atômica durante o build e busca opcional no navegador.
A camada oficial @kirchdev/duxt-meilisearch consome todo o
snapshot duxt:search:records. Preserva IDs derivados da URL,
texto normalizado, origem, versão e idioma, incluindo seções geradas. Meilisearch
é opcional; a busca integrada não precisa de serviço.
pnpm add @kirchdev/duxt-meilisearchexport default defineNuxtConfig({
extends: ['@kirchdev/duxt', '@kirchdev/duxt-meilisearch'],
duxtMeilisearch: {
host: process.env.MEILISEARCH_HOST,
index: 'docs',
searchKey: process.env.MEILISEARCH_SEARCH_KEY,
syncKey: process.env.MEILISEARCH_SYNC_KEY,
taskKey: process.env.MEILISEARCH_TASK_KEY,
sync: {
enabled: process.env.MEILISEARCH_SYNC_ENABLED === 'true',
deployment: process.env.DUXT_DEPLOYMENT === 'production'
? 'production' : 'preview'
}
}
})
Ative ambas as opções de produção apenas no trabalho de publicação. A presença
de syncKey não habilita gravações. Desenvolvimento, Nuxt prepare e contextos
reconhecidos de PR ou prévia ignoram a sincronização. Outros sistemas CI devem
usar deployment: 'preview' nas prévias. Cloudflare Pages também exige que
DUXT_PRODUCTION_BRANCH corresponda a CF_PAGES_BRANCH.
Use um índice exclusivo docs. A chave privada de build precisa de
indexes.create, indexes.get, indexes.delete, indexes.swap,
settings.update, documents.add e tasks.get para docs e docs__duxt_*.
A camada cria um índice temporário único, aguarda tarefas de configuração e
importação, troca-o atomicamente com docs, aguarda o sucesso da troca e só então
remove o snapshot anterior. Builds seguintes removem páginas excluídas; um
snapshot vazio esvazia o índice. Falhas de importação preservam o índice anterior.
Uma troca incerta mantém o índice temporário para evitar excluir dados
possivelmente publicados; falhas de limpeza são informadas. Serialize as
publicações se a ordem importar. A primeira sincronização cria o destino vazio
quando o índice temporário está pronto.
A chave privada nunca entra na configuração do navegador. Omita searchKey
para manter a busca integrada durante a sincronização. Para conectar o diálogo
existente, crie outra chave com apenas a ação search e apenas o índice
configurado docs. A chave de busca padrão abrange todos os índices; não a use.
Nunca publique uma chave mestra ou administrativa. A camada rejeita reutilizar a
chave privada conhecida; uma string opaca não revela permissões, portanto cabe
ao operador provisionar a chave restrita. Busca apenas no navegador não precisa
de chave privada. Permita a origem do site na configuração CORS do serviço.
A busca mantém a versão selecionada ou padrão de cada artefato e a cadeia de
idiomas de fallback. Uma tradução substitui sua página original; páginas sem
tradução continuam acessíveis no idioma original. A camada lê um inventário de
caminhos em cache pelo Content e exclui páginas cobertas por fonte, versão e
idioma antes da classificação e do limite. O campo page, usado apenas para
filtrar, contém a URL sem âncora; seções ocultas não ocupam a janela de 1.000
resultados. Sincronize uma vez antes da busca no navegador se uma compilação
anterior criou o índice. Erros do serviço produzem resultados vazios e
um aviso no console. Requisições HTTP expiram após 30 segundos; tarefas têm cinco
minutos, configuráveis por sync.taskTimeoutMs, até uma hora.
O pacote tem versão e changelog próprios. duxt não recebe SDK, credenciais nem
configuração do provedor. Interfaces próprias usam
@kirchdev/duxt-meilisearch/search; scripts de build podem usar
@kirchdev/duxt-meilisearch/sync com as mesmas opções de produção.
Consulte a troca atômica, as tarefas assíncronas e as chaves restritas do Meilisearch.
Meilisearch 1.54.3 oculta a tarefa global indexSwap (indexUid: null) de
chaves restritas por índice, mesmo que incluam ambos os índices. Com uma chave de
escrita restrita, forneça um taskKey privado apenas com
actions: ['tasks.get'] e indexes: ['*']. Ele serve somente para consultar
tarefas e nunca é publicado. Sem ele, syncKey precisa ler tarefas globais. Um
404 oculto não confirma a publicação e preserva o índice temporário. Esse
comportamento foi verificado com o motor real.