mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-01 10:22:08 +00:00
536 lines
45 KiB
JSON
536 lines
45 KiB
JSON
{
|
||
"meta": {
|
||
"title": "Notificações Proxmox — Telegram, Discord, E-mail, Gotify, Pushover, Apprise | ProxMenux Monitor",
|
||
"description": "Envie notificações Proxmox VE por Telegram, Discord, email, Gotify, Pushover e cerca de 80 serviços Apprise. O Monitor reúne eventos de saúde, registo do sistema e webhook PVE, com deduplicação, intervalos entre envios, resumos, reescrita IA opcional e histórico.",
|
||
"ogTitle": "Notificações Proxmox — Telegram, Discord, e-mail, Gotify, Pushover, Apprise",
|
||
"ogDescription": "Alertas Proxmox VE nos seis canais, com serviços adicionais Apprise, deduplicação, intervalos entre envios, agregação e reescrita IA opcional.",
|
||
"twitterTitle": "Notificações Proxmox | ProxMenux Monitor",
|
||
"twitterDescription": "Envie alertas Proxmox VE para Telegram, Discord, Email, Gotify, Pushover e ~80 serviços extras via Apprise."
|
||
},
|
||
"header": {
|
||
"title": "Notificações",
|
||
"description": "Distribui os eventos recolhidos pelo Monitor pelos canais configurados: Telegram, Discord, email, Gotify, Pushover e cerca de 80 serviços via Apprise. Inclui deduplicação, intervalos entre envios, agregação de eventos próximos, filtros por evento e canal, reescrita IA opcional e histórico consultável.",
|
||
"section": "ProxMenux Monitor"
|
||
},
|
||
"intro": {
|
||
"title": "De onde vêm as mensagens",
|
||
"body": "As notificações usam os eventos já produzidos pelo <link>Health Monitor</link>, monitores do registo e tarefas Proxmox, webhook PVE, verificações periódicas e scripts ProxMenux. Não fazem uma análise separada: os eventos passam pelo mesmo processo de envio aos canais configurados."
|
||
},
|
||
"howItWorks": {
|
||
"heading": "Como funciona",
|
||
"intro": "Coletores independentes produzem eventos estruturados. O processo de envio decide se os envia e em que formato; pode reescrevê-los com um LLM e distribui-os pelos canais configurados.",
|
||
"arrowLabel": "evento",
|
||
"caption": "Cada tentativa efetiva de envio, bem-sucedida ou falhada, fica no histórico SQLite. Um grupo agregado surge como uma entrada; os eventos suprimidos pelo intervalo entre envios não são registados.",
|
||
"nodes": {
|
||
"sourcesLabel": "Fontes",
|
||
"sourcesDetail": "Health Monitor\nMonitor do registo\nMonitor de tarefas\nWebhook PVE\nVerificações periódicas\nEventos internos",
|
||
"dispatchLabel": "Processo de envio",
|
||
"dispatchDetail": "Agregação de eventos próximos\nVerificações de assinatura/intervalo\nLimites de frequência por grupo\nControlos por canal",
|
||
"aiLabel": "Reescrita com IA (opcional)",
|
||
"aiDetail": "OpenAI / Anthropic\nGemini / Groq\nOpenRouter / Ollama\n(desativada por predefinição)",
|
||
"channelsLabel": "Canais",
|
||
"channelsDetail": "Telegram\nDiscord\nE-mail (SMTP)\nGotify\nPushover\nApprise (~80 serviços)"
|
||
}
|
||
},
|
||
"enabling": {
|
||
"heading": "Habilitando o painel",
|
||
"intro": "Numa instalação nova, o cartão Notificações nas Definições mostra <em>Desativadas</em> e o botão <em>Ativar notificações</em>. Até o premir não envia mensagens nem altera a configuração PVE.",
|
||
"disabledAlt": "Cartão Notificações desativado com botão para ativar",
|
||
"disabledCaption": "O primeiro estado — um clique para habilitar.",
|
||
"stepsIntro": "Pressionar o botão faz três coisas em sequência:",
|
||
"steps": [
|
||
"Passa ao estado <em>Ativas</em> e mostra o formulário dos canais.",
|
||
"Regista o destino webhook em <code>/etc/pve/notifications.cfg</code>. Sem HTTPS usa <code>POST http://127.0.0.1:8008/api/notifications/webhook</code>; com HTTPS usa o listener HTTP local separado na porta 8009. As notificações PVE entram assim no processo do Monitor. Veja <pvelink>Integração webhook PVE</pvelink>.",
|
||
"Inicia o thread de envio em segundo plano, que lê a fila e processa os eventos."
|
||
],
|
||
"activeAlt": "Notificações ativas: separadores dos canais, nome apresentado e secção expansível de reescrita IA",
|
||
"activeCaption": "Estado ativo: separadores Telegram, Gotify, Discord, email, Pushover e Apprise, nome apresentado, categorias por canal e secção <em>Avançadas: melhoria IA</em>."
|
||
},
|
||
"sources": {
|
||
"heading": "Fontes de eventos",
|
||
"intro": "Seis tipos de fontes alimentam as notificações: coletores em segundo plano, recetor webhook e eventos internos do processo. Produzem objetos <code>NotificationEvent</code> estruturados.",
|
||
"headerCollector": "Coletor",
|
||
"headerWatches": "O que monitoriza",
|
||
"headerEvents": "Eventos típicos",
|
||
"rows": [
|
||
{
|
||
"collector": "Monitor de Saúde",
|
||
"watches": "Dez categorias, cada 5 minutos",
|
||
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>."
|
||
},
|
||
{
|
||
"collector": "Monitor do registo do sistema",
|
||
"watches": "Segue <code>journalctl --follow</code> e reconhece falhas de autenticação SSH/web, bloqueios Fail2Ban se a jail estiver instalada, erros de E/S, OOM e eventos smartd.",
|
||
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>oom_kill</code>, <code>disk_io_error</code>, <code>service_fail</code>."
|
||
},
|
||
{
|
||
"collector": "Monitor de tarefas",
|
||
"watches": "Consulta <code>/var/log/pve/tasks/index</code> para encontrar novos UPID e acompanha os respetivos ficheiros de registo.",
|
||
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>migration_*</code>, <code>snapshot_complete</code>."
|
||
},
|
||
{
|
||
"collector": "Webhook Proxmox",
|
||
"watches": "Recebe <code>POST /api/notifications/webhook</code>. Versões PVE com destinos webhook podem encaminhar notificações após a configuração; veja <pvelink>abaixo</pvelink>.",
|
||
"events": "Qualquer coisa que PVE emite – incluindo eventos que o Monitor perderia (HA, replicação, vzdump da GUI)."
|
||
},
|
||
{
|
||
"collector": "Colector de sondagem",
|
||
"watches": "Comparações periódicas: nós do cluster disponíveis, validade de certificados, atribuição GPU e atualizações PVE/ProxMenux.",
|
||
"events": "<code>node_disconnect</code>, <code>node_reconnect</code>, <code>pve_update</code>, <code>proxmenux_update</code>, <code>gpu_mode_switch</code>, <code>pci_passthrough_conflict</code>."
|
||
},
|
||
{
|
||
"collector": "Emissores em processo",
|
||
"watches": "Chamadas diretas de ProxMenux scripts e do próprio Monitor (<code>notification_manager.emit_event(...)</code>).",
|
||
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>ai_model_migrated</code>, eventos de teste personalizados."
|
||
}
|
||
],
|
||
"after1": "Cada evento tem <code>event_type</code> estável, <code>severity</code> (<code>INFO</code>, <code>WARNING</code>, <code>CRITICAL</code>), <code>category</code> para emojis e filtros e dados <code>data</code> para o modelo, como <code>vmid</code>, <code>device</code>, <code>source_ip</code> e <code>reason</code>.",
|
||
"after2": "O modelo de cada <code>event_type</code> em <code>notification_templates.py</code> produz o texto enviado. A reescrita IA opcional usa esse texto. A página <ailink>Assistente IA</ailink> explica a relação entre modelo e reescrita."
|
||
},
|
||
"channels": {
|
||
"heading": "Configuração dos canais",
|
||
"intro": "Atualmente são suportados seis canais: Telegram, Discord, Gotify, Email (SMTP), Pushover e Apprise. Os cinco primeiros são integrações nativas com seus próprios campos de configuração. Apprise é um hub genérico que adiciona em torno de 80 serviços adicionais (ntfy, Matrix, Slack, Teams, Pushbullet, AWS SNS, Mattermost...) através de um único campo URL. Todos eles estão documentados passo a passo abaixo.",
|
||
"credsTitle": "Onde ficam guardadas as credenciais",
|
||
"credsBody": "Tokens, chaves, webhook URLs e senhas SMTP são armazenados localmente no banco de dados SQLite do Monitor em <code>/usr/local/share/proxmenux/</code>. Valores sensíveis são protegidos e mascarados na interface. Eles nunca saem do anfitrião, exceto para chegar aos seus respectivos serviços. Um backup desse diretório é suficiente para recuperar os canais configurados."
|
||
},
|
||
"telegram": {
|
||
"heading": "Telegram",
|
||
"intro": "Precisa de um <strong>token do bot</strong>, reutilizável entre conversas, e um <strong>ID da conversa</strong>, que identifica conversa privada, grupo ou supergrupo. O guia integrado explica os passos; seguem os formatos de destino.",
|
||
"guideAlt": "Guia de Configuração de Bots Telegram com quatro seções numeradas: Criar um Bot com BotFather, Obter o Token Bot, Obter o ID de Chat e Para Grupos ou Canais",
|
||
"guideCaption": "O link <em>+ guia de configuração</em> no separador Telegram abre a janela com quatro passos para configurar o canal.",
|
||
"step1Title": "1 · Criar um bot com BotFather",
|
||
"step1Items": [
|
||
"Abra o Telegram e inicie uma conversa com o <a>@BotFather</a> (aquele com o tique azul de verificação – as cópias são comuns).",
|
||
"Enviar <code>/newbot</code>.",
|
||
"Escolha um nome de exibição (por exemplo: <em>ProxMenux Lab</em>). Pode ser mudado mais tarde.",
|
||
"Escolha um nome de utilizador único no Telegram que termine em <code>bot</code>, por exemplo <em>proxmenux_lab_bot</em>.",
|
||
"O BotFather responde com o token, por exemplo <code>123456789:ABCdef…</code>. Trate-o como uma palavra-passe."
|
||
],
|
||
"step2Title": "2 · Obter o ID do Chat",
|
||
"step2Intro": "O ID da conversa indica <em>onde</em> o bot envia. O formato depende do destino.",
|
||
"privateLabel": "Conversa privada (você recebe os alertas em sua própria conta):",
|
||
"privateItems": [
|
||
"Inicie uma conversa com seu novo bot e envie qualquer mensagem (por exemplo: <code>/start</code>).",
|
||
"Abra uma conversa com <a1>@userinfobot</a1> (ou <a2>@myidbot</a2>) e envie <code>/start</code>. Ele responde com o seu ID de usuário numérico — que é o ID do Chat. É um número positivo."
|
||
],
|
||
"privateAlt": "Formulário Telegram com token oculto, ID da conversa positivo e ID do tópico opcional vazio",
|
||
"privateCaption": "Conversa privada com o bot — Chat ID é um número positivo (seu ID de usuário pessoal).",
|
||
"groupLabel": "Grupo ou supergrupo com tópicos:",
|
||
"groupItems": [
|
||
"Adicione o bot ao grupo como membro (e torne-o administrador se o grupo exigir que ele publique).",
|
||
"Envie qualquer mensagem no grupo.",
|
||
"Abra <code>https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates</code> em um navegador. Procure <code>chat.id</code> na resposta JSON — para grupos é um número negativo, para supergrupos começa com <code>-100</code>.",
|
||
"Nos supergrupos com <em>Tópicos</em>, anote também o <code>message_thread_id</code> do destino e coloque-o no campo opcional <em>ID do tópico</em>."
|
||
],
|
||
"groupAlt": "Formulário Telegram para supergrupo: token oculto, ID da conversa negativo com prefixo -100 e ID do tópico 3",
|
||
"groupCaption": "Supergrupo: o ID da conversa começa por <code>-100…</code>; <em>ID do tópico</em> seleciona uma conversa específica.",
|
||
"step3Title": "3 · Salvar e testar",
|
||
"step3Body": "Introduza token e ID da conversa, guarde e prima <em>Enviar teste</em>. Se não chegar, consulte o histórico: token inválido, bot ausente do grupo ou bloqueado, etc."
|
||
},
|
||
"discord": {
|
||
"heading": "Discord",
|
||
"intro": "Os canais Discord aceitam mensagens recebidas através de um <em>Webhook URL</em> ligado a um único canal. O Monitor precisa dessa URL e nada mais.",
|
||
"items": [
|
||
"No Discord abra o servidor e vá a <em>Definições do servidor → Integrações → Webhooks</em>.",
|
||
"Prima <em>Novo webhook</em>, atribua um nome como <em>ProxMenux</em> e escolha o canal. O avatar é opcional.",
|
||
"Prima <em>Copiar URL do webhook</em>: o formato é <code>https://discord.com/api/webhooks/<id>/<token></code>.",
|
||
"Colar no campo de URL Webhook da aba Discord no painel Notificações e salvar."
|
||
],
|
||
"imageAlt": "Forma de canal Discord com campo de URL Webhook começando com https://discord.com/api/webhooks/",
|
||
"imageCaption": "Discord: copie o URL em <em>Definições do servidor → Integrações → Webhooks</em>."
|
||
},
|
||
"gotify": {
|
||
"heading": "Gotify",
|
||
"intro": "Gotify é um servidor de notificações push alojado por si. Precisa do URL e de um <em>token da aplicação</em> gerado na interface de administração.",
|
||
"items": [
|
||
"Se você ainda não tiver uma instância Gotify, instale uma — veja o guia de instalação <a>oficial</a>.",
|
||
"Entre no Gotify como administrador, abra <em>Aplicações</em> → <em>Criar aplicação</em>, dê-lhe o nome <em>ProxMenux</em> e copie o token.",
|
||
"Na aba Gotify do painel Notificações, defina <em>Server URL</em> para o URL base de sua instância (por exemplo. <code>https://gotify.example.com</code>) e colar o App Token.",
|
||
"Guarde e prima <em>Enviar teste</em>."
|
||
],
|
||
"imageAlt": "Formulário de canal Gotify com campo URL do servidor definido para https://gotify.example.com e um campo Token App com placeholder A_valid_gotify_token",
|
||
"imageCaption": "Gotify — URL do servidor da sua instância self-hosted mais o Token App da interface de administração Gotify."
|
||
},
|
||
"email": {
|
||
"heading": "Correio eletrónico (SMTP)",
|
||
"intro": "Para email precisa de servidor SMTP, porta, modo TLS, eventuais credenciais, endereço do remetente e pelo menos um destinatário.",
|
||
"imageAlt": "Formulário email: servidor SMTP, porta, TLS, utilizador, palavra-passe, remetente, destinatários separados por vírgulas e prefixo do assunto",
|
||
"imageCaption": "Configure servidor SMTP, porta e TLS, eventuais credenciais, remetente, destinatários separados por vírgulas e prefixo do assunto para filtrar alertas.",
|
||
"appNote": "O Monitor usa autenticação SMTP por palavra-passe. Gmail pode exigir uma <strong>palavra-passe de aplicação</strong>. Na Microsoft depende do serviço e política do tenant: essa credencial não contorna o bloqueio da autenticação Basic. Verifique o método permitido.",
|
||
"gmailTitle": "Senha do aplicativo do Gmail",
|
||
"gmailIntro": "As palavras-passe de aplicação Gmail exigem <strong>verificação em dois passos</strong> ativa. Sem isso, a página <em>Palavras-passe de aplicações</em> não está disponível.",
|
||
"gmailItems": [
|
||
"Abra <a>myaccount.google.com/security</a> e ative <em>Verificação em dois passos</em>.",
|
||
"Vá para <a>myaccount.google.com/apppasswords</a>.",
|
||
"Introduza um nome, por exemplo <em>ProxMenux</em>, prima <em>Criar</em> e copie a palavra-passe de 16 caracteres.",
|
||
"Defina <em>Servidor</em> <code>smtp.gmail.com</code>, <em>Porta</em> <code>587</code>, <em>Modo TLS</em> <code>STARTTLS</code>, <em>Utilizador</em> com o endereço Gmail e <em>Palavra-passe</em> com os 16 caracteres gerados."
|
||
],
|
||
"outlookTitle": "Senha do aplicativo Microsoft / Outlook",
|
||
"outlookIntro": "Microsoft exige <strong>verificação em dois passos</strong> para palavras-passe de aplicação, mas isso não garante compatibilidade SMTP. Se o serviço ou tenant exigir OAuth2, o cliente SMTP do Monitor baseado em palavra-passe não consegue autenticar-se. Use um relay com a autenticação exigida a montante.",
|
||
"outlookItems": [
|
||
"Abra o <a>account.microsoft.com/security</a> e habilite a verificação em duas etapas.",
|
||
"Se disponível, abra <em>Opções de segurança avançadas</em> → <em>Palavras-passe de aplicações</em> → <em>Criar nova palavra-passe de aplicação</em>. A sua existência não prova que o serviço aceite SMTP por palavra-passe.",
|
||
"Se Microsoft gerar uma palavra-passe de aplicação, copie-a e verifique se o serviço SMTP a aceita.",
|
||
"Só se o seu fornecedor permitir SMTP por palavra-passe, preencha os parâmetros aprovados: <em>Host SMTP</em> <code>smtp.office365.com</code> para Exchange Online, <em>Porta</em> <code>587</code>, <em>Modo TLS</em> <code>STARTTLS</code>, <em>Utilizador</em> com o endereço da caixa de correio e <em>Palavra-passe</em> com a credencial SMTP permitida. O Outlook.com pessoal tem definições e requisitos de autenticação diferentes; não presuma que estas credenciais funcionem."
|
||
],
|
||
"relayTitle": "Relay SMTP gerido por si",
|
||
"relayBody": "Pode usar um relay SMTP sob o seu controlo, como Postfix, que trate da autenticação a montante. Configure credenciais e TLS do Monitor conforme o relay: usar um relay local não desativa por si só a encriptação."
|
||
},
|
||
"pushover": {
|
||
"heading": "Pushover",
|
||
"intro": "Pushover é um serviço de push móvel com aplicativos oficiais para iOS, Android e navegadores de desktop. O canal ProxMenux dedicado fala diretamente com o <a>Pushover API</a>, então não é necessário nenhum URL Apprise.",
|
||
"stepsTitle": "Configurar",
|
||
"steps": [
|
||
"Crie uma conta <a>Pushover</a>, instale o aplicativo oficial nos dispositivos que devem receber alertas e iniciar sessão.",
|
||
"Copie a <em>chave de utilizador</em> do painel Pushover. Use uma chave de grupo se várias pessoas ou dispositivos precisarem do mesmo alerta.",
|
||
"Abra <a>Criar aplicação/token API</a>, crie <em>ProxMenux</em> e copie o token API de 30 caracteres.",
|
||
"Em <em>Definições → Notificações → Pushover</em> introduza chave de utilizador/grupo e token API. Dispositivo e som são opcionais.",
|
||
"Guarde e prima <em>Enviar teste</em>. Verifique a receção na aplicação Pushover."
|
||
],
|
||
"priorityTitle": "Correspondência de prioridades",
|
||
"priorityBody": "Normalmente usa prioridade Pushover 0. Com <strong>Alta prioridade para alertas críticos</strong>, eventos CRITICAL usam 1 e ultrapassam o silêncio configurado pelo utilizador no Pushover. Não usa prioridade de emergência 2, que exigiria repetições e confirmação de receção.",
|
||
"secretTitle": "Proteger ambos os valores",
|
||
"secretBody": "A chave de utilizador/grupo e o token API autorizam ambos os envios. O ProxMenux protege-os e oculta-os na interface; não os publique em capturas ou registos de suporte."
|
||
},
|
||
"apprise": {
|
||
"heading": "Apprise: acesso a cerca de 80 serviços",
|
||
"intro": "Apprise é uma biblioteca de código aberto que integra cerca de 80 serviços por URL. O canal permite chegar a ntfy, Matrix, Slack, Microsoft Teams, Mattermost, Pushbullet, AWS SNS, Pushsafer, Rocket.Chat, Signal API e outros sem integração ProxMenux dedicada. Também suporta Pushover, cuja configuração nativa é mais simples para um único destino.",
|
||
"listIntro": "A lista completa de serviços suportados e o formato exato de URL para cada um está disponível na documentação oficial Apprise:",
|
||
"listItems": [
|
||
"<a>Documentação dos serviços Apprise</a>: índice completo dos serviços suportados.",
|
||
"<a>Noções básicas dos URL</a>: estrutura dos URL Apprise."
|
||
],
|
||
"stepsTitle": "Passos",
|
||
"steps": [
|
||
"Escolha o serviço na <a>wiki Apprise</a> e copie o seu modelo URL. A página indica esquema (<code>ntfy://</code>, <code>matrix://</code>, <code>pover://</code>, <code>slack://</code>…), tokens, canais e nomes de anfitrião necessários.",
|
||
"Preencha os placeholders com suas próprias credenciais. Por exemplo, um tópico ntfy.sh se parece com <code>ntfy://ntfy.sh/my-topic</code>; uma URL Pushover parece com <code>pover://user@token</code>; uma URL Matrix parece com <code>matrix://user:pass@host:port/#room</code>.",
|
||
"Colar o URL final no campo <em>Apprise URL</em> na aba Apprise do painel Notificações e salvar.",
|
||
"Prima <em>Enviar teste</em> para verificar ligação e credenciais."
|
||
],
|
||
"deliveredTitle": "O que é entregue",
|
||
"deliveredBody": "Apprise recebe título, texto e gravidade (info/success/warning/failure), convertida no formato do serviço: ícone, prioridade ou cor. Formatação e reescrita IA ocorrem antes do envio, como nos outros canais.",
|
||
"fanoutTitle": "Um URL por canal Apprise",
|
||
"fanoutBody": "O Monitor aceita um URL Apprise. Para distribuir por vários serviços, como ntfy.sh e Matrix, pode usar um <a>servidor API Apprise</a> com configuração por etiquetas: o Monitor chama o endpoint e o servidor distribui pelos destinos da etiqueta."
|
||
},
|
||
"rich": {
|
||
"heading": "Mensagens formatadas, categorias e filtros por canal",
|
||
"intro": "Cada canal oferece <em>Mensagens formatadas</em>, onze <em>Categorias de notificação</em> expansíveis com opções por evento e <em>Enviar teste</em> no fim.",
|
||
"imageAlt": "Categorias de notificação com formatação, grupos VM/CT, cópias de segurança, recursos, armazenamento, rede, segurança, cluster, serviços, Health Monitor e atualizações, contadores e botão de teste",
|
||
"imageCaption": "A seta indica <em>Mensagens formatadas</em> do canal. Abaixo ficam onze categorias com opções por evento e <em>Enviar teste</em>.",
|
||
"richTitle": "Mensagens formatadas",
|
||
"richIntro": "Com <em>Mensagens formatadas</em>, o título inclui o emoji da categoria e o texto usa a formatação do canal, como HTML Telegram ou bloco Discord com cor da gravidade. Ao desativar envia o mesmo conteúdo em texto simples.",
|
||
"plainHeader": "Texto simples: formatação desativada",
|
||
"richHeader": "Formatado: formatação ativa",
|
||
"richOutro": "A opção é independente por canal: por exemplo email simples e Telegram/Discord formatados. Canais sem formatação em linha, como email simples e Gotify, recebem texto de qualquer modo.",
|
||
"togglesTitle": "Categorias por evento",
|
||
"togglesIntro": "Cada canal controla categorias e eventos individualmente. Desativar uma categoria suprime os seus eventos nesse canal; as opções individuais aplicam-se nas categorias ativas. Não existe um filtro global principal de eventos no processo de envio.",
|
||
"togglesItems": [
|
||
"<strong>Categoria por canal.</strong> Desativar VM/CT suprime <code>vm_start</code> e eventos relacionados nesse canal. As preferências ficam em <code><channel>.events.<group></code>.",
|
||
"<strong>Evento por canal.</strong> Numa categoria ativa pode <em>enviar <code>backup_complete</code> para Discord mas não Telegram</em>. A preferência fica em <code><channel>.event.<event_type></code>."
|
||
],
|
||
"togglesOutro": "Cada categoria mostra eventos <em>ativos</em>/<em>totais</em> e uma opção para os ativar ou desativar em conjunto, como cópias <code>info</code> ou atualizações, sem expandir a secção."
|
||
},
|
||
"quiet": {
|
||
"heading": "Horário de silêncio",
|
||
"intro": "Nesta faixa horária do canal só passam imediatamente eventos <strong>CRITICAL</strong>. INFO, WARNING e ações são guardados e enviados num resumo no fim da faixa.",
|
||
"imageAlt": "Definições do canal: silêncio 22:00–07:00 com previsão da transição e resumo diário às 09:00; a nota sobre CRITICAL/WARNING refere-se ao resumo",
|
||
"imageCaption": "Horário de silêncio em cima e resumo diário em baixo, independentes por canal.",
|
||
"purposeTitle": "Para que serve",
|
||
"purposeItems": [
|
||
"<strong>Sem avisos de atualização às 03:00.</strong> O horário de silêncio adia notificações INFO, como cópias bem-sucedidas e atualizações.",
|
||
"<strong>As urgências continuam imediatas.</strong> Só os eventos efetivamente CRITICAL ultrapassam o silêncio. O nome não basta: o monitor do registo emite bloqueios Fail2Ban e avisos de encerramento/reinício como INFO, pelo que podem aguardar.",
|
||
"<strong>As mensagens ficam guardadas.</strong> Os eventos adiados permanecem no buffer SQLite até ao fim da faixa."
|
||
],
|
||
"howTitle": "Como funciona",
|
||
"howItems": [
|
||
"<strong>Opção por canal.</strong> Telegram pode ficar silencioso 22:00–07:00 enquanto o email continua a enviar 24/7.",
|
||
"<strong>Hora inicial e final</strong> no fuso horário local: início incluído e fim excluído. Pode atravessar a meia-noite, por exemplo 22:00–07:00.",
|
||
"<strong>Pré-visualização em tempo real</strong>: mostra se a faixa está ativa e quando mudará de estado.",
|
||
"<strong>Durante a faixa:</strong> CRITICAL segue o envio normal. INFO e WARNING ficam no buffer persistente <code>quiet_pending</code> do SQLite.",
|
||
"<strong>Quando a janela fecha:</strong> uma única notificação agrupada é enviada com tudo o que se acumula — uma linha por evento buffered, em ordem cronológica. O buffer é limpo apenas após o canal confirmar a entrega, então uma parada transitória Telegram / SMTP não perde o contexto da noite.",
|
||
"<strong>Após reiniciar.</strong> O buffer permanece no disco. Se o Monitor regressar depois do fim da faixa, o ciclo seguinte recupera as entradas pendentes num resumo."
|
||
],
|
||
"criticalTitle": "Que eventos são CRITICAL",
|
||
"criticalBody": "A fonte define a gravidade de cada evento. Um evento de disco, encerramento ou segurança não é automaticamente CRITICAL. O monitor do registo emite ip_block, system_shutdown e system_reboot como INFO. O <link>Catálogo de eventos</link> lista os tipos; verifique a gravidade efetiva no evento recebido e no produtor."
|
||
},
|
||
"digest": {
|
||
"heading": "Resumo diário de eventos INFO",
|
||
"intro1": "O resumo diário é <strong>opcional</strong>: reúne eventos INFO elegíveis, como atualizações disponíveis, e envia-os às 09:00 ou à hora escolhida. Resultados de cópias/replicação e ações imediatas ficam excluídos. O horário de silêncio adia mensagens não críticas numa faixa diária.",
|
||
"intro2": "Fica abaixo do horário de silêncio no mesmo cartão do canal; veja <link>Horário de silêncio</link>. As duas funções são ativadas independentemente.",
|
||
"purposeTitle": "Para que serve",
|
||
"purposeItems": [
|
||
"<strong>Um resumo de manhã.</strong> Se verifica o anfitrião uma vez por dia, pode ler às 09:00 um único resumo em vez de 20 notificações separadas.",
|
||
"<strong>Separar informações e urgências.</strong> O resumo reúne eventos INFO elegíveis; CRITICAL e WARNING não aguardam pelo resumo."
|
||
],
|
||
"howTitle": "Como funciona",
|
||
"howItems": [
|
||
"<strong>Ativação por canal.</strong> Desativado por predefinição. Ative só nos canais onde pretende um resumo; os restantes mantêm envios imediatos.",
|
||
"<strong>Hora de envio</strong> no fuso local, inicialmente 09:00. Pode alterá-la; o processo envia até cerca de 60 segundos após o minuto definido.",
|
||
"<strong>No resumo:</strong> eventos genéricos elegíveis de nível <strong>INFO</strong>. Por exemplo, <em>atualizações de aplicações</em>, <em>atualizações Tailscale</em>, <em>atualizações de otimizações ProxMenux</em> e <em>atualizações de segurança APT</em>. Resultados de cópias e outros eventos de ações excluídas continuam imediatos.",
|
||
"<strong>O que nunca é atrasado:</strong>",
|
||
"<strong>Persistência.</strong> Os eventos permanecem em SQLite, na tabela <code>digest_pending</code>, até à hora escolhida e sobrevivem aos reinícios do Monitor.",
|
||
"<strong>Sem eventos, sem resumo.</strong> Não envia mensagens vazias quando não existem eventos INFO a resumir."
|
||
],
|
||
"neverDelayedSub": [
|
||
"<strong>CRITICAL</strong> eventos sempre passam imediatamente.",
|
||
"<strong>WARNING</strong> eventos sempre passam imediatamente.",
|
||
"Início, paragem, encerramento, reinício e falhas VM/CT, início e resultados de cópias, resultados de replicação e encerramento/reinício do anfitrião não entram no resumo, mesmo como INFO. O horário de silêncio pode ainda adiar os não críticos."
|
||
],
|
||
"comboTitle": "Combinar horário de silêncio e resumo diário",
|
||
"comboBody": "Pode ativar <em>ambos</em>: silêncio 22:00–07:00 e resumo 09:00. Os eventos não críticos durante o silêncio saem no resumo das 07:00; INFO elegíveis fora da faixa entram no diário. CRITICAL ultrapassa ambos; WARNING ultrapassa o resumo mas aguarda no silêncio. Escolha uma <em>faixa de silêncio</em>, um <em>resumo a hora fixa</em> ou ambos."
|
||
},
|
||
"displayName": {
|
||
"heading": "Nome apresentado",
|
||
"intro": "O <em>nome apresentado</em> identifica o anfitrião de origem. Surge nas mensagens formatadas, por exemplo <code>🏠 home-lab</code>, e no prefixo do assunto email.",
|
||
"imageAlt": "Mostrar o campo Nome com o valor amd mostrado como exemplo, etiqueta Nome mostrado nas notificações - edite para personalizar ou deixe em branco para usar o nome da máquina do sistema",
|
||
"imageCaption": "Deixe o campo vazio para usar o nome do anfitrião ou introduza uma etiqueta personalizada.",
|
||
"outro": "Se o campo estiver vazio, o Monitor cai de volta para o nome da máquina do sistema. A substituição é mais útil quando você executa vários hosts ProxMenux que enviam para o mesmo chat ou caixa de entrada Telegram — uma etiqueta mais amigável (<em>home-lab</em>, <em>office-pve</em>) é mais fácil de ler do que <code>pve01.lan</code> ou <code>pmx-prod-01</code>."
|
||
},
|
||
"dispatch": {
|
||
"heading": "Processo de envio",
|
||
"intro": "A tabela descreve três mecanismos relacionados. O fluxo real começa pela agregação de eventos próximos, depois verificações de envio/intervalo, limites por grupo, formatação e controlos por canal.",
|
||
"headerStage": "Etapa",
|
||
"headerWhat": "O que ele faz",
|
||
"headerTunable": "Configurável?",
|
||
"rows": [
|
||
{
|
||
"stage": "Deduplicação por assinatura",
|
||
"what": "Calcula uma assinatura do evento (<code>event_type + key fields from data</code>). Assinaturas idênticas num intervalo curto são consideradas duplicados.",
|
||
"tunable": "Não — lógica interna do expedidor."
|
||
},
|
||
{
|
||
"stage": "Intervalo entre envios",
|
||
"what": "Após envio bem-sucedido suprime repetições e guarda o estado em <code>notification_last_sent</code>. Valores base: 86 400 s para <code>CRITICAL</code>, <code>WARNING</code>, <code>INFO</code>, <code>resources</code> e <code>updates</code>. Exceções: 5 s para ações VM/CT e encerramento/reinício do anfitrião, 10 s para resultados de cópias/replicação, 1 800–3 600 s para várias categorias de saúde. Definições explícitas por evento/grupo prevalecem.",
|
||
"tunable": "Apenas através da API de definições: uma chave <code>cooldown.<event_type></code> ou <code>cooldown.<group></code> substitui os valores predefinidos; não existe nenhum controlo na interface."
|
||
},
|
||
{
|
||
"stage": "Agregação de eventos próximos",
|
||
"what": "Vários eventos do mesmo tipo num intervalo curto, como tentativas SSH repetidas, são reunidos numa mensagem <code>burst_*</code> com contagem e exemplo.",
|
||
"tunable": "Não: janela e limiar estão definidos no código por tipo de evento."
|
||
}
|
||
],
|
||
"calloutTitle": "Os envios ocorrem em segundo plano",
|
||
"calloutBody": "Um thread dedicado processa os envios. O pedido HTTP que produz o evento termina ao colocá-lo na fila, sem aguardar Telegram, SMTP ou webhook. O resultado de cada envio fica no histórico."
|
||
},
|
||
"aiRewrite": {
|
||
"heading": "Reescrita IA opcional",
|
||
"body1": "Eventos elegíveis podem ser reescritos por um LLM. Resultados de cópias (backup_complete e backup_fail) ficam excluídos. IA está desativada por predefinição e, quando ativa, trabalha no thread de envio. Se a chamada falhar ou expirar, usa o texto original do modelo.",
|
||
"body2": "Seis fornecedores: OpenAI, Anthropic, Google Gemini, Groq, OpenRouter e Ollama. Cada canal escolhe detalhe (<code>brief</code>, <code>standard</code>, <code>detailed</code>), idioma, modo do prompt (<code>default</code>/<code>custom</code>) e prompt personalizado. Veja <link>Assistente IA</link> para configuração e exemplos.",
|
||
"privacyTitle": "Nota de privacidade",
|
||
"privacyBody": "Os pedidos IA podem incluir título, gravidade, texto, prompt e contexto: nomes de anfitrião, IP, utilizadores, erros e linhas do registo. Seguem para o endpoint escolhido. Ollama só permanece local com servidor e modelo ambos locais; servidores remotos ou modelos cloud enviam dados para fora do anfitrião. Para os manter na rede, desative a reescrita ou use endpoint e modelo locais controlados."
|
||
},
|
||
"pveWebhook": {
|
||
"heading": "Integração PVE webhook",
|
||
"intro1": "Proxmox dispõe de <em>destinos</em> sendmail, Gotify, SMTP e webhook quando suportado. Ativar notificações do Monitor regista um destino <code>webhook</code>. Eventos PVE, como HA, replicação e relatórios de cópias da interface, podem assim usar o mesmo processo de envio.",
|
||
"intro2": "O alvo é visível da GUI Proxmox no <em>Datacenter → Notificações → Alvos de Notificação</em>:",
|
||
"imageAlt": "Webhook Proxmox com destino proxmenux-webhook, método POST, URL local 8008 e modelo JSON com escape dos valores e campos json",
|
||
"imageCaption": "O alvo webhook do lado PVE como o Proxmox vê-lo (a GUI está no locale configurado da máquina — espanhol neste exemplo). Os mesmos campos aplicam-se em qualquer idioma.",
|
||
"registeredIntro": "O que é registrado:",
|
||
"registeredItems": [
|
||
"<strong>Método e URL.</strong> <code>POST http://127.0.0.1:8008/api/notifications/webhook</code> sem HTTPS do Monitor. Com HTTPS usa o listener HTTP local separado na porta 8009. Ambos permanecem no mesmo anfitrião.",
|
||
"<strong>Modelo do corpo.</strong> Usa os auxiliares Handlebars do PVE. O PVE guarda-o codificado em base64; o conteúdo JSON é:",
|
||
"<strong>Matcher.</strong> Um bloco <code>matcher: proxmenux-matcher</code> companheiro com <code>mode all</code> para que cada notificação PVE atinja o alvo.",
|
||
"<strong>Configuração privada.</strong> A configuração escreve o bloco correspondente <code>webhook: proxmenux-webhook</code> em <code>/etc/pve/priv/notifications.cfg</code> com uma entrada <code>secret</code> chamada X-Webhook-Secret, codificada em base64. O bloco público do destino contém apenas o modelo do corpo, o método e o URL. O bloco privado não é um esboço vazio."
|
||
],
|
||
"securityTitle": "Como o receptor está seguro",
|
||
"securityIntro": "O receptor webhook em <code>POST /api/notifications/webhook</code> aplica diferentes camadas de segurança, dependendo de onde o pedido vem:",
|
||
"securityItems": [
|
||
"<strong>Fontes locais (<code>127.0.0.1</code>/<code>::1</code>).</strong> Aplica limites de frequência, omitindo verificações remotas de segredo, data/hora e repetições. Endereços atribuídos às interfaces do anfitrião também são locais. O destino PVE automático usa loopback.",
|
||
"<strong>Pedidos remotos.</strong> Além dos limites verifica o segredo <code>X-Webhook-Secret</code>, data/hora em <code>X-ProxMenux-Timestamp</code> ou JSON, repetições e eventual lista IP. O segredo fica em SQLite e é copiado em base64 para <code>/etc/pve/priv/notifications.cfg</code> para o cabeçalho PVE."
|
||
],
|
||
"practiceTitle": "Na prática",
|
||
"practiceBody": "PVE usa <code>http://127.0.0.1:8008</code> sem HTTPS, ou HTTP 8009 com HTTPS do Monitor. Para chamar <code>https://<monitor-host>:<port>/api/notifications/webhook</code> externamente, envie <code>X-Webhook-Secret</code> e data/hora atual e cumpra verificações IP e de repetições. Só o segredo não basta.",
|
||
"actionsIntro": "O Monitor gerencia este alvo através de três ações na aba Configurações:",
|
||
"actionsItems": [
|
||
"<strong>Setup</strong> — é executado automaticamente quando você ativa as notificações. Cria a entrada em <code>/etc/pve/notifications.cfg</code>. O arquivo é escrito apenas quando seu conteúdo tem que mudar, e uma cópia do anterior é mantida em <code>/usr/local/share/proxmenux/backups/pve-notifications/</code> (o mais novo três). Nada é escrito enquanto o <code>/etc/pve</code> não está montado: um Monitor que começa durante um reinício do <code>pve-cluster</code> registra a entrada uma vez que está de volta.",
|
||
"<strong>Limpeza</strong>: remove a entrada e mantém a cópia anterior.",
|
||
"<strong>Ler configuração</strong>: mostra destinos e regras PVE atuais para verificar o percurso efetivo quando existem vários envios configurados."
|
||
],
|
||
"clusterTitle": "Nós de agrupamento",
|
||
"clusterBody": "<code>/etc/pve/</code> é partilhado no cluster, incluindo URL e segredo. Cada nó chama o seu <em>próprio</em> listener: <code>127.0.0.1:8008</code> sem HTTPS ou HTTP 8009 com HTTPS. Execute o Monitor em cada nó relevante e mantenha o destino partilhado consistente com todos os listeners."
|
||
},
|
||
"catalogue": {
|
||
"heading": "Catálogo de eventos",
|
||
"intro": "Cerca de setenta tipos de eventos são agrupados em onze categorias de IU. O painel Notificações mostra uma seção colapsável por grupo com uma opção para cada evento dentro dele. Cada evento está ligado por padrão, a menos que explicitamente marcado de outra forma.",
|
||
"headerGroup": "Grupo",
|
||
"headerEvents": "Eventos",
|
||
"rows": [
|
||
{
|
||
"group": "VM/CT",
|
||
"events": "<code>vm_start</code>, <code>vm_start_warning</code>, <code>vm_stop</code>, <code>vm_shutdown</code>, <code>vm_fail</code>, <code>vm_restart</code>, mais o <code>ct_*</code> equivalentes, <code>migration_start</code>, <code>migration_complete</code>, <code>migration_warning</code>, <code>migration_fail</code>, <code>replication_complete</code>, <code>replication_fail</code>."
|
||
},
|
||
{
|
||
"group": "Cópias de segurança",
|
||
"events": "<code>backup_start</code>, <code>backup_complete</code>, <code>backup_warning</code>, <code>backup_fail</code>, <code>snapshot_complete</code>, <code>snapshot_fail</code>."
|
||
},
|
||
{
|
||
"group": "Recursos",
|
||
"events": "<code>cpu_high</code>, <code>ram_high</code>, <code>temp_high</code>, <code>load_high</code>."
|
||
},
|
||
{
|
||
"group": "Armazenamento",
|
||
"events": "<code>disk_space_low</code>, <code>disk_io_error</code>, <code>storage_unavailable</code>, <code>smart_test_complete</code>, <code>smart_test_failed</code>."
|
||
},
|
||
{
|
||
"group": "Rede",
|
||
"events": "<code>network_down</code>, <code>network_latency</code>."
|
||
},
|
||
{
|
||
"group": "Segurança",
|
||
"events": "<code>auth_fail</code>, <code>ip_block</code>, <code>firewall_issue</code>, <code>user_permission_change</code>."
|
||
},
|
||
{
|
||
"group": "Cluster",
|
||
"events": "<code>split_brain</code>, <code>node_disconnect</code>, <code>node_reconnect</code>."
|
||
},
|
||
{
|
||
"group": "Serviços",
|
||
"events": "<code>system_startup</code>, <code>system_shutdown</code>, <code>system_reboot</code>, <code>system_problem</code>, <code>service_fail</code>, <code>oom_kill</code>, <code>system_mail</code>."
|
||
},
|
||
{
|
||
"group": "Monitor de Saúde",
|
||
"events": "<code>new_error</code>, <code>error_resolved</code>, <code>error_escalated</code>, <code>health_degraded</code>, <code>health_persistent</code>, <code>health_issue_new</code>, <code>health_issue_resolved</code>."
|
||
},
|
||
{
|
||
"group": "Atualizações",
|
||
"events": "<code>update_summary</code>, <code>update_available</code>, <code>pve_update</code>, <code>update_complete</code>, <code>proxmenux_update</code>."
|
||
},
|
||
{
|
||
"group": "Hardware / GPU",
|
||
"events": "<code>gpu_mode_switch</code>, <code>gpu_passthrough_blocked</code>, <code>pci_passthrough_conflict</code>, <code>ai_model_migrated</code>."
|
||
}
|
||
],
|
||
"burstNote": "Eventos agregados <code>burst_*</code>, como <code>burst_auth_fail</code>, <code>burst_ip_block</code> e <code>burst_disk_io</code>, substituem vários eventos por um resumo. Não têm opções próprias: herdam o estado do evento de origem.",
|
||
"backupResults": {
|
||
"heading": "Resultados da cópia de segurança",
|
||
"intro": "A notificação descreve o resultado da cópia reportado pelo Proxmox. O resultado determina título, ícone das <em>Mensagens formatadas</em> e linha de estado no email.",
|
||
"headerIcon": "Icon",
|
||
"headerResult": "Resultado",
|
||
"headerWhen": "Quando",
|
||
"rows": [
|
||
{
|
||
"icon": "💾✅",
|
||
"result": "Backup concluído",
|
||
"when": "Todos os convidados terminaram e o relatório não contém avisos."
|
||
},
|
||
{
|
||
"icon": "💾⚠️",
|
||
"result": "Backup concluído com avisos",
|
||
"when": "Todos os convidados terminaram e o relatório contém pelo menos uma linha de aviso."
|
||
},
|
||
{
|
||
"icon": "💾❌",
|
||
"result": "Erro de cópia de segurança reportado",
|
||
"when": "Um convidado falhou ou o processo terminou com erro."
|
||
},
|
||
{
|
||
"icon": "💾❔",
|
||
"result": "Resultado da cópia de segurança não confirmado",
|
||
"when": "O relatório está incompleto ou não indica um resultado para cada hóspede."
|
||
}
|
||
],
|
||
"items": [
|
||
"<strong>O título identifica a tarefa.</strong> Inclui armazenamento e, com um só convidado, tipo, nome e ID. Se falhar identifica o convidado envolvido.",
|
||
"<strong>O corpo lista cada guest</strong> com seu próprio resultado, tamanho, duração e arquivo, seguido de uma linha com os totais do trabalho.",
|
||
"<strong>Avisos e erros surgem uma só vez.</strong> A causa principal fica primeiro. Acima de oito linhas, conta as restantes no fim; continuam no registo de tarefas Proxmox.",
|
||
"<strong>Se falhar antes do primeiro convidado</strong>, mostra o motivo reportado pelo Proxmox, como armazenamento inexistente.",
|
||
"<strong>Os resumos preservam o resultado.</strong> No resumo do horário de silêncio, a cópia mantém o seu ícone. Resultados de cópias não entram no resumo diário."
|
||
]
|
||
}
|
||
},
|
||
"history": {
|
||
"heading": "Histórico",
|
||
"body1": "Cada <em>tentativa</em> efetiva fica em <code>notification_history</code>: data <code>sent_at</code>, canal, evento, gravidade, título, texto, resultado <code>success</code> e eventual <code>error_message</code>. Um grupo agregado surge como uma linha <code>burst_*</code>. Eventos suprimidos pelo intervalo entre envios não geram tentativas nem entradas.",
|
||
"body2": "Definições → Notificações inclui a secção <em>Histórico de notificações</em>, inicialmente fechada, com os últimos 20 envios, resultado, canal, data, erro e resultado dos resumos. Não oferece eliminação: Auditoria e relatório lê o mesmo histórico para verificar os envios.",
|
||
"body3": "Os mesmos dados são expostos em <code>GET /api/notifications/history</code> com parâmetros de consulta opcional <code>limit</code>, <code>offset</code>, <code>severity</code> e <code>channel</code>, e podem ser limpos com <code>DELETE /api/notifications/history</code>."
|
||
},
|
||
"api": {
|
||
"heading": "Endpoints API",
|
||
"headerEndpoint": "Endpoint",
|
||
"headerMethod": "Método",
|
||
"headerUse": "Usar",
|
||
"rows": [
|
||
{
|
||
"endpoint": "/api/notifications/settings",
|
||
"method": "GET / POST",
|
||
"use": "Lê ou guarda configuração de canais, eventos, reescrita IA e nome apresentado."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/test",
|
||
"method": "POST",
|
||
"use": "Enviar uma notificação de teste para um canal: <code>'{'\"channel\":\"telegram\"'}'</code>."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/test-ai",
|
||
"method": "POST",
|
||
"use": "Redigir e reescrever um evento de exemplo sem o enviar."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/provider-models",
|
||
"method": "POST",
|
||
"use": "Listar modelos disponíveis para o fornecedor de IA selecionado."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/send",
|
||
"method": "POST",
|
||
"use": "Emitir um evento de fora (integrações personalizadas)."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/history",
|
||
"method": "GET / DELETE",
|
||
"use": "Leia o histórico com filtros; limpe- o."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/webhook",
|
||
"method": "POST",
|
||
"use": "Recebe notificações Proxmox. Endereços locais omitem os controlos remotos mas têm limites de frequência. Nos pedidos remotos verifica <code>X-Webhook-Secret</code>, data/hora em <code>X-ProxMenux-Timestamp</code> ou JSON, repetições e eventual lista IP."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/proxmox/setup-webhook",
|
||
"method": "POST",
|
||
"use": "Registar o Monitor como alvo em <code>/etc/pve/notifications.cfg</code>."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/proxmox/cleanup-webhook",
|
||
"method": "POST",
|
||
"use": "Remova o alvo Monitor da configuração de notificação do PVE."
|
||
},
|
||
{
|
||
"endpoint": "/api/notifications/proxmox/read-cfg",
|
||
"method": "GET",
|
||
"use": "Mostrar a configuração de notificação PVE atual como PVE vê."
|
||
}
|
||
]
|
||
},
|
||
"whereNext": {
|
||
"heading": "Leituras seguintes",
|
||
"items": [
|
||
{
|
||
"label": "Assistente de IA",
|
||
"href": "/docs/monitor/ai-assistant",
|
||
"tail": " — fornecedores, modelos, modos do prompt, idiomas e detalhe por canal."
|
||
},
|
||
{
|
||
"label": "Monitor de Saúde",
|
||
"href": "/docs/monitor/health-monitor",
|
||
"tail": " — o maior produtor único de eventos, com duração de supressão própria por categoria."
|
||
},
|
||
{
|
||
"label": "Arquitetura",
|
||
"href": "/docs/monitor/architecture",
|
||
"tailRich": " — lugar das tabelas SQLite <code>notification_last_sent</code>, <code>notification_history</code> e do thread de envio na arquitetura do Monitor."
|
||
},
|
||
{
|
||
"label": "Acesso e autenticação",
|
||
"href": "/docs/monitor/access-auth",
|
||
"tailRich": " — criação de tokens API para scripts que chamam <code>/api/notifications/send</code>."
|
||
},
|
||
{
|
||
"label": "Painel → Registos do Sistema",
|
||
"href": "/docs/monitor/dashboard/system-logs",
|
||
"tail": " — vista em tempo real do registo usado pelo respetivo monitor."
|
||
}
|
||
]
|
||
}
|
||
}
|