{
"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 Servidorsmtp.gmail.com, Porta587, Modo TLSSTARTTLS, 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 SMTPsmtp.office365.com para Exchange Online, Porta587, Modo TLSSTARTTLS, 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."
}
]
}
}