{ "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 Health Monitor, 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 Desativadas e o botão Ativar notificações. 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 Ativas e mostra o formulário dos canais.", "Regista o destino webhook em /etc/pve/notifications.cfg. Sem HTTPS usa POST http://127.0.0.1:8008/api/notifications/webhook; com HTTPS usa o listener HTTP local separado na porta 8009. As notificações PVE entram assim no processo do Monitor. Veja Integração webhook PVE.", "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 Avançadas: melhoria IA." }, "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 NotificationEvent estruturados.", "headerCollector": "Coletor", "headerWatches": "O que monitoriza", "headerEvents": "Eventos típicos", "rows": [ { "collector": "Monitor de Saúde", "watches": "Dez categorias, cada 5 minutos", "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent." }, { "collector": "Monitor do registo do sistema", "watches": "Segue journalctl --follow e reconhece falhas de autenticação SSH/web, bloqueios Fail2Ban se a jail estiver instalada, erros de E/S, OOM e eventos smartd.", "events": "auth_fail, ip_block, oom_kill, disk_io_error, service_fail." }, { "collector": "Monitor de tarefas", "watches": "Consulta /var/log/pve/tasks/index para encontrar novos UPID e acompanha os respetivos ficheiros de registo.", "events": "backup_start, backup_complete, backup_warning, backup_fail, migration_*, snapshot_complete." }, { "collector": "Webhook Proxmox", "watches": "Recebe POST /api/notifications/webhook. Versões PVE com destinos webhook podem encaminhar notificações após a configuração; veja abaixo.", "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": "node_disconnect, node_reconnect, pve_update, proxmenux_update, gpu_mode_switch, pci_passthrough_conflict." }, { "collector": "Emissores em processo", "watches": "Chamadas diretas de ProxMenux scripts e do próprio Monitor (notification_manager.emit_event(...)).", "events": "system_startup, system_shutdown, system_reboot, ai_model_migrated, eventos de teste personalizados." } ], "after1": "Cada evento tem event_type estável, severity (INFO, WARNING, CRITICAL), category para emojis e filtros e dados data para o modelo, como vmid, device, source_ip e reason.", "after2": "O modelo de cada event_type em notification_templates.py produz o texto enviado. A reescrita IA opcional usa esse texto. A página Assistente IA 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 /usr/local/share/proxmenux/. 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 token do bot, reutilizável entre conversas, e um ID da conversa, 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 + guia de configuração 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 @BotFather (aquele com o tique azul de verificação – as cópias são comuns).", "Enviar /newbot.", "Escolha um nome de exibição (por exemplo: ProxMenux Lab). Pode ser mudado mais tarde.", "Escolha um nome de utilizador único no Telegram que termine em bot, por exemplo proxmenux_lab_bot.", "O BotFather responde com o token, por exemplo 123456789:ABCdef…. Trate-o como uma palavra-passe." ], "step2Title": "2 · Obter o ID do Chat", "step2Intro": "O ID da conversa indica onde 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: /start).", "Abra uma conversa com @userinfobot (ou @myidbot) e envie /start. 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 https://api.telegram.org/bot<YOUR_TOKEN>/getUpdates em um navegador. Procure chat.id na resposta JSON — para grupos é um número negativo, para supergrupos começa com -100.", "Nos supergrupos com Tópicos, anote também o message_thread_id do destino e coloque-o no campo opcional ID do tópico." ], "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 -100…; ID do tópico seleciona uma conversa específica.", "step3Title": "3 · Salvar e testar", "step3Body": "Introduza token e ID da conversa, guarde e prima Enviar teste. 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 Webhook URL ligado a um único canal. O Monitor precisa dessa URL e nada mais.", "items": [ "No Discord abra o servidor e vá a Definições do servidor → Integrações → Webhooks.", "Prima Novo webhook, atribua um nome como ProxMenux e escolha o canal. O avatar é opcional.", "Prima Copiar URL do webhook: o formato é https://discord.com/api/webhooks/<id>/<token>.", "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 Definições do servidor → Integrações → Webhooks." }, "gotify": { "heading": "Gotify", "intro": "Gotify é um servidor de notificações push alojado por si. Precisa do URL e de um token da aplicação 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 oficial.", "Entre no Gotify como administrador, abra Aplicações → Criar aplicação, dê-lhe o nome ProxMenux e copie o token.", "Na aba Gotify do painel Notificações, defina Server URL para o URL base de sua instância (por exemplo. https://gotify.example.com) e colar o App Token.", "Guarde e prima Enviar teste." ], "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 palavra-passe de aplicação. 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 verificação em dois passos ativa. Sem isso, a página Palavras-passe de aplicações não está disponível.", "gmailItems": [ "Abra myaccount.google.com/security e ative Verificação em dois passos.", "Vá para myaccount.google.com/apppasswords.", "Introduza um nome, por exemplo ProxMenux, prima Criar e copie a palavra-passe de 16 caracteres.", "Defina Servidor smtp.gmail.com, Porta 587, Modo TLS STARTTLS, Utilizador com o endereço Gmail e Palavra-passe com os 16 caracteres gerados." ], "outlookTitle": "Senha do aplicativo Microsoft / Outlook", "outlookIntro": "Microsoft exige verificação em dois passos 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 account.microsoft.com/security e habilite a verificação em duas etapas.", "Se disponível, abra Opções de segurança avançadas → Palavras-passe de aplicações → Criar nova palavra-passe de aplicação. 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: Host SMTP smtp.office365.com para Exchange Online, Porta 587, Modo TLS STARTTLS, Utilizador com o endereço da caixa de correio e Palavra-passe 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 Pushover API, então não é necessário nenhum URL Apprise.", "stepsTitle": "Configurar", "steps": [ "Crie uma conta Pushover, instale o aplicativo oficial nos dispositivos que devem receber alertas e iniciar sessão.", "Copie a chave de utilizador do painel Pushover. Use uma chave de grupo se várias pessoas ou dispositivos precisarem do mesmo alerta.", "Abra Criar aplicação/token API, crie ProxMenux e copie o token API de 30 caracteres.", "Em Definições → Notificações → Pushover introduza chave de utilizador/grupo e token API. Dispositivo e som são opcionais.", "Guarde e prima Enviar teste. Verifique a receção na aplicação Pushover." ], "priorityTitle": "Correspondência de prioridades", "priorityBody": "Normalmente usa prioridade Pushover 0. Com Alta prioridade para alertas críticos, 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": [ "Documentação dos serviços Apprise: índice completo dos serviços suportados.", "Noções básicas dos URL: estrutura dos URL Apprise." ], "stepsTitle": "Passos", "steps": [ "Escolha o serviço na wiki Apprise e copie o seu modelo URL. A página indica esquema (ntfy://, matrix://, pover://, slack://…), 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 ntfy://ntfy.sh/my-topic; uma URL Pushover parece com pover://user@token; uma URL Matrix parece com matrix://user:pass@host:port/#room.", "Colar o URL final no campo Apprise URL na aba Apprise do painel Notificações e salvar.", "Prima Enviar teste 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 servidor API Apprise 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 Mensagens formatadas, onze Categorias de notificação expansíveis com opções por evento e Enviar teste 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 Mensagens formatadas do canal. Abaixo ficam onze categorias com opções por evento e Enviar teste.", "richTitle": "Mensagens formatadas", "richIntro": "Com Mensagens formatadas, 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": [ "Categoria por canal. Desativar VM/CT suprime vm_start e eventos relacionados nesse canal. As preferências ficam em <channel>.events.<group>.", "Evento por canal. Numa categoria ativa pode enviar backup_complete para Discord mas não Telegram. A preferência fica em <channel>.event.<event_type>." ], "togglesOutro": "Cada categoria mostra eventos ativos/totais e uma opção para os ativar ou desativar em conjunto, como cópias info 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 CRITICAL. 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": [ "Sem avisos de atualização às 03:00. O horário de silêncio adia notificações INFO, como cópias bem-sucedidas e atualizações.", "As urgências continuam imediatas. 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.", "As mensagens ficam guardadas. Os eventos adiados permanecem no buffer SQLite até ao fim da faixa." ], "howTitle": "Como funciona", "howItems": [ "Opção por canal. Telegram pode ficar silencioso 22:00–07:00 enquanto o email continua a enviar 24/7.", "Hora inicial e final no fuso horário local: início incluído e fim excluído. Pode atravessar a meia-noite, por exemplo 22:00–07:00.", "Pré-visualização em tempo real: mostra se a faixa está ativa e quando mudará de estado.", "Durante a faixa: CRITICAL segue o envio normal. INFO e WARNING ficam no buffer persistente quiet_pending do SQLite.", "Quando a janela fecha: 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.", "Após reiniciar. 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 Catálogo de eventos 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 é opcional: 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 Horário de silêncio. As duas funções são ativadas independentemente.", "purposeTitle": "Para que serve", "purposeItems": [ "Um resumo de manhã. Se verifica o anfitrião uma vez por dia, pode ler às 09:00 um único resumo em vez de 20 notificações separadas.", "Separar informações e urgências. O resumo reúne eventos INFO elegíveis; CRITICAL e WARNING não aguardam pelo resumo." ], "howTitle": "Como funciona", "howItems": [ "Ativação por canal. Desativado por predefinição. Ative só nos canais onde pretende um resumo; os restantes mantêm envios imediatos.", "Hora de envio no fuso local, inicialmente 09:00. Pode alterá-la; o processo envia até cerca de 60 segundos após o minuto definido.", "No resumo: eventos genéricos elegíveis de nível INFO. Por exemplo, atualizações de aplicações, atualizações Tailscale, atualizações de otimizações ProxMenux e atualizações de segurança APT. Resultados de cópias e outros eventos de ações excluídas continuam imediatos.", "O que nunca é atrasado:", "Persistência. Os eventos permanecem em SQLite, na tabela digest_pending, até à hora escolhida e sobrevivem aos reinícios do Monitor.", "Sem eventos, sem resumo. Não envia mensagens vazias quando não existem eventos INFO a resumir." ], "neverDelayedSub": [ "CRITICAL eventos sempre passam imediatamente.", "WARNING 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 ambos: 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 faixa de silêncio, um resumo a hora fixa ou ambos." }, "displayName": { "heading": "Nome apresentado", "intro": "O nome apresentado identifica o anfitrião de origem. Surge nas mensagens formatadas, por exemplo 🏠 home-lab, 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 (home-lab, office-pve) é mais fácil de ler do que pve01.lan ou pmx-prod-01." }, "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 (event_type + key fields from data). 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 notification_last_sent. Valores base: 86 400 s para CRITICAL, WARNING, INFO, resources e updates. 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 cooldown.<event_type> ou cooldown.<group> 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 burst_* 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 (brief, standard, detailed), idioma, modo do prompt (default/custom) e prompt personalizado. Veja Assistente IA 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 destinos sendmail, Gotify, SMTP e webhook quando suportado. Ativar notificações do Monitor regista um destino webhook. 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 Datacenter → Notificações → Alvos de Notificação:", "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": [ "Método e URL. POST http://127.0.0.1:8008/api/notifications/webhook sem HTTPS do Monitor. Com HTTPS usa o listener HTTP local separado na porta 8009. Ambos permanecem no mesmo anfitrião.", "Modelo do corpo. Usa os auxiliares Handlebars do PVE. O PVE guarda-o codificado em base64; o conteúdo JSON é:", "Matcher. Um bloco matcher: proxmenux-matcher companheiro com mode all para que cada notificação PVE atinja o alvo.", "Configuração privada. A configuração escreve o bloco correspondente webhook: proxmenux-webhook em /etc/pve/priv/notifications.cfg com uma entrada secret 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 POST /api/notifications/webhook aplica diferentes camadas de segurança, dependendo de onde o pedido vem:", "securityItems": [ "Fontes locais (127.0.0.1/::1). 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.", "Pedidos remotos. Além dos limites verifica o segredo X-Webhook-Secret, data/hora em X-ProxMenux-Timestamp ou JSON, repetições e eventual lista IP. O segredo fica em SQLite e é copiado em base64 para /etc/pve/priv/notifications.cfg para o cabeçalho PVE." ], "practiceTitle": "Na prática", "practiceBody": "PVE usa http://127.0.0.1:8008 sem HTTPS, ou HTTP 8009 com HTTPS do Monitor. Para chamar https://<monitor-host>:<port>/api/notifications/webhook externamente, envie X-Webhook-Secret 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": [ "Setup — é executado automaticamente quando você ativa as notificações. Cria a entrada em /etc/pve/notifications.cfg. O arquivo é escrito apenas quando seu conteúdo tem que mudar, e uma cópia do anterior é mantida em /usr/local/share/proxmenux/backups/pve-notifications/ (o mais novo três). Nada é escrito enquanto o /etc/pve não está montado: um Monitor que começa durante um reinício do pve-cluster registra a entrada uma vez que está de volta.", "Limpeza: remove a entrada e mantém a cópia anterior.", "Ler configuração: mostra destinos e regras PVE atuais para verificar o percurso efetivo quando existem vários envios configurados." ], "clusterTitle": "Nós de agrupamento", "clusterBody": "/etc/pve/ é partilhado no cluster, incluindo URL e segredo. Cada nó chama o seu próprio listener: 127.0.0.1:8008 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": "vm_start, vm_start_warning, vm_stop, vm_shutdown, vm_fail, vm_restart, mais o ct_* equivalentes, migration_start, migration_complete, migration_warning, migration_fail, replication_complete, replication_fail." }, { "group": "Cópias de segurança", "events": "backup_start, backup_complete, backup_warning, backup_fail, snapshot_complete, snapshot_fail." }, { "group": "Recursos", "events": "cpu_high, ram_high, temp_high, load_high." }, { "group": "Armazenamento", "events": "disk_space_low, disk_io_error, storage_unavailable, smart_test_complete, smart_test_failed." }, { "group": "Rede", "events": "network_down, network_latency." }, { "group": "Segurança", "events": "auth_fail, ip_block, firewall_issue, user_permission_change." }, { "group": "Cluster", "events": "split_brain, node_disconnect, node_reconnect." }, { "group": "Serviços", "events": "system_startup, system_shutdown, system_reboot, system_problem, service_fail, oom_kill, system_mail." }, { "group": "Monitor de Saúde", "events": "new_error, error_resolved, error_escalated, health_degraded, health_persistent, health_issue_new, health_issue_resolved." }, { "group": "Atualizações", "events": "update_summary, update_available, pve_update, update_complete, proxmenux_update." }, { "group": "Hardware / GPU", "events": "gpu_mode_switch, gpu_passthrough_blocked, pci_passthrough_conflict, ai_model_migrated." } ], "burstNote": "Eventos agregados burst_*, como burst_auth_fail, burst_ip_block e burst_disk_io, 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 Mensagens formatadas 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": [ "O título identifica a tarefa. Inclui armazenamento e, com um só convidado, tipo, nome e ID. Se falhar identifica o convidado envolvido.", "O corpo lista cada guest com seu próprio resultado, tamanho, duração e arquivo, seguido de uma linha com os totais do trabalho.", "Avisos e erros surgem uma só vez. A causa principal fica primeiro. Acima de oito linhas, conta as restantes no fim; continuam no registo de tarefas Proxmox.", "Se falhar antes do primeiro convidado, mostra o motivo reportado pelo Proxmox, como armazenamento inexistente.", "Os resumos preservam o resultado. 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 tentativa efetiva fica em notification_history: data sent_at, canal, evento, gravidade, título, texto, resultado success e eventual error_message. Um grupo agregado surge como uma linha burst_*. Eventos suprimidos pelo intervalo entre envios não geram tentativas nem entradas.", "body2": "Definições → Notificações inclui a secção Histórico de notificações, 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 GET /api/notifications/history com parâmetros de consulta opcional limit, offset, severity e channel, e podem ser limpos com DELETE /api/notifications/history." }, "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: '{'\"channel\":\"telegram\"'}'." }, { "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 X-Webhook-Secret, data/hora em X-ProxMenux-Timestamp ou JSON, repetições e eventual lista IP." }, { "endpoint": "/api/notifications/proxmox/setup-webhook", "method": "POST", "use": "Registar o Monitor como alvo em /etc/pve/notifications.cfg." }, { "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 notification_last_sent, notification_history 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 /api/notifications/send." }, { "label": "Painel → Registos do Sistema", "href": "/docs/monitor/dashboard/system-logs", "tail": " — vista em tempo real do registo usado pelo respetivo monitor." } ] } }