docs: review Monitor documentation in all seven translations

This commit is contained in:
Jonatan
2026-10-17 15:08:53 +02:00
parent ce1a3de719
commit dace78214a
209 changed files with 43788 additions and 1942 deletions
@@ -0,0 +1,396 @@
{
"meta": {
"title": "Autenticação do painel Proxmox — 2FA, tokens API, perfil, proxy inverso | ProxMenux Monitor",
"description": "Acesso e proteção do ProxMenux Monitor: configuração inicial, palavra-passe com nome e avatar, perfil, TOTP 2FA, tokens API para scripts, HTTPS, exemplos Nginx/Caddy/Traefik, registo de auditoria e jail Fail2Ban opcional.",
"ogTitle": "Autenticação Proxmox — 2FA, tokens API, proxy inverso",
"ogDescription": "Proteja o ProxMenux Monitor com palavra-passe, TOTP 2FA, tokens API, HTTPS, exemplos de proxy inverso e jail Fail2Ban opcional.",
"twitterTitle": "Autenticação do painel Proxmox | ProxMenux Monitor",
"twitterDescription": "Senha + TOTP 2FA, API tokens, HTTPS, Nginx/Caddy/Traefik snippets e log de auditoria."
},
"header": {
"title": "Acesso e autenticação",
"description": "Acesso ao painel, primeiro arranque e camadas de proteção: palavra-passe e TOTP, sessões JWT, tokens API, HTTPS, proxies inversos, Secure Gateway e jail Fail2Ban opcional.",
"section": "Monitor do ProxMenux"
},
"intro": {
"title": "A autenticação é opcional",
"body": "No primeiro acesso, o painel apresenta a caixa de diálogo <em>«Proteger o painel?»</em>, com os botões <strong>Sim, configurar palavra-passe</strong> e <strong>Não, continuar sem proteção</strong>. Ao escolher a segunda opção, os endpoints da API ficam abertos em TCP 8008: pode ser adequado numa LAN de laboratório isolada, mas é perigoso noutros ambientes. A autenticação de dois fatores (2FA) <strong>não</strong> faz parte desta escolha inicial; é configurada mais tarde no <strong>separador Segurança</strong>, depois de definir uma palavra-passe."
},
"reaching": {
"heading": "Alcançar o painel",
"intro": "ProxMenux Monitor liga-se a <code>0.0.0.0:8008</code>. Há três maneiras comuns de alcançá-lo:",
"outro": "O acesso direto corresponde à unidade systemd predefinida. O proxy inverso e o Secure Gateway são descritos abaixo. Os IP em <code>X-Forwarded-For</code> exigem PROXMENUX_TRUST_PROXY=1 e um proxy sob o seu controlo. <code>X-Forwarded-Proto</code> ou <code>X-Forwarded-Host</code> não ativam essa confiança por si só; o frontend constrói os URL API a partir da origem do navegador."
},
"firstLaunch": {
"heading": "Procedimento do primeiro arranque",
"intro": "A primeira vez que você abre o painel, o frontend chama <code>GET /api/auth/status</code>. Se a configuração de autenticação nunca foi escrita (<code>configured: false</code>), aparece uma única janela intitulada <em>\"Proteger o seu painel?\"</em> com duas opções:",
"imageAlt": "Diálogo inicial «Proteger o painel?» com opções para configurar palavra-passe ou continuar sem proteção",
"imageCaption": "Escolha inicial entre proteção por palavra-passe e nenhuma proteção. Volta a aparecer após nova instalação ou desativação da autenticação nas definições.",
"headerButton": "Botão",
"headerWhat": "O que acontece?",
"headerApi": "Chamada API",
"rows": [
{
"button": "Sim, configurar senha",
"what": "Abre um formulário com nome de utilizador e palavra-passe obrigatórios, além de <em>nome de apresentação</em> e <em>imagem de avatar</em> opcionais. Ativa a autenticação em <code>auth.json</code> com <code>enabled: true</code> e devolve um JWT para iniciar sessão. Os campos opcionais do perfil são guardados por chamadas posteriores, descritas abaixo.",
"api": "POST /api/auth/setup"
},
{
"button": "Não, continue sem proteção",
"what": "Marca <code>declined: true</code> em <code>auth.json</code>. Cada endpoint API é acessível publicamente até que você mude de ideia a partir de Configurações.",
"api": "POST /api/auth/skip"
}
],
"twofaCalloutTitle": "O 2FA é configurado mais tarde, não aqui",
"twofaCalloutBody": "O diálogo inicial decide apenas a palavra-passe. A <strong>autenticação de dois fatores (TOTP)</strong> é configurada depois no <strong>separador Segurança</strong>, após iniciar sessão com palavra-passe. O procedimento completo aparece mais abaixo.",
"createTitle": "Criando o primeiro usuário",
"createIntro": "<em>Sim, configurar palavra-passe</em> abre um formulário para criar a conta e preencher o perfil opcional, permitindo mostrar o avatar assim que guardar. Os campos são:",
"headerField": "Campo",
"headerRequired": "Requerido",
"headerNotes": "Notas",
"fieldRows": [
{
"field": "Nome de usuário",
"required": "Sim",
"notes": "Identificador de início de sessão. Não pode ser alterado pela interface; requer editar <code>auth.json</code> diretamente."
},
{
"field": "Senha",
"required": "Sim",
"notes": "Pelo menos 10 caracteres de 3 das 4 categorias: minúsculas, maiúsculas, algarismos e símbolos. Palavras-passe óbvias como <code>password</code>, <code>12345678</code> e <code>proxmenux</code> são rejeitadas. As mesmas regras são impostas no servidor, pelo que curl não as pode contornar."
},
{
"field": "Nome de exibição",
"required": "Não",
"notes": "Nome apresentado no menu do cabeçalho e no perfil. Se vazio, usa o nome de utilizador. Pode alterá-lo em <strong>Avatar → Ver perfil</strong>."
},
{
"field": "Imagem do Avatar",
"required": "Não",
"notes": "PNG, JPEG, WebP ou GIF até 2 MB. Desenhado como um círculo no cabeçalho e na página de perfil. Quando vazio, o cabeçalho mostra a primeira letra do nome de exibição (ou nome de usuário) em um círculo colorido. Pode ser carregado, substituído ou removido mais tarde da página de perfil."
}
],
"createImageAlt": "Formulário de criação da conta com nome de utilizador e palavra-passe obrigatórios, nome de apresentação e avatar opcionais",
"createImageCaption": "Formulário do primeiro arranque. Nome e avatar são opcionais; sem eles, a conta é criada e o cabeçalho mostra uma inicial num círculo.",
"saveCalloutTitle": "Um guardar, até três chamadas API",
"saveCalloutBody": "O formulário envia primeiro <code>POST /api/auth/setup</code> com utilizador e palavra-passe. Com o novo JWT, envia <code>PUT /api/auth/profile</code> para o nome e <code>POST /api/auth/profile/avatar</code> para a imagem, se preenchidos. Uma falha no perfil não anula a conta; pode completá-lo mais tarde.",
"avatarTitle": "Página de menu e perfil do Avatar",
"avatarBody1": "Depois de configurar a autenticação, o avatar aparece no canto superior direito, junto ao seletor de tema. O menu contém perfil, Segurança e <strong>Terminar sessão</strong>. Também pode terminar a sessão no separador Segurança.",
"avatarBody2": "O perfil mostra o avatar, o utilizador apenas para leitura e o nome de apresentação editável. Os carregamentos, substituições e remoções do avatar são atómicos; o cabeçalho atualiza-se automaticamente após sucesso. O formulário inicial e o perfil usam os mesmos endpoints descritos abaixo.",
"profileImageAlt": "Perfil com pré-visualização do avatar, botões Carregar / Substituir / Remover, utilizador apenas para leitura e nome editável",
"profileImageCaption": "A página dedicada ao perfil. O nome de usuário é somente para leitura; o nome de exibição e o avatar podem ser editados daqui sem tocar na aba Segurança.",
"headerEndpoint": "Endpoint",
"headerEpWhat": "O que ele faz",
"endpointRows": [
{
"endpoint": "GET /api/auth/profile",
"what": "Retorna o nome de usuário atual, o nome de exibição e se um avatar está definido (<code>has_avatar</code>, <code>avatar_mtime</code>)."
},
{
"endpoint": "PUT /api/auth/profile",
"what": "Atualiza o nome de apresentação. Corpo do pedido: <code>'{' \"display_name\": \"...\" '}'</code>."
},
{
"endpoint": "GET /api/auth/profile/avatar",
"what": "Devolve a imagem PNG / JPEG / WebP / GIF com o tipo de conteúdo correto. Exige o cabeçalho Bearer; o frontend obtém um blob e cria um URL de objeto local para o apresentar."
},
{
"endpoint": "POST /api/auth/profile/avatar",
"what": "Envia um novo avatar (max 2 MB). O tipo de conteúdo deve corresponder ao ficheiro. O velho avatar é substituído atomicamente."
},
{
"endpoint": "DELETE /api/auth/profile/avatar",
"what": "Remove o avatar. O cabeçalho volta a mostrar uma inicial num círculo colorido."
}
],
"reversibleTitle": "Pode ativar a proteção mais tarde",
"reversibleBody": "Depois de <em>Não, continuar sem proteção</em>, o diálogo inicial não volta a aparecer. Ative a autenticação no <strong>separador Segurança</strong> ou edite <code>/root/.config/proxmenux-monitor/auth.json</code>, remova o indicador <code>declined</code> e reinicie o serviço."
},
"password": {
"heading": "Autenticação de senha",
"intro": "Após configurar a proteção, as chamadas API protegidas exigem um JWT em <code>Authorization: Bearer &lt;token&gt;</code>:",
"items": [
"<strong>Token de sessão:</strong> válido por 24 horas, emitido por <code>POST /api/auth/login</code>.",
"<strong>Token API para integrações:</strong> válido por 365 dias, emitido por <code>POST /api/auth/generate-api-token</code>. Detalhes na secção seguinte."
],
"loginImageAlt": "A tela de login mostrada após a autenticação está configurada — campos de nome de usuário e senha",
"loginImageCaption": "Uma vez configurada a autenticação, cada visita ao painel começa aqui. Com o 2FA ativado, a tela pede o código 6 dígitos em um segundo passo após a senha ser aceita.",
"loginFlowTitle": "Fluxo de login",
"twofaIntro": "Com 2FA ativo, a primeira chamada devolve <code>requires_totp: true</code>. Repita-a com o código de seis dígitos:",
"publicTitle": "Acesso público e verificações protegidas",
"publicIntro": "O início de sessão e o estado da autenticação são públicos. Pode criar a conta enquanto não houver utilizador e palavra-passe guardados, mesmo após recusar a proteção. Os dados do sistema exigem autenticação quando a proteção está ativa:",
"publicItems": [
"<code>/api/auth/login</code> e <code>/api/auth/status</code> são públicos. <code>/api/auth/setup</code> cria a primeira conta e recusa substituir credenciais existentes.",
"<code>/api/system-info</code> é um endpoint público com informações básicas do sistema, incluindo <code>health.status</code>. Não exige token. /api/auth/status também é público e permite verificar a disponibilidade."
],
"cryptoTitle": "Criptografia e armazenamento",
"cryptoIntro": "ProxMenux Monitor é código aberto — nada disso é secreto. Documentar a pilha aqui explicitamente é uma escolha deliberada: operadores que armazenam credenciais em seu host merecem saber como essas credenciais são protegidas antes de decidirem confiar nelas. Os algoritmos abaixo são os mesmos que o código em <code>scripts/auth_manager.py</code> usa; esta seção é um contrato, não uma promessa de marketing.",
"headerAsset": "Elemento",
"headerAlgo": "Algoritmo",
"headerWhere": "Localização",
"cryptoRows": [
{
"asset": "Senha",
"algorithm": "PBKDF2-HMAC-SHA256 com salt aleatório por palavra-passe e muitas iterações, segundo a referência OWASP 2023+. Guardado como <code>pbkdf2_sha256$&lt;iters&gt;$&lt;salt&gt;$&lt;hash&gt;</code>.",
"where": "<code>auth.json</code> → <code>password_hash</code>"
},
{
"asset": "Sessão / API JWT",
"algorithm": "Assinatura HS256 com segredo próprio da instalação, gerado no primeiro arranque (<code>secrets.token_urlsafe</code>, ≥48 bytes). Os tokens incluem <code>iss=proxmenux-monitor</code> e <code>aud=api</code>; cada pedido verifica a assinatura com o segredo atual.",
"where": "Segredo: <code>auth.json</code> → <code>jwt_secret</code>. JWT em si: apenas no cliente."
},
{
"asset": "Metadados de token API",
"algorithm": "O hash SHA-256 do JWT é guardado com a impressão digital <code>signed_with</code> do <code>jwt_secret</code> utilizado. Permite apresentar os metadados e detetar tokens afetados pela substituição do segredo.",
"where": "<code>auth.json</code> → <code>api_tokens[]</code>"
},
{
"asset": "Segredo TOTP de 2FA",
"algorithm": "TOTP padrão (RFC 6238), com segredo codificado em base32. Os oito códigos de recuperação são de utilização única e guardados como hashes SHA-256.",
"where": "<code>auth.json</code> → <code>totp_secret</code> + <code>backup_codes[]</code>"
},
{
"asset": "Revogação",
"algorithm": "Quando um token é revogado, o hash SHA-256 entra numa lista de bloqueio consultada em cada verificação. Uma cache em memória de cerca de 30 s evita leituras repetidas do disco.",
"where": "<code>auth.json</code> → <code>revoked_tokens[]</code>"
}
],
"authJsonTitle": "auth.json — o que contém e como está protegido",
"authJsonBody": "Os dados de autenticação ficam em <code>/root/.config/proxmenux-monitor/auth.json</code>, modo <code>0600</code>, proprietário <code>root</code>. Contém <em>hashes</em> PBKDF2 e <em>segredos criptográficos</em> (<code>jwt_secret</code>, <code>totp_secret</code>), nunca a palavra-passe em claro. Cifre os destinos de cópia ou replicação e nunca inclua este ficheiro no controlo de versões.",
"rotateTitle": "A rotação do jwt_secret invalida todos os JWTs existentes",
"rotateBody": "Se <code>auth.json</code> for recriado ou restaurado com outro segredo, <code>jwt_secret</code> muda. Os JWT antigos de sessão e API falham com \"Invalid or expired token\". A interface assinala-os com <strong>Inválido — gerar novamente</strong>. Revogue e substitua os tokens também no Home Assistant, scripts e outros clientes.",
"recoverTitle": "Recuperar uma senha perdida",
"recoverIntro": "Não há fluxo online de \"esquecimento de senha\" — por design, já que o painel é executado no próprio host do operador e o caminho de recuperação é o acesso de shell a esse host. ProxMenux envia uma reinicialização guiada dentro do menu de configuração para que você não tenha que editar manualmente <code>auth.json</code>:",
"survivesTitle": "O que sobrevive ao reset",
"survivesBody": "O início de sessão interativo é apagado, mas <code>jwt_secret</code> e os <code>api_tokens</code> registados são conservados. O Home Assistant e os outros scripts mantêm os tokens. Para recomeçar com novo segredo, elimine <code>auth.json</code> e reinicie o serviço: todos os tokens antigos tornam-se inválidos.",
"physicalTitle": "Pré-requisito de acesso físico",
"physicalBody": "Exige uma <strong>shell root no anfitrião</strong>. Quem executa <code>menu</code> como root já controla a máquina; repor a palavra-passe não aumenta privilégios. A autenticação do Monitor não protege contra quem já tem acesso root."
},
"twofa": {
"heading": "Autenticação de Dois Fatores (TOTP)",
"intro": "2FA adiciona um segundo fator em cima de sua senha: um código 6 dígitos que gira cada 30 segundos, gerado em um telefone ou gerenciador de senha que você controla. Mesmo que alguém obtenha a senha, ainda não pode entrar sem o código do seu dispositivo. ProxMenux Monitor implementa o protocolo padrão <strong>TOTP</strong> (RFC 6238), então qualquer aplicativo autenticador funciona.",
"pickTitle": "Escolha uma aplicação de autenticação",
"pickIntro": "Pode utilizar uma aplicação TOTP existente. A tabela apresenta opções comuns: algumas gratuitas, outras por subscrição. As plataformas e os métodos de cópia de segurança também variam.",
"headerApp": "Aplicativo",
"headerPlatforms": "Plataformas",
"headerAppNotes": "Notas",
"apps": [
{
"name": "Google Authenticator",
"href": "https://safety.google/authentication/",
"platforms": "iOS, Android",
"notes": "O padrão para muitos usuários. Opcional backup na nuvem da conta Google."
},
{
"name": "Microsoft Authenticator",
"href": "https://www.microsoft.com/en-us/security/mobile-authenticator-app",
"platforms": "iOS, Android",
"notes": "Backup da conta Microsoft. Também lida com notificações do MS push se você usá-las no trabalho."
},
{
"name": "Authy",
"href": "https://authy.com/",
"platforms": "iOS, Android",
"notes": "Sincronização cifrada entre dispositivos. A aplicação para computador deixou de ser suportada em 19 de março de 2024."
},
{
"name": "Apple Passwords",
"href": "https://support.apple.com/guide/passwords/welcome/mac",
"platforms": "iOS, iPadOS, macOS, visionOS, Windows (através do iCloud)",
"notes": "Incluída nos sistemas Apple; aplicação Passwords independente desde iOS 18 / macOS Sequoia. Guarda TOTP junto da palavra-passe e sincroniza através do Porta-chaves iCloud."
},
{
"name": "Bitwarden",
"href": "https://bitwarden.com/",
"platforms": "iOS, Android, desktop, navegador",
"notes": "Código aberto. O TOTP pode ficar junto das palavras-passe no cofre. É prático, mas não mantém os dois fatores em dispositivos separados."
},
{
"name": "1Password",
"href": "https://1password.com/",
"platforms": "iOS, Android, desktop, navegador",
"notes": "A mesma idéia que Bitwarden — TOTP integrado com o cofre de senha. Assinatura."
},
{
"name": "Aegis Authenticator",
"href": "https://getaegis.app/",
"platforms": "Android",
"notes": "Código aberto. Arquivo de backup criptografado no dispositivo que você controla. Nenhuma nuvem, nenhuma conta necessária."
},
{
"name": "Raivo OTP",
"href": "https://raivo-otp.com/",
"platforms": "iOS, macOS",
"notes": "Código aberto. Sincronização iCloud opcional. Alternativa do ecossistema Apple comparável ao Aegis."
},
{
"name": "Ente Auth",
"href": "https://ente.io/auth/",
"platforms": "iOS, Android, computador, web",
"notes": "Código aberto. Sincronização em nuvem criptografada de ponta a ponta entre dispositivos."
},
{
"name": "2FAS",
"href": "https://2fas.com/",
"platforms": "iOS, Android, extensão do navegador",
"notes": "Código aberto. Backup encriptado opcional na nuvem; extensão do navegador pode preencher automaticamente códigos."
},
{
"name": "FreeOTP+",
"href": "https://github.com/helloworld1/FreeOTPPlus",
"platforms": "Android",
"notes": "Derivação de código aberto do FreeOTP para Android, com importação e exportação. Não exige conta."
}
],
"backupTitle": "Porque são importantes as cópias de segurança",
"backupBody": "Se perder o dispositivo, use um código de recuperação guardado ou restaure uma cópia configurada previamente. A sincronização na nuvem e as exportações variam por aplicação: verifique se restauram os segredos TOTP. O acesso root ao anfitrião também permite a recuperação descrita abaixo. Guarde uma cópia separada e segura.",
"setupTitle": "Configuração passo a passo do painel",
"setupImageAlt": "Tela de configuração 2FA com código QR e códigos de backup",
"setupImageCaption": "O diálogo 2FA mostra um QR, o segredo Base32 para introdução manual e oito códigos de recuperação de utilização única. Copie-os antes de fechar: não serão apresentados novamente.",
"setupSteps": [
"<strong>Instale o aplicativo autenticador no telefone</strong> (ou abra o gerenciador de senhas). Um dos aplicativos da tabela acima. Você só precisa fazer isso uma vez — o mesmo aplicativo irá conter códigos para cada serviço que você protege.",
"<strong>Fazer login no painel</strong> com seu nome de usuário e senha.",
"<strong>Abra o separador Segurança</strong> e escolha <strong>Ativar 2FA</strong>. O diálogo mostra QR, segredo Base32 e oito códigos de recuperação.",
"<strong>Adicione a entrada ao aplicativo autenticador:</strong>",
"<strong>Guarde os códigos de recuperação.</strong> Conserve os oito num gestor de palavras-passe, nota cifrada ou cópia impressa segura. Cada um funciona uma vez se a aplicação estiver indisponível.",
"<strong>Confirme com o código atual de seis dígitos</strong> da aplicação no campo \"Código de verificação\" e envie. Muda a cada 30 segundos; se expirar durante a escrita, use o seguinte.",
"<strong>Concluído.</strong> 2FA está ativo. O próximo início de sessão pede primeiro a palavra-passe e depois o código atual de seis dígitos."
],
"setupStep4Sub": [
"<em>Método simples:</em> na aplicação, escolha <em>Adicionar conta</em> → <em>Ler código QR</em> e aponte a câmara ao QR. A entrada recebe um nome como <code>ProxMenux Monitor (your-username)</code> e mostra um código de seis dígitos renovado a cada 30 segundos.",
"<em>Alternativa manual</em>, se não puder ler o QR, por exemplo no mesmo telefone: <em>Adicionar conta</em> → <em>Introduzir chave de configuração</em>. Escolha um nome como <em>Proxmox Monitor</em>, cole o segredo Base32, mantenha <em>Tipo</em> em <em>Baseado no tempo</em> e guarde."
],
"testTitle": "Teste antes de sair",
"testBody": "Mantenha a sessão atual aberta e teste outro início de sessão numa janela privada <em>imediatamente</em> após configurar. Se o código falhar, verifique os relógios do servidor e do telefone antes de terminar a sessão válida. Se já perdeu o acesso, use um código de recuperação ou edite <code>auth.json</code> na shell do anfitrião.",
"lostTitle": "Autenticador perdido",
"lostIntro": "Três métodos de recuperação, do menos ao mais intrusivo:",
"lostItems": [
"<strong>Use um código de recuperação.</strong> Introduza um dos oito no campo TOTP. Funciona uma vez; os restantes continuam válidos. Depois de entrar, configure novamente 2FA nas definições para obter oito códigos novos.",
"<strong>Restaure a aplicação da nuvem ou de uma cópia.</strong> Com sincronização configurada, instale-a no novo dispositivo e inicie sessão: Google, Microsoft, Authy, Apple Passwords via Porta-chaves iCloud, Ente ou 2FAS. Com um ficheiro exportado por Aegis, Raivo ou FreeOTP+, instale a aplicação e importe o ficheiro.",
"<strong>Desativar 2FA do shell do host.</strong> Quando as opções anteriores não estiverem disponíveis, edite <code>/root/.config/proxmenux-monitor/auth.json</code> no host Proxmox (você precisa de acesso raiz SSH ou console), defina <code>totp_enabled</code> para <code>false</code>, salve e reinicie o serviço:"
],
"lostShellOutro": "Você pode fazer login com nome de usuário + senha apenas, em seguida, habilitar de configurações 2FA.",
"disableTitle": "Desativar 2FA",
"disableBody": "Abra <strong>Segurança</strong> e escolha <strong>Desativar 2FA</strong>. <code>POST /api/auth/totp/disable</code> exige palavra-passe atual e código TOTP ou de recuperação válido. Elimina o segredo TOTP e os códigos. Remova também a entrada antiga da aplicação.",
"rejectedTitle": "O código de seis dígitos é sempre rejeitado",
"rejectedIntro": "O TOTP depende da hora: os relógios do servidor e do telefone devem diferir menos de cerca de 30 s. Duas verificações:",
"rejectedItems": [
"<strong>Telefone:</strong> Definições → Data e hora → ativar sincronização automática / de rede.",
"<strong>Anfitrião Proxmox:</strong> <code>timedatectl status</code> deve mostrar \"System clock synchronized: yes\". Caso contrário, execute <code>timedatectl set-ntp true</code> e aguarde um minuto."
],
"rejectedOutro": "Depois de sincronizar os relógios, o código é aceite na janela seguinte de 30 segundos."
},
"apiTokens": {
"heading": "Tokens API de longa duração",
"intro": "As sessões expiram após 24 horas. Para Homepage, Home Assistant, Grafana ou Uptime Kuma, crie um <strong>token API</strong> válido por 365 dias. O JWT usa o mesmo segredo; o campo <code>token_name</code> permite identificá-lo e revogá-lo individualmente.",
"imageAlt": "Painel de tokens API com nome, prefixo, data de criação e validade",
"imageCaption": "Lista nas definições: nome, prefixo com os quatro últimos caracteres de identificação, datas de criação e validade, ação de revogação.",
"generateTitle": "Gerar um token",
"generateIntro": "Do painel:",
"generateSteps": [
"Abra <strong>Segurança → Tokens de acesso API</strong>.",
"Introduza um nome descritivo, <em>por exemplo \"Home Assistant\"</em>.",
"Volta a inserir a tua senha. Se 2FA está ligado, também o código atual 6 dígitos.",
"Clique em <strong>Gerar token</strong>. Aparece <strong>uma única vez</strong>: copie-o imediatamente."
],
"generateCli": "Da linha de comando:",
"useTitle": "Usar um token",
"revokeTitle": "Revogar um token",
"revokeBody": "Cada linha oferece <strong>Revogar</strong>, que adiciona o hash a <code>revoked_tokens</code> em <code>auth.json</code>. O token é rejeitado no pedido seguinte.",
"cheatTitle": "Resumo de segurança dos tokens",
"cheatItems": [
"Guarde os tokens no sistema de segredos da integração: Homepage <code>secrets.yaml</code>, Home Assistant <code>!secret</code> ou variáveis de ambiente. Nunca os inclua no Git.",
"Um token por integração, com o seu nome. Revogue-o ao remover essa integração.",
"Rodar cada 6–12 meses. A expiração é um limite difícil, não uma recomendação."
],
"outro": "Recomendações de armazenamento e exemplos: <apiLink>Referência API → Gestão de tokens</apiLink> e <intLink>Integrações</intLink>."
},
"https": {
"heading": "HTTPS",
"intro": "Dois caminhos para o TLS:",
"items": [
"<strong>Proxy inverso (recomendado).</strong> Terminar TLS em Nginx / Caddy / Traefik e encaminhar HTTP na porta 8008 para o processo Flask. Excertos abaixo.",
"<strong>HTTPS direto na AppImage.</strong> Configure um certificado com <code>POST /api/ssl/configure</code> (interface: <strong>Definições → SSL</strong>). HTTPS usa <code>gevent.pywsgi</code> com o handler padrão; flask-sock trata WebSocket para WSS. Os caminhos ficam na configuração SSL."
],
"calloutTitle": "Limitações diretas do HTTPS",
"calloutBody": "O Monitor pode usar um certificado gerido pelo Proxmox ou ficheiros próprios. Não emite certificados ACME. Para emissão e renovação automáticas, use Proxmox ACME ou um proxy Caddy, Traefik ou Nginx e garanta que os certificados renovados são carregados."
},
"gateway": {
"heading": "Gateway seguro (Tailscale)",
"intro": "Um proxy inverso permite acesso remoto. <strong>Secure Gateway</strong> evita expor TCP 8008: cria um LXC Alpine com <a>Tailscale</a> como router de sub-rede. O acesso ao IP LAN do anfitrião depende das rotas aprovadas e regras da tailnet.",
"calloutTitle": "Por que isto é conveniente",
"calloutBody": "Use o URL LAN <code>http://&lt;proxmox-lan-ip&gt;:8008</code> pela rota aprovada. Os routers Tailscale usam SNAT por predefinição: o Monitor costuma ver o IP LAN do gateway, não o endereço <code>100.x.y.z</code> do cliente. Registos e Fail2Ban identificam a origem realmente recebida pelo anfitrião.",
"deployBody": "Num ecrã, escolha o armazenamento LXC, cole uma chave Tailscale criada em <a>login.tailscale.com/admin/settings/keys</a>, escolha as sub-redes e implemente. O LXC inicia em cerca de 30 segundos e regista-se na tailnet.",
"outro": "Implementação, rotas de sub-rede, ACL Tailscale e modo Exit Node estão em <link>Painel → Segurança → Secure Gateway</link>, juntamente com o assistente. Aqui descreve-se o acesso."
},
"proxy": {
"heading": "Exemplos de proxy inverso",
"intro": "Use um <strong>nome de anfitrião dedicado</strong>, como <code>monitor.example.com</code>, encaminhado para a porta 8008 do Proxmox. Os exemplos seguem esse modelo. Um subcaminho como <code>example.com/proxmenux-monitor/</code> exige alterações no frontend e proxy; retirar o prefixo não basta.",
"nginxTitle": "Nginx",
"caddyTitle": "Caddy",
"traefikTitle": "Traefik (etiquetas — Docker / Kubernetes)",
"subPathTitle": "Avançado: implementação num subcaminho",
"subPathBody": "O frontend atual não tem uma base de subcaminho e cria chamadas desde a raiz com URL <code>/api/*</code>. Retirar um prefixo como <code>example.com/proxmenux-monitor/</code> não resolve essas chamadas nem todos os recursos do frontend. Use um nome dedicado. Um subcaminho exige alterações coordenadas e testes específicos."
},
"audit": {
"heading": "Registo de auditoria",
"intro": "Falhas de início de sessão e avisos de limitação são escritos, uma linha por evento, em <code>/var/log/proxmenux-auth.log</code>. Este logger não regista acessos bem-sucedidos:",
"outro": "Siga-o da maneira habitual: <code>tail -F /var/log/proxmenux-auth.log</code>. O arquivo é rodado pelo <code>logrotate</code> se for adicionado um drop-in de configuração; o próprio Monitor não o roda."
},
"fail2ban": {
"heading": "Opcional: jail do Fail2Ban",
"calloutTitle": "O Fail2Ban não está empacotado com o Monitor",
"calloutBody": "Fail2Ban <strong>não</strong> é instalado pelo próprio ProxMenux Monitor. Instale-o via <link>Segurança → Fail2Ban</link> no menu ProxMenux (ou com o pacote Debian padrão). Sem ele, o Monitor ainda grava o registro de auditoria acima — ele apenas não bane automaticamente os infratores reincidentes.",
"intro": "A integração ProxMenux inclui uma jail <code>[proxmenux]</code> que:",
"items": [
"Lê-se <code>/var/log/proxmenux-auth.log</code>.",
"Corresponde ao padrão <code>authentication failure; rhost=&lt;ip&gt;</code> com um filtro dedicado.",
"Bane o IP ofensivo no nível de firewall do kernel por padrão.",
"O hook Flask <code>before_request</code> verifica os pedidos com a lista de bloqueios, em cache durante 30 s. Atrás de um proxy inverso, o bloqueio por IP também exige PROXMENUX_TRUST_PROXY=1 e um proxy controlado que defina cabeçalhos fiáveis."
],
"outro": "Configuração, duração dos bloqueios e desbloqueio: <link>Segurança → Fail2Ban</link>."
},
"troubleshoot": {
"heading": "Resolução de Problemas",
"noScreenTitle": "O ecrã do primeiro lançamento nunca aparece",
"noScreenBody": "Ou a autenticação já está configurada (<code>configured: true</code>) ou alguém já escolheu Skip. Para começar de novo:",
"noScreenOutro": "Apaga autenticação, segredos TOTP e tokens API. Faça primeiro uma cópia de <code>auth.json</code> se pretende conservá-los.",
"tokenTitle": "HTTP 401 em todos os pedidos de um token API que funcionava",
"tokenBody": "Token expirou (limite 365 d) ou entrou na lista <code>revoked_tokens</code>. Gere um novo em Configurações e atualize a integração. Verificar:",
"tokenOutro": "Os tokens expirados ou revogados retornam <code>'{'\"error\":\"Invalid or expired token\"'}'</code>.",
"no2faTitle": "Não é possível iniciar sessão após activar o 2FA, sem autenticador à mão",
"no2faBody": "Use um código de backup no campo TOTP. Se esses forem idos, edite <code>/root/.config/proxmenux-monitor/auth.json</code> de uma shell host, definir <code>totp_enabled</code> para <code>false</code>, reiniciar o serviço.",
"wsTitle": "O 'proxy' inverso funciona, mas a página do terminal desliga- se a cada minuto",
"wsBody": "Tempo limite de inatividade WebSocket do proxy. Aumente o limite de leitura (Nginx: <code>proxy_read_timeout 86400s</code>; Traefik: <code>idleTimeout</code> no ponto de entrada ou middleware). No Nginx, confirme <code>proxy_set_header Upgrade $http_upgrade</code> e <code>Connection \"upgrade\"</code>."
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Referência API → Gestão de tokens",
"href": "/docs/monitor/api",
"tail": " — criar, listar e revogar tokens API; segurança e armazenamento de segredos."
},
{
"label": "Integrações",
"href": "/docs/monitor/integrations",
"tail": " — Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma e exemplos cURL."
},
{
"label": "Painel → Segurança → Gateway seguro",
"href": "/docs/monitor/dashboard/security",
"tail": " — implementar o LXC Tailscale: rotas de sub-rede, ACL e modo Exit Node."
},
{
"label": "Segurança → Fail2Ban",
"href": "/docs/security/fail2ban",
"tail": " — instalar e configurar a jail opcional."
},
{
"label": "Configurações → ProxMenux Monitor",
"href": "/docs/settings/proxmenux-monitor",
"tail": " — iniciar e parar o serviço systemd pela TUI do ProxMenux."
}
]
}
}
@@ -0,0 +1,342 @@
{
"meta": {
"title": "Assistente de IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama | ProxMenux Monitor",
"description": "O assistente de IA opcional reformula as notificações Proxmox VE em linguagem clara. Seis fornecedores: OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter e Ollama. A interface oferece treze idiomas, três níveis de detalhe por canal, prompts personalizados com uma biblioteca comunitária e contexto com tempo de atividade, recorrência e dados SMART.",
"ogTitle": "Assistente de IA Proxmox — OpenAI, Claude, Gemini, Groq, Ollama",
"ogDescription": "Reescreva notificações Proxmox VE em linguagem simples com OpenAI, Anthropic Claude, Google Gemini, Groq, OpenRouter ou local Ollama.",
"twitterTitle": "Assistente de IA Proxmox | ProxMenux Monitor",
"twitterDescription": "Reescreva notificações Proxmox VE em linguagem simples com OpenAI, Anthropic, Gemini, Groq, OpenRouter ou Ollama local."
},
"header": {
"title": "Assistente de IA",
"description": "A reformulação opcional por IA transforma as notificações elegíveis em mensagens claras, com detalhe por canal, treze idiomas na interface, prompts personalizados, biblioteca comunitária pública e contexto adicional. Os relatórios <code>backup_complete</code> e <code>backup_fail</code> não passam pela IA.",
"section": "Monitor do ProxMenux"
},
"intro": {
"title": "Desligado por omissão, comutador único para activar",
"body": "A reformulação por IA vem desativada. Ative-a em <em>Definições → Notificações → Avançado: melhoria por IA</em>. Se o enriquecimento ou a reformulação falhar, é enviado o modelo original. Cada reformulação tem um limite de espera de 25 segundos; ao atingi-lo, utiliza-se o modelo sem esperar indefinidamente."
},
"howItWorks": {
"heading": "Como funciona",
"intro": "Os eventos enviados pelo Monitor seguem o mesmo processo. A reformulação por IA é uma etapa opcional entre o texto do modelo e o envio ao canal. Um evento passa por quatro passos:",
"steps": [
"<strong>Evento + modelo.</strong> Um evento chega de um dos seis coletores e é renderizado em um corpo estruturado de texto simples por <code>notification_templates.py</code>. Este é o corpo que o canal enviaria se a IA reescrever estivesse desligada.",
"<strong>Aprimoramento de contexto.</strong> O expedidor inspeciona o evento e, condicionalmente, adiciona os sinais extras relevantes — tempo de funcionamento do sistema (somente para falhas críticas do sistema), frequência do evento, dados do SMART (somente para eventos em disco), correspondências de banco de dados de erros conhecidos e linhas de diário.",
"<strong>Construção do prompt.</strong> O prompt de sistema combina o modelo e as definições do canal: idioma, detalhe, regras emoji das <em>Mensagens enriquecidas</em> e sugestões de IA, se ativas. No modo personalizado, o seu prompt substitui todo o prompt de sistema. A mensagem do utilizador contém o texto do modelo e os blocos de contexto.",
"<strong>Chamada ao fornecedor.</strong> Groq, OpenAI, Anthropic, Gemini, Ollama ou OpenRouter devolve título e texto reformulados. O módulo de envio analisa a resposta, substitui esses conteúdos para o canal e entrega-os ao adaptador de envio."
],
"notesIntro": "Três detalhes que valem a pena manter antes de ler o resto desta página:",
"notes": [
"<strong>A IA não produz eventos.</strong> Cada evento nasce de um sinal real (Scan Health Monitor, linha de diário, PVE webhook, etc.) e é renderizado em um corpo modelado antes que a IA o veja. A IA é um tradutor e re-formatador, não um observador.",
"<strong>A IA é executada por canal.</strong> Telegram e Discord podem usar uma breve reescrita enquanto o Email recebe um relatório detalhado — mesmo evento, forma diferente, tudo de uma chamada de provedor por canal.",
"<strong>Em caso de falha utiliza-se o modelo.</strong> Se o fornecedor devolver um erro 5xx, exceder o tempo limite, produzir uma resposta inválida ou recusar o pedido, o módulo regista o erro e envia o texto original do modelo para esse canal."
]
},
"enabling": {
"heading": "Habilitando o painel",
"intro": "A configuração de IA fica no fundo do painel Notificações, no separador Definições, no bloco recolhível <em>Avançado: melhoria por IA</em>. Clique no título para o expandir:",
"collapsedAlt": "Cabeçalho AI Avançado Recolher com indicador chevron",
"collapsedCaption": "Recolhido por predefinição; um clique expande o painel.",
"panelAlt": "Painel IA expandido com interruptor principal, fornecedor Google Gemini, chave API oculta, modelo gemini-2.5-flash, prompt predefinido, idioma inglês, detalhe para Telegram, Discord, Gotify e e-mail, sugestões IA e teste de ligação",
"panelCaption": "O painel IA completo: cada controlo descrito nesta página corresponde a um dos campos acima.",
"outro": "De cima para baixo: interruptor <em>Mensagens melhoradas por IA</em>, fornecedor e janela informativa, chave API ou URL Ollama, lista de modelos carregada após a chave, modo <em>Predefinido</em> / <em>Personalizado</em>, idioma, detalhe por canal, <em>Sugestões de IA</em> e botão <em>Testar ligação</em> que envia uma mensagem de teste ao fornecedor para validar as credenciais."
},
"context": {
"heading": "Qual o contexto que a IA recebe",
"intro": "Antes que o prompt seja construído, o despachante caminha uma rotina de enriquecimento de contexto que decide quais sinais extras são relevantes para o evento em questão. O objetivo é dar ao LLM informações suficientes para produzir uma mensagem útil, sem alagá-la (e sua carteira) com ruído que não se aplica. Cinco blocos de contexto podem ser adicionados à mensagem do usuário:",
"headerBlock": "Bloco",
"headerWhen": "Quando é injetado",
"headerWhat": "O que carrega",
"rows": [
{
"block": "Tempo de atividade do sistema",
"when": "Apenas para falhas críticas do sistema: <code>crash</code>, <code>panic</code>, <code>oom</code>, <code>kernel</code>, <code>split_brain</code>, <code>quorum_lost</code>, <code>node_offline</code>, <code>node_fail</code>, <code>system_fail</code>, <code>boot_fail</code>. Omite-se em erros de disco, avisos e operações de rotina para manter o prompt conciso.",
"what": "Uma linha como <code>System uptime: 14 days (stable system)</code>. Permite ao LLM distinguir problemas de inicialização de falhas de longo prazo."
},
{
"block": "Frequência do evento",
"when": "Sempre, quando o Monitor já viu a mesma impressão digital antes.",
"what": "Número de ocorrências, data da primeira deteção e padrão opcional: recorrente, isolado ou pico. O modelo utiliza estes dados para distinguir um problema recorrente de uma primeira ocorrência."
},
{
"block": "Dados SMART",
"when": "Apenas para eventos relacionados ao disco (tipo evento contém <code>disk</code>, <code>smart</code>, <code>storage</code>, <code>io_error</code>, ou o corpo menciona <code>/dev/sd</code>, <code>ata</code>, <code>i/o error</code>).",
"what": "Saída de <code>smartctl</code> para o dispositivo afetado — saúde geral (PASSED / FAILED) mais os atributos relevantes para o modo de falha."
},
{
"block": "Base de dados de erros conhecidos",
"when": "Quando o contexto do corpo ou diário corresponde a um padrão de erro específico do Proxmox enviado com o Monitor.",
"what": "Um bloco <code>KNOWN PROXMOX ERROR DETECTED</code> com a causa identificada e uma solução concreta. O prompt pede uma tradução fiel, sem reformular a correção recomendada."
},
{
"block": "Registos de diários",
"when": "Quando o coletor de origem capturou linhas de log para o evento, sobretudo na monitorização dos logs e das tarefas.",
"what": "Excertos crus <code>journalctl</code>. O prompt diz ao LLM para extrair IDs, timestamps e dicas de causa-root, e ignorar entradas não relacionadas."
}
],
"afterBlocks": "Uma vez que estes blocos são unidos, a mensagem de usuário enviada para o LLM tem esta forma:",
"calloutTitle": "Nenhuma telemetria além do próprio evento",
"calloutBody": "O Monitor só envia o que tem à mão para o evento atual — nenhuma telemetria em todo o sistema, nenhuma série métrica histórica, nenhum depósito de inventário. Os cinco blocos acima são o limite superior do que deixa o hospedeiro em uma única reescrita de IA."
},
"tokens": {
"heading": "Tokens — o que são e como são consumidos",
"intro1": "Os fornecedores comerciais cobram por <em>token</em>. Um token corresponde aproximadamente a quatro caracteres ingleses ou três quartos de uma palavra. A frase inglesa <em>\"Backup completed on storage local-bak\"</em> tem cerca de oito tokens. Dez linhas de log podem ocupar 200–400 tokens, conforme o conteúdo técnico.",
"intro2": "Duas coisas são cobradas em cada chamada:",
"items": [
"<strong>Tokens de entrada</strong>: prompt de sistema e mensagem do utilizador, com gravidade, título, texto do modelo e contexto adicional. A quantidade depende do prompt e do evento. Cada canal reformulado pode consumir os seus tokens; os relatórios de cópia concluída ou falhada não passam pela IA.",
"<strong>Tokens de saída</strong>: a resposta do modelo. O Monitor limita-os com <code>max_tokens</code>. O valor é um <em>limite</em>, não um consumo fixo: se o modelo produzir 250 tokens com limite de 1500, paga por 250."
],
"capsIntro": "Estes são os limites aplicados pelo módulo de envio, definidos em <code>AI_DETAIL_TOKENS</code> em <code>notification_templates.py</code>:",
"headerLevel": "Nível de detalhe",
"headerCap": "Limite de saída (tokens)",
"headerConsumption": "Consumo real típico",
"capRows": [
{
"level": "breve",
"cap": "500",
"consumption": "Tokens de saída 50-200 para eventos curtos."
},
{
"level": "padrão",
"cap": "1500",
"consumption": "200–700 tokens de saída para eventos habituais com pouco contexto."
},
{
"level": "detalhado",
"cap": "3000",
"consumption": "Tokens de saída 500-2000 para relatórios completos de e-mail com logs e tabelas SMART."
}
],
"customNote": "O modo de prompt personalizado limita a saída a 500 tokens, independentemente do detalhe. O prompt é controlado por si e o limite evita respostas excessivas.",
"sizingTitle": "Tamanho prático",
"sizingBody": "Estime o consumo: eventos reformulados × canais IA × tokens de entrada e saída por chamada. Exemplo: 50 eventos × um canal × (500 de entrada + 300 de saída) = 40.000 tokens por dia. O consumo e custo reais dependem do modelo, contexto, cache e limites do fornecedor. <link>Detalhe por canal</link> explica o uso de <code>brief</code> no chat em vez de <code>standard</code>, mantendo e-mails detalhados."
},
"providers": {
"heading": "Prestadores de IA",
"intro": "Seis fornecedores estão ligados ao Monitor. O dropdown do provedor na UI mostra todos eles; um botão de informação ao lado dele abre um modal com uma descrição de uma linha para cada um. Abaixo está a referência completa, com o URL para obter uma chave API, a descrição mostrada na UI e as notas relevantes do codebase.",
"imageAlt": "AI Providers Information modal que enumera os seis fornecedores apoiados — Groq, OpenAI, Anthropic Claude, Google Gemini, Ollama, OpenRouter — cada uma com o seu ícone e a sua descrição de uma linha, bem como uma descrição especial OpenAI- Nota compatível com APIs para OpenAI",
"imageCaption": "O modal no aplicativo — seis cartões, um por provedor, com as mesmas descrições documentadas abaixo.",
"groq": {
"heading": "Groq",
"tagline": "Nível livre muito rápido e generoso (30 req/min). Ideal para começar.",
"items": [
"Chave API: <a>console.groq.com/keys</a>",
"Exemplos da lista de modelos incluída: <code>allam-2-7b</code>, <code>qwen/qwen3.8-27b</code>, <code>openai/gpt-oss-20b</code>, <code>groq/compound-mini</code>.",
"Recomendação incluída: <strong><code>openai/gpt-oss-20b</code></strong>. Verifique a disponibilidade para a sua conta no seletor do fornecedor e no teste de ligação."
]
},
"openai": {
"heading": "OpenAI",
"tagline": "Padrão industrial. Muito preciso e amplamente utilizado.",
"items": [
"Chave API: <a>platform.openai.com/api-keys</a>",
"Exemplos da lista de modelos incluída: <code>gpt-4.1-nano</code>, <code>gpt-4.1-mini</code>, <code>gpt-4o-mini</code>, <code>gpt-4.1</code>, <code>gpt-4o</code>, <code>gpt-5-nano</code>.",
"Recomendação incluída: <strong><code>gpt-4.1-nano</code></strong>. O adaptador também trata requisitos dos modelos de raciocínio; a lista inclui gpt-5-nano, pelo que esses modelos não são excluídos em geral."
],
"baseUrlTitle": "URL base compatível com OpenAI",
"baseUrlBody": "O fornecedor OpenAI aceita um <em>URL base</em> personalizado para serviços compatíveis, como <strong>BytePlus / ByteDance (Kimi K2.5)</strong>, <strong>LocalAI</strong>, <strong>LM Studio</strong>, <strong>vLLM</strong>, <strong>Together AI</strong> e <strong>Fireworks AI</strong>, que utilizam o formato <code>/v1/chat/completions</code>. Defina o URL no separador OpenAI junto à chave API."
},
"anthropic": {
"heading": "Anthropic (Claude)",
"tagline": "Excelente para escrever e traduzir. Rápido e económico.",
"items": [
"Chave API: <a>console.anthropic.com/settings/keys</a>",
"Exemplos da lista de modelos incluída: <code>claude-haiku-4-5-20251001</code>, <code>claude-sonnet-4-6</code>, <code>claude-opus-4-6</code>.",
"Recomendação incluída: <strong><code>claude-haiku-4-5-20251001</code></strong>. Esta versão exata está configurada como recomendada; as antigas entradas Claude 3.5 já não constam da lista incluída."
]
},
"gemini": {
"heading": "Google Gemini",
"tagline": "Plano gratuito disponível, boa relação qualidade/preço.",
"items": [
"Chave API: <a>aistudio.google.com/app/apikey</a>",
"Exemplos da lista de modelos incluída: <code>gemini-2.5-flash-lite</code>, <code>gemini-2.5-flash</code>, <code>gemini-3-flash-preview</code>.",
"Recomendado: <strong><code>gemini-2.5-flash-lite</code></strong> — flash e flash-lite passam o verificador de forma consistente. As variantes pro rejeitam a configuração <code>thinkingBudget=0</code> que o Monitor usa e são exageradas para esta carga de trabalho."
]
},
"openrouter": {
"heading": "OpenRouter",
"tagline": "Agregador com acesso a modelos 100+ usando uma única chave API. Máxima flexibilidade.",
"items": [
"Chave API: <a>openrouter.ai/keys</a>",
"Exemplos da lista de modelos incluída: <code>meta-llama/llama-3.3-70b-instruct</code>, <code>meta-llama/llama-3.1-70b-instruct</code>, <code>meta-llama/llama-3.1-8b-instruct</code>, <code>anthropic/claude-haiku-4.5</code>, <code>google/gemini-2.5-flash-lite</code>, <code>openai/gpt-4o-mini</code>, <code>mistralai/mistral-medium-3</code>.",
"Recomendado: <strong><code>meta-llama/llama-3.3-70b-instruct</code></strong> — mesmo modelo da entrada Groq, mas roteado através de OpenRouter, o que significa uma única chave para todos os modelos listados."
]
},
"ollama": {
"heading": "Ollama (local)",
"tagline": "Utiliza os modelos do servidor Ollama configurado. Os modelos locais executam-se nesse servidor; os modelos cloud encaminham pedidos para um fornecedor externo. A execução local evita custos de API alojada, mas utiliza o seu hardware e eletricidade.",
"items": [
"Nenhuma chave API. Defina o campo <em>Ollama URL</em> para o seu servidor (padrão <code>http://localhost:11434</code> ou qualquer máquina roda sua instância Ollama).",
"Modelos: <strong>não filtrados.</strong> O Monitor lê quaisquer modelos que você extraiu no lado Ollama via <code>ollama pull &lt;model&gt;</code>. O menu suspenso é preenchido em <code>GET /api/tags</code> em seu servidor Ollama.",
"Instalação: <a>ollama.com/download</a> — Linux, macOS e Windows. Escolha um modelo que caiba na RAM e tenha contexto suficiente para os blocos de log adicionados pelo módulo de envio."
]
}
},
"models": {
"heading": "Por que esses modelos específicos",
"intro": "A seleção comercial utiliza o catálogo incluído <code>verified_ai_models.json</code> e as verificações dos adaptadores. Estes convertem o pedido interno <code>system_prompt + user_message + max_tokens</code> para cada API. O catálogo contém entradas testadas e adições manuais; não garante acesso atual da conta nem a passagem de todas as entradas pelo mesmo verificador.",
"consequencesIntro": "Duas consequências que merecem ser conscientes:",
"consequences": [
"<strong>A recomendação incluída</strong> é um ponto de partida para notificações. Avalie qualidade linguística, latência e custo com os seus eventos e conta; não é uma classificação universal.",
"<strong>Pode escolher outro modelo da lista</strong> conforme a quota ou preferências. Verifique a disponibilidade com o teste de ligação; constar da lista não garante acesso atual."
],
"ollamaTitle": "Ollama é a exceção",
"ollamaBody": "A lista Ollama não é filtrada pelo catálogo comercial; mostra os modelos do servidor. Para execução local, escolha um modelo local que caiba na RAM e tenha contexto para os logs. Os modelos cloud são remotos, mesmo através de um servidor Ollama local."
},
"defaultPrompt": {
"heading": "Solicitação padrão",
"intro": "Com o modo prompt definido para <em>Default</em>, o monitor usa o prompt do sistema abaixo. O prompt é modelado em tempo de execução: <code>'{'language'}'</code>, <code>'{'detail_level'}'</code>, <code>'{'emoji_instructions'}'</code> e <code>'{'suggestions_addon'}'</code> são substituídos antes da chamada. As variantes para canais ricos vs simples e o suplemento de Sugestões de IA são mostrados imediatamente após.",
"showFullSummary": "Mostrar o prompt completo do sistema por omissão",
"passagesIntro": "Duas variantes de texto são escolhidas conforme a opção <em>Mensagens enriquecidas</em> de cada canal:",
"passages": [
"<strong>Rich on</strong> → um bloco emoji é injetado listando os ícones que o LLM pode usar, além de uma regra hostname (o LLM deve manter o prefixo hostname do título verbatim) e um punhado de exemplos formatados (início de backup, backup completo, atualizações, VM start, saúde degradada). Isto é o que produz as mensagens emoji-prefixadas em Telegram e Discord.",
"<strong>Rich off</strong> → um bloco de uma linha diz ao LLM para usar ASCII simples apenas — sem emojis, sem símbolos Unicode. Usado para email e qualquer canal onde a formatação do ruído fere as regras da caixa de entrada ou a legibilidade."
],
"suggestionsPlaceholder": "E o placeholder <code>'{'suggestions_addon'}'</code> está vazio a menos que você habilite as Sugestões de IA (próxima seção), caso em que este bloco é injetado:",
"showAddonSummary": "Mostrar o addon de Sugestões de IA"
},
"customPrompt": {
"heading": "Modo de prompt personalizado",
"intro": "O modo <em>Personalizado</em> substitui todo o prompt de sistema pelo seu texto. É guardado nas definições SQLite e enviado sem alterações em cada chamada IA. Permite escolher outro tom, estrutura ou foco.",
"imageAlt": "Prompt personalizado com área de texto para regras de tradução, botões Exportar e Importar e ligação aos prompts comunitários",
"imageCaption": "Prompt personalizado — área de texto grande com o prompt do usuário, além de <em>Export</em>, <em>Import</em> e um link para a galeria comunitária em GitHub.",
"changesTitle": "O que muda quando o Personalizado está ligado",
"changes": [
"<strong>O prompt padrão é substituído por completo.</strong> Os mapeamentos do Proxmox, as regras de contexto e as instruções emoji desapareceram. Se você quiser manter qualquer um deles, cole-os em seu prompt – o pacote <code>EXAMPLE_CUSTOM_PROMPT</code> mostrado abaixo é um ponto de partida.",
"<strong>O seletor de idioma é ignorado.</strong> O prompt predefinido contém <code>'{'language'}'</code>, mas o personalizado não. Indique o idioma no texto, por exemplo «Traduzir para espanhol» ou «Escrever tudo em francês».",
"<strong>O limite personalizado é fixo: 500 tokens</strong>, independentemente do detalhe guardado por canal. O modo predefinido utiliza 500 / 1500 / 3000. Alterar o prompt não aumenta o limite; peça respostas mais curtas ou escolha um detalhe predefinido adequado.",
"<strong>Os marcadores de saída continuam obrigatórios.</strong> Inclua <code>[TITLE]</code> e <code>[BODY]</code> na resposta. O analisador extrai o conteúdo; se faltar um marcador, devolve o modelo original.",
"<strong>As regras de emoji de mensagens ricas não são auto-injetadas.</strong> Se quer emojis, diga ao prompt para usá-los. Se queres texto simples, diz-lhe para não o fazer. A opção apenas fecha os blocos empacotados do prompt padrão, não o seu texto personalizado."
],
"starterTitle": "Prompt inicial",
"starterIntro": "O campo <em>Prompt personalizado</em> vem preenchido com um exemplo mínimo que pode adaptar:",
"showStarterSummary": "Mostrar o prompt personalizado inicial",
"shareTitle": "Partilhar prompts com a comunidade",
"shareIntro": "O botão <em>Exportar</em> guarda o prompt num ficheiro (<code>.txt</code> / <code>.md</code>) para cópia de segurança ou partilha. <em>Importar</em> carrega um ficheiro. O terceiro botão abre a galeria comunitária pública no GitHub:",
"shareLinkLabel": "github.com/MacRimi/ProxMenux/discussions — Compartilhe prompts personalizados para notificações de IA",
"shareOutro": "Consulte a discussão para ver os prompts de outros administradores: alertas curtos, relatórios técnicos detalhados e variantes linguísticas. Se gostar da sua adaptação, partilhe-a com um parágrafo sobre o objetivo. Também são bem-vindos comentários sobre o que funciona ou não."
},
"suggestions": {
"heading": "Sugestões de IA (BETA)",
"intro": "As sugestões IA permitem adicionar <strong>uma</strong> dica curta e prática ao fim do texto. Exigem modo <em>Predefinido</em>, IA e <em>Sugestões de IA</em> ativos. O prompt pede para omitir a dica se a causa ou solução não for clara.",
"formatIntro": "Quando uma dica é adicionada, segue este formato exato:",
"rulesIntro": "As regras colocadas no addon (visível no bloco dobrável sob a seção de prompt padrão acima):",
"rules": [
"A dica será incluída <em>somente</em> se o contexto do diário ou o banco de dados de Erros Conhecidos apontar claramente para uma correção específica.",
"O prompt pede uma dica com menos de 100 caracteres; o analisador não verifica esse limite separadamente.",
"O prompt exige um comando ou caminho concreto e pede ao modelo para evitar conselhos genéricos.",
"Se um Erro Conhecido fornece uma solução, o LLM deve usar essa solução, não inventar uma nova.",
"O prompt pede para omitir a dica se os dados não sustentarem uma correção concreta."
],
"betaTitle": "POR QUE BETA",
"betaBody": "A qualidade das dicas depende do modelo e do contexto dos logs. Um modelo como Claude 3.5 Haiku, GPT-4.1 Mini ou Llama 3.3 70B, com dados smartctl e logs, pode dar dicas úteis. Um pequeno modelo Ollama local com um evento de uma linha pode dar um resultado pouco útil ou omitir a dica. Desative as sugestões se incomodarem e volte a ativá-las quando quiser."
},
"detailLevel": {
"heading": "Nível de detalhe por canal",
"intro": "Cada um dos quatro canais (Telegram, Discord, Gotify, Email) tem seu próprio nível de detalhes. Três valores estão disponíveis, mapeados para token caps de saída específicos e para instruções específicas no prompt padrão:",
"headerLevel": "Nível",
"headerLabel": "Rótulo UI",
"headerCap": "Limite de saída",
"headerProduce": "O que o prompt pede ao LLM para produzir",
"rows": [
{
"level": "breve",
"label": "2–3 linhas, apenas o essencial",
"cap": "500 tokens",
"produce": "\"O que aconteceu + onde\". Mais nada."
},
{
"level": "padrão",
"label": "Conciso com o contexto básico",
"cap": "1500 tokens",
"produce": "3–6 linhas: o que aconteceu, onde, causa e dispositivos afetados."
},
{
"level": "detalhado",
"label": "Detalhes técnicos completos",
"cap": "3000 tokens",
"produce": "Relatório completo: o que, onde, causa, afetado, logs, dados SMART, histórico."
}
],
"defaultsIntro": "Predefinições na primeira instalação:",
"defaults": [
"<strong>Telegram, Discord, Gotify</strong> — <code>standard</code>.",
"<strong>Email</strong> — <code>detailed</code>. Email é o canal onde você normalmente quer a imagem completa para arquivo."
],
"emailTitle": "Nível de detalhes de e- mail adiciona o original",
"emailBody": "Se o formatador IA devolver um resultado para e-mail em <code>detailed</code> e o texto original tiver mais de 50 caracteres, acrescenta-o após 40 traços e <code>Original message:</code>. Os detalhes ficam disponíveis para pesquisas. Se a IA for ignorada ou falhar, pode ser enviado apenas o modelo original."
},
"language": {
"heading": "Idioma",
"intro": "O seletor oferece treze idiomas. Guarda <code>ai_language</code>, utilizado no prompt predefinido em <em>\"translate alerts into '{'language'}'\"</em>. A lista:",
"list": "Inglês (<code>en</code>), eslovaco (<code>sk</code>), espanhol (<code>es</code>), francês (<code>fr</code>), alemão (<code>de</code>), português (<code>pt</code>), italiano (<code>it</code>), russo (<code>ru</code>), sueco (<code>sv</code>), norueguês (<code>no</code>), japonês (<code>ja</code>), chinês (<code>zh</code>), neerlandês (<code>nl</code>).",
"rulesIntro": "Duas regras importantes tomadas diretamente do prompt:",
"rules": [
"<strong>Traduzir</strong>: rótulos, descrições, estados e unidades, por exemplo GB → Go em francês.",
"<strong>Não traduz</strong>: nomes de máquinas, IPs, caminhos, IDs VM/CT, nomes de dispositivos como <code>/dev/sdX</code>, identificadores técnicos. Estes permanecem verbatim independentemente da linguagem."
],
"customNote": "Modo de prompt personalizado <strong>não utilizar</strong> o seletor de idiomas. Se você mudar para Custom e quiser um idioma de saída específico, declare-o dentro de seu prompt."
},
"templates": {
"heading": "Uma nota sobre modelos",
"body1": "A IA recebe o texto já produzido pelo modelo, não dados brutos. Tipos como <code>vm_start</code>, <code>auth_fail</code> e <code>health_degraded</code> têm modelos em <code>notification_templates.py</code>. A IA reformula os textos elegíveis; <code>backup_complete</code> e <code>backup_fail</code> mantêm relatórios determinísticos sem IA.",
"body2": "Os nomes de máquina e VMID já são preenchidos pelo modelo antes da reformulação. Com IA desativada, o texto do modelo é enviado diretamente. A página <link>Notificações</link> documenta todo o processo de envio e o que acontece antes desta etapa."
},
"privacy": {
"heading": "Privacidade e fluxo de dados",
"intro": "Com a reescrita de IA habilitada, o Monitor envia o corpo de notificação renderizado mais os blocos de contexto enriquecidos para o provedor configurado. Isso pode incluir nomes de host, IPs, nomes de usuário, caminhos do dispositivo, linhas de registro de diário e atributos SMART para o dispositivo afetado. Se isso deixa a máquina depende de qual provedor você escolheu:",
"headerProvider": "Provedor",
"headerDestination": "Destino dos dados",
"rows": [
{
"provider": "Ollama",
"destination": "Os modelos locais executam-se no host Ollama configurado. Se for o nó Proxmox, os pedidos permanecem nele. Os modelos cloud encaminham pedidos para fora do host, mesmo através de um servidor Ollama local."
},
{
"provider": "OpenAI",
"destination": "<code>api.openai.com</code> por predefinição ou o URL base personalizado. Aplica-se a política de dados do operador real do serviço."
},
{
"provider": "Anthropic",
"destination": "<code>api.anthropic.com</code>."
},
{
"provider": "Google Gemini",
"destination": "<code>generativelanguage.googleapis.com</code>."
},
{
"provider": "Groq",
"destination": "<code>api.groq.com</code>."
},
{
"provider": "OpenRouter",
"destination": "<code>openrouter.ai</code>, que remete para o fornecedor do modelo subjacente escolhido no campo <code>model</code>. Dois saltos em vez de um."
}
],
"calloutTitle": "Se o conteúdo do evento não puder sair da rede",
"calloutBody": "Utilize um serviço alojado localmente com um modelo local, como Ollama ou um servidor compatível com OpenAI, ou desative a IA. Os modelos cloud Ollama não processam os dados localmente. O módulo não anonimiza nomes de máquina ou IP; utiliza o conteúdo real do evento."
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tail": " — processo de envio, canais, opções por evento e integração do webhook PVE que envolve esta etapa."
},
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tail": " — o maior produtor único de eventos que a IA acaba por reescrever, com as suas próprias durações de supressão por categoria."
},
{
"label": "Arquitetura",
"href": "/docs/monitor/architecture",
"tail": " — quando o AI Enhancer se encaixa no processo Monitor mais amplo (é um módulo, não um serviço separado)."
}
],
"communityLabel": "Prompts comunitários no GitHub",
"communityTail": " — navegar, partilhar, perguntar."
}
}
@@ -0,0 +1,760 @@
{
"meta": {
"title": "API Proxmox Monitor — Referência de integração | ProxMenux",
"description": "Endpoints HTTP do ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n e painéis próprios. Consulta de estado e operações documentadas: controlo de VM, início de cópias, notificações e confirmação de alertas.",
"ogTitle": "API Proxmox Monitor — Referência de integração",
"ogDescription": "Endpoints do ProxMenux Monitor para Home Assistant, Homepage, Grafana, Prometheus, n8n e painéis próprios.",
"twitterTitle": "Monitor Proxmox API | ProxMenux",
"twitterDescription": "Endpoints para Home Assistant, Homepage, Grafana, Prometheus, n8n e painéis próprios."
},
"header": {
"title": "Referência da API",
"description": "Endpoints HTTP para consultar estado e executar ações documentadas: sensores Home Assistant, cartões Homepage, painéis Grafana, recolha Prometheus, fluxos n8n e scripts próprios. Inclui categorias, métricas exportadas e exemplos curl.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "Para que serve esta página",
"body": "Esta página reúne endpoints para integrações: leitura de dados, início de cópias, notificações próprias e confirmação de alertas. A API usa o processo Flask do painel na porta TCP <strong>8008</strong>. O endereço de escuta e TLS são descritos em <link>Acesso e autenticação</link>."
},
"headerEndpoint": "Endpoint",
"headerMethod": "Método",
"headerUse": "Utilização",
"auth": {
"heading": "Autenticação",
"intro": "Com autenticação ativa, os endpoints protegidos esperam um token JWT Bearer no cabeçalho:",
"tokensIntro": "Duas formas de obter o token:",
"items": [
"<strong>Tokens API, recomendados para integrações.</strong> Válidos por 365 dias, criados em <strong>Segurança → Tokens API</strong>. Têm nome e revogação individual. Use read_only para dados e full_admin apenas para ações administrativas necessárias.",
"<strong>Início de sessão, JWT de 24 horas.</strong> <code>POST /api/auth/login</code> com utilizador, palavra-passe e TOTP se exigido pela 2FA. O JWT expira após 24 horas; os scripts devem voltar a autenticar-se."
],
"flowLink": "Acesso, palavras-passe, 2FA, auditoria e TLS são descritos em <link>Acesso e autenticação</link>.",
"rows": [
{
"endpoint": "/api/auth/login",
"method": "POST",
"use": "Campos do corpo (esquema): <code>'{'\"username\",\"password\",\"totp_token?\"'}'</code>. Devolve um JWT de 24 horas."
},
{
"endpoint": "/api/auth/api-tokens",
"method": "GET",
"use": "Listar os tokens API (apenas metadados — nomes, prefixos, datas; nunca o segredo real)."
},
{
"endpoint": "/api/auth/generate-api-token",
"method": "POST",
"use": "Cria um token API de 365 dias numa sessão autenticada. Campos: <code>password, token_name?, totp_token?, scope?</code>. Palavra-passe e TOTP exigido são verificados de novo. scope usa read_only por predefinição; full_admin exige escolha explícita. O segredo é devolvido uma só vez."
},
{
"endpoint": "/api/auth/api-tokens/<id>",
"method": "DELETE",
"use": "Revogar um token API específico pelo seu ID."
}
]
},
"conventions": {
"heading": "Convenções",
"items": [
"A maioria usa JSON. Algumas transferências devolvem texto simples; <code>/api/prometheus</code> usa o formato de exposição Prometheus 0.0.4 em vez de OpenMetrics. Verifique o tipo de resposta de cada rota.",
"Muitas operações devolvem <code>'{'\"success\": true, ...'}'</code>. Os erros variam; um formato habitual é <code>'{'\"success\": false, \"error\": \"'<'reason'>'\"'}'</code>. Verifique estado HTTP e campos: alguns desafios de autenticação usam HTTP 200 com success false.",
"Os parâmetros dependem do endpoint. Use <code>limit</code>, <code>offset</code>, <code>since</code> e filtros de categoria apenas quando suportados.",
"Os formatos de tempo variam: marcas Unix, cadeias ISO-8601 e datas systemd. Não presuma a mesma unidade nem um fuso horário explícito em todos os campos."
]
},
"system": {
"heading": "Sistema e hardware",
"rows": [
{
"endpoint": "/api/system",
"method": "GET",
"use": "Valores atuais de CPU, memória, swap, tempo de atividade e carga."
},
{
"endpoint": "/api/info",
"method": "GET",
"use": "Informações estáticas do host: hostname, kernel, versão PVE, modelo CPU, distro."
},
{
"endpoint": "/api/system-info",
"method": "GET",
"use": "Dados alargados usados no cabeçalho: métricas gerais e hora de arranque."
},
{
"endpoint": "/api/hardware",
"method": "GET",
"use": "Inventário detalhado de hardware: dispositivos PCI, GPU e sensores."
},
{
"endpoint": "/api/hardware/live",
"method": "GET",
"use": "Valores atuais de sensores que variam rapidamente."
},
{
"endpoint": "/api/temperature/history",
"method": "GET",
"use": "Séries temporais das temperaturas da CPU e do encapsulamento."
},
{
"endpoint": "/api/gpu/<slot>/realtime",
"method": "GET",
"use": "Métricas atuais de GPU NVIDIA, Intel e AMD por posição PCI."
}
]
},
"actions": {
"heading": "Ações do sistema",
"intro": "Estas ações assíncronas usam unidades systemd temporárias. Com autenticação ativa, as escritas exigem <code>full_admin</code>; <code>read_only</code> pode consultar <code>.../status</code>. O início aceite devolve HTTP 202 e estado; consulte <code>.../status</code> para o progresso. Controlo de hóspedes e cópias usam respostas diferentes, descritas abaixo.",
"shapeTitle": "Forma de resposta comum",
"shapeIntro": "As ações de sistema assíncronas partilham este objeto JSON de estado. Controlo de hóspedes e cópias usam formatos diferentes:",
"shapeCode": "{\n \"unit\": \"proxmenux-action-pve-update.service\",\n \"state\": \"idle | running | success | failed | cancelled\",\n \"started_at\": \"Sat 2026-08-01 11:01:32 CEST\",\n \"finished_at\": null,\n \"exit_code\": null,\n \"result\": null\n}",
"concurrencyTitle": "Concurrência e cancelamento",
"concurrencyBody": "Iniciar outra execução da mesma ação ativa devolve HTTP 409. Só se pode cancelar com uma rota DELETE documentada, como na atualização PVE. O estado passa a <code>cancelled</code> e preserva as datas. Os estados finais ficam na memória do processo e podem perder-se ao reiniciar o Monitor.",
"rows": [
{
"endpoint": "/api/system/power/reboot",
"method": "POST",
"use": "Inicia o reinício do anfitrião Proxmox. A ligação HTTP pode fechar quando systemd inicia o encerramento."
},
{
"endpoint": "/api/system/power/reboot/status",
"method": "GET",
"use": "Estado do reinício atual ou anterior."
},
{
"endpoint": "/api/system/power/shutdown",
"method": "POST",
"use": "Desliga o anfitrião Proxmox, por exemplo em resposta ao sinal de encerramento da UPS."
},
{
"endpoint": "/api/system/power/shutdown/status",
"method": "GET",
"use": "Estado do encerramento atual ou anterior."
},
{
"endpoint": "/api/system/pve-update/run",
"method": "POST",
"use": "Inicia a atualização PVE usada por Atualizar agora do Health Monitor e pelo menu da shell; delega em update-pve-safe.sh."
},
{
"endpoint": "/api/system/pve-update/status",
"method": "GET",
"use": "Estado da atualização PVE atual ou anterior."
},
{
"endpoint": "/api/system/pve-update",
"method": "DELETE",
"use": "Cancela uma atualização PVE em curso com SIGTERM."
},
{
"endpoint": "/api/proxmenux/self-update/run",
"method": "POST",
"use": "Atualiza o ProxMenux com o instalador do canal estável ou beta configurado. Uma unidade systemd própria permite continuar durante o reinício de proxmenux-monitor feito pelo instalador."
},
{
"endpoint": "/api/proxmenux/self-update/status",
"method": "GET",
"use": "Estado da atualização ProxMenux atual ou anterior."
},
{
"endpoint": "/api/vms/<vmid>/control",
"method": "POST",
"use": "Envia um comando de controlo de VM ou LXC. <code>action</code> aceita <code>start</code>, <code>stop</code>, <code>shutdown</code> ou <code>reboot</code>. A resposta bem-sucedida devolve uma tarefa PVE confirmada, sem indicar que terminou. Consulte o endpoint control-task do hóspede para o resultado."
},
{
"endpoint": "/api/vms/<vmid>/backup",
"method": "POST",
"use": "Cria uma cópia vzdump de VM ou LXC. Campos opcionais a adaptar ao armazenamento: <code>storage</code> (destino PVE), <code>mode</code> (<code>snapshot</code>, <code>suspend</code> ou <code>stop</code>), <code>compress</code> (<code>zstd</code>, <code>lzo</code>, <code>gzip</code> ou <code>none</code>), <code>protected</code> (<code>true</code> ou <code>false</code>), <code>notes</code>, <code>notification</code> (<code>auto</code>, <code>always</code>, <code>failure</code> ou <code>never</code>) e <code>pbs_change_detection</code> (<code>default</code>, <code>legacy</code> ou <code>data</code>). Devolve o UPID da tarefa PVE."
},
{
"endpoint": "/api/vms/<vmid>/backups",
"method": "GET",
"use": "Listar backups anteriores para um VM ou LXC em todos os armazenamentos alcançáveis."
}
],
"syncVsAsyncTitle": "Dois tipos de ações",
"syncVsAsyncBody": "Energia e atualizações do anfitrião usam unidades systemd temporárias com <code>.../status</code>. Só a atualização PVE tem aqui uma rota <code>DELETE</code> para cancelar. O controlo VM/LXC devolve uma tarefa a acompanhar; a cópia um UPID de trabalho em segundo plano. Aceitação não significa conclusão. Autenticação e permissões dependem da rota.",
"curlTitle": "Exemplo curl",
"curlBody": "Inicia uma atualização PVE e acompanha até terminar, como uma automação Home Assistant ou um playbook Ansible.",
"curlCode": "TOKEN=<your full_admin token>\n\ncurl -sSf -X POST \\\n -H \"Authorization: Bearer $TOKEN\" \\\n https://<host>:8008/api/system/pve-update/run\n\nwhile true; do\n state=$(curl -sSf -H \"Authorization: Bearer $TOKEN\" \\\n https://<host>:8008/api/system/pve-update/status | jq -r .state)\n [ \"$state\" != \"running\" ] && break\n sleep 30\ndone\necho \"final state: $state\"",
"haTitle": "Exemplo para Home Assistant",
"haBody": "Um sensor <code>rest</code> consulta o estado e <code>rest_command</code> inicia a atualização. Use-os com um botão do painel e as automações pretendidas:",
"haCode": "# configuration.yaml\nsensor:\n - platform: rest\n resource: https://pve.local:8008/api/system/pve-update/status\n name: pve_update_state\n value_template: \"{{ value_json.state }}\"\n scan_interval: 60\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\nrest_command:\n pve_update:\n url: https://pve.local:8008/api/system/pve-update/run\n method: POST\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Start VM 100 (works for LXC too — same endpoint)\n vm_100_start:\n url: https://pve.local:8008/api/vms/100/control\n method: POST\n content_type: 'application/json'\n payload: '{\"action\": \"start\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\"\n\n # Backup VM 100 to the 'pbs-main' storage\n vm_100_backup:\n url: https://pve.local:8008/api/vms/100/backup\n method: POST\n content_type: 'application/json'\n payload: '{\"storage\": \"pbs-main\", \"mode\": \"snapshot\", \"compress\": \"zstd\"}'\n headers:\n Authorization: \"Bearer !secret proxmenux_token\""
},
"health": {
"heading": "Monitor de Saúde",
"rows": [
{
"endpoint": "/api/health",
"method": "GET",
"use": "Verificação leve que devolve JSON com <code>status</code>, <code>timestamp</code> e <code>version</code>. Serve para palavras-chave do Uptime Kuma; com autenticação ativa, o cliente deve enviar o cabeçalho Bearer."
},
{
"endpoint": "/api/health/status",
"method": "GET",
"use": "Estado global: um nível de gravidade e um resumo."
},
{
"endpoint": "/api/health/details",
"method": "GET",
"use": "As dez categorias com estado e dados estruturados de cada verificação."
},
{
"endpoint": "/api/health/full",
"method": "GET",
"use": "Dados completos: categorias, erros ativos, alertas dispensados e definições de silenciamento. Usa resultados de fundo com menos de seis minutos; caso contrário, ou numa atualização forçada, faz nova verificação."
},
{
"endpoint": "/api/health/active-errors",
"method": "GET",
"use": "Lista ativa, filtrada por <code>?category=&lt;name&gt;</code>."
},
{
"endpoint": "/api/health/dismissed",
"method": "GET",
"use": "Alertas dispensados com as horas de silenciamento restantes."
},
{
"endpoint": "/api/health/settings",
"method": "GET",
"use": "Duração do silenciamento configurada por categoria."
},
{
"endpoint": "/api/health/remote-storages",
"method": "GET",
"use": "Inventário de armazenamentos remotos definidos por Proxmox, com estado online."
},
{
"endpoint": "/api/health/interfaces",
"method": "GET",
"use": "Interfaces de rede com tipo (bridge / bond / física), IP e velocidade da ligação."
},
{
"endpoint": "/api/health/acknowledge",
"method": "POST",
"use": "Corpo: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Silencia um alerta durante o período configurado para a categoria."
},
{
"endpoint": "/api/health/cleanup-orphans",
"method": "POST",
"use": "Limpeza manual de erros cujo dispositivo subjacente ou VM desapareceu. Idempotente."
}
],
"outro": "Os formatos das respostas e as categorias são descritos em <link>Health Monitor</link>."
},
"storage": {
"heading": "Armazenamento",
"rows": [
{
"endpoint": "/api/storage",
"method": "GET",
"use": "Discos visíveis pelo anfitrião: dispositivos de blocos, pools ZFS e LVM."
},
{
"endpoint": "/api/storage/summary",
"method": "GET",
"use": "Resumo compacto usado nos cartões do painel."
},
{
"endpoint": "/api/proxmox-storage",
"method": "GET",
"use": "Armazenamentos definidos por Proxmox de <code>/etc/pve/storage.cfg</code> com estado online e espaço livre."
},
{
"endpoint": "/api/storage/observations",
"method": "GET",
"use": "Histórico persistente: avisos SMART, erros de E/S e eventos ZFS. Mantém-se após a resolução automática dos alertas."
},
{
"endpoint": "/api/storage/smart/<disk>",
"method": "GET",
"use": "Atributos SMART atuais para um disco."
},
{
"endpoint": "/api/storage/smart/<disk>/latest",
"method": "GET",
"use": "Mais recente SMART auto-teste para o disco."
},
{
"endpoint": "/api/storage/smart/<disk>/history",
"method": "GET",
"use": "Lista de relatórios SMART armazenados para o disco."
},
{
"endpoint": "/api/storage/smart/<disk>/history/<file>",
"method": "GET",
"use": "Leia um relatório SMART armazenado específico."
},
{
"endpoint": "/api/storage/smart/<disk>/test",
"method": "POST",
"use": "Inicia um autoteste SMART. Esquema do corpo: <code>'{'\"type\":\"short\"|\"long\"'}'</code>."
},
{
"endpoint": "/api/storage/smart/schedules",
"method": "GET",
"use": "Listar os testes SMART programados atualmente."
},
{
"endpoint": "/api/storage/smart/tools",
"method": "GET",
"use": "Verifica se <code>smartctl</code> e as ferramentas associadas estão instalados."
}
]
},
"network": {
"heading": "Rede",
"rows": [
{
"endpoint": "/api/network",
"method": "GET",
"use": "Todas as interfaces com o estado de ligação e endereços."
},
{
"endpoint": "/api/network/summary",
"method": "GET",
"use": "Visualização compacta usada pelo painel."
},
{
"endpoint": "/api/network/<iface>/metrics",
"method": "GET",
"use": "RX/TX por interface, contadores de erros e séries temporais RRD."
},
{
"endpoint": "/api/network/latency/current",
"method": "GET",
"use": "Última medição de latência até ao gateway."
},
{
"endpoint": "/api/network/latency/history",
"method": "GET",
"use": "Série temporal de latência do gateway."
}
]
},
"vms": {
"heading": "VMs e contêineres",
"rows": [
{
"endpoint": "/api/vms",
"method": "GET",
"use": "VM e CT do nó local com estado, vmid e nome."
},
{
"endpoint": "/api/vms/<vmid>",
"method": "GET",
"use": "Detalhes completos de um sistema convidado: configuração, rede e discos."
},
{
"endpoint": "/api/vms/<vmid>/metrics",
"method": "GET",
"use": "Séries temporais de CPU, memória e E/S de disco de um sistema convidado (RRD)."
},
{
"endpoint": "/api/vms/<vmid>/logs",
"method": "GET",
"use": "Registos de tarefas recentes desse hóspede."
},
{
"endpoint": "/api/vms/<vmid>/backups",
"method": "GET",
"use": "Cópias de segurança guardadas para este sistema convidado."
},
{
"endpoint": "/api/vms/<vmid>/control",
"method": "POST",
"use": "Escolha uma ação do esquema: <code>'{'\"action\":\"start|stop|reboot|shutdown\"'}'</code>. Controla a alimentação do sistema convidado."
},
{
"endpoint": "/api/vms/<vmid>/backup",
"method": "POST",
"use": "Inicia <code>vzdump</code> para o hóspede. O corpo indica armazenamento e modo (<code>snapshot</code> / <code>suspend</code> / <code>stop</code>)."
},
{
"endpoint": "/api/vms/<vmid>/config",
"method": "PUT",
"use": "Atualizar o campo de descrição (notas) de um VM / CT. Outras chaves de configuração não são modificáveis a partir deste endpoint."
},
{
"endpoint": "/api/node/metrics",
"method": "GET",
"use": "Métricas agregadas do nó em séries RRD."
}
]
},
"backups": {
"heading": "Cópias de segurança",
"rows": [
{
"endpoint": "/api/backups",
"method": "GET",
"use": "Cópias encontradas nos armazenamentos dir, NFS, CIFS e PBS consultados através do nó local. Não percorre todos os nós do cluster."
},
{
"endpoint": "/api/backup-storages",
"method": "GET",
"use": "Armazenamentos indicados como destinos de cópias, com espaço livre."
}
]
},
"logs": {
"heading": "Registos, tarefas, eventos",
"rows": [
{
"endpoint": "/api/logs",
"method": "GET",
"use": "Entradas filtradas no diário. Consulta: <code>?level=&service=&limit=</code>."
},
{
"endpoint": "/api/logs/download",
"method": "GET",
"use": "Exporta o intervalo filtrado como texto simples."
},
{
"endpoint": "/api/events",
"method": "GET",
"use": "Fluxo de eventos internos — o mesmo que alimenta notificações."
},
{
"endpoint": "/api/task-log/<upid>",
"method": "GET",
"use": "Registo completo em texto simples de uma tarefa Proxmox identificada por UPID."
}
]
},
"notifications": {
"heading": "Notificações e IA",
"intro": "Envio, canais e reformulação com IA são descritos em <notifLink>Notificações</notifLink> e <aiLink>Assistente de IA</aiLink>.",
"rows": [
{
"endpoint": "/api/notifications",
"method": "GET",
"use": "Notificações recentes apresentadas no painel."
},
{
"endpoint": "/api/notifications/download",
"method": "GET",
"use": "Exporta as notificações como texto."
},
{
"endpoint": "/api/notifications/status",
"method": "GET",
"use": "Estado do envio: processo de fundo ativo, tamanho da fila e último envio."
},
{
"endpoint": "/api/notifications/settings",
"method": "GET",
"use": "Lê a configuração das notificações: canais, controlos por evento, reformulação IA e nome apresentado."
},
{
"endpoint": "/api/notifications/history",
"method": "GET",
"use": "Histórico de envio. Parâmetros: <code>?limit=&offset=&severity=&channel=</code>."
},
{
"endpoint": "/api/notifications/history",
"method": "DELETE",
"use": "Limpa a tabela do histórico de envio."
},
{
"endpoint": "/api/notifications/test",
"method": "POST",
"use": "Envia uma notificação de teste a um canal. Corpo: <code>'{'\"channel\":\"telegram\"'}'</code>."
},
{
"endpoint": "/api/notifications/send",
"method": "POST",
"use": "Emite um evento personalizado. Corpo: <code>'{'\"event_type\":\"custom\",\"severity\":\"WARNING\",\"title\":\"...\",\"body\":\"...\",\"data\":'{''}''}'</code>."
},
{
"endpoint": "/api/notifications/test-ai",
"method": "POST",
"use": "Testa a ligação ao fornecedor de IA. Campos do corpo (esquema): <code>'{'\"provider\",\"api_key\",\"model\",\"ollama_url?\"'}'</code>."
},
{
"endpoint": "/api/notifications/provider-models",
"method": "POST",
"use": "Listar modelos disponíveis para o fornecedor de IA selecionado."
},
{
"endpoint": "/api/notifications/proxmox/setup-webhook",
"method": "POST",
"use": "Registar o Monitor como alvo webhook 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": "Leia o <code>notifications.cfg</code> atual do PVE como ele vê."
}
]
},
"security": {
"heading": "Segurança (leitura)",
"rows": [
{
"endpoint": "/api/security/firewall/status",
"method": "GET",
"use": "Estado de firewall PVE e regras ativas."
},
{
"endpoint": "/api/security/fail2ban/details",
"method": "GET",
"use": "Estado do jail Fail2Ban; exige esse componente opcional instalado."
},
{
"endpoint": "/api/security/fail2ban/activity",
"method": "GET",
"use": "Eventos recentes Fail2Ban: bloqueios, desbloqueios e arranques do jail."
},
{
"endpoint": "/api/security/lynis/status",
"method": "GET",
"use": "Estado do Lynis: instalação e data da última análise."
},
{
"endpoint": "/api/security/lynis/report",
"method": "GET",
"use": "Último relatório Lynis: avisos, sugestões e índice de reforço da segurança."
},
{
"endpoint": "/api/security/tools",
"method": "GET",
"use": "Detecte quais ferramentas de segurança opcionais (Fail2Ban, Lynis) estão instaladas."
}
]
},
"proxmenuxIntegration": {
"heading": "Integração ProxMenux",
"rows": [
{
"endpoint": "/api/proxmenux/update-status",
"method": "GET",
"use": "Disponibilidade de atualização do ProxMenux Monitor, versão instalada e mais recente."
},
{
"endpoint": "/api/proxmenux/installed-tools",
"method": "GET",
"use": "Lista de cada otimização pós-instalação ProxMenux atualmente registrada no host (de <code>/usr/local/share/proxmenux/installed_tools.json</code>)."
},
{
"endpoint": "/api/proxmenux/tool-source/<key>",
"method": "GET",
"use": "Código da função pós-instalação associada, extraído dos scripts atuais do anfitrião ou de código antigo preservado. Não garante uma cópia do código executado originalmente."
}
]
},
"prometheus": {
"heading": "Métricas Prometheus",
"intro": "O endpoint autenticado <code>GET /api/prometheus</code> devolve o formato de texto Prometheus 0.0.4. Cada métrica inclui <code>node=\"&lt;hostname&gt;\"</code> e uma marca temporal explícita. Recolha com Prometheus ou outra base temporal compatível.",
"exportedTitle": "métricas exportadas",
"headerGroup": "Grupo",
"headerMetric": "Métrica",
"headerDesc": "Descrição",
"groups": [
{
"group": "Sistema",
"metrics": [
{
"metric": "proxmox_cpu_usage",
"desc": "Percentagem de utilização da CPU, tipo gauge."
},
{
"metric": "proxmox_memory_total_bytes",
"desc": "Memória física total em bytes."
},
{
"metric": "proxmox_memory_used_bytes",
"desc": "Memória utilizada em bytes."
},
{
"metric": "proxmox_memory_usage_percent",
"desc": "Percentagem de utilização da memória."
},
{
"metric": "proxmox_load_average",
"desc": "Média de carga do sistema. Rótulo <code>period=\"1m\" | \"5m\" | \"15m\"</code>."
}
]
},
{
"group": "Tempo de atividade",
"metrics": [
{
"metric": "proxmox_uptime_seconds",
"desc": "Segundos desde o último arranque."
}
]
},
{
"group": "Hardware",
"metrics": [
{
"metric": "proxmox_cpu_temperature_celsius",
"desc": "Temperatura do encapsulamento da CPU."
},
{
"metric": "proxmox_disk_temperature_celsius",
"desc": "Temperatura por disco. Rótulo <code>disk</code>."
},
{
"metric": "proxmox_fan_speed_rpm",
"desc": "Velocidades das ventoinhas. Rótulo <code>fan</code>."
}
]
},
{
"group": "Espaço em disco",
"metrics": [
{
"metric": "proxmox_disk_total_bytes",
"desc": "Capacidade total de cada entrada de disco exportada. Rótulo <code>disk</code>."
},
{
"metric": "proxmox_disk_used_bytes",
"desc": "Capacidade utilizada de cada entrada de disco exportada."
},
{
"metric": "proxmox_disk_usage_percent",
"desc": "Percentagem utilizada de cada entrada de disco exportada."
}
]
},
{
"group": "Rede",
"metrics": [
{
"metric": "proxmox_network_bytes_sent_total",
"desc": "Total de bytes enviados, tipo counter."
},
{
"metric": "proxmox_network_bytes_received_total",
"desc": "Total de bytes recebidos, tipo counter."
},
{
"metric": "proxmox_interface_bytes_sent_total",
"desc": "Bytes enviados por interface. Rótulo <code>interface</code>."
},
{
"metric": "proxmox_interface_bytes_received_total",
"desc": "Bytes recebidos por interface."
}
]
},
{
"group": "VMs / CTs",
"metrics": [
{
"metric": "proxmox_vms_total",
"desc": "Número total de VMs e LXCs."
},
{
"metric": "proxmox_vms_running",
"desc": "Número de sistemas convidados em execução."
},
{
"metric": "proxmox_vms_stopped",
"desc": "Número de convidados parados."
},
{
"metric": "proxmox_vm_status",
"desc": "Estado por VM/CT: 1 em execução, 0 nos restantes estados. Rótulos <code>node</code>, <code>vmid</code> e <code>name</code>."
},
{
"metric": "proxmox_vm_cpu_usage",
"desc": "Utilização de CPU por VM/CT, com os mesmos rótulos."
},
{
"metric": "proxmox_vm_memory_used_bytes / _max_bytes",
"desc": "Memória utilizada e máximo configurado por VM/CT."
}
]
},
{
"group": "GPU",
"metrics": [
{
"metric": "proxmox_gpu_temperature_celsius",
"desc": "Temperatura GPU. Rótulos <code>slot</code> e <code>vendor</code>; gpu inclui também o nome da GPU."
},
{
"metric": "proxmox_gpu_utilization_percent",
"desc": "Percentagem de utilização da GPU."
},
{
"metric": "proxmox_gpu_memory_total_bytes",
"desc": "Memória total da GPU."
},
{
"metric": "proxmox_gpu_power_draw_watts",
"desc": "Potência consumida pela GPU em watts."
},
{
"metric": "proxmox_gpu_clock_speed_mhz",
"desc": "Frequência do núcleo da GPU."
},
{
"metric": "proxmox_gpu_memory_clock_mhz",
"desc": "Frequência da memória da GPU."
}
]
},
{
"group": "UPS",
"metrics": [
{
"metric": "proxmox_ups_battery_charge_percent",
"desc": "Percentagem de carga da bateria."
},
{
"metric": "proxmox_ups_load_percent",
"desc": "Carga actual na UPS."
},
{
"metric": "proxmox_ups_runtime_seconds",
"desc": "Autonomia estimada em bateria."
},
{
"metric": "proxmox_ups_input_voltage_volts",
"desc": "Tensão de entrada."
}
]
}
],
"scrapeTitle": "Configuração de recolha do Prometheus",
"scrapeIntro": "Com autenticação ativa, adicione um token API ao cabeçalho Bearer da configuração de recolha Prometheus:",
"perHostTitle": "Recolha por anfitrião",
"perHostBody": "Cada instância exporta métricas do seu anfitrião. Num cluster, configure Prometheus para consultar cada nó. O rótulo <code>node</code> distingue as séries no Grafana (<code>proxmox_vms_running'{'node=\"pve01\"'}'</code>)."
},
"puttingItTogether": {
"heading": "Combinar as integrações",
"body": "Consulte <link>Integrações</link> para ligar os endpoints a sensores Home Assistant, cartões Homepage, painéis Grafana, fluxos n8n e outras ferramentas. Inclui configurações habituais copiáveis de cada plataforma. Esta página reúne o catálogo de endpoints."
},
"whereNext": {
"heading": "Para continuar",
"items": [
{
"label": "Acesso e autenticação",
"href": "/docs/monitor/access-auth",
"tail": " — criação de tokens, registo de auditoria, jail Fail2Ban opcional e TLS."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tailRich": " — conteúdo de <code>data</code> por evento ao chamar <code>/api/notifications/send</code>."
},
{
"label": "Assistente de IA",
"href": "/docs/monitor/ai-assistant",
"tailRich": " — funcionamento de <code>/api/notifications/test-ai</code> e <code>/api/notifications/provider-models</code>."
},
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tailRich": " — formato das respostas de <code>/api/health/*</code> e significado das dez categorias."
}
]
}
}
@@ -0,0 +1,303 @@
{
"meta": {
"title": "Arquitetura do ProxMenux Monitor — AppImage, Flask, SQLite, WebSocket | ProxMenux",
"description": "Construção do ProxMenux Monitor: estrutura AppImage, blueprints Flask, tarefas de fundo, dados de psutil, pvesh, smartctl e journalctl, armazenamento SQLite, terminal WebSocket, fornecedores IA, canais de notificação, proxy inverso e Fail2Ban opcional.",
"ogTitle": "Arquitetura ProxMenux Monitor",
"ogDescription": "Dentro do ProxMenux Monitor: AppImage, blueprints Flask, tarefas de fundo, SQLite, WebSocket, fornecedores IA e canais de notificação.",
"twitterTitle": "Arquitetura ProxMenux Monitor",
"twitterDescription": "AppImage, Flask, SQLite, WebSocket, fornecedores de IA e canais de notificação — dentro do Monitor."
},
"header": {
"title": "Arquitetura",
"description": "Como se distribui o ProxMenux Monitor, o que contém o AppImage e como os pedidos do navegador passam pelo Flask até às ferramentas do anfitrião e ao armazenamento SQLite.",
"section": "ProxMenux Monitor"
},
"intro": {
"title": "Um processo, muitas responsabilidades",
"body": "Um processo Python escuta em TCP 8008. Serve a versão estática Next.js, disponibiliza a API REST, gere o terminal WebSocket, executa Health Monitor e envia notificações. Não exige servidor web separado, intermediário de mensagens ou base de dados externa."
},
"requestFlow": {
"heading": "Percurso de um pedido",
"intro": "Um pedido de dados típico segue este percurso; as preferências do navegador podem ser tratadas localmente:",
"diagramCaption": "As rotas protegidas validam JWT com autenticação ativa. Rotas principais e blueprints devolvem dados em cache ou acabados de recolher. A verificação Fail2Ban opcional consulta a lista de bloqueios em cache. Cabeçalhos IP reencaminhados só são aceites com PROXMENUX_TRUST_PROXY=1; caso contrário, usa-se o endereço da ligação. O estado persistente inclui SQLite e ficheiros JSON como auth.json.",
"diagramArrowLabel": "HTTP / WS",
"nodes": {
"clientLabel": "Cliente",
"clientDetail": "Navegador ou PWA\n+ proxy opcional\nNginx / Caddy /\nTraefik",
"flaskLabel": "Flask :8008",
"flaskDetail": "Blueprints\nMiddleware JWT\nVerificação Fail2Ban\n(se instalado)",
"hostLabel": "Ferramentas do anfitrião",
"hostDetail": "psutil\npvesh\nsmartctl\njournalctl",
"stateLabel": "Estado local",
"stateDetail": "SQLite DB\n+ auth.json"
},
"threadsIntro": "O processo executa também <strong>threads em segundo plano</strong>. Estes exemplos recolhem dados, atualizam caches e SQLite e enviam notificações. Existem outras tarefas; o envio depende de estar ativado:",
"headerThread": "Thread",
"headerCadence": "Cadência",
"headerJob": "Tarefa agendada",
"rows": [
{
"thread": "_temperature_collector_loop",
"cadence": "60 s",
"job": "Guarda temperatura CPU e amostras de latência na base histórica, mantendo dados para os gráficos sem navegador ligado."
},
{
"thread": "_health_collector_loop",
"cadence": "5 min",
"job": "Executa o ciclo Health Monitor de dez categorias, guarda erros e observações de discos, mantém as dispensas e passa novos eventos ao motor de notificações."
},
{
"thread": "_vital_signs_sampler",
"cadence": "CPU 5 s; temperatura 15 s; memória 30 s",
"job": "Recolhe CPU, memória e temperatura CPU para indicadores e deteção de condições prolongadas, independentemente da análise geral de cinco minutos."
},
{
"thread": "notification_manager.start()",
"cadence": "orientado por eventos",
"job": "Inicia os observadores de journal, tarefas e hooks (<code>JournalWatcher</code>, <code>TaskWatcher</code>, <code>ProxmoxHookWatcher</code>) e envia para os canais configurados, com reformulação IA opcional."
}
]
},
"systemd": {
"heading": "Unidade systemd",
"intro": "O instalador cria a unidade <code>/etc/systemd/system/proxmenux-monitor.service</code>. Configuração predefinida:",
"items": [
"<strong><code>User=root</code></strong>: o serviço usa privilégios root para SMART, <code>pvesh</code> e gestão ZFS. Os processos do terminal web herdam estas permissões.",
"<strong><code>Restart=on-failure</code></strong> com espera de dez segundos: o serviço reinicia automaticamente após uma saída com erro.",
"<strong><code>After=network.target</code></strong>: ordena o arranque após esse alvo; não garante IP atribuído, DNS ou ligação externa."
],
"inspectTitle": "Consultar a unidade atual"
},
"appimage": {
"heading": "Qual a composição de AppImage",
"intro": "O AppImage contém um sistema de ficheiros montado ao executar. <code>AppRun</code> na raiz prepara o ambiente e inicia <code>flask_server.py</code>:",
"consequencesIntro": "Duas consequências deste layout:",
"consequences": [
"<strong>Ambiente Python incluído.</strong> O interpretador e os pacotes estão no AppImage, sem instalação no Python do sistema. A aplicação continua a usar interfaces do kernel e ferramentas externas do anfitrião.",
"<strong>Clientes de hardware incluídos.</strong> Contém <code>ipmitool</code>, <code>lm-sensors</code> e <code>upsc</code>. As leituras dependem do hardware compatível, acesso aos sensores e, para a UPS, de um servidor NUT configurado."
]
},
"flask": {
"heading": "Estrutura da aplicação Flask",
"intro": "<code>flask_server.py</code> cria uma instância <code>Flask(__name__)</code> com CORS limitado, regista diretamente nove blueprints e inicia o terminal. A tabela destaca módulos principais; regista também auditoria, cópias VM e PBS. As pré-cargas PVE só funcionam em anfitriões PVE.",
"headerBlueprint": "Blueprint / módulo",
"headerPrefix": "Prefixo das rotas",
"headerOwns": "Responsabilidade",
"rows": [
{
"blueprint": "flask_server.py",
"prefix": [
"/api/system",
"/api/storage",
"/api/network",
"/api/vms",
"/api/hardware",
"/api/logs",
"/api/prometheus"
],
"owns": "Endpoints principais, web estática e verificação Fail2Ban opcional quando o jail <code>proxmenux</code> existe no anfitrião."
},
{
"blueprint": "flask_auth_routes.py",
"prefix": [
"/api/auth/*"
],
"owns": "Início de sessão, emissão JWT, configuração e verificação TOTP, alteração de palavra-passe e tokens API."
},
{
"blueprint": "flask_health_routes.py",
"prefix": [
"/api/health/*"
],
"owns": "Verificações de estado, detalhes, erros ativos e dispensados e definições de silenciamento. As rotas protegidas exigem autenticação quando ativa."
},
{
"blueprint": "flask_terminal_routes.py",
"prefix": [
"/api/terminal/* + WS"
],
"owns": "Atribui um PTY por sessão e liga-o por WebSocket ao <code>xterm.js</code> do navegador."
},
{
"blueprint": "flask_notification_routes.py",
"prefix": [
"/api/notifications/*"
],
"owns": "Criar, consultar, editar e remover canais; testes, IA, histórico e envios manuais."
},
{
"blueprint": "flask_security_routes.py",
"prefix": [
"/api/security/*"
],
"owns": "Falhas de acesso e, com Fail2Ban instalado, estado do jail, bloqueios e desbloqueio manual."
},
{
"blueprint": "flask_proxmenux_routes.py",
"prefix": [
"/api/proxmenux/*"
],
"owns": "Lê as otimizações ProxMenux registadas no anfitrião."
},
{
"blueprint": "flask_oci_routes.py",
"prefix": [
"/api/oci/*"
],
"owns": "Funções de implementação de aplicações OCI e contentores no Proxmox VE 9.1+."
}
],
"endpointsLink": "Os endpoints de integração e os formatos são descritos em <link>Referência da API</link>."
},
"dataSources": {
"heading": "Fontes de dados",
"intro": "Os dados do anfitrião vêm sobretudo de bibliotecas padrão, ficheiros e comandos de administração. Alguns dados dos sistemas convidados dependem também do QEMU Guest Agent ou de comandos no CT:",
"headerSource": "Origem",
"headerUsedFor": "Usado para",
"rows": [
{
"source": "psutil",
"usedFor": "Carga CPU, memória, swap, ocupação das montagens, contadores de rede e processos."
},
{
"source": "pvesh / qm / pct",
"usedFor": "Informações do nó Proxmox, inventário e configuração VM/CT, armazenamento e histórico de tarefas."
},
{
"source": "smartctl",
"usedFor": "Atributos SATA/NVMe, estado SMART, desgaste, vida útil, modelo e número de série."
},
{
"source": "zpool / zfs",
"usedFor": "Estado do pool (ONLINE / DEGRADED / FAULTED / UNAVAIL), progresso do scrub e utilização dos datasets."
},
{
"source": "journalctl",
"usedFor": "Registos do sistema, processos terminados por OOM, erros ATA/NVMe/dm, segurança e unidades de serviço próprias."
},
{
"source": "ip / iproute2",
"usedFor": "Interfaces, endereços, bridges, bonds e dispositivos geridos por OVS."
},
{
"source": "nvidia-smi · intel_gpu_top",
"usedFor": "Dados GPU disponíveis de utilização, VRAM, temperatura e codificação/descodificação. Os campos dependem do fabricante, ferramenta e controlador."
},
{
"source": "lspci · lscpu · dmidecode",
"usedFor": "Topologia PCIe, modelo e topologia CPU, placa principal e BIOS."
},
{
"source": "ipmitool · sensors",
"usedFor": "Sensores fora de banda, ventoinhas e temperaturas da placa, quando o hardware permite."
},
{
"source": "upsc (NUT)",
"usedFor": "Estado da bateria, carga e autonomia UPS com um servidor NUT configurado."
}
],
"cacheTitle": "Cache para reduzir consultas ao anfitrião",
"cacheBody": "Os resultados dispendiosos de <code>smartctl -a</code> e <code>pvesh get</code> ficam temporariamente no processo Flask para reduzir consultas aos discos e à API do cluster. A duração depende da fonte: segundos para métricas e minutos para SMART."
},
"persistence": {
"heading": "Persistência",
"intro": "Vários ficheiros de estado têm conteúdos e requisitos de acesso diferentes:",
"headerPath": "Path",
"headerOwner": "Proprietário",
"headerContents": "Conteúdo",
"rows": [
{
"path": "/usr/local/share/proxmenux/health_monitor.db",
"owner": "root:root",
"contents": "Base SQLite. Tabelas: <code>errors</code>, <code>events</code>, <code>disk_registry</code>, <code>disk_observations</code>, <code>user_settings</code>, <code>notification_history</code>, <code>excluded_storages</code>, <code>excluded_interfaces</code>. Registo em modo WAL."
},
{
"path": "/usr/local/share/proxmenux/.notification_key",
"owner": "root <code>0600</code>",
"contents": "Chave principal de 32 bytes para segredos de notificação ENC2. Usa salt aleatório por valor, chaves derivadas e MAC. Os valores XOR antigos são suportados para migração."
},
{
"path": "/root/.config/proxmenux-monitor/auth.json",
"owner": "root:root",
"contents": "Configuração de acesso: ativação, utilizador, hash PBKDF2-HMAC-SHA256 da palavra-passe com salt, segredo TOTP, códigos de recuperação, chave JWT da instalação, metadados dos tokens API e hashes de revogação. Hashes SHA-256 antigos migram após um início de sessão bem-sucedido."
},
{
"path": "/var/log/proxmenux-auth.log",
"owner": "root:root",
"contents": "Registo de autenticação em texto simples, independente do Fail2Ban. Se o jail <code>[proxmenux]</code> estiver instalado e ativo, lê o ficheiro para detetar falhas repetidas. Sem esse jail, o registo continua disponível para consulta."
}
],
"backupTitle": "Guardar auth.json antes de reinstalar",
"backupBody": "Substituir o AppImage normalmente preserva <code>/root/.config/proxmenux-monitor/auth.json</code> e <code>/usr/local/share/proxmenux/health_monitor.db</code>. Guarde <code>auth.json</code> com jwt_secret para manter validade e metadados dos tokens. A base guarda separadamente estado e notificações. Guarde <code>.notification_key</code> com ela para restaurar segredos dos canais; a base isolada não restaura a autenticação API."
},
"health": {
"heading": "Ciclo Health Monitor",
"intro": "Aproximadamente a cada cinco minutos, o processo de fundo chama <code>health_monitor.py</code> para verificar as dez categorias do painel:",
"items": [
"Serviços PVE críticos (<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>).",
"Armazenamentos Proxmox: <code>pvesh get /storage</code> e disponibilidade de cada um.",
"Discos e sistemas de ficheiros: SMART, erros de E/S no dmesg, estado ZFS e capacidade das montagens.",
"VM e CT: falhas de arranque, paragens inesperadas, erros QMP e falhas de encerramento.",
"Rede: estado de bridges e bonds, ligações e latência até ao gateway.",
"Atualizações: pacotes pendentes e correções de segurança.",
"Registos: padrões persistentes, picos e cascatas no journal do sistema.",
"Memória: intervenções do OOM killer e pressão RAM prolongada.",
"Temperatura: leituras CPU e discos face aos limites de monitorização; os sensores disponíveis dependem do hardware.",
"Segurança: falhas de acesso, bloqueios e estado do jail Fail2Ban."
],
"afterIntro": "Os resultados usam <code>error_key</code>, categoria e gravidade estáveis. As linhas de <code>errors</code> recebem <code>last_seen</code> e contagens, sem duplicação. O envio de notificações tem também impressões e intervalos próprios.",
"cycleEnd": "A limpeza pode resolver erros antigos com a <em>duração de silenciamento</em> por categoria e regras de estado, retirar registos órfãos de recursos removidos e apagar <code>events</code> com mais de 30 dias. As categorias estão em <link>Painel → Health Monitor</link>."
},
"notifications": {
"heading": "Motor de notificação",
"intro": "<code>notification_manager.py</code> coordena o envio: carrega canais, gere a fila e disponibiliza uma API Python para Flask e Health Monitor e uma entrada CLI para os hooks <code>.sh</code> do ProxMenux.",
"items": [
"Os <strong>observadores</strong> geram eventos: <code>JournalWatcher</code> acompanha o journal, <code>TaskWatcher</code> consulta tarefas Proxmox, <code>ProxmoxHookWatcher</code> recebe hooks de cópias, replicação e snapshots e <code>PollingCollector</code> gere fontes lentas.",
"Os <strong>modelos</strong> convertem eventos em título e texto. O fornecedor IA configurado (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter) pode reformulá-los em linguagem natural. Ambas as versões ficam em <code>notification_history</code>.",
"Os <strong>canais</strong> enviam por serviços como Telegram, Discord, email, Gotify, Pushover e Apprise. As implementações em <code>notification_channels.py</code> partilham <code>create_channel()</code> / <code>send()</code>.",
"<strong>Cifragem.</strong> As definições sensíveis (<code>telegram.bot_token</code>, <code>discord.webhook_url</code>, <code>pushover.user_key</code>, <code>pushover.api_token</code>, <code>ai_api_key_*</code>, <code>email.password</code>) são cifradas com a chave de <code>.notification_key</code> antes de guardar e apresentadas de forma mascarada."
],
"linksFooter": "Controlos por evento, opções dos canais e IA são descritos em <notifLink>Definições → Notificações</notifLink> e <aiLink>Definições → Assistente de IA</aiLink>."
},
"websocket": {
"heading": "Terminal WebSocket",
"intro": "A aba <em>Terminal</em> liga um cliente leve <code>xterm.js</code> a um PTY do servidor por WebSocket. Existem dois modos:",
"items": [
"<strong>Modo HTTP, predefinido:</strong> o servidor Flask incluído e <code>flask-sock</code> tratam a mudança de protocolo para WebSocket.",
"<strong>Modo HTTPS / WSS:</strong> usa <code>gevent.pywsgi.WSGIServer</code> com <code>geventwebsocket.handler.WebSocketHandler</code> para WebSocket sobre TLS."
],
"outro": "Os processos do terminal herdam <code>User=root</code>. Com autenticação ativa, WebSocket exige um ticket breve de uso único obtido pelo endpoint autenticado com permissões administrativas. Se a autenticação estiver desativada ou recusada, a ligação segue esse modo sem autenticação.",
"proxyNote": "Num proxy inverso, permita WebSocket e os cabeçalhos <code>Upgrade</code> e <code>Connection</code>. O terminal precisa desse encaminhamento."
},
"proxy": {
"heading": "Proxy inverso e Fail2Ban",
"intro": "A escolha do IP do cliente e o bloqueio opcional na aplicação dependem destas definições e componentes:",
"items": [
"<strong>Escolha do IP do cliente.</strong> A verificação <code>before_request</code> e o registo de acesso só aceitam <code>X-Forwarded-For</code>, depois <code>X-Real-IP</code>, com PROXMENUX_TRUST_PROXY=1. Caso contrário, usam <code>request.remote_addr</code>. Cabeçalhos reencaminhados não são aceites automaticamente.",
"<strong>Fail2Ban opcional na aplicação.</strong> Uma ligação proxy pode apresentar o IP do proxy como origem TCP. Com o IP fiável do cliente e o jail <code>proxmenux</code> ativo, Flask rejeita IP bloqueados com HTTP 403. A lista fica em cache por 30 segundos e renova-se ao processar pedidos após expirar, sem temporizador dedicado."
],
"calloutTitle": "Fail2Ban não está incluído",
"calloutBody": "Fail2Ban <strong>não</strong> está incluído nem se instala automaticamente. Pode ser instalado em Segurança do Monitor ou <link>Segurança → Fail2Ban</link> no ProxMenux Scripts. Sem <code>fail2ban-client</code> ou o jail <code>proxmenux</code>, esta verificação não bloqueia pedidos. A autenticação segue a política configurada.",
"outro": "Os exemplos Nginx/Caddy/Traefik e o guia do jail estão em <accessLink>Acesso e autenticação</accessLink> e <fail2banLink>Segurança → Fail2Ban</fail2banLink>."
},
"whereNext": {
"heading": "Para continuar",
"items": [
{
"label": "Acesso e autenticação",
"href": "/docs/monitor/access-auth",
"tail": " — primeiro arranque, palavra-passe e TOTP 2FA, exemplos de proxy inverso e jail Fail2Ban."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — endpoints de integração, gestão de tokens e convenções de autenticação."
},
{
"label": "Configurações → ProxMenux Monitor",
"href": "/docs/settings/proxmenux-monitor",
"tail": " — controlo do serviço e verificação do estado no menu de texto ProxMenux."
}
]
}
}
@@ -0,0 +1,218 @@
{
"meta": {
"title": "Avaliação e inventário | Auditoria e relatórios",
"description": "Avaliação de Auditoria e relatórios: perfis dos relatórios, classificação dos resultados, riscos aceites, fontes ilegíveis, Lynis e inventário do nó."
},
"header": {
"title": "Avaliação e inventário",
"description": "A avaliação inspeciona o nó, mantém seus achados e responde a diferentes perguntas dependendo do perfil do relatório.",
"section": "Auditoria e relatórios"
},
"sections": [
{
"id": "read-only",
"blocks": [
{
"calloutInfo": {
"title": "Uma avaliação inspeciona; não altera a configuração",
"body": "Lê a configuração e o estado da máquina. Ele escreve seus resultados, relatórios e registros, e as verificações de inicialização podem montar partições do sistema EFI por um momento. A configuração que avalia não é modificada."
}
},
{
"p": "<strong>Executar avaliação</strong> inicia uma execução com o perfil escolhido em <strong>Relatório</strong>. A vista mostra a data da última execução e o tempo decorrido."
}
]
},
{
"id": "profiles",
"title": "Perfis de relatórios",
"intro": "Cada perfil responde a uma pergunta diferente. Os controlos e secções são seleccionados antes da composição do documento.",
"blocks": [
{
"table": {
"headers": [
"Perfil",
"O que cobre"
],
"rows": [
[
"Auditoria completa",
"Todas as verificações e toda a estrutura disponível."
],
[
"Diagnóstico rápido",
"Cada verificação; o resultado se abre com os achados críticos, as advertências e as leituras que não puderam ser verificadas."
],
[
"Inventário",
"Uma descrição do nó, sem verificações e sem classificação."
],
[
"Revisão da segurança",
"Exposição, acesso, privilégios, certificados, atualizações, repositórios e Lynis."
],
[
"Garantia de backup",
"Cobertura, idade, resultados, verificação, retenção e recuperação dos backups."
],
[
"Capacidade e desgaste",
"Margem de crescimento, memória, uso do espaço e a vida útil dos discos."
]
]
}
},
{
"p": "O conteúdo de cada documento está descrito em <reportsLink>Relatórios e comparações</reportsLink>."
}
]
},
{
"id": "results",
"title": "Como os resultados são classificados",
"blocks": [
{
"table": {
"headers": [
"Classificação",
"Significado"
],
"rows": [
[
"Crítico",
"Uma condição falhada que tem prioridade."
],
[
"Aviso",
"Uma condição que precisa de uma revisão, dada a evidência ou a política."
],
[
"Observação",
"Informações sobre o nó que não é relatado como uma falha."
],
[
"Não verificado",
"Não foi possível ler a fonte necessária à verificação. Isto não significa que o problema não exista."
],
[
"Conforme",
"A condição preenche o critério aplicado."
],
[
"Não aplicável",
"Não se aplica nada no âmbito do controlo."
],
[
"Risco aceite",
"A descoberta existe e uma decisão sobre ela foi registrada."
],
[
"Excluído pela política",
"A política declara que o elemento está fora da contagem."
]
]
}
},
{
"p": "Os achados podem ser filtrados por área: Sistema, Armazenamento, Rede, Segurança, Backup, Convidados e Hardware. Cada achado mantém sua evidência, com a fonte da qual foi lido."
}
]
},
{
"id": "unverified",
"title": "Quando uma fonte não pode ser lida",
"blocks": [
{
"table": {
"headers": [
"Caso",
"Comportamento"
],
"rows": [
[
"Não verificado",
"A verificação mantém a sua identidade, indica nas evidências qual a fonte que falhou e não transforma dados em falta num resultado conforme."
],
[
"Evidência incompleta",
"O relatório indica a fonte e a hora da recolha para distinguir um problema real de uma leitura insuficiente."
],
[
"Uma nova execução",
"Uma vez que o acesso, pacote ou serviço é corrigido, o mesmo perfil é executado novamente e a comparação mostra se o resultado pode ser verificado."
]
]
}
}
]
},
{
"id": "lynis",
"title": "Lynis",
"blocks": [
{
"p": "A revisão de segurança utiliza o relatório Lynis do anfitrião. Se Lynis nunca foi executado ou o relatório ultrapassa a antiguidade permitida pela política, um diálogo oferece <strong>Executar com Lynis</strong>, que demora alguns minutos mais, ou <strong>Executar sem Lynis</strong>, que utiliza o relatório existente."
},
{
"figure": {
"src": "/monitor/audit/lynis-dialog.png",
"alt": "Janela que se oferece para executar a avaliação com ou sem Lynis",
"caption": "O diálogo Lynis antes de uma revisão de segurança."
}
}
]
},
{
"id": "accept",
"title": "Aceitar um risco",
"blocks": [
{
"p": "<strong>Aceitar risco</strong> regista uma decisão sobre uma conclusão. A justificação é obrigatória e é guardada com o autor e a data."
},
{
"table": {
"headers": [
"Campo",
"Opções"
],
"rows": [
[
"Justificação",
"Texto livre, necessário."
],
[
"Deixa de aplicar-se após",
"90 dias, 180 dias, 1 ano ou não expirar. Quando o período termina o achado torna-se ativo novamente."
],
[
"Lembrar-me de rever",
"Um lembrete que traz a decisão de volta à atenção enquanto ela permanece em vigor."
]
]
}
},
{
"p": "Uma conclusão aceite continua visível com a decisão; <strong>Voltar a ativo</strong> revoga a aceitação. Aceitar um risco não o corrige: a comparação apresenta-o como aceite, não como resolvido."
}
]
},
{
"id": "inventory",
"title": "Inventário",
"blocks": [
{
"list": {
"items": [
"Identidade, versão Proxmox VE, kernel, assinatura e cluster.",
"CPU, memória, placa, BIOS, controladores e IOMMU.",
"Discos, SMART, horas de energia e eventos gravados.",
"Adaptadores, bonds, bridges, latência e ligações.",
"Armazenamento, hóspedes com seus discos e interfaces e backups.",
"A passagem PCI e o software ProxMenux gerenciam."
]
}
}
]
}
]
}
@@ -0,0 +1,208 @@
{
"meta": {
"title": "Alterações | Auditoria e relatórios",
"description": "Registo de alterações de Auditoria e relatórios: o que o ProxMenux alterou no anfitrião, estado anterior, diferenças e possibilidade de anular."
},
"header": {
"title": "Alterações",
"description": "Registo das operações realizadas pelo ProxMenux no anfitrião e, quando capturado, do estado anterior e posterior de cada uma.",
"section": "Auditoria e relatórios"
},
"sections": [
{
"id": "purpose",
"blocks": [
{
"calloutInfo": {
"title": "Do script executado à alteração efetuada",
"body": "Uma função longa pode alterar apenas duas linhas. O registo guarda cada operação concreta com o script, função e versão responsáveis, recurso afetado, diferenças e possibilidade de anular."
}
},
{
"flow": {
"nodes": [
{
"label": "Script",
"detail": "função + versão"
},
{
"label": "Capturar",
"detail": "conteúdo antes"
},
{
"label": "Operação",
"detail": "arquivo · pacote · serviço"
},
{
"label": "Registo",
"detail": "atribuição + diferença"
}
],
"caption": "A captura é feita durante a operação e é consolidada quando o Monitor lê o registo."
}
},
{
"figure": {
"src": "/monitor/audit/changes-view.png",
"alt": "Vista Alterações de Auditoria e relatórios com entradas agrupadas por opção pós-instalação e script",
"caption": "A visão Mudanças, com a diferença de um arquivo editado por ProxMenux."
}
}
]
},
{
"id": "types",
"title": "Tipos de entrada",
"intro": "O filtro no topo separa as entradas por tipo.",
"blocks": [
{
"table": {
"headers": [
"Tipo",
"O que grava"
],
"rows": [
[
"Configuração",
"ProxMenux escreveu, editou ou removeu um arquivo, alterou uma configuração ou alterou um serviço."
],
[
"Instalações",
"ProxMenux adicionou um pacote ou componente, e os pacotes que realmente apareceram são gravados."
],
[
"Execuções",
"O ProxMenux executou um comando; as alterações dependem do próprio comando."
],
[
"Aplicado",
"Uma função foi aplicada antes de existir o registo; o estado anterior não foi capturado."
]
]
}
}
]
},
{
"id": "groups",
"title": "Como se organiza a visão",
"blocks": [
{
"table": {
"headers": [
"Secção",
"Conteúdo"
],
"rows": [
[
"Otimizações pós-instalação",
"Agrupado pela opção pós-instalação selecionada pelo usuário."
],
[
"Scripts do ProxMenux",
"GPU, Coral, rede, armazenamento, segurança, utilitários e os outros scripts instrumentados, incluindo o instalador ProxMenux e ProxMenux Monitor."
],
[
"Pacotes e utilitários instalados",
"Software instalado pelo ProxMenux no anfitrião."
]
]
}
},
{
"p": "Dentro de cada seção, <strong>Por função</strong> agrupa as entradas sob a função que as fez."
}
]
},
{
"id": "entry",
"title": "O que cada item mostra",
"blocks": [
{
"list": {
"items": [
"O script, função e versão responsável.",
"A data e o recurso afetado.",
"O estado conhecido antes e depois da mudança.",
"As linhas adicionadas e removidas.",
"Os pacotes que foram realmente adicionados.",
"A transição de estado de um serviço.",
"<strong>Anular esta alteração</strong>: <em>Repõe exatamente o estado anterior</em>, <em>Elimina o ficheiro (não existia antes)</em>, <em>O pacote pode ser desinstalado</em>, uma anulação parcial ou <em>Não pode ser anulado a partir do registo</em>."
]
}
}
]
},
{
"id": "before",
"title": "O que significa o estado anterior",
"blocks": [
{
"p": "O estado anterior pode ser conteúdo capturado, um ficheiro criado pela primeira vez ou um estado desconhecido. As alterações anteriores ao registo não podem ser reconstruídas; voltar a executar a função captura primeiro o estado encontrado nesse momento."
}
]
},
{
"id": "limits",
"title": "Âmbito do registo",
"blocks": [
{
"list": {
"items": [
"As alterações manuais e feitas por outros softwares não são gravadas.",
"Apenas as operações que passam pelos primitivos de auditoria ProxMenux estão cobertas.",
"A gravação nunca bloqueia a operação que descreve: se a entrada não puder ser escrita, a operação continua.",
"Mudanças sucessivas em um recurso são mostradas como a origem conhecida contra o estado atual."
]
}
}
]
},
{
"id": "retention",
"title": "Provas armazenadas",
"blocks": [
{
"table": {
"headers": [
"Elemento",
"Comportamento"
],
"rows": [
[
"Entradas",
"As entradas são guardadas no anfitrião; nada é removido automaticamente do registo."
],
[
"Conteúdo capturado",
"Um objeto capturado é mantido enquanto uma entrada se refere a ele."
],
[
"Tamanho de uma captura",
"O conteúdo com mais de 1 MiB não é guardado na totalidade; a entrada regista que a captura foi omitida devido ao tamanho."
],
[
"Leitura",
"O Monitor não carrega objetos armazenados acima de 2 MiB."
],
[
"Diferença",
"São apresentadas no máximo 400 linhas; uma diferença maior é assinalada como truncada."
],
[
"Listagem",
"A API devolve por predefinição 200 entradas por pedido, até um máximo de 1000."
]
]
}
},
{
"calloutWarning": {
"title": "Guardar o conteúdo não implica anular automaticamente",
"body": "O conteúdo anterior pode ser consultado e reposto manualmente, mas a vista Alterações não anula operações. Uma entrada de execução regista o comando sem conhecer todos os efeitos da ferramenta executada."
}
}
]
}
]
}
@@ -0,0 +1,136 @@
{
"meta": {
"title": "Auditoria e relatórios | ProxMenux Monitor",
"description": "Avalie um nó Proxmox VE, registe as alterações do ProxMenux e declare o que se espera dos sistemas convidados e do armazenamento, com relatórios imprimíveis."
},
"header": {
"title": "Auditoria e relatórios",
"description": "Avaliação do nó, registo das alterações do ProxMenux e declaração das expectativas, com documentos que podem ser impressos ou guardados em PDF.",
"section": "ProxMenux Monitor"
},
"sections": [
{
"id": "views",
"blocks": [
{
"calloutInfo": {
"title": "Três vistas, três perguntas",
"body": "Auditoria e relatórios distingue os factos do nó, as intervenções do ProxMenux e as expectativas declaradas. Uma configuração que não possa ser avaliada face a um objetivo declarado é descrita sem ser assinalada como falha."
}
},
{
"cards": {
"items": [
{
"icon": "shield",
"title": "Avaliação — como está o nó?",
"body": "Realiza as verificações do perfil escolhido, compõe o inventário e classifica o que precisa de atenção, com as evidências de cada resultado."
},
{
"icon": "refresh",
"title": "Alterações — o que fez o ProxMenux?",
"body": "Lista os ficheiros, pacotes, serviços e comandos alterados pelos scripts ProxMenux instrumentados, incluindo o estado anterior quando foi capturado."
},
{
"icon": "fileText",
"title": "Política — o que se espera?",
"body": "Declara quais os sistemas convidados que necessitam de cópia de segurança ou devem arrancar com o anfitrião, qual o armazenamento essencial e os limiares das verificações."
}
]
}
},
{
"flow": {
"nodes": [
{
"label": "Avaliação",
"detail": "factos"
},
{
"label": "Política",
"detail": "contexto"
},
{
"label": "Alterações",
"detail": "intervenções"
}
],
"caption": "A avaliação fornece os factos, a política dá-lhes contexto e o registo documenta as ações do ProxMenux."
}
},
{
"figure": {
"src": "/monitor/audit/assessment-view.png",
"alt": "Auditoria e relatórios no ProxMenux Monitor com as vistas Avaliação, Alterações e Política",
"caption": "Auditoria e Relatório, com a visão de Avaliação aberta."
}
}
]
},
{
"id": "boundaries",
"title": "Três funções diferentes",
"blocks": [
{
"table": {
"headers": [
"Função",
"O que ele faz"
],
"rows": [
[
"<healthLink>Monitor de estado</healthLink>",
"Observa métricas e eventos continuamente e pode gerar notificações."
],
[
"Auditoria e relatórios",
"Executa uma avaliação a pedido, documenta o nó e compara as execuções entre si."
],
[
"Registo de alterações",
"Regista as operações realizadas pelo ProxMenux através das suas primitivas de auditoria."
]
]
}
}
]
},
{
"id": "pages",
"title": "Páginas desta secção",
"blocks": [
{
"next": {
"items": [
{
"label": "Avaliação e inventário",
"href": "/docs/monitor/audit-report/assessment",
"tail": "Perfis, resultados, riscos aceites e inventário."
},
{
"label": "Alterações",
"href": "/docs/monitor/audit-report/changes",
"tail": "o diário do que ProxMenux mudou no host."
},
{
"label": "Política",
"href": "/docs/monitor/audit-report/policy",
"tail": "sistemas convidados, armazenamento e limiares."
},
{
"label": "Relatórios e comparações",
"href": "/docs/monitor/audit-report/reports",
"tail": "os seis documentos e a execução de referência."
},
{
"label": "Âmbito de aplicação e garantias",
"href": "/docs/monitor/audit-report/scope",
"tail": "fontes, limites e dados armazenados."
}
]
}
}
]
}
]
}
@@ -0,0 +1,111 @@
{
"meta": {
"title": "Política | Auditoria e relatórios",
"description": "Política do nó em Auditoria e relatórios: cópia de segurança, arranque automático e objetivo de recuperação de cada sistema convidado, função de cada armazenamento e limiares das verificações."
},
"header": {
"title": "Política",
"description": "A política declara o que uma inspeção não pode deduzir: a finalidade de cada sistema convidado e armazenamento e os limiares aplicados pelas verificações.",
"section": "Auditoria e relatórios"
},
"sections": [
{
"id": "principle",
"blocks": [
{
"calloutInfo": {
"title": "Sem declaração o relatório descreve; com ela avalia",
"body": "Uma avaliação vê o que o anfitrião faz, não para que serve. Um convidado sem backup cuja finalidade não é declarada é relatado como uma observação. Caso seu backup seja declarado necessário, a mesma ausência é reportada como advertência. Nada precisa ser declarado."
}
},
{
"figure": {
"src": "/monitor/audit/policy-view.png",
"alt": "Vista Política com os sistemas convidados, armazenamento e limiares do nó",
"caption": "A vista Política."
}
}
]
},
{
"id": "guests",
"title": "Convidados",
"intro": "Cada VM e LXC do nó tem três campos. Um valor deixado como padrão toma o valor geral, mostrado ao lado dele.",
"blocks": [
{
"table": {
"headers": [
"Campo",
"Valores",
"Efeito na avaliação"
],
"rows": [
[
"Cópia de Segurança",
"Necessário, Não exigido, Não indicado",
"Um backup ausente é um aviso quando é necessário, uma observação quando não é indicado, e é deixado fora da contagem quando não é necessário."
],
[
"Arranque automático",
"Necessário, Não exigido, Não indicado",
"Indica se o sistema convidado deve arrancar com o anfitrião."
],
[
"Objetivo de recuperação",
"Horas",
"A idade máxima aceitável do último backup."
]
]
}
}
]
},
{
"id": "storage",
"title": "Armazenamento",
"blocks": [
{
"p": "Um armazenamento inalcançável é relatado como crítico quando é declarado essencial ou serve um hóspede em execução, como um aviso quando seu papel não é declarado, e como uma observação quando é declarado opcional."
}
],
"intro": "Cada armazenamento do nó é declarado Essencial, Opcional ou Não indicado."
},
{
"id": "thresholds",
"title": "Limiares",
"intro": "Um limiar vazio utiliza o valor predefinido incluído, apresentado como texto indicativo.",
"blocks": [
{
"list": {
"items": [
"Verificação da capacidade de armazenamento (%) e do preenchimento do thin pool (%).",
"Rácio de sobreaprovisionamento thin e rácio de sobrealocação de memória.",
"Intervalo de scrub ZFS (dias).",
"Limite de recurso para a antiguidade das cópias de segurança (dias) e margem sobre o calendário (rácio).",
"Aviso de validade do certificado (dias).",
"Vida útil do disco (horas) e janela de erro do disco recente (dias).",
"Antiguidade do relatório Lynis (dias) e do índice de pacotes (dias).",
"Utilização do journal face ao seu limite (%).",
"Verificação do espaço (%) e dos inodes (%) do sistema de ficheiros."
]
}
}
]
},
{
"id": "save",
"title": "Como a política é salva",
"blocks": [
{
"p": "A declaração é validada e guardada atomicamente em <code>/usr/local/share/proxmenux/audit_policy.json</code>. Cada gravação inclui uma revisão: se outra sessão tiver alterado a declaração, o rascunho não é guardado e a vista propõe recarregar a versão gravada."
},
{
"calloutWarning": {
"title": "A política nunca é inferida",
"body": "O ProxMenux não acrescenta requisitos por iniciativa própria. Um campo vazio mantém o valor predefinido ou fica não indicado; uma declaração parcial só afeta os elementos que menciona."
}
}
]
}
]
}
@@ -0,0 +1,247 @@
{
"meta": {
"title": "Relatórios e comparações | Auditoria e relatórios",
"description": "Os seis documentos de Auditoria e relatórios, a impressão ou gravação em PDF e a comparação das execuções com uma referência."
},
"header": {
"title": "Relatórios e comparações",
"description": "Seis documentos para perguntas diferentes e a comparação de cada execução com uma referência.",
"section": "Auditoria e relatórios"
},
"sections": [
{
"id": "intro",
"blocks": [
{
"calloutInfo": {
"title": "Seis documentos, não seis estilos",
"body": "O motor seleciona as verificações e seções antes de compor o documento. Um diagnóstico rápido não é uma auditoria completa com menos páginas, e um inventário não apresenta resultados de avaliação. Os documentos da amostra abaixo utilizam dados fictícios."
}
}
]
},
{
"id": "documents",
"title": "Os seis documentos",
"blocks": [
{
"downloads": {
"items": [
{
"title": "Auditoria completa",
"body": "Documenta todo o nó como registo técnico.",
"href": "/monitor/audit/sample-audit-full-report.pdf",
"facts": [
{
"label": "Controlos",
"value": "Todas as verificações disponíveis."
},
{
"label": "Conteúdo",
"value": "Resumo executivo; identidade e cluster; hardware; rede e latência; armazenamento; sistemas convidados; passthrough; aplicações; conclusões com evidências; fontes e âmbito."
}
]
},
{
"title": "Diagnóstico rápido",
"body": "Mostra o que precisa de atenção sem o inventário completo.",
"href": "/monitor/audit/sample-audit-diagnostic-report.pdf",
"facts": [
{
"label": "Controlos",
"value": "Os mesmos controlos que a auditoria completa."
},
{
"label": "Conteúdo",
"value": "Identidade mínima; conclusões críticas; advertências; observações relevantes; leituras não verificadas e ações prioritárias. Diagramas, inventário e anexos longos são deixados de fora."
}
]
},
{
"title": "Inventário",
"body": "Descreve o que existe no nó sem avaliá-lo.",
"href": "/monitor/audit/sample-audit-inventory-report.pdf",
"facts": [
{
"label": "Controlos",
"value": "Nenhum; nenhum achado é classificado."
},
{
"label": "Conteúdo",
"value": "Identidade; cluster; CPU e memória; placa, BIOS e controladores; rede; armazenamento; VMs e LXCs; passthrough; aplicações e elementos geridos pelo ProxMenux."
}
]
},
{
"title": "Revisão da segurança",
"body": "Cobre a exposição e os controles sobre o acesso ao nó.",
"href": "/monitor/audit/sample-audit-security-report.pdf",
"facts": [
{
"label": "Controlos",
"value": "A área de segurança, além de privilégios de contêiner, atualizações, repositórios e a cadeia APT."
},
{
"label": "Conteúdo",
"value": "Identidade e cluster; rede e latência; acesso; firewall; 2FA; certificados; privilégios; atualizações; repositórios; estado e idade de Lynis."
}
]
},
{
"title": "Garantia de backup",
"body": "Verifica que a proteção declarada existe e que seus backups são utilizáveis.",
"href": "/monitor/audit/sample-audit-backup-report.pdf",
"facts": [
{
"label": "Controlos",
"value": "A área de backup, além de conectividade de armazenamento e entrega de notificação."
},
{
"label": "Conteúdo",
"value": "Cobertura por sistema convidado; objetivo de recuperação declarado; antiguidade e resultado; destino; retenção; verificação; tarefas falhadas; recuperação e fontes incompletas."
}
]
},
{
"title": "Capacidade e desgaste",
"body": "Mede a margem de crescimento e os sinais de esgotamento ou envelhecimento.",
"href": "/monitor/audit/sample-audit-capacity-report.pdf",
"facts": [
{
"label": "Controlos",
"value": "As áreas de armazenamento e hardware, além de memória, swap, diário e o sistema de arquivos host."
},
{
"label": "Conteúdo",
"value": "Utilização e limiares; thin pools; sobreaprovisionamento; memória; inodes; ZFS; temperaturas; horas de funcionamento; erros SMART e vida útil NVMe/SSD."
}
]
}
]
}
},
{
"figure": {
"src": "/monitor/audit/audit-report-preview.png",
"alt": "Primeira página de um relatório de auditoria completo",
"caption": "Cada documento compartilha o identificador do relatório, seções numeradas, data, nó, perfil e rodapé."
}
},
{
"p": "Conforme o perfil, o documento inclui identidade do nó e data da avaliação, resumo executivo, resumo por área, estrutura de hardware, rede e armazenamento, proteção dos sistemas convidados, conclusões com evidências, fontes ilegíveis e âmbito e política aplicados."
}
]
},
{
"id": "print",
"title": "Impressão ou gravação como PDF",
"blocks": [
{
"steps": {
"items": [
{
"title": "Executar",
"body": "A avaliação utiliza o perfil selecionado em <strong>Relatório</strong>."
},
{
"title": "Revisão",
"body": "A execução final mostra suas descobertas, as fontes que não pôde ler e a política que aplicou."
},
{
"title": "Gerar relatório",
"body": "<strong>Gerar relatório</strong> abre a vista preparada como documento."
},
{
"title": "Imprimir",
"body": "<strong>Imprimir ou guardar como PDF</strong> abre o diálogo de impressão do navegador para escolher uma impressora ou <em>Guardar como PDF</em>."
}
]
}
},
{
"calloutTip": {
"title": "A impressão é um documento, não uma imagem",
"body": "A barra de ação está escondida, uma tabela que continua na próxima página repete seu cabeçalho, blocos evitam quebras desnecessárias e cada página mantém a identificação e numeração."
}
}
]
},
{
"id": "compare",
"title": "Comparando com uma execução de referência",
"intro": "<strong>Usar como referência</strong> marca uma execução terminada. As seguintes são comparadas com ela e as conclusões são agrupadas em:",
"blocks": [
{
"table": {
"headers": [
"Grupo",
"Significado"
],
"rows": [
[
"Novo",
"Informado agora e não antes."
],
[
"Pioraram",
"Continuam presentes, mas são mais graves ou abrangentes do que antes."
],
[
"Melhoraram",
"Continuam presentes, mas são menos graves ou abrangentes do que antes."
],
[
"Resolvido",
"Já não são apresentados e ninguém os aceitou."
],
[
"Aceites",
"Não mais contado porque um risco foi aceito, não porque o hospedeiro mudou."
],
[
"Já não avaliados",
"Presentes antes mas ausentes desta execução; não foi verificado que tenham desaparecido."
]
]
}
},
{
"table": {
"headers": [
"Execução de referência",
"Comportamento"
],
"rows": [
[
"Configurando",
"Qualquer execução terminada pode ser marcada; nenhuma é marcada automaticamente."
],
[
"Mudando",
"Marcar outra execução muda a referência sem eliminar o histórico."
],
[
"Comparando",
"Quando não são selecionadas duas execuções, a comparação usa a referência e a execução selecionada ou mais recente."
],
[
"Conservar execuções",
"São conservadas as 30 execuções mais recentes; a referência nunca é removida."
],
[
"Sem referência",
"A vista indica que ainda não foi escolhida uma execução de referência, pelo que não existe base de comparação."
]
]
}
},
{
"calloutWarning": {
"title": "Um relatório descreve um momento",
"body": "Uma avaliação não certifica um período inteiro. Os resultados antigos deixam de descrever o estado atual; a vista mostra a antiguidade da última execução e cada fonte conserva a hora da recolha."
}
}
]
}
]
}
@@ -0,0 +1,115 @@
{
"meta": {
"title": "Âmbito e garantias | Auditoria e relatórios",
"description": "Origem dos dados de Auditoria e relatórios, limites do âmbito, garantias da conceção e localização dos dados."
},
"header": {
"title": "Âmbito e garantias",
"description": "De onde vêm os dados de uma avaliação, o que fica fora do seu âmbito e onde Auditoria e relatórios guarda os dados.",
"section": "Auditoria e relatórios"
},
"sections": [
{
"id": "sees",
"title": "O que observa",
"blocks": [
{
"list": {
"items": [
"A configuração e o estado do nó local.",
"A configuração declarada das VMs e LXCs.",
"O estado do armazenamento tal como é conhecido pelo Proxmox VE.",
"O histórico disponível de backups e verificações.",
"Dados SMART e os eventos que o Monitor recolheu.",
"O estado dos serviços, cluster, HA e fontes locais."
]
}
}
]
},
{
"id": "outside",
"title": "O que está fora da sua visão",
"blocks": [
{
"list": {
"items": [
"O interior dos convidados, além do que eles declaram para Proxmox VE.",
"Equipamento de rede fora do hospedeiro.",
"Dependências remotas que o nó não consegue observar.",
"Estado físico que o hardware não expõe.",
"O registo de alterações não inclui ações manuais ou de outro software."
]
}
},
{
"calloutWarning": {
"title": "Provas em falta não são provas de ausência",
"body": "Uma fonte que não pode ser lida dá um resultado não verificado ou incompleto, nunca conforme. O relatório enumera as fontes que não estavam disponíveis."
}
}
]
},
{
"id": "guarantees",
"title": "Garantias do projecto",
"blocks": [
{
"list": {
"items": [
"Identificadores estáveis para as verificações.",
"Histórico de execuções e conclusões.",
"Uma política validada, salva atomicamente.",
"Riscos aceitos com uma razão, visíveis.",
"Atribuição de alterações ao script e função.",
"Captura do estado anterior e posterior, quando disponível.",
"Um resultado explícito quando algo não pode ser medido ou capturado."
]
}
}
]
},
{
"id": "storage",
"title": "Onde são guardados os dados",
"blocks": [
{
"table": {
"headers": [
"Dados",
"Localização"
],
"rows": [
[
"Política",
"<code>/usr/local/share/proxmenux/audit_policy.json</code>"
],
[
"Avaliações",
"A base de dados de auditoria do Monitor"
],
[
"Objetos capturados",
"<code>/usr/local/share/proxmenux/changes/objects/</code>"
],
[
"Entradas pendentes",
"<code>/usr/local/share/proxmenux/changes/spool/</code>"
],
[
"Registo consolidado",
"<code>/usr/local/share/proxmenux/changes.db</code>"
]
]
}
},
{
"calloutInfo": {
"title": "Uma ferramenta para rever, não uma certificação",
"body": "Auditoria e relatórios revê, compara e documenta o nó. Os resultados são interpretados de acordo com a finalidade do sistema, a política declarada e as fontes disponíveis."
}
}
]
}
]
}
@@ -0,0 +1,174 @@
{
"meta": {
"title": "Painel Apps: um lançador para todas as ligações web | ProxMenux",
"description": "Use o painel de aplicativos para abrir links web registrados LXC e links personalizados, organizá-los por categoria e voltar para o hóspede que possui cada serviço."
},
"header": {
"title": "Painel: Página de aplicações",
"description": "Um único lançador para as interfaces web que você usa em todo o nó, seja de um aplicativo LXC registrado ou um Web Link personalizado.",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Um lançador, não um instalador de aplicações",
"body": "O separador <strong>Apps</strong> não instala software nem descobre serviços. Reúne as ligações guardadas numa grelha pesquisável. As ligações LXC configuram-se no <appTabLink>separador App</appTabLink> do sistema convidado; as personalizadas incluem serviços VM, proxies inversos e painéis externos."
},
"sources": {
"heading": "O que aparece em Apps",
"intro": "Cada URL lançável torna-se seu próprio cartão. A fonte determina onde esse cartão é editado, mas não como ele parece durante o uso normal.",
"colSource": "Origem",
"colAppears": "O que aparece",
"colManagedFrom": "Onde é gerido",
"rows": [
{
"source": "Aplicação LXC registada",
"appears": "Um cartão para cada Web Link salvo no registro da aplicação.",
"managedFrom": "VMs e LXCs → Janela do LXC → Aplicação"
},
{
"source": "Ligação personalizada ligada a um hóspede",
"appears": "Um URL de serviço associado a um VM ou LXC.",
"managedFrom": "Apps → Editar"
},
{
"source": "Ligação personalizada sem associação",
"appears": "Qualquer destino HTTP(S), incluindo serviços externos ou publicados através de proxy inverso.",
"managedFrom": "Apps → Editar"
}
],
"relationshipTitle": "Apps e a aba de aplicativos LXC têm trabalhos diferentes",
"relationshipBody": "O <appTabLink>separador App</appTabLink> do LXC gere identidade, ligações web e acompanhamento opcional da versão. <strong>Apps</strong> utiliza estas ligações para as abrir rapidamente. Editar um cartão LXC regressa ao registo do sistema convidado sem duplicar a configuração."
},
"cards": {
"heading": "Como usar um cartão",
"intro": "Toda a placa é o alvo de lançamento, enquanto seus controles menores fornecem contexto sem abrir o serviço.",
"items": [
"Clique no cartão para abrir sua URL em uma nova guia do navegador.",
"O logotipo utiliza o logotipo Web Link primeiro e volta ao logotipo da aplicação quando apropriado.",
"O chip de categoria usa a mesma cor e etiqueta que o link Web correspondente na aba do aplicativo LXC.",
"A etiqueta do sistema convidado identifica a VM ou LXC associado. Um clique abre a sua janela: as ligações LXC abrem <strong>App</strong>, as VM abrem <strong>Estado</strong>.",
"Uma seta para cima roxa significa que a aplicação específica ou imagem Docker tem uma atualização disponível. Não é uma conta de atualização geral para todo o hóspede."
]
},
"toolbar": {
"heading": "Procurar, filtrar e ordenar",
"intro": "A barra de ferramentas estreita uma grande coleção de aplicativos sem alterar os registros salvos.",
"items": [
"A pesquisa corresponde ao nome da aplicação, nome do convidado, VMID e categoria.",
"O filtro de categoria mostra uma categoria de cada vez ou todas as aplicações.",
"Ordene por <strong>Nome</strong>, <strong>ID</strong> ou <strong>Categoria</strong>. Ordenar por categoria acrescenta títulos entre grupos de cartões.",
"A ordem é guardada neste navegador. O texto de pesquisa e o filtro de categoria são repostos ao regressar à página.",
"A aba Apps permanece disponível quando a grade está vazia, então o primeiro link personalizado pode ser adicionado sem registrar primeiro um aplicativo LXC."
]
},
"customLinks": {
"heading": "Adicionar e editar links Web personalizados",
"intro": "Use um link personalizado quando o serviço não for representado por um aplicativo LXC registrado.",
"steps": [
"Pressione <strong>Adicionar link</strong> da barra de ferramentas ou do estado vazio.",
"Digite um nome e uma URL <code>http://</code> ou <code>https://</code>.",
"Opcionalmente, adicione um logotipo, escolha ou crie uma categoria e ligue o link a um VM ou LXC.",
"Guarde a ligação. O cartão aparece imediatamente na grelha.",
"Para alterar ou remover uma ligação personalizada, escolha <strong>Editar</strong> e utilize o lápis no cartão."
],
"colField": "Campo",
"colRequired": "Requerido",
"colPurpose": "Objecto",
"fields": [
{
"field": "Nome",
"required": "Sim",
"purpose": "O título do cartão e termo de pesquisa."
},
{
"field": "URL",
"required": "Sim",
"purpose": "O destino HTTP(S) completo aberto pelo cartão."
},
{
"field": "URL do logotipo",
"required": "Não",
"purpose": "Uma imagem remota mostrada na carta."
},
{
"field": "Categoria",
"required": "Não",
"purpose": "Adiciona um crachá compartilhado e permite a filtragem de categoria."
},
{
"field": "Associação ao sistema convidado",
"required": "Não",
"purpose": "Associa o link com um VM ou LXC e permite o atalho de hóspedes."
}
],
"editTitle": "Editar a fonte da verdade",
"editBody": "O modo de edição mostra lápis apenas nas ligações personalizadas. Para um cartão LXC, abra o <appTabLink>separador App</appTabLink> do sistema convidado e altere a ligação guardada."
},
"categories": {
"heading": "Categorias e sinais de atualização",
"intro": "As categorias organizam ligações; os indicadores de atualização descrevem o estado do software. São funções separadas.",
"items": [
"O registro LXC assistido por catálogo pode preencher uma categoria, mas permanece editável.",
"Nomes de categorias personalizados podem ser criados a partir do mesmo seletor e então reutilizados pelo filtro.",
"As cores da categoria são determinísticas e adaptam-se ao tema claro ou escuro. Faixas roxas e vermelhas são reservadas para atualização e estados de perigo.",
"Para Docker, o ProxMenux associa o cartão ao contentor ou imagem e mostra as atualizações dessa imagem. As de Docker Engine continuam no <updatesLink>separador Atualizações</updatesLink> do LXC."
]
},
"persistence": {
"heading": "Comportamento de persistência e cache",
"intro": "O painel utiliza os dados já disponíveis no Monitor sem voltar a analisar todos os sistemas convidados.",
"items": [
"As ligações personalizadas são guardadas atomicamente em <code>/etc/proxmenux/custom_links.json</code> e carregadas em memória no arranque do Monitor.",
"Links de LXC registrados continuam a fazer parte do registro de Monitor salvo de sua aplicação; o painel Apps não os duplica no arquivo de link personalizado.",
"Criar, editar ou excluir um link personalizado atualiza a lista de memórias imediatamente.",
"A preferência de ordenação é local ao navegador e não se sincroniza entre dispositivos ou utilizadores.",
"A posição de topo do Apps é controlada separadamente por <settingsLink>Configurações → Ordem de navegação</settingsLink>."
]
},
"troubleshooting": {
"heading": "Situações comuns",
"colProblem": "Situação",
"colResolution": "Resolução",
"rows": [
{
"problem": "Um aplicativo LXC está registrado, mas nenhum cartão aparece",
"resolution": "Abra sua guia App e adicione pelo menos um link Web. O rastreamento de versões sozinho não cria uma placa de lançamento."
},
{
"problem": "O URL ou logotipo está errado",
"resolution": "Edite o link personalizado em Apps ou edite o Web Link na guia LXC App."
},
{
"problem": "Falta um serviço Docker",
"resolution": "Edite o aplicativo Docker registrado e salve a porta web publicada do serviço como um Web Link."
},
{
"problem": "A seta roxa refere-se à atualização errada Docker",
"resolution": "Reveja o nome e a descrição da ligação web para os associar ao contentor ou imagem pretendida."
},
{
"problem": "Apps abrem primeiro em vez de Visão Geral do Sistema",
"resolution": "O primeiro item salvo em Configurações → Ordem de navegação torna-se a guia de pouso. Restaurar a ordem padrão ou mover Visão geral primeiro."
}
]
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Página da aplicação LXC",
"href": "/docs/monitor/dashboard/vms-lxcs/app",
"tail": " — aplicações de registo, ligações Web e acompanhamento opcional de versões."
},
{
"label": "Página de Atualizações do LXC",
"href": "/docs/monitor/dashboard/vms-lxcs/updates",
"tail": " — configurar e executar atualizações de aplicações, Docker Engine e imagens."
},
{
"label": "Página de Configuração",
"href": "/docs/monitor/dashboard/settings#navigation-order",
"tail": " — alterar a ordem de navegação e a guia de aterragem."
}
]
}
}
@@ -0,0 +1,248 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: Hardware | Documentação ProxMenux",
"description": "O separador Hardware inventaria a máquina física: CPU e placa-mãe, módulos de memória, sensores térmicos, GPU com monitorização por slot e instalador de controladores num clique, aceleradores Coral TPU, resumo do armazenamento com velocidades de ligação, listas PCI e USB, consumo, fontes de alimentação, ventoinhas e UPS."
},
"header": {
"title": "Painel: Página de hardware",
"description": "A máquina física em uma tela – CPU e identidade da placa-mãe, todos os módulos de memória, sensores térmicos em todos os subsistemas, GPUs com uso ao vivo e um instalador de driver embutido, Coral TPUs, cada dispositivo PCI e USB com seu driver de kernel, o inventário de disco completo com velocidades de ligação negociadas, além de energia, refrigeração e UPS.",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Construído a partir de ferramentas padrão",
"body": "A maior parte desta página é analisada de <code>lscpu</code>, <code>dmidecode</code>, <code>lspci</code>, <code>lsusb</code>, <code>lsblk</code>, <code>smartctl</code>, <code>nvme</code>, <code>sensors</code>, <code>nvidia-smi</code>, <code>intel_gpu_top</code>, <code>amdgpu_top</code>, <code>ipmitool</code> e <code>upsc</code>. Seções só renderizam quando a ferramenta relevante retorna dados, então um host sem uma UPS não mostrará o cartão UPS e um host sem IPMI não mostrará figuras de energia fora de banda."
},
"thresholds": {
"title": "Cor do estado e limiares aplicados aqui",
"intro": "Cada indicador e leitura de temperatura usa a mesma escala: <green/> <strong>verde</strong> abaixo de Aviso, <amber/> <strong>âmbar</strong> entre Aviso e Crítico, <red/> <strong>vermelho</strong> a partir de Crítico. Valores recomendados incluídos no ProxMenux:",
"items": [
"<strong>Temperatura CPU</strong> — aviso 80 °C, crítico 90 °C.",
"<strong>Temperatura do disco</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (alertar / crítico)."
],
"outro": "Os valores são configuráveis por host. <link>Definições → Limiares do monitor de saúde</link> centraliza os ajustes e explica como os adaptar."
},
"sections": {
"heading": "Seções",
"intro": "As secções aparecem nesta ordem de cima para baixo. Algumas exigem o hardware ou ferramenta correspondente e estão marcadas como <em>(condicional)</em>.",
"systemInfoTitle": "Informações do sistema",
"systemInfoIntro": "Dois blocos lado a lado, sempre presentes:",
"systemInfoItems": [
"<strong>CPU</strong> — modelo, microarquitetura, sockets/núcleos/threads, frequências base e boost, capacidades de virtualização (VT-x / AMD-V) e topologia da cache.",
"<strong>Placa-mãe</strong> — fabricante, modelo, versão e data BIOS, UUID SMBIOS. Ajuda a localizar a página correta do fabricante para atualizar o firmware."
],
"memoryTitle": "Módulos de memória",
"memoryBody": "Uma linha por slot ocupado de <code>dmidecode</code>: etiqueta, capacidade do módulo, tipo (DDR4 / DDR5 / variantes ECC), velocidade configurada e nominal, fabricante, referência e número de série. Os slots vazios aparecem atenuados para mostrar a margem de expansão.",
"thermalTitle": "Monitoramento Térmico",
"thermalIntro": "Sete blocos com dados de <code>lm-sensors</code>, <code>sysfs</code> e coletores específicos de cada ferramenta. Os sensores hwmon de armazenamento são associados ao dispositivo de blocos físico, com modelo e caminho <code>/dev/...</code>. Cada bloco fica oculto se não houver sensores na categoria.",
"thermalItems": [
"<strong>CPU</strong> — temperatura do encapsulamento e de cada núcleo.",
"<strong>GPU</strong> — sensores de GPU dedicada via <code>nvidia-smi</code> / <code>amdgpu_top</code> e iGPU Intel. Inclui ponto quente e temperatura de junção da memória quando o controlador os fornece.",
"<strong>NVME</strong> — temperatura composta do controlador associada ao namespace NVMe exato.",
"<strong>HDD</strong> — leituras <code>drivetemp</code> para dispositivos de blocos rotativos.",
"<strong>SSD</strong> — leituras <code>drivetemp</code> para dispositivos de bloco SATA/SAS não rotacionais.",
"<strong>PCI</strong> — sensores em dispositivos ligados a PCI, como HBA e placas de rede com sensores internos.",
"<strong>OTHER</strong> — chipset, VRM, sensores ambientais que não se encaixam em outro lugar."
]
},
"graphics": {
"heading": "Placas Gráficas",
"intro": "Cada controlador de vídeo aparece num cartão com fabricante, modelo, tipo (<em>Integrado</em> / <em>PCI</em> / BMC), endereço PCI (BDF), controlador do kernel e módulos. <strong>Mudar modo</strong> alterna entre partilha LXC com controlador nativo e passthrough VM (<code>vfio-pci</code>). <link>Mudar modo GPU (VM ↔ LXC)</link> explica os efeitos no host.",
"vfioImageAlt": "Seção de placas gráficas mostrando um GPU integrado de Matrox G200EH ligado a mgag200 (pronto para LXC) e um NVIDIA Quadro P400 ligado a vfio-pci (pronto para passagem de VM)",
"vfioImageCaption": "Duas GPUs detectadas: o chip Matrox BMC está no driver nativo e pronto para LXC; o NVIDIA Quadro P400 está ligado ao <code>vfio-pci</code>, pronto para passagem VM.",
"lxcImageAlt": "Placas gráficas: iGPU Intel UHD Graphics com i915 e NVIDIA Quadro P1000 com nvidia, ambas prontas para contentores LXC",
"lxcImageCaption": "O mesmo nó após devolver a placa NVIDIA ao controlador nativo: ambas as GPU prontas para contentores LXC.",
"realtimeTitle": "Janela de monitorização em tempo real",
"realtimeBody": "Clicar numa GPU abre a monitorização por slot, que consulta a ferramenta do fabricante a cada três segundos. Mostra fabricante, tipo, slot PCI, controlador, módulos do kernel, utilização dos motores (Render/3D, Video, Blitter, VideoEnhance), frequências gráfica e de memória, temperatura, consumo se disponível, VRAM e processos ativos com carga por processo. Dados de <code>/api/gpu/&lt;slot&gt;/realtime</code>.",
"toolsIntro": "A ferramenta do fornecedor usada por GPU:",
"headerVendor": "Fornecedor",
"headerTool": "Ferramenta",
"headerProject": "Projeto",
"tools": [
{
"vendor": "NVIDIA",
"tool": "nvidia-smi",
"projectLabel": "developer.nvidia.com",
"projectHref": "https://developer.nvidia.com/nvidia-system-management-interface"
},
{
"vendor": "Intel iGPU",
"tool": "intel_gpu_top (igt-gpu-tools)",
"projectLabel": "gitlab.freedesktop.org",
"projectHref": "https://gitlab.freedesktop.org/drm/igt-gpu-tools"
},
{
"vendor": "AMD",
"tool": "amdgpu_top",
"projectLabel": "github.com/Umio-Yasuno/amdgpu_top",
"projectHref": "https://github.com/Umio-Yasuno/amdgpu_top"
},
{
"vendor": "Matrox / ASPEED (BMC)",
"tool": "— (apenas visualização)",
"projectLabel": "Detetado e identificado como BMC; sem monitorização em tempo real."
}
],
"nvidiaImageAlt": "Monitorização NVIDIA Quadro P1000: fabricante NVIDIA, controlador nvidia carregado, frequência gráfica 1.26 GHz, memória 2.50 GHz, temperatura 50 °C, motores a 0 %, sem processos ativos, memória total 4096 MiB",
"nvidiaImageCaption": "NVIDIA Quadro P1000 com controlador proprietário: frequências, temperatura, barras de utilização dos motores e processos ativos.",
"intelImageAlt": "Monitorização de iGPU Intel UHD Graphics com i915: consumo 11.31 W, carga de vídeo 1 % e processo ffmpeg com 8 MB",
"intelImageCaption": "Intel iGPU com <code>i915</code> ativo. A tabela Processos Ativos pega um trabalho ffmpeg usando o motor de vídeo.",
"amdImageAlt": "Monitorização de GPU integrada AMD Lucienne com amdgpu: motores a 0 % e amdgpu_top como processo ativo",
"amdImageCaption": "iGPU AMD monitorizada com <code>amdgpu_top</code>. A ferramenta surge como processo ativo porque recolhe os dados em direto.",
"installTitle": "Instalar o controlador NVIDIA a partir da janela",
"installBody": "Com <code>nouveau</code>/<code>nvidiafb</code> sem controlador proprietário NVIDIA, não se podem ler frequências, consumo e carga por processo. A janela oferece <strong>Instalar controladores NVIDIA</strong>, que executa o script de <link>Instalar controladores NVIDIA (host)</link>.",
"noDriverAlt": "Monitorização NVIDIA Quadro P620 com nvidiafb e nouveau carregados, aviso Monitorização alargada indisponível e botão azul Instalar controladores NVIDIA",
"noDriverCaption": "Controlador proprietário ainda não instalado: a janela oferece instalação num clique.",
"promptAlt": "Diálogo de confirmação de instalação do driver NVIDIA GPU listando GPUs detectadas, containers LXC com passagem NVIDIA e um par Sim/Cancelar",
"promptCaption": "Resumo pré-instalação: GPUs detectadas, containers LXC que já têm passagem NVIDIA, e o que o script fará. Nada é tocado até confirmares.",
"successAlt": "Saída terminal mostrando o driver NVIDIA 580.105.08 instalado com sucesso e nvidia-smi relatando um Quadro P620",
"successCaption": "Instalação bem-sucedida — o NVIDIA <code>.run</code> construído via DKMS, o serviço de persistência está em vigor, e o <code>nvidia-smi</code> relata o GPU.",
"warningTitle": "Escolha uma versão do driver que o seu GPU realmente suporta",
"warningBody": "Os ramos NVIDIA mais recentes deixam de suportar famílias antigas, como Maxwell ou Kepler. Se <code>nvidia-smi</code> mostrar <em>\"No devices were found\"</em> após instalar ou o DKMS falhar, o ramo pode ser incompatível. Repita com um ramo anterior, como legacy 470.x para Kepler. Consulte a compatibilidade na <a>página oficial de pesquisa de controladores</a>.",
"whereGoIntro": "Para onde ir a partir daqui:",
"whereGoItems": [
"<link1>Instalar controladores NVIDIA (host)</link1> — guia completo, matriz de compatibilidade do kernel, patch NVENC opcional e propagação aos LXC.",
"<link2>Mudar modo GPU (VM ↔ LXC)</link2> — efeitos do controlo <em>Mudar modo</em> do cartão.",
"<link3>Adicionar GPU a VM (passthrough)</link3> e <link4>Adicionar GPU a LXC</link4> — primeira atribuição de uma GPU não associada."
]
},
"coral": {
"heading": "Aceleradores Coral TPU / AI",
"subHeading": "(condicional)",
"intro": "Aparece com dispositivos Google Coral ou outros aceleradores IA ligados. Cada janela mostra ligação (M.2 / mini-PCIe / USB), largura PCIe, ID fabricante/produto, suporte de software (<code>apex</code> no kernel para PCIe, <code>libedgetpu</code> em espaço de utilizador para USB), módulos (<code>gasket</code> + <code>apex</code>), nós (<code>/dev/apex_*</code>), estado do runtime Edge TPU, temperatura em direto e limiares de aviso do firmware.",
"imageAlt": "Detalhes Coral Edge TPU: ligação PCIe/M.2, 5.0 GT/s x1, ID 1ac1:089a, controlador apex, módulos gasket e apex carregados, /dev/apex_0 presente, Edge TPU Runtime não instalado, 53.5 °C e limiares de aviso de hardware",
"imageCaption": "Coral M.2 com módulos do kernel carregados, nó de dispositivo presente e avisos de temperatura do firmware disponíveis. O indicador do runtime fica verde após instalar o Edge TPU Runtime correspondente.",
"pathsIntro": "Existem dois caminhos de instalação dependendo do fator de forma:",
"pathsItems": [
"<strong>M.2 / Mini-PCIe</strong> — o host precisa dos módulos do kernel <code>gasket</code> + <code>apex</code> construídos via DKMS para que o nó do dispositivo <code>/dev/apex_0</code> apareça no arranque.",
"<strong>USB Accelerator</strong> — o host só precisa do tempo de execução do espaço de usuário Edge TPU (<code>libedgetpu1-std</code>) do repositório APT do Google."
],
"outro": "<installLink>Instalar Coral TPU no host</installLink> deteta e gere as duas variantes. Informações e runtime oficial em <a>coral.ai/docs</a>. Depois, atribua o dispositivo a um contentor com <lxcLink>Adicionar Coral TPU a LXC</lxcLink>."
},
"storage": {
"heading": "Resumo de armazenamento",
"intro": "Todos os dispositivos de blocos conhecidos pelo kernel, agrupados por tipo. Cada disco mostra nome (<code>sda</code>, <code>nvme0n1</code>, <code>zram0</code>…), tipo (<em>SSD</em>, <em>HDD</em>, <em>NVMe SSD</em>), modelo e ligação negociada. Clique para abrir modelo, número de série, capacidade, interface e velocidade atual e máxima.",
"imageAlt": "Resumo do armazenamento com onze dispositivos de blocos (SSD SATA, HDD SATA, SSD NVMe e zram), modelos e velocidades negociadas; os dois NVMe mostram 3.0 x4 com velocidade atual destacada",
"imageCaption": "Onze dispositivos neste nó. As ligações SATA aparecem como <em>SATA &lt;version&gt;, &lt;Gb/s&gt; (current: ...)</em>; os NVMe como <em>&lt;PCIe gen&gt; x&lt;width&gt;</em>.",
"nvmeBody": "A linha de cada NVMe compara a ligação negociada com o máximo suportado. Se diferirem, como um SSD Gen3 x4 a <strong>3.0 x1</strong> num slot com uma só via, o valor atual aparece em âmbar. Ajuda a diagnosticar discos lentos ou alterações nas vias após atualizar o BIOS.",
"nvmeModalAlt": "Detalhes NVMe de nvme0n1: NVMe SSD, 953.9 GB, ligação atual 3.0 x1 em âmbar, máximo 3.0 x4, WDC CL SN720, número de série e interface PCIe/NVMe",
"nvmeModalCaption": "Detalhes NVMe com ligação reduzida: o disco suporta x4, mas o slot está ligado a x1.",
"outro": "Dados SMART, autotestes, histórico e relatório PDF estão em <storageLink>Painel: Armazenamento</storageLink>. Os mesmos dados alimentam <smartLink>Estado e testes SMART dos discos</smartLink>. Um teste longo pelo script escreve o JSON mostrado pelo Monitor em <em>Armazenamento → Histórico</em>."
},
"pci": {
"heading": "Dispositivos PCI",
"intro": "Dispositivos PCI identificados por <strong>BDF PCI</strong> (Bus:Device.Function, por exemplo <code>03:00.0</code>) e classe (<em>Controlador de armazenamento</em>, <em>Controlador USB</em>, <em>Placa gráfica</em>, <em>Controlador de rede</em>, <em>Controlador de áudio</em>…). Cada cartão mostra fabricante, nome e <strong>controlador do kernel associado</strong>, úteis para diagnosticar passthrough, grupos IOMMU ou controladores incorretos.",
"imageAlt": "Quinze dispositivos PCI por classe: controladores de armazenamento ahci/nvme, USB, placas gráficas (uma com vfio-pci, outra com controlador nativo), rede igb/tg3 e áudio associado a uma GPU em passthrough",
"imageCaption": "Quinze dispositivos neste nó. Note que o GPU e sua função de áudio acompanhante estão ligados ao <code>vfio-pci</code> — é um cartão preparado para a passagem do VM.",
"bdfTitle": "Lendo o BDF",
"bdfBody": "<code>03:00.0</code> indica barramento PCI <code>03</code>, dispositivo <code>00</code>, função <code>0</code>. As GPU dedicadas usam geralmente <code>.0</code> para gráficos e <code>.1</code> para áudio HDMI. Ambas as funções passam juntas para a VM; por isso <link>Mudar modo GPU</link> limpa as associações de áudio órfãs ao sair do modo VM."
},
"usb": {
"heading": "Dispositivos USB",
"intro": "Dispositivos USB com fabricante e produto, versão USB, endereço <code>bus:device</code>, ID <code>vendor:product</code> e controlador do kernel. Classificam-se por função: <em>Comunicações</em> (adaptadores Z-Wave / Zigbee), <em>UPS</em>, armazenamento ou HID. Assim identificam-se sem comparar os ID.",
"imageAlt": "Dispositivos USB: Aeotec Z-Wave Z-Stick, coordenador Zigbee ConBee II e UPS Ellipse ECO, com versão USB, endereço, ID vendor:product e controlador associado",
"imageCaption": "Três dispositivos USB – dois rádios de automação doméstica em <code>usbfs</code> e um UPS em <code>usbfs</code> (NUT fala com ele através da libusb)."
},
"power": {
"heading": "Consumo de energia",
"subHeading": "(condicional)",
"intro": "Aparece se o host fornecer telemetria de potência. Mostra duas origens independentes quando disponíveis:",
"items": [
"<strong>Consumo total ACPI / IPMI</strong> — potência de todo o sistema medida por um sensor da placa-mãe ou pelo BMC. Habitual em placas de servidor.",
"<strong>Consumo do encapsulamento CPU</strong> — contadores Intel RAPL ou equivalente AMD. Distingue o consumo CPU do restante sistema em placas de consumo sem sensor total."
],
"supplyImageAlt": "Consumo: 198 W totais via ACPI e duas fontes de alimentação com estado OK e saída de 185 W e 5 W",
"supplyImageCaption": "Placa de servidor com um único sensor de potência ACPI e PSUs duplos reportados através do IPMI — o segundo PSU é o redundante, inativo em 5 W.",
"cpuImageAlt": "Consumo numa placa de uso doméstico: apenas 8.7 W de CPU via Intel RAPL",
"cpuImageCaption": "Placa de uso doméstico sem sensor total: mostra apenas o consumo CPU via RAPL."
},
"psu": {
"heading": "Fontes de alimentação",
"subHeading": "(condicional)",
"body": "Em máquinas de servidor com fontes duplas, IPMI mostra presença (PSU 1 / PSU 2 / …), tensão de entrada, potência de saída e estado OK/falha. Verifique após uma interrupção elétrica em nós com fontes redundantes."
},
"fans": {
"heading": "Ventiladores do sistema",
"subHeading": "(condicional)",
"body": "RPM de cada ventoinha com minigráfico, se suportado. Sem dados individuais apresenta uma única leitura da ventoinha do chassis."
},
"ups": {
"heading": "Status do no-break",
"subHeading": "(condicional)",
"body": "Aparece com um servidor NUT (Network UPS Tools) configurado e acessível. Mostra estado (rede / bateria / carregamento / bateria fraca), carga da bateria, autonomia estimada, percentagem de carga suportada, tensão de entrada, modelo e firmware. Alimenta também <em>Segurança e certificados</em> do monitor de saúde: a passagem a bateria é assinalada imediatamente."
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerSection": "Secção da página",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"section": "Inventário estático (PCI, CPU, BIOS)",
"endpoint": "/api/hardware",
"source": "<code>lspci -vmm</code>, <code>/proc/cpuinfo</code>, <code>dmidecode</code>; em cache para a vida útil do processo."
},
{
"section": "Valores dos sensores em direto",
"endpoint": "/api/hardware/live",
"source": "<code>sensors</code> (lm-sensors), <code>/sys/class/hwmon</code> e <code>/sys/block</code> identificam os dispositivos de armazenamento. As temperaturas permanecem em direto; só o mapeamento hwmon-dispositivo fica em cache por 60 segundos."
},
{
"section": "CPU histórico de temperatura",
"endpoint": "/api/temperature/history",
"source": "Série temporal registada a cada 60 segundos pelo coletor de temperatura e guardada em SQLite."
},
{
"section": "Métricas GPU em direto",
"endpoint": "/api/gpu/<slot>/realtime",
"source": "NVIDIA: <code>nvidia-smi --query-gpu=...</code>. Intel: <code>intel_gpu_top</code>. AMD: sysfs <code>/sys/class/drm/cardN</code>."
}
],
"codeComment1": "# Comparar o inventário com a vista do sistema operativo",
"codeComment2": "# Confirme o cartão GPU que o painel vê"
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Instalar Drivers NVIDIA (Host)",
"href": "/docs/hardware/nvidia-host",
"tail": " — o que executa o botão de instalação do GPU."
},
{
"label": "Mudar modo GPU (VM ↔ LXC)",
"href": "/docs/hardware/switch-gpu-mode",
"tail": " — efeitos no host da mudança de modo em cada cartão GPU."
},
{
"label": "Instale Coral TPU no Host",
"href": "/docs/hardware/install-coral-tpu-host",
"tail": " — instalação do módulo do kernel e do runtime Coral."
},
{
"label": "Integridade e teste do disco SMART",
"href": "/docs/disk-manager/smart-disk-test",
"tail": " — script que produz os dados SMART nos detalhes do disco em Armazenamento."
},
{
"label": "Painel: Página de armazenamento",
"href": "/docs/monitor/dashboard/storage",
"tail": " — tabela completa de atributos SMART, historial de auto-teste e relatório PDF."
},
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tail": " — categoria CPU e Temperatura, que utiliza os mesmos sensores."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — endpoints de hardware e GPU."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tail": " — os outros separadores."
}
]
}
}
@@ -0,0 +1,101 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel | Documentação do ProxMenux",
"description": "O painel é a interface principal do ProxMenux Monitor: dez separadores, incluindo o lançador Apps, um cabeçalho global e uma ordem de navegação configurável."
},
"header": {
"title": "Painel",
"description": "A vista diária do ProxMenux Monitor: dez separadores, incluindo o lançador Apps, um cabeçalho global e uma ordem de navegação configurável.",
"section": "ProxMenux Monitor"
},
"oneHeader": {
"title": "Um cabeçalho, dez separadores",
"body": "O cabeçalho (logótipo, nome do nó, indicador de estado, tempo de atividade, atualização e tema) permanece visível. O separador ativo muda toda a área de conteúdo. A cor do indicador reflete a categoria mais grave do <link>monitor de estado</link>: o mesmo dado é mostrado no painel."
},
"tabs": {
"heading": "Os dez separadores",
"intro": "Cada guia tem sua própria página dedicada. As páginas são adicionadas incrementalmente à medida que a documentação é preenchida; abaixo está a lista completa e pelo que cada uma é responsável.",
"headerTab": "Separador",
"headerOwns": "O que abrange",
"rows": [
{
"name": "Visão geral do sistema",
"linksTo": "/docs/monitor/dashboard/system-overview",
"owns": "CPU / widgets de memória / temperatura, contagem ativa de VM e LXC, gráficos de métricas históricas, resumos de armazenamento e rede. Guia de aterrissagem padrão até que a ordem de navegação seja personalizada."
},
{
"name": "Aplicativos",
"linksTo": "/docs/monitor/dashboard/apps",
"owns": "Lançador unificado de ligações web LXC registadas e ligações personalizadas, com categorias, pesquisa, atalhos dos sistemas convidados e indicadores de atualização por aplicação."
},
{
"name": "Armazenamento",
"owns": "pools Proxmox, discos físicos, dados SMART, estado ZFS, desgaste & vida útil, histórico de observação."
},
{
"name": "Rede",
"owns": "Interfaces físicas, bonds, bridges e OVS, endereços IP/MAC, gráficos RX/TX e histórico RRD por interface."
},
{
"name": "VMs e LXCs",
"owns": "Inventário de sistemas convidados, detalhes de configuração, métricas e registos, ações de iniciar, parar, reiniciar e desligar."
},
{
"name": "Hardware",
"owns": "CPU modelo e topologia, layout de memória, topologia PCIe, GPUs com monitoramento em tempo real por slot."
},
{
"name": "Registros do sistema",
"owns": "Live <code>journalctl</code> com filtros, histórico de tarefas Proxmox, registro de notificação, pacotes de logs para download."
},
{
"name": "Terminal",
"owns": "Shell do anfitrião ou de qualquer VM/CT no navegador, com <code>xterm.js</code> sobre WebSockets."
},
{
"name": "Segurança",
"owns": "Configuração da autenticação, palavra-passe, 2FA e tokens API, registo de auditoria, painel Fail2Ban opcional e implementação do Secure Gateway."
},
{
"name": "Configurações",
"owns": "Idioma do Monitor, ordem de navegação, canais de notificação, fornecedor IA, limiares de estado, exclusões e inventário de otimizações pós-instalação."
}
]
},
"headerAnatomy": {
"heading": "Anatomia do cabeçalho",
"items": [
"<strong>Logo + nome do produto</strong> à esquerda. O logotipo se transforma em uma variante \"atualização disponível\" quando uma versão mais recente do Monitor é detectada.",
"<strong>Identidade do nó</strong>: nome obtido por <code>pvesh get /nodes</code>, com <code>hostname</code> como alternativa.",
"<strong>Indicador de estado</strong>: Saudável (verde), Aviso (amarelo), Crítico (vermelho). Um clique abre o monitor de estado. Uma etiqueta azul <em>info</em> aparece se existem elementos ignorados ainda dentro do período de supressão.",
"<strong>Tempo de atividade</strong>: tempo de funcionamento do anfitrião num formato legível.",
"<strong>Botão Atualizar</strong>: repete as chamadas API de dados em direto sem recarregar toda a página.",
"<strong>Seletor de tema</strong>: claro, escuro ou sistema. Guardado em <code>localStorage</code>."
]
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Página de aplicativos",
"href": "/docs/monitor/dashboard/apps",
"tail": " — lançador unificado de ligações web e relação com aplicações LXC registadas."
},
{
"label": "Página Visão Geral do Sistema",
"href": "/docs/monitor/dashboard/system-overview",
"tail": " — a guia de aterragem, totalmente documentada."
},
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tail": " — janela do indicador de estado com detalhes das dez categorias."
},
{
"label": "Arquitetura",
"href": "/docs/monitor/architecture",
"tail": " — como o painel fala com a infra-estrutura Flask."
}
]
}
}
@@ -0,0 +1,251 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: separador Rede | Documentação ProxMenux",
"description": "O separador Rede lista as interfaces do anfitrião: placas físicas, bridges, bonds, VLAN e interfaces virtuais VM/LXC. O detalhe mostra IP, MAC, estado, membros do bond, tráfego desde o arranque e histórico RRD."
},
"header": {
"title": "Painel: separador Rede",
"description": "As interfaces detetadas pelo kernel — placas físicas, bridges, bonds, VLAN e portas virtuais VM/LXC — estão agrupadas em três cartões. Clique numa linha para ver os endereços, contadores de tráfego e dados históricos RRD.",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Dados atuais e históricos",
"body": "O estado atual vem de <code>psutil.net_if_stats()</code> e <code>ip</code>, e o histórico de largura de banda do armazenamento RRD Proxmox através de <code>/api/network/&lt;interface&gt;/metrics</code>. Os contadores atualizam-se aproximadamente a cada 5 segundos e os dados RRD do gráfico são carregados a pedido."
},
"topRow": {
"heading": "Linha superior: quatro cartões estatísticos",
"headerCard": "Cartão",
"headerWhat": "O que mostra",
"rows": [
{
"card": "Tráfego de rede",
"what": "Taxa RX/TX agregada de todas as interfaces, expressa na unidade adequada (bps / Kbps / Mbps / Gbps)."
},
{
"card": "Interfaces ativas",
"what": "Dois contadores: <em>Physical X / Y</em> e <em>Bridges X / Y</em>, ativas face ao total. Um primeiro ponto a verificar quando algo deixa de funcionar."
},
{
"card": "Status da rede",
"what": "Estado rápido: Saudável / Aviso / Crítico conforme a ligação, a acessibilidade do gateway e a integridade da bridge. Reflete a categoria <em>Interfaces de rede</em> do Health Monitor."
},
{
"card": "Latência de rede",
"what": "Tempo de ida e volta ao gateway com um pequeno gráfico. Um clique abre o <strong>diálogo Latência de rede</strong> descrito abaixo: histórico e teste ping a pedido ao gateway, Cloudflare ou Google, com relatório PDF para transferência."
}
]
},
"flow": {
"heading": "Diagrama de fluxo de rede",
"intro": "Entre a linha superior e os três cartões, <strong>Network Flow</strong> mostra a topologia em direto. Os percursos dos pacotes ligam placas físicas, bridges ao centro e depois VM e contentores. Os impulsos animados representam o tráfego rx/tx atual em cada ligação.",
"imageAlt": "Diagrama de fluxo de rede – NICs à esquerda, host e pontes no meio, VMs e LXCs à direita, com impulsos animados em cada conexão",
"imageCaption": "Fluxo de rede — nós codificados a cores e cometas animados cuja direcção e espessura reflectem o tráfego ao vivo.",
"elementsTitle": "O que o diagrama mostra",
"elementsIntro": "Cada nó representa uma entrada do mesmo inventário dos cartões abaixo. A disposição em topologia permite ver as relações de imediato:",
"elements": [
"<strong>Placas de rede</strong> (âmbar) — interfaces físicas com ligação ativa; as inativas aparecem esbatidas.",
"<strong>Anfitrião</strong> (âmbar) — o anfitrião Proxmox entre placas de rede e bridges. Um ponto fixo que não é clicável.",
"<strong>Bridges</strong> (ciano) — bridges Linux e OVS com pelo menos uma máquina convidada ativa. As não utilizadas são ocultadas para destacar o tráfego real.",
"<strong>LXC</strong> (ciano) — contentores em execução ligados a uma bridge.",
"<strong>VM</strong> (roxo) — máquinas virtuais em execução ligadas a uma bridge.",
"As VM e os contentores parados são ocultados."
],
"pulsesTitle": "O que a animação codifica",
"pulsesBody": "Os cometas animados que viajam ao longo de cada borda representam tráfego ao vivo:",
"pulses": [
"<strong>Direção</strong> — para a placa de rede significa <em>tx</em> da máquina convidada; para a máquina, <em>rx</em>.",
"A <strong>espessura da linha</strong> aumenta com a taxa rx+tx da máquina convidada. Sem tráfego mantém-se uma linha animada ténue; com muito tráfego, torna-se grossa.",
"<strong>Brilho da cabeça do cometa</strong> — tom quente perto de 1 MB/s, intenso a partir de 30 MB/s. Permite identificar a máquina convidada que mais ocupa uma placa de rede.",
"<strong>Clique</strong> — todos os nós exceto o anfitrião abrem o diálogo de detalhe da interface descrito abaixo. Clicar no anfitrião não tem efeito; esta vista não inclui um diálogo para ele."
],
"useTitle": "Quando é útil",
"useBody": "Os cartões mostram <em>o que</em> existe; o diagrama mostra <em>como está ligado</em> e por onde passa o tráfego. Permite detetar máquinas na mesma bridge, duas máquinas muito ativas na mesma placa — um possível estrangulamento — ou uma VM a saturar uma ligação enquanto as outras quase não transmitem."
},
"groups": {
"heading": "Três grupos de interface",
"intro": "Três cartões agrupam as interfaces por função. Cada cabeçalho indica quantas estão ativas. Uma etiqueta colorida identifica o <strong>tipo</strong> de cada interface:",
"badges": [
"Azul <strong>Physical</strong> — verdadeiro NIC.",
"Verde <strong>Bridge</strong> — bridge Linux ou OVS (<code>vmbr*</code>).",
"Roxo <strong>Bond</strong> — agregação bond / LACP / active-backup.",
"Ciano <strong>VLAN</strong> — subinterface VLAN (<code>vmbr0.10</code>, <code>eno1.42</code>, …)."
],
"clickable": "<strong>Todas as linhas são clicáveis</strong>: interfaces físicas, virtuais, bridges e bonds. O detalhe descrito abaixo mostra dados básicos, IP, contadores e histórico RX/TX do armazenamento RRD Proxmox.",
"physicalTitle": "Interfaces Físicas",
"physicalBody": "Interfaces físicas reconhecidas pelo kernel: <code>eno1</code>, <code>enp4s0</code>, <code>eth0</code>, <code>wlp3s0</code>, etc. Cada dispositivo tem uma linha com etiqueta azul <strong>Physical</strong> e estado da ligação. Os <em>membros de um bond</em> também aparecem, com referência ao bond a que pertencem.",
"bridgeTitle": "Interfaces de ponte",
"bridgeBody": "Bridges Linux (<code>vmbr0</code>, <code>vmbr1</code>, …) e OVS geridas pelo Proxmox. Cada linha mostra a etiqueta verde <strong>Bridge</strong>, a interface física se tiver uma única porta e o estado. Os bonds têm etiqueta roxa <strong>Bond</strong>; as subinterfaces VLAN, a etiqueta ciano <strong>VLAN</strong>.",
"vmTitle": "Interfaces de VM / LXC",
"vmBody": "Interfaces <code>tap*</code> e <code>veth*</code> criadas no arranque das máquinas convidadas, uma por placa virtual. O cabeçalho mostra <em>X / Y Active</em> e as linhas ligam à VM/CT no separador VMs e LXCs. Após a paragem, as entradas inativas desaparecem no ciclo de atualização seguinte."
},
"drillIn": {
"heading": "Detalhe por interface",
"intro": "Um clique numa linha abre um diálogo com cinco blocos:",
"headerBlock": "Bloco",
"headerContents": "Conteúdo",
"rows": [
{
"block": "Informações Básicas",
"contents": "Nome, tipo (física / bridge / bond / VLAN / vm), endereço MAC, estado (ativo / inativo), MTU e interface física subjacente nos tipos virtuais."
},
{
"block": "Membros do bond",
"contents": "Apenas para bonds: cada placa membro com estado ativo ou falha, modo do bond (active-backup / 802.3ad / balance-alb / …) e interface principal se configurada."
},
{
"block": "Endereços IP",
"contents": "Cada endereço IPv4/IPv6 com o comprimento do prefixo. Os endereços link-local automáticos aparecem a cinzento."
},
{
"block": "Gráfico histórico",
"contents": "Largura de banda RX/TX no período escolhido (1 hora / 24 horas / 7 dias / 30 dias / 1 ano), obtida de <code>/api/network/&lt;interface&gt;/metrics</code> (RRD Proxmox)."
},
{
"block": "Tráfego desde a última inicialização",
"contents": "Total de bytes e pacotes RX/TX desde o último arranque do anfitrião, com contadores de erros e pacotes descartados."
}
],
"inactiveTitle": "O detalhe das interfaces inativas continua acessível",
"inactiveBody": "Se a interface estiver <em>inativa</em>, o diálogo mostra o aviso «Interface inativa» e omite os contadores atuais. A configuração — endereços e membros do bond — e o histórico continuam visíveis para diagnosticar a falha e quando ocorreu."
},
"latency": {
"heading": "Diálogo Latência de rede",
"intro": "Clique em <em>Latência de rede</em> na linha superior para abrir o diálogo: histórico, teste a pedido, três destinos e relatório PDF para transferência.",
"targetsTitle": "Alvos",
"targetsIntro": "A lista no topo seleciona o destino do ping:",
"targets": [
"<strong>Gateway</strong> — o router LAN. Testa apenas o percurso local para investigar problemas do switch ou da cablagem sem incluir a WAN.",
"<strong>Cloudflare (1.1.1.1)</strong> — resolvedor DNS público numa rede anycast. Testa o percurso WAN.",
"<strong>Google (8.8.8.8)</strong> — destino público alternativo para comparar resultados ou em caso de problemas regionais do Cloudflare."
],
"mode1Title": "Modo 1 — Vista histórica",
"mode1Alt": "Diálogo de latência em modo histórico, destino Gateway, período de uma hora e medições anteriores representadas",
"mode1Caption": "Histórico do gateway na última hora. O processo de recolha de temperatura e latência guarda as medições na base de dados a cada 60 segundos.",
"mode1Body1": "Modo inicial do diálogo. Uma segunda lista escolhe o período (<em>1 hora / 6 horas / 24 horas / 3 dias / 7 dias</em>). Acima aparecem Atual / Mínimo / Média / Máximo e um estado Excelente / Bom / Razoável / Mau conforme os limites abaixo.",
"mode1Body2": "Fonte: as medições usadas pelo Health Monitor para detetar lentidão persistente. O processo em segundo plano <code>_temperature_collector_loop</code> mede o gateway a cada 60 segundos e guarda o histórico num SQLite local.",
"mode2Title": "Modo 2 — Ensaio em tempo real",
"mode2Alt": "Diálogo de latência com ping em tempo real ao Cloudflare, progresso a 50% e novas medições no gráfico",
"mode2Caption": "Teste de dois minutos ao Cloudflare com uma leitura a cada cinco segundos, logo acrescentada ao gráfico. <em>Parar</em> termina mais cedo; <em>Repetir teste</em> acrescenta medições ao mesmo conjunto de dados.",
"mode2Intro": "Mudando o alvo para Cloudflare ou Google inicia um teste de ping sob demanda. Comportamento:",
"mode2Items": [
"<strong>Duração</strong> — dois minutos por teste, com barra de progresso e segundos restantes.",
"<strong>Frequência</strong> — uma leitura a cada cinco segundos, 24 por teste.",
"<strong>Método</strong> — ICMP Echo Request (<code>ping</code>), três pings consecutivos por medição com latência média.",
"<strong>Stop</strong> — termina o teste imediatamente; os dados parciais são preservados.",
"<strong>Repetir teste</strong> — acrescenta medições aos dados existentes para criar um histórico mais longo com vários testes.",
"<strong>Indicador de estado atual</strong> — atualizado após cada medição com os mesmos limites Excelente / Bom / Razoável / Mau."
],
"thresholdsTitle": "Limiares de desempenho",
"headerStatus": "Estado",
"headerRange": "Intervalo",
"headerImpact": "Impacto prático",
"thresholdRows": [
{
"status": "Excelente",
"range": "< 50 ms",
"impact": "Ideal para aplicações em tempo real, jogos e chamadas de vídeo."
},
{
"status": "Bom",
"range": "50 – 100 ms",
"impact": "Aceitável para a maioria das aplicações com impacto mínimo."
},
{
"status": "Razoável",
"range": "100 – 200 ms",
"impact": "Atraso notável. Pode afetar VoIP e aplicativos interativos."
},
{
"status": "Mau",
"range": "> 200 ms",
"impact": "Latência significativa. Investigação recomendada."
}
],
"reportTitle": "Relatório de latência da rede (PDF)",
"reportIntro": "Ambos os modos têm um botão <strong>Relatório</strong> junto ao seletor de destino. Gera um PDF das medições que pode anexar a um pedido de assistência ao fornecedor de Internet.",
"reportPreviewAlt": "Primeira página PDF do relatório de latência: resumo executivo, indicador, estatísticas, gráfico e guia dos limites",
"reportPreviewCaption": "A primeira página contém resumo executivo, indicador, estatísticas principais, evolução da latência e guia dos limites. A partir da página 2 surgem a tabela de medições e a metodologia.",
"downloadLabel": "Transferir relatório de latência de exemplo (PDF)",
"sectionsIntro": "O relatório contém seis secções:",
"sections": [
"<strong>Resumo executivo</strong> — indicador de 0 a mais de 300 ms com zonas verde, amarela e vermelha; estado Excelente / Bom / Razoável / Mau; destino, modo, número de medições e resumo da perda de pacotes.",
"<strong>Estatísticas de latência</strong> — quatro indicadores para valor atual, mínimo, média e máximo, mais número de medições, perda média de pacotes e período de teste.",
"<strong>Gráfico de latência</strong> — gráfico de área das medições durante o teste, com referências de mínimo, média e máximo no eixo vertical.",
"<strong>Limites de desempenho</strong> — a mesma escala de quatro níveis anterior, com um ponto colorido por nível.",
"<strong>Resultados detalhados</strong> — tabela numerada com data e hora, latência, perda de pacotes e estado de cada medição. Revela picos breves ocultos pelas médias.",
"<strong>Metodologia</strong> — ICMP Echo Request, três pings consecutivos por medição, nome e IP do destino e avaliação final derivada do estado."
],
"useCaseTitle": "Caso de uso: assistência do fornecedor de Internet",
"useCaseBody": "Execute dois minutos de teste Cloudflare quando notar lentidão, prolongue com <em>Repetir teste</em> e selecione <em>Relatório</em>. O PDF contém todas as medições e a metodologia. Pode anexá-lo a um pedido de assistência com as horas do incidente; o fornecedor decide os comprovativos necessários."
},
"excluding": {
"heading": "Excluir interfaces da monitorização",
"body1": "Pode excluir interfaces da monitorização: bridges desativadas intencionalmente, interfaces de teste ou placas removidas ainda configuradas. A definição fica em <code>excluded_interfaces</code>: o Health Monitor não gera avisos ou notificações e não as inclui no estado geral.",
"body2": "No menu de contexto escolha <em>Excluir da monitorização</em>. A interface continua visível com etiqueta roxa <strong>excluída</strong>. Pode reativar a monitorização no mesmo menu."
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerSection": "Secção da página",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"section": "Inventário de interface",
"endpoint": "/api/network",
"source": "<code>ip -j addr</code> + <code>ip -j link</code> e consulta de bonds e bridges."
},
{
"section": "Cartões de resumo",
"endpoint": "/api/network/summary",
"source": "Resumo do inventário e contagem de interfaces ativas e inativas."
},
{
"section": "Histórico RX/TX por interface",
"endpoint": "/api/network/<iface>/metrics",
"source": "Os contadores atuais usam <code>/proc/net/dev</code>; o histórico vem de RRD Proxmox através de pvesh. As interfaces VM/LXC usam dados da máquina convidada; as físicas e bridges, dados do nó."
},
{
"section": "Latência: actual",
"endpoint": "/api/network/latency/current",
"source": "Breve série de <code>ping</code> ao gateway ou destino configurado."
},
{
"section": "Latência: histórico",
"endpoint": "/api/network/latency/history",
"source": "Medições guardadas aproximadamente a cada 60 segundos pelo processo de recolha de temperatura e latência em segundo plano."
}
],
"codeComment1": "# Verificar o estado das interfaces apresentado no painel",
"codeComment2": "# Verificar uma medição atual de latência de ponta a ponta"
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tail": " — categoria Rede e limites do histórico de latência."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — endpoints de rede e latência."
},
{
"label": "Integrações",
"href": "/docs/monitor/integrations",
"tail": " — a recolha Prometheus disponibiliza as mesmas métricas de rede."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tail": " — as outras páginas."
},
{
"label": "ProxMenux → Rede",
"href": "/docs/network",
"tail": " — o lado das ações: análise de ponte, nomes de interface persistentes, backup e reinício, iperf3."
}
]
}
}
@@ -0,0 +1,246 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: separador Segurança | Documentação ProxMenux",
"description": "O separador Segurança reúne os controlos de proteção em duas colunas: ProxMenux Monitor (autenticação, SSL/HTTPS, tokens de API, Secure Gateway) e Proxmox VE (firewall, Fail2Ban, auditoria Lynis). Inclui o assistente Secure Gateway, a auditoria Lynis e a instalação e o ajuste das regras do Fail2Ban."
},
"header": {
"title": "Painel: separador Segurança",
"description": "Os controlos de segurança estão organizados em dois blocos: a configuração do Monitor (autenticação, SSL, tokens, Secure Gateway) e a do anfitrião Proxmox monitorizado (firewall, Fail2Ban, Lynis).",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Dois escopos, uma aba",
"body": "O separador Segurança tem duas secções: <strong>ProxMenux Monitor</strong> (definições do painel) e <strong>Proxmox VE</strong> (definições do anfitrião). Os cartões Fail2Ban e Lynis permitem instalar estas ferramentas quando estão ausentes e mostram os respetivos controlos após a instalação."
},
"monitor": {
"heading": "ProxMenux Monitor",
"intro": "Quatro cartões permitem gerir o acesso ao painel e a autenticação."
},
"auth": {
"heading": "Autenticação",
"imageAlt": "Cartão de autenticação com estado Ativada, botões Terminar sessão e Alterar palavra-passe, informações sobre autenticação de dois fatores e botões para a ativar ou desativar a autenticação",
"imageCaption": "Cartão com autenticação ativa: indicador de estado, Alterar palavra-passe, Ativar 2FA e a ação destrutiva Desativar autenticação.",
"intro": "O cartão permite gerir o início de sessão no painel. O primeiro arranque, a política de palavras-passe, a configuração TOTP e a recuperação em caso de perda do autenticador estão descritos em <link>Acesso e autenticação</link>. Este cartão permite gerir essas definições no dia a dia:",
"items": [
"<strong>Estado da autenticação</strong> — indicador <em>Ativada</em> / <em>Desativada</em> / <em>Recusada</em>.",
"<strong>Alterar palavra-passe</strong> — palavra-passe atual + nova palavra-passe + confirmação.",
"<strong>Ativar / Desativar autenticação de dois fatores</strong> — abre a configuração com código QR ao ativar e pede a palavra-passe atual ao desativar.",
"<strong>Desativar autenticação</strong> — ação destrutiva que volta a mostrar o diálogo inicial <em>Proteger o painel?</em> na próxima visita."
]
},
"ssl": {
"heading": "SSL/HTTPS",
"imageAlt": "Cartão SSL/HTTPS com estado HTTP sem SSL, certificado Proxmox detetado com titular, emissor e validade, botão Usar certificado Proxmox e opção Usar certificado personalizado",
"imageCaption": "Cartão SSL/HTTPS com HTTPS desativado. O Monitor deteta o certificado instalado no anfitrião Proxmox e permite usá-lo com um clique. Se tiver ficheiros próprios noutro local, pode escolher <em>Usar certificado personalizado</em>.",
"intro": "Disponibiliza o painel por HTTPS sem proxy inverso. O cartão deteta o certificado usado pelo Proxmox em <code>/etc/pve/local/</code> e mostra o titular, o emissor e a validade para verificação antes da ativação. Há duas formas de ativar HTTPS:",
"items": [
"<strong>Usar certificado Proxmox</strong> — o Monitor reutiliza o certificado do anfitrião com um clique. Adequado se o PVE e o painel já usarem o mesmo nome DNS.",
"<strong>Usar certificado personalizado</strong> — cole os caminhos absolutos do certificado <code>.pem</code> e da chave privada <code>.key</code>. São validados antes de reiniciar o serviço. Se o carregamento falhar, o painel regressa automaticamente a HTTP e permanece acessível."
],
"enabledAlt": "Cartão SSL/HTTPS com HTTPS ativado, certificado ativo com os caminhos de pve-ssl.pem e pve-ssl.key e botão Desativar HTTPS",
"enabledCaption": "HTTPS ativo — o cartão mostra o certificado em uso, os caminhos dos ficheiros e a ação <em>Desativar HTTPS</em>, que repõe HTTP na mesma porta.",
"acmeTitle": "ACME / Let's Encrypt através do Proxmox",
"acmeBody": "Se o nó Proxmox já tiver Let’s Encrypt configurado em <em>Datacenter → Certificados → ACME</em>, o painel reutiliza o certificado apresentado aos navegadores ao escolher <em>Usar certificado Proxmox</em>. Não é necessária uma configuração ACME separada para o Monitor.",
"walkthroughLink": "Consulte <link>HTTPS para ProxMenux Monitor</link> para saber como é detetado o certificado ACME, o que é gravado no disco e como usar um par <code>.pem</code> / <code>.key</code> próprio."
},
"apiTokens": {
"heading": "Tokens de acesso API",
"emptyAlt": "Cartão de tokens de acesso à API vazio, com informações sobre os tokens e botão Gerar novo token de API",
"emptyCaption": "Cartão de tokens numa instalação nova. A caixa <em>Sobre os tokens de API</em> resume a validade, a utilização e a inclusão em cabeçalhos <code>Authorization: Bearer</code>.",
"intro": "Tokens válidos por um ano para integrações automáticas: widgets Homepage, sensores REST do Home Assistant, coletores Grafana, fluxos n8n e scripts próprios. O cartão passa por três estados: vazio → formulário → token gerado.",
"generateBody": "<strong>Gerar um token.</strong> Clique em <em>Gerar novo token de API</em>. Introduza um <em>nome do token</em> descritivo para o identificar na lista e a sua <em>palavra-passe</em> como confirmação adicional. Se a 2FA estiver ativa, é também pedido o código TOTP atual.",
"generateAlt": "Formulário de geração de token de API com campos Nome do token e Palavra-passe e botões Gerar token e Cancelar",
"generateCaption": "Formulário Gerar token de API: introduza um nome e confirme com a palavra-passe e, se a 2FA estiver ativa, o código TOTP.",
"saveBody": "<strong>Guarde o token imediatamente.</strong> O valor completo aparece <strong>apenas uma vez</strong> após a criação. O cartão assinala-o com um aviso laranja e um botão de cópia. Não poderá recuperá-lo depois; a lista de tokens ativos mostrará apenas o prefixo.",
"generatedAlt": "Token de API gerado com valor oculto, botão de cópia, instruções para o cabeçalho Authorization: Bearer e lista dos tokens ativos com prefixo",
"generatedCaption": "Token gerado: o valor é mostrado uma vez, com botão de cópia e o excerto exato <code>Authorization: Bearer</code>. A lista de tokens ativos mostra nome, prefixo e data de criação para permitir a revogação individual.",
"outro": "Cada token ativo tem um botão <em>Revogar</em>. A revogação invalida-o imediatamente e interrompe as integrações que o usam. Encontra exemplos para Homepage, Home Assistant, n8n e Prometheus em <link>Integrações</link>."
},
"gateway": {
"heading": "Secure Gateway",
"cardAlt": "Cartão Secure Gateway antes da primeira implementação, com o botão Implementar Secure Gateway",
"cardCaption": "Cartão Secure Gateway numa instalação nova: um botão inicia o assistente.",
"intro": "Aceda ao painel, à interface web Proxmox e às máquinas convidadas através da sua rede <a>Tailscale</a>, sem expor portas à Internet. O Monitor implementa no anfitrião um contentor LXC Alpine com <code>tailscaled</code> como router de sub-rede. Após aprovação na consola Tailscale, os dispositivos remotos podem aceder ao IP LAN do anfitrião a partir de qualquer local.",
"wizardTitle": "Assistente passo a passo",
"wizardIntro": "Antes de clicar em <em>Deploy Secure Gateway</em>, gere uma chave de autenticação na consola Tailscale. O assistente irá pedi-la no passo 2.",
"step0Title": "0. Gerar a chave de autenticação Tailscale",
"step0Body": "Inicie sessão em <a>login.tailscale.com/admin/settings/keys</a> e clique em <em>Generate auth key…</em>. Escolha uma chave <em>pré-autenticada</em> para que o gateway não precise de um início de sessão interativo. Copie o valor; é mostrado apenas uma vez.",
"step0Alt": "Página Settings → Keys da consola Tailscale, com o botão Generate auth key realçado",
"step0Caption": "Consola de administração Tailscale — <em>Settings → Keys → Generate auth key…</em>. Se ainda não tiver conta, crie uma conta gratuita Tailscale através da ligação no assistente.",
"step1Title": "1. Abrir o assistente",
"step1Body": "Regresse ao separador Segurança e clique em <em>Deploy Secure Gateway</em>. O primeiro passo apresenta as funções e os requisitos.",
"step1Alt": "Introdução do assistente Secure Gateway: acesso VPN sem encaminhamento de portas e com encriptação ponto a ponto",
"step1Caption": "Passo 1 — visão geral do que o Secure Gateway fornece e um lembrete de que você precisará de uma conta de Tailscale gratuita.",
"step2Title": "2. Autenticação Tailscale",
"step2Body": "Cole a chave de autenticação do passo 0 e escolha um nome de anfitrião. O gateway aparecerá com esse nome na consola Tailscale, normalmente <code>proxmox-gateway</code> ou o nome do nó.",
"step2Alt": "Passo do assistente Secure Gateway que pede a chave de autenticação Tailscale e o nome de anfitrião do dispositivo, com ligação para gerar a chave",
"step2Caption": "Passo 2: cole a chave pré-autenticada e escolha o nome de anfitrião. Se tiver ignorado o passo 0, a ligação sob o campo abre a página Tailscale correspondente.",
"step3Title": "3. Âmbito de acesso",
"step3Intro": "Escolha o que sua tailnet pode alcançar através do gateway:",
"step3Items": [
"<strong>Proxmox Only</strong> — apenas a IU Proxmox e o Monitor. Superfície de ataque mais pequena.",
"<strong>Full Local Network</strong> — toda a sub-rede LAN (auto-detectado a partir da interface primária do host). Permite alcançar NAS, impressoras, VMs e qualquer outro dispositivo LAN.",
"<strong>Sub-redes personalizadas</strong> — indique os CIDR pretendidos. Para configurações com várias VLAN em que apenas alguns segmentos devem ficar acessíveis."
],
"step3Alt": "Passo Âmbito de acesso do assistente Secure Gateway com as opções Apenas Proxmox, Toda a rede local e Sub-redes personalizadas",
"step3Caption": "Passo 3: escolha o âmbito de acesso. <em>Toda a rede local</em> preenche automaticamente a sub-rede LAN detetada.",
"step4Title": "4. Opções avançadas (opcional)",
"step4Intro": "Duas opções, ambas <strong>desativadas por predefinição</strong>:",
"step4Items": [
"<strong>Exit Node</strong> — ao ativar e selecionar esta opção num dispositivo remoto, todo o tráfego de Internet desse dispositivo sai pela WAN do anfitrião Proxmox. Útil em viagem para usar a ligação de casa a partir do telemóvel.",
"<strong>Aceitar rotas</strong> — permite ao gateway aceder a redes anunciadas por <em>outros</em> routers de sub-rede Tailscale, em instalações com vários locais."
],
"step4Alt": "Passo Opções avançadas do Secure Gateway com as caixas Exit Node e Accept Routes",
"step4Caption": "Passo 4: Exit Node e Accept Routes. Deixe ambas desativadas se apenas precisar de aceder ao painel a partir do telemóvel ou portátil.",
"step5Title": "5. Rever e implementar",
"step5Body": "Resumo final antes da implementação. O assistente lembra o passo manual ainda necessário na consola Tailscale: <strong>aprovar a rota de sub-rede</strong>.",
"step5Alt": "Passo Rever e implementar do Secure Gateway com resumo do nome de anfitrião, modo de acesso, redes, Exit Node e Accept Routes e botão Implementar gateway",
"step5Caption": "Passo 5 — rever a configuração e implantar. O aviso azul no fundo indica a aprovação da rota pendente.",
"approvalTitle": "Um último passo manual no administrador Tailscale",
"approvalBody": "Após a implementação, abra <a>login.tailscale.com/admin/machines</a> e aprove a rota de sub-rede anunciada pelo gateway. Até lá, os dispositivos remotos da rede Tailscale não podem aceder aos IP LAN através do gateway. O Tailscale assinala as rotas pendentes com um aviso amarelo na linha do dispositivo: clique em <em>Edit route settings</em> e selecione a rota."
},
"pve": {
"heading": "Proxmox VE",
"intro": "As proteções do anfitrião: firewall, prevenção de intrusões e auditoria de segurança. Os cartões Fail2Ban e Lynis oferecem a instalação se necessário e depois mostram os controlos de gestão."
},
"firewall": {
"heading": "Proxmox Firewall",
"imageAlt": "Cartão da firewall Proxmox com estado do cluster e anfitrião, regras de acesso rápido para Monitor e interface web Proxmox, contadores, lista de regras e botão Adicionar regra",
"imageCaption": "Cartão da firewall Proxmox: interruptores para o cluster e anfitrião, portas comuns em <em>Regras de acesso rápido</em>, contadores em <em>Resumo de regras</em> e lista completa com <em>+ Adicionar regra</em>.",
"intro": "O cartão gere a configuração da firewall Proxmox VE. O motor clássico usa <code>iptables</code> e o alternativo usa <code>nftables</code>. Não gere regras arbitrárias criadas fora do Proxmox. Três blocos:",
"items": [
"<strong>Firewall do cluster + firewall do anfitrião</strong> — interruptores globais. A firewall do cluster tem de estar ativa para que as regras do anfitrião tenham efeito. O cartão indica esta dependência junto da definição.",
"<strong>Regras de acesso rápido</strong> — linhas predefinidas para <code>8008/TCP</code> (Monitor) e <code>8006/TCP</code> (interface web Proxmox), com estado permitido, bloqueado ou sem proteção. A interface Proxmox é permitida por uma macro de firewall <em>integrada</em> que não pode ser eliminada por engano.",
"<strong>Resumo de regras</strong> — contadores do total de regras, regras accept, regras drop/reject e portas distintas protegidas. Os valores são lidos de <code>/etc/pve/firewall/cluster.fw</code> e <code>/etc/pve/nodes/&lt;node&gt;/host.fw</code>.",
"<strong>Regras da firewall</strong> — lista com ação, protocolo, porta, origem e nível. <em>+ Adicionar regra</em> abre o editor no cartão; o caixote do lixo elimina a regra. As alterações são guardadas nos ficheiros Proxmox e aparecem também na respetiva interface (Datacenter / Node → Firewall)."
]
},
"fail2ban": {
"heading": "Fail2Ban",
"subHeading": "(conforme o estado)",
"whatIs": "<strong>O que é.</strong> O Fail2Ban é um serviço de código aberto que deteta tentativas de início de sessão falhadas repetidas nos registos e bloqueia o IP na firewall. Protege SSH e formulários web contra ataques contínuos de força bruta. O ProxMenux configura três jails: SSH, acesso web Proxmox (porta 8006) e acesso ProxMenux Monitor (porta 8008).",
"notBundled": "O Fail2Ban <strong>não está incluído</strong>. O cartão deteta se está instalado e adapta-se: se faltar, permite instalá-lo com um clique. Depois apresenta o estado das jails e os IP bloqueados e permite ajustar o número de tentativas e a duração do bloqueio de cada jail.",
"notInstalledAlt": "Cartão Fail2Ban não instalado com descrição da proteção de SSH, interface web Proxmox e Monitor através de nftables e botão Instalar e configurar Fail2Ban",
"notInstalledCaption": "Cartão Fail2Ban antes de instalar — a caixa azul visualiza o que a instalação configuraria.",
"clickBody": "Clique em <em>Instalar e configurar Fail2Ban</em> para abrir um diálogo de confirmação com todas as alterações que o script fará no anfitrião:",
"confirmAlt": "Confirmação Fail2Ban com modo SSH agressivo, proteção Proxmox na porta 8006 e Monitor na porta 8008, deteção nftables, ajuste dos registos journald e proteção SSH MaxAuthTries",
"confirmCaption": "Confirmação da instalação: lista de jails, nível de registo journald ajustado para ler eventos SSH e proteção adicional de SSH (<code>MaxAuthTries=3</code>).",
"confirmIntro": "Após a confirmação, um painel mostra a instalação em direto: apt, configuração das jails e testes. Usa o mesmo mecanismo do instalador CLI ProxMenux.",
"progressAlt": "Painel com registo de instalação Fail2Ban: pacote, journald MaxLevelStore para autenticação, jails, deteção nftables, proteção MaxAuthTries, teste de comunicação fail2ban-client e mensagem final",
"progressCaption": "Instalação em curso: o painel regista cada passo. A mensagem Connection closed no fim indica que a transmissão terminou.",
"afterInstall": "Após a instalação, o cartão mostra o estado em direto: jails configuradas, IP bloqueados e bloqueios recentes. Os separadores distinguem <em>Jails e IP bloqueados</em> de <em>Atividade recente</em>, as últimas N entradas do registo Fail2Ban.",
"activeAlt": "Cartão Fail2Ban ativo com três jails (proxmenux, proxmox, sshd), contadores de IP bloqueados, bloqueios totais e tentativas falhadas e linhas com tentativas, duração do bloqueio, intervalo e engrenagem",
"activeCaption": "Fail2Ban ativo: as três jails predefinidas (<code>proxmenux</code>, <code>proxmox</code>, <code>sshd</code>) com definições de tentativas, duração do bloqueio e intervalo de deteção.",
"tuneBody": "<strong>Ajustar as regras da jail.</strong> Clique na engrenagem para alterar <em>Max Retries</em>, <em>Ban Time</em> e <em>Find Time</em>, o intervalo móvel em que são contadas as tentativas. Um bloqueio permanente dura até ser removido manualmente. O formulário explica os valores habituais.",
"configAlt": "Formulário da jail sshd com Max Retries, Ban Time em segundos, opção Permanent Ban, Find Time, ajuda sobre valores habituais e botão Guardar configuração",
"configCaption": "Edição da jail sshd: reduza <em>Max Retries</em> se usar SSH apenas a partir da sua sub-rede, ou aumente <em>Ban Time</em> para um painel exposto à Internet.",
"outro": "O guia <em>Instalação, configuração e desinstalação</em> inclui a instalação manual, a alteração de SSH MaxAuthTries e a relação com o registo <code>proxmenux-auth.log</code>. Consulte <link>ProxMenux → Segurança → Fail2Ban</link>.",
"calloutTitle": "Sem Fail2Ban, este mecanismo não bloqueia IPs",
"calloutBody": "O ProxMenux Monitor verifica os IP bloqueados pelo Fail2Ban ao <em>nível da aplicação</em> antes de processar pedidos Flask. Consulta fail2ban-client e guarda o resultado em cache durante 30 segundos; não lê uma tabela SQL de bloqueios. Sem Fail2Ban, as tentativas falhadas são registadas em <code>proxmenux-auth.log</code>, mas este mecanismo não bloqueia IPs."
},
"lynis": {
"heading": "Auditoria de segurança Lynis",
"subHeading": "(conforme o estado)",
"whatIs": "<strong>O que é.</strong> O Lynis é uma ferramenta de auditoria de segurança de código aberto que executa cerca de 280 testes no anfitrião: permissões, proteção do kernel, SSH, vulnerabilidades dos pacotes, política criptográfica, tarefas agendadas, identificação de serviços e outros. Produz um índice de segurança de 0 a 100, avisos e sugestões. É uma referência comum para avaliar servidores Debian.",
"whyUseful": "<strong>Porque é útil.</strong> Avaliar a segurança lendo cada ficheiro de configuração é difícil. O Lynis deteta falhas comuns: proteções do kernel ausentes, cifras SSH fracas, registos não persistentes ou <code>NOPASSWD</code> em sudoers para contas predefinidas. Repetir a análise após os ajustes ProxMenux permite comparar a melhoria através de uma pontuação.",
"notInstalledAlt": "Cartão Lynis não instalado com botão Instalar Lynis e funções: índice de segurança, deteção de vulnerabilidades, conformidade e código GitHub",
"notInstalledCaption": "Cartão Lynis antes de instalar — a caixa azul resume o que a ferramenta faz.",
"notBundled": "O Lynis também <strong>não está incluído</strong>. O ProxMenux instala-o diretamente a partir do código oficial no GitHub em vez do pacote Debian.",
"confirmAlt": "Diálogo de confirmação Lynis com as funções: índice de segurança, deteção de vulnerabilidades, análise de configuração, verificação de conformidade e código do repositório oficial GitHub",
"confirmCaption": "Confirmação da instalação que indica explicitamente a origem GitHub.",
"progressAlt": "Painel de instalação Lynis em direto, com instalação da versão mais recente, confirmação da versão 3.1.6 e mensagem final",
"progressCaption": "Instalação em curso: o painel mostra o registo em direto, tal como no Fail2Ban.",
"afterInstall": "Após a instalação, o cartão mostra a versão e um histórico de auditorias vazio. Clique em <em>Executar auditoria de segurança</em> para iniciar a primeira análise.",
"installedAlt": "Cartão Lynis após a instalação com versão 3.1.6, data da última análise, índice de segurança 0, avisos 0, sugestões 0, relatório vazio e botão Executar auditoria de segurança",
"installedCaption": "O Lynis está instalado, ainda sem auditorias. Os indicadores mostram inicialmente zeros.",
"runningAlt": "Cartão Lynis durante a auditoria com mensagem de análise em curso, duração estimada de 2 a 5 minutos e botão Auditoria em curso desativado",
"runningCaption": "Auditoria em curso: o botão mostra um indicador de carregamento e o cartão avisa que a análise pode demorar de 2 a 5 minutos.",
"finishedBody": "No fim, o cartão mostra os resultados: índice de segurança, avisos, sugestões e lista de <em>Relatórios de auditoria</em> com as análises anteriores.",
"resultsAlt": "Cartão Lynis com índice 71, detalhe Lynis 66 e PVE 71, 3 avisos, 40 sugestões, pontuação ajustada ao Proxmox de 71 em 100 na faixa Bom, relatórios com transferência PDF e botão Executar auditoria de segurança",
"resultsCaption": "Resultados de exemplo: índice de segurança <strong>71/100 (Bom)</strong>. O cartão mostra a pontuação original Lynis (66) e a ajustada ao Proxmox (71). O ajuste depende da pontuação original e da proporção das ocorrências consideradas normais no Proxmox VE; não acrescenta 11 pontos fixos.",
"scoreTitle": "Pontuação bruta de Lynis vs pontuação ajustada a Proxmox",
"scoreIntro": "As regras Lynis destinam-se a sistemas Debian de uso geral. O Proxmox diverge de algumas por motivos válidos, como serviços do cluster executados como root ou definições próprias de <code>journald</code>. O cartão mostra ambas as pontuações para:",
"scoreItems": [
"Acompanhar a <em>pontuação original Lynis</em>, como faria um auditor externo.",
"Acompanhar a pontuação <em>ajustada ao Proxmox</em>, uma referência mais adequada para comparar nós do mesmo cluster."
],
"reportBody": "<strong>Relatório completo.</strong> O botão <em>PDF</em> de cada auditoria transfere um relatório de várias páginas: resumo executivo, informações do sistema, estado da segurança, avisos explicados, sugestões ordenadas por impacto e inventário dos pacotes. Pode anexá-lo a uma revisão de segurança.",
"reportAlt": "Primeira página de exemplo do PDF Lynis com resumo executivo, índice 71 de 100, contagens de avisos e sugestões, nome de anfitrião, kernel, versão Lynis, data e resumo da segurança",
"reportCaption": "Primeira página do relatório: resumo executivo, informações do sistema e estado da segurança. Seguem-se avisos detalhados, sugestões e pacotes instalados. É fornecido um <a>PDF de exemplo</a> como referência.",
"runPeriodically": "Execute a auditoria periodicamente (após grandes atualizações do Proxmox, após a aplicação de ajustes pós-instalação, antes de abrir um caminho de acesso remoto) e mantenha os relatórios – a tendência importa mais do que qualquer número.",
"outro": "O guia de <em>instalação, configuração e desinstalação</em> e a análise de um relatório de exemplo estão em <link>ProxMenux → Segurança → Lynis</link>."
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerCard": "Cartão",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"card": "Autenticação, 2FA, mudança de senha",
"endpoint": "/api/auth/*",
"source": "Configuração local de autenticação em ~/.config/proxmenux-monitor/auth.json; JWT emitidos pelo Monitor."
},
{
"card": "SSL/HTTPS",
"endpoint": "/api/auth/ssl/*",
"source": "<code>openssl x509</code> em <code>/etc/pve/local/pve-ssl.pem</code> + <code>/etc/proxmenux/ssl_config.json</code>."
},
{
"card": "Listar, gerar e revogar tokens de API",
"endpoint": "/api/auth/api-tokens",
"source": "Os dados dos tokens ficam guardados localmente; nada sai do anfitrião."
},
{
"card": "Gateway seguro (deploy + status)",
"endpoint": "/api/oci/*",
"source": "Cria um contentor LXC Alpine com <code>tailscaled</code> através de <code>pct create</code> / <code>pct exec</code>."
},
{
"card": "Estado e regras da firewall",
"endpoint": "/api/security/firewall/*",
"source": "<code>pve-firewall</code> + <code>/etc/pve/firewall/&lt;cluster|host&gt;.fw</code>."
},
{
"card": "Fail2Ban (somente quando instalado)",
"endpoint": "/api/security/fail2ban/*",
"source": "<code>fail2ban-client status</code>, <code>/var/log/fail2ban.log</code>, <code>/etc/fail2ban/jail.local</code>."
},
{
"card": "Auditoria Lynis (apenas quando instalado)",
"endpoint": "/api/security/lynis/*",
"source": "Executa o <code>lynis audit system</code> em segundo plano; relatório analisado do <code>/var/log/lynis-report.dat</code>."
}
]
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Acesso e autenticação",
"href": "/docs/monitor/access-auth",
"tail": " — configuração inicial completa, escolha de aplicação 2FA, recuperação após perda do autenticador e exemplos de proxy inverso."
},
{
"label": "Integrações",
"href": "/docs/monitor/integrations",
"tail": " — exemplos de tokens de API com Homepage, Home Assistant, Prometheus e n8n e configuração completa do Secure Gateway."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tailRich": " — todos os endpoints <code>/api/auth</code>, <code>/api/security</code> e <code>/api/oci</code> com método, corpo do pedido e exemplos curl."
},
{
"label": "ProxMenux → Segurança → Fail2Ban",
"href": "/docs/security/fail2ban",
"tail": " — guia de instalação, jails configuradas e instalação manual."
},
{
"label": "ProxMenux → Segurança → Lynis",
"href": "/docs/security/lynis",
"tail": " — relatório de exemplo, interpretação da pontuação e quando repetir a auditoria."
}
]
}
}
@@ -0,0 +1,367 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: separador Definições | Documentação ProxMenux",
"description": "O separador Definições gere idioma, ordem de navegação, preferências do painel, limites e exclusões da monitorização, notificações, IA e inventário das otimizações pós-instalação."
},
"header": {
"title": "Painel: separador Definições",
"description": "Idioma do Monitor, ordem de navegação, preferências do painel, exclusões da monitorização, notificações, configuração de IA e inventário atual das otimizações ProxMenux.",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Onde cada definição é guardada",
"body": "Definições reúne apresentação do painel, monitorização Health Monitor, envio de alertas e alterações já aplicadas pelo ProxMenux ao anfitrião. Os cartões ligam à documentação detalhada; este separador é o ponto de acesso."
},
"interfaceLanguage": {
"heading": "Idioma da interface",
"intro": "Escolha o idioma da <strong>interface web do Monitor</strong>. Muda de imediato, sem reiniciar o serviço nem alterar o idioma dos menus de terminal do ProxMenux.",
"items": [
"O ProxMenux Monitor oferece atualmente inglês, alemão, espanhol, francês, italiano, português, eslovaco e sueco.",
"Na primeira visita usa o idioma do navegador, se suportado; caso contrário, inglês.",
"Alterar a seleção atualiza o idioma da página e sincroniza as outras abas do mesmo perfil do navegador.",
"Se faltar uma tradução, apenas esse texto aparece em inglês em vez de uma chave ou marcador inválido."
],
"scopeTitle": "Preferência local do navegador",
"scopeBody": "A escolha fica em <code>localStorage</code> sob <code>proxmenux-ui-language</code>. Aplica-se a este perfil do navegador e dispositivo, não ao nó inteiro. Cada administrador pode escolher o seu idioma."
},
"navigationOrder": {
"heading": "Ordem de navegação",
"intro": "Ordene as sete entradas principais: <strong>Visão geral, Apps, VMs e LXCs, Nó, Cópias, Terminal e Administração</strong>. Prima <strong>Editar</strong>, arraste as linhas e guarde.",
"items": [
"Com o rato, arrastar começa ao premir. Em ecrãs táteis exige uma pressão de 250 ms para distinguir do deslocamento.",
"Os grupos <strong>Nó</strong> e <strong>Administração</strong> movem-se em conjunto; as páginas internas mantêm a ordem definida.",
"O menu móvel segue a mesma ordem guardada.",
"<strong>Repor predefinições</strong> repõe a ordem em edição. Guarde para aplicar a alteração.",
"Os novos separadores principais de versões futuras são acrescentados ao fim da ordem personalizada, preservando a sua organização."
],
"landingTitle": "A primeira entrada é o separador inicial",
"landingBody": "O Monitor abre a primeira entrada guardada. Com <strong>Nó</strong>, abre Armazenamento; com <strong>Administração</strong>, Registos do sistema. A ordem fica neste navegador sob <code>proxmenux-nav-order</code>, permitindo organizações diferentes por dispositivo."
},
"networkUnits": {
"heading": "Unidades de rede",
"imageAlt": "Cartão Unidades de rede com o seletor de apresentação em Bytes",
"imageCaption": "Escolha entre bits por segundo e bytes por segundo para cada taxa de rede exibida no painel.",
"body": "Mostra a velocidade em <strong>bits por segundo</strong> (Mbps/Gbps) ou <strong>bytes por segundo</strong> (MB/s/GB/s). Bits são a predefinição, como nas especificações de placas e fornecedores; as transferências de ficheiros usam frequentemente bytes. Gráficos, etiquetas e ajudas mudam de imediato sem recarregar."
},
"health": {
"heading": "Monitor de Saúde",
"intro": "O cartão define a <strong>duração da supressão</strong>: quanto esperar antes de voltar a avisar sobre um alerta descartado. Cada categoria — CPU, memória, armazenamento, discos, rede, VM, serviços PVE, registos, atualizações e segurança — tem a sua lista:",
"items": [
"<strong>24 h</strong> — padrão para a maioria das categorias transitórias.",
"<strong>72 h</strong> — para silenciar estes eventos durante alguns dias.",
"<strong>168 h</strong> (1 semana) e <strong>720 h</strong> (1 mês) — controlos periódicos.",
"<strong>8760 h</strong> (1 ano) — silêncio durante um longo período.",
"<strong>-1</strong> — silêncio permanente até que você o reative manualmente.",
"<strong>Horas personalizadas</strong> — um número inteiro para um valor intermédio."
],
"imageAlt": "Definições, cartão Health Monitor com duração por categoria e supressões ativas",
"imageCaption": "As listas definem a duração das supressões futuras. A secção inferior mostra os alertas silenciados e permite reativá-los.",
"editTitle": "Modo de edição",
"editBody": "O cartão começa em leitura. <strong>Editar</strong> no canto superior direito ativa listas e botões de reativação. <strong>Guardar</strong> aplica em conjunto as durações e reativações pendentes; <strong>Cancelar</strong> descarta-as. Guardar só fica ativo quando há alterações.",
"activeTitle": "Supressões Ativas",
"activeIntro": "Sob as durações, <strong>Supressões ativas</strong> lista alertas silenciados temporariamente —24 h, 7 dias ou outro período— e os <em>permanentes</em>. Cada linha mostra:",
"activeItems": [
"Um emblema colorido: <strong>Permanente</strong> em âmbar ou uma contagem, como <strong>24 h restantes</strong> / <strong>7 dias restantes</strong>, em azul.",
"O identificador do alerta em formato legível (por exemplo, <code>pve_storage_full_PBS-Cloud</code> → <em>Armazenamento PVE cheio: PBS-Cloud</em>).",
"Categoria, gravidade e data e hora em que o alerta foi descartado.",
"Um botão <strong>Reativar</strong>, disponível ao editar, prepara a remoção da supressão ao guardar."
],
"activeReenableTitle": "Como reativar um alerta",
"activeReenableBody": "<strong>Reativar</strong> ao editar marca a linha a verde e risca o identificador, sem aplicar ainda a alteração. Clique de novo para <strong>Desfazer</strong>. <strong>Guardar</strong> envia em paralelo <code>POST /api/health/un-acknowledge</code> por reativação e retira as linhas. Se o problema persistir e a categoria permitir novos avisos, o alerta regressa aos ativos na próxima análise.",
"activePermanentNote": "As supressões permanentes —por <em>Permanentemente</em> ou duração predefinida <code>-1</code>— <strong>só são revertidas aqui</strong>. O diálogo geral não tem esse botão; esta secção reúne o registo e a reativação.",
"activeAutoRefreshTitle": "Atualização automática",
"activeAutoRefreshBody": "A lista atualiza-se ao descartar ou reativar um alerta no Health Monitor, ao regressar ao separador e quando muda a visibilidade. Não precisa de recarregar.",
"calloutTitle": "Detalhes na página Health Monitor",
"calloutBody": "Escalamento, resolução automática quando um dispositivo desaparece e diferença entre descartar e resolver estão em <link>Health Monitor → Descartar alertas e duração da supressão</link>. Este cartão oferece as listas e supressões ativas."
},
"thresholds": {
"heading": "Limites do Health Monitor",
"intro": "O cartão anterior define <em>o silêncio após dispensar um alerta</em>; este regula <strong>o valor que desencadeia um alerta</strong>. A maioria das verificações tem valores <strong>Aviso</strong> e <strong>Crítico</strong> ajustáveis. A tabela explica exceções como a regra combinada de swap e o detetor atual de RAM.",
"whatForTitle": "Para que serve",
"whatForIntro": "Os valores predefinidos são um ponto de partida, mas cada ambiente tem condições próprias:",
"whatForItems": [
"Um homelab com um só SSD pode avisar mais cedo, por exemplo a 75/90%, para deixar espaço para snapshots.",
"Os limites de memória devem refletir medições e carga do anfitrião. A redundância Ceph não justifica por si só avisos menos rigorosos; uso elevado de ARC ZFS não equivale a memória de trabalho irrecuperável.",
"Escolha os limites de temperatura conforme as especificações do disco e as condições reais. A refrigeração passiva ou forçada não determina só por si um limite seguro universalmente inferior ou superior.",
"Um anfitrião muito virtualizado pode ter picos de CPU durante compilações sem avisar por cada pico de 80%, mas deve alertar para saturação prolongada."
],
"whatForOutro": "As alterações suportadas aplicam-se <strong>na próxima análise</strong>. O Health Monitor lê <code>/usr/local/share/proxmenux/health_thresholds.json</code> em cada ciclo sem reinício. Alguns indicadores, como a temperatura dos discos, usam estes valores; certas barras de capacidade têm limites próprios. A linha RAM descreve uma exceção atual.",
"coloursTitle": "Cores dos estados Aviso e Crítico",
"coloursIntro": "Os widgets que usam Aviso/Crítico seguem os três estados abaixo. Outros indicadores, como as barras de capacidade PVE, têm limites próprios; a cor por si só não indica um alerta Health Monitor.",
"headerColour": "Cor",
"headerRange": "Intervalo",
"headerMeaning": "Significado",
"colourRows": [
{
"colour": "Verde",
"range": "valor < Aviso",
"meaning": "Intervalo normal. Não é gerado alerta."
},
{
"colour": "Âmbar",
"range": "Aviso ≤ valor < crítico",
"meaning": "Estado de aviso. O Health Monitor gera um evento WARNING; as notificações respeitam filtros e horas de silêncio."
},
{
"colour": "Vermelho",
"range": "valor ≥ Crítico",
"meaning": "Estado crítico. O Health Monitor gera um evento CRITICAL que ignora as horas de silêncio. As definições de categoria e evento do canal continuam a aplicar-se; a entrega depende também da sua disponibilidade."
}
],
"sectionsTitle": "Secções e valores predefinidos recomendados",
"sectionsIntro": "São os valores iniciais ProxMenux até serem alterados. As secções seguem <em>carga de processamento</em>, <em>temperatura</em> e <em>capacidade de armazenamento</em>, da carga atual ao espaço ocupado.",
"headerSection": "Secção",
"headerWarning": "Aviso",
"headerCritical": "Crítico",
"headerGates": "Verificação controlada",
"thresholdRows": [
{
"section": "Uso da CPU",
"warning": "85 %",
"critical": "95 %",
"gates": "Alerta de carga prolongada quando a média de CPU ultrapassa o limite no período de análise."
},
{
"section": "Memória",
"warning": "85 %",
"critical": "95 %",
"gates": "Pressão RAM do anfitrião. A definição mostra Crítico a 95%, mas o detetor atual usa uma regra fixa de 90% sustentados; alterar a definição não muda atualmente esse ramo."
},
{
"section": "Swap (apenas nível crítico)",
"warning": "—",
"critical": "80 %",
"gates": "O CRITICAL de swap exige mais de 80% de swap e menos de 15% de RAM disponível em várias medições. O swap ocupado por si só não ativa a regra."
},
{
"section": "Temperatura da CPU",
"warning": "80 °C",
"critical": "90 °C",
"gates": "Temperatura do conjunto CPU ou dos núcleos obtida de <code>lm-sensors</code>."
},
{
"section": "Temperatura do disco — HDD",
"warning": "60 °C",
"critical": "65 °C",
"gates": "Temperatura HDD. Valores iniciais: aviso a 60 °C, crítico a 65 °C. São valores de monitorização, não um limite universal do fabricante; consulte as especificações do modelo."
},
{
"section": "Temperatura do disco — SSD",
"warning": "70 °C",
"critical": "75 °C",
"gates": "SSD SATA de 2,5 polegadas ou M.2. Esta classe usa 70/75 °C por predefinição; os limites reais dependem do modelo."
},
{
"section": "Temperatura do disco — NVMe",
"warning": "80 °C",
"critical": "85 °C",
"gates": "Temperatura NVMe. Esta classe usa 80/85 °C por predefinição. A temperatura de limitação do controlador varia por modelo e nem sempre é 85 °C."
},
{
"section": "Temperatura do disco — SAS",
"warning": "55 °C",
"critical": "65 °C",
"gates": "Temperatura SAS. Esta classe usa aviso a 55 °C e crítico a 65 °C. São <em>valores de monitorização</em>, não prova de falha de refrigeração a 55 °C nem um limite universal."
},
{
"section": "Espaço em disco — máquina",
"warning": "85 %",
"critical": "95 %",
"gates": "Capacidade de <code>/</code> e de cada ponto de montagem do anfitrião (<code>/var/lib/vz</code>, <code>/mnt/*</code>…)."
},
{
"section": "Espaço em disco — LXC rootfs",
"warning": "85 %",
"critical": "95 %",
"gates": "Disco raiz por contêiner, avaliado em relação ao tamanho do rootfs do PVE."
},
{
"section": "Pontos de montagem LXC",
"warning": "85 %",
"critical": "95 %",
"gates": "Capacidade das montagens em CT ativos: mp0, mp1, NFS e bind mounts. Exclui rootfs."
},
{
"section": "Armazenamento PVE",
"warning": "85 %",
"critical": "95 %",
"gates": "Armazenamentos geridos por PVE: LVM, LVM-thin, ZFS-pool, RBD/Ceph e PBS. Nem todos são backends de blocos."
},
{
"section": "Conjunto ZFS",
"warning": "85 %",
"critical": "95 %",
"gates": "Pools ZFS do anfitrião, independentemente do registo no PVE."
}
],
"defaultsTitle": "Valores predefinidos, alterações e reposição",
"defaultsBody": "Cada secção parte dos valores predefinidos; guarda apenas as alterações desejadas. O cartão mostra o valor <em>efetivo</em>: a alteração ou o valor inicial. <strong>Repor</strong> elimina todas as alterações de todas as secções.",
"validationTitle": "Validação",
"validationBody": "Ao guardar são verificados os intervalos permitidos e rejeitado Crítico abaixo de Aviso. A interface mostra erros e o servidor valida de novo os pedidos API antes de guardar."
},
"lxcDetection": {
"heading": "Detecção de atualização LXC",
"imageAlt": "Cartão de deteção de atualizações LXC com interruptor para procurar pacotes pendentes em contentores Debian, Ubuntu e Alpine ativos",
"imageCaption": "Interruptor da análise periódica com <code>apt list --upgradable</code> / <code>apk list -u</code> nos CT ativos. Vem ligado. A opção correspondente em Notificações → Serviços aparece com a deteção ativa.",
"intro": "O interruptor entre Limites e Notificações controla a análise LXC. Ativo, consulta os gestores de pacotes dos CT em execução; Hardware mostra os resultados e alimenta <code>lxc_updates_available</code>. Desativado, para as chamadas <code>pct exec</code> e remove entradas LXC de <code>managed_installs.json</code>; <code>/api/managed-installs</code> deixa de mostrar esse estado sem esperar 24 h.",
"whatRunsTitle": "O que a análise executa",
"whatRunsIntro": "Para cada CT no estado <code>running</code> com um gestor de pacotes suportado:",
"whatRunsItems": [
"<strong>Atualidade dos metadados.</strong> Se a cache apt/apk ultrapassar <strong>24 horas</strong>, tenta <code>apt-get update -qq</code> em Debian/Ubuntu ou <code>apk update</code> em Alpine, com limite de 60 s. Se falhar, a lista usa a cache disponível e pode estar desatualizada.",
"<strong>Lista.</strong> Executa <code>apt list --upgradable</code> / <code>apk list -u</code> e obtém o número de pacotes e alguns nomes.",
"<strong>Evitar duplicados por CT.</strong> Uma impressão do total, atualizações de segurança e nomes ordenados evita avisos diários idênticos. Uma alteração relevante gera novo aviso."
],
"selfUpdateTitle": "CT atualizados fora de apt podem indicar 0",
"selfUpdateBody": "A deteção cobre apenas o gestor de pacotes do CT. Software atualizado fora de apt, como uma tarefa <code>plexupdate</code> configurada ou imagens obtidas com <code>docker pull</code>, fica fora da contagem. Zero atualizações apt não prova que todas as aplicações estejam atuais. Os pacotes do sistema base continuam a ser detetados.",
"refreshTitle": "Porquê renovar os metadados após 24 h",
"refreshBody": "Um CT ativo há muito pode ter metadados apt antigos se ninguém executar <code>apt update</code>. <code>apt list --upgradable</code> pode então omitir atualizações novas. O ProxMenux tenta renovar após 24 horas e ignora o passo com cache mais recente.",
"toggleTitle": "Opção de notificação ligada à deteção",
"toggleBody": "A opção <code>lxc_updates_available</code> por canal em <strong>Notificações → Serviços</strong> só aparece com a deteção ativa. Desativá-la oculta a linha em todos os canais. A preferência fica na base de dados e recupera o mesmo valor ao reativar.",
"purgeTitle": "O que é removido ao desativar a deteção",
"purgeBody": "Desativar remove de imediato as entradas <code>type=lxc</code> de <code>/usr/local/share/proxmenux/managed_installs.json</code>. Os contadores de atualizações LXC em Hardware desaparecem na próxima atualização. Reativar preenche o registo no próximo ciclo, ou antes por atualização manual da API."
},
"storageExclusions": {
"heading": "Exclusões de armazenamento remoto",
"imageAlt": "Cartão de exclusões de armazenamento remoto com PBS-Cloud, PBS e PBS2 e opções Estado e Alertas por linha",
"imageCaption": "Opções <em>Estado</em> e <em>Alertas</em> por armazenamento. Com ambas desligadas, deixa de contar no Health Monitor e de enviar notificações. Continua visível em Armazenamento, marcado como excluído.",
"intro": "Pode excluir armazenamentos geridos pelo Proxmox (NFS / CIFS / PBS / Ceph / iSCSI / etc.) com duas opções independentes:",
"items": [
"<strong>Estado</strong> — desligar esta opção retira o armazenamento da categoria Armazenamento do Health Monitor. Útil para volumes de arquivo normalmente desligados ou destinos remotos de cópia ligados apenas nos horários previstos.",
"<strong>Alertas</strong> — desligar impede notificações deste armazenamento pelos canais configurados, mesmo com as verificações de estado ativas. Útil para consultar o estado no painel sem receber notificações."
],
"outro": "Os armazenamentos excluídos continuam na <link>aba Armazenamento</link> com o emblema roxo <em>excluído</em>, mantendo o inventário visível. O estado fica na tabela SQLite <code>excluded_storages</code>."
},
"interfaceExclusions": {
"heading": "Exclusões de interface de rede",
"imageAlt": "Cartão de exclusões das interfaces vmbr0, vmbr1, vmbr2, bond0 e eno1 com opções Estado e Alertas por interface",
"imageCaption": "Tal como no armazenamento, cada interface tem <em>Estado</em> e <em>Alertas</em>. Cada linha mostra nome, tipo (bridge / bond / física), IP e velocidade da ligação.",
"intro": "O mesmo princípio aplica-se às interfaces: excluir cada uma das verificações de estado, das notificações ou de ambas. Exemplos habituais:",
"items": [
"Uma bridge de reserva desativada intencionalmente.",
"Uma placa de rede removida fisicamente que ainda consta em <code>/etc/network/interfaces</code>.",
"Uma subinterface VLAN usada apenas durante a manutenção.",
"Uma bridge de gestão com alterações repetidas e conhecidas do estado da ligação durante a manutenção."
],
"outro": "O estado fica na tabela SQLite <code>excluded_interfaces</code>. O emblema roxo <em>excluída</em> na <link>aba Rede</link> mantém visíveis as interfaces excluídas."
},
"notifications": {
"heading": "Notificações e IA",
"body1": "Aqui se ativam as notificações do ProxMenux Monitor e a reformulação com IA. <em>Ativar notificações</em> inicia o envio em segundo plano, regista um destino webhook Proxmox VE para integrar os seus eventos e abre os canais: Telegram, Discord, email, Gotify e outros. A reformulação com IA está numa secção avançada expansível do mesmo painel.",
"body2": "As opções são explicadas em páginas próprias: canais, controlos por evento, mensagens formatadas, nome apresentado, envio com eliminação de duplicados, intervalo, agregação e horas de silêncio, webhook PVE, fornecedores de IA e modos de instruções:",
"items": [
"<notifLink>Notificações</notifLink>: configuração dos canais (Telegram, Discord, Gotify, email e palavras-passe de aplicação Gmail / Microsoft, ntfy, Slack, Teams e webhook genérico), categorias de eventos, mensagens formatadas, nome apresentado, envio, webhook PVE, histórico e API.",
"<aiLink>Assistente de IA</aiLink>: fornecedores (OpenAI, Anthropic, Gemini, Groq, OpenRouter, Ollama), modelos, instruções predefinidas ou personalizadas, idioma de saída, detalhe por canal e sugestões de IA."
]
},
"optimizations": {
"heading": "Otimizações ProxMenux",
"intro": "Inventário das otimizações pós-instalação registadas pelo ProxMenux no anfitrião. As opções de <autoLink>Pós-instalação automatizada</autoLink> e <customLink>Pós-instalação personalizável</customLink> registam a aplicação em <code>/usr/local/share/proxmenux/installed_tools.json</code>. O Monitor lê esse registo. Uma entrada não volta a verificar se todas as definições permanecem intactas.",
"imageAlt": "Cartão de otimizações ProxMenux com 14 entradas: ponto colorido, nome e versão. Inclui APT IPv4 Force, Bashrc Customization, Fastfetch, Log2ram SSD Protection, Memory Settings Optimization, Setting persistent network interfaces, System Limits Increase, APT Language Skip, Entropy Generation haveged com Legacy, Kernel Panic Configuration, Logrotate Optimization, Network Optimizations, Subscription Banner Removal e VFIO IOMMU Passthrough.",
"imageCaption": "Cada otimização mostra nome, versão e ponto colorido. No canto superior direito fica o contador laranja <em>14 ativas</em>. As ferramentas com código-fonte disponível podem ser abertas.",
"dotsTitle": "O que significam os pontos",
"dotsItems": [
"<green/> <strong>Ponto verde</strong>: otimização registada sem marca Legacy nem atualização indicada. Abra a linha se houver código-fonte disponível.",
"<amber/> <strong>Ponto âmbar e emblema <em>legacy</em></strong>: otimização registada cujo script foi renomeado ou substituído. O código preservado abre em modo Legacy com destaque âmbar. Não volta a verificar a configuração atual do anfitrião."
],
"clickTitle": "Abrir o código-fonte",
"clickBody": "Clicar mostra a função bash associada e o nome do script (<code>auto_post_install.sh</code> ou <code>customizable_post_install.sh</code>). As ferramentas atuais são extraídas dos ficheiros do anfitrião; as antigas podem usar código preservado. O realce de sintaxe e Copiar ajudam na análise. Não é uma cópia garantida do código executado na instalação.",
"detailAlt": "Janela de código de APT IPv4 Force com a função bash force_apt_ipv4 de customizable_post_install.sh versão 1.0. O código realçado configura /etc/apt/apt.conf.d/99-force-ipv4 com Acquire ForceIPv4 true, regista a ferramenta e mostra uma mensagem traduzida de configuração APT IPv4 concluída.",
"detailCaption": "Código de <em>APT IPv4 Force</em>: função <code>force_apt_ipv4()</code> de <code>customizable_post_install.sh v1.0</code>, com realce de sintaxe e cópia num clique.",
"whyTitle": "Por que isso importa?",
"whyBody": "O ProxMenux pode alterar parâmetros do kernel, repositórios, rede, rotação de registos e passthrough de GPU. Consulte as otimizações registadas antes de alterações manuais, sobretudo se outro administrador preparou o anfitrião. O cartão mostra o registo e o código disponível; não audita todas as definições atuais nem guarda um histórico exato de execução.",
"updatesTitle": "Faixa de atualizações disponíveis",
"updatesBody": "Se a versão em disco de uma otimização superar a registada no anfitrião, aparece uma faixa com o total e <strong>Aplicar</strong>. <strong>Aplicar</strong> abre o seletor, tal como <em>Aplicar atualizações disponíveis</em> no menu pós-instalação. Escolha o que atualizar: o ProxMenux volta a executar as funções e atualiza o registo. A faixa desaparece quando tudo está atualizado.",
"updatesAlt": "Cartão de otimizações ProxMenux com faixa de atualizações disponíveis, total pendente e botão Aplicar para selecionar otimizações",
"updatesCaption": "A faixa aparece se pelo menos uma otimização tiver versão mais recente em disco. Consulte <link>Aplicar atualizações disponíveis</link> para o processo completo e a opção Path-A equivalente no menu da shell.",
"revertTitle": "Reverter uma otimização",
"revertBody": "Para reverter uma otimização, use a opção correspondente em <link>Desinstalar otimizações</link> no menu ProxMenux Scripts. A desinstalação remove a entrada de <code>installed_tools.json</code>, que desaparece do cartão na próxima atualização."
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerCard": "Cartão",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"card": "Idioma da interface",
"endpoint": "localStorage",
"source": "Preferência do navegador <code>proxmenux-ui-language</code>; sem escolha guardada, usa inicialmente o idioma do navegador."
},
{
"card": "Ordem de navegação",
"endpoint": "localStorage",
"source": "Preferência do navegador <code>proxmenux-nav-order</code>; também determina a aba inicial."
},
{
"card": "Unidades de rede",
"endpoint": "/api/settings",
"source": "Guardado na tabela SQLite de definições do painel."
},
{
"card": "Durações do Health Monitor",
"endpoint": "/api/health/settings",
"source": "Duração do silenciamento por categoria na base de dados do Health Monitor."
},
{
"card": "Exclusões de armazenamento / interface",
"endpoint": "/api/storage/exclusions, /api/network/exclusions",
"source": "Tabelas de SQLite <code>excluded_storages</code> e <code>excluded_interfaces</code>."
},
{
"card": "Painel Notificações e IA",
"endpoint": "/api/notifications/*",
"source": "Consulte <notifLink>Notificações</notifLink> e <aiLink>Assistente de IA</aiLink>."
},
{
"card": "Lista de otimizações ProxMenux",
"endpoint": "/api/proxmenux/installed-tools",
"source": "Lê <code>/usr/local/share/proxmenux/installed_tools.json</code>, escrito por chamadas a <code>register_tool</code> nos scripts pós-instalação."
},
{
"card": "Janela do código de otimização",
"endpoint": "/api/proxmenux/tool-source",
"source": "Extrai a função bash associada de <code>auto_post_install.sh</code> ou <code>customizable_post_install.sh</code> no anfitrião; ferramentas antigas podem usar código preservado."
}
]
},
"whereNext": {
"heading": "Para continuar",
"items": [
{
"label": "Aba Aplicações",
"href": "/docs/monitor/dashboard/apps",
"tail": " — o lançador cuja posição se altera na ordem de navegação."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tail": " — canais, controlos por evento, ajustes por canal, histórico e envios de teste."
},
{
"label": "Assistente de IA",
"href": "/docs/monitor/ai-assistant",
"tail": " — fornecedores, modelos, modos de instruções, idiomas e detalhe por canal."
},
{
"label": "Health Monitor → Dispensar alertas e duração do silenciamento",
"href": "/docs/monitor/health-monitor#dismissing-alerts-and-the-suppression-duration",
"tail": " — como funcionam as listas de duração por categoria."
},
{
"label": "ProxMenux Scripts → Pós-instalação automatizada",
"href": "/docs/post-install/automated",
"tailRich": " e <customLink>Pós-instalação personalizável</customLink> — os scripts que registam as otimizações na lista acima."
},
{
"label": "Desinstalar otimizações",
"href": "/docs/post-install/uninstall",
"tail": " — como reverter uma otimização registada acima."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tail": " — voltar à visão geral das abas."
}
]
}
}
@@ -0,0 +1,268 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: separador Armazenamento | Documentação ProxMenux",
"description": "O separador Armazenamento reúne quatro vistas: armazenamentos Proxmox com estado, pools ZFS, discos internos com SMART e unidades USB externas. O detalhe de cada disco mostra atributos SMART, desgaste, vida útil e histórico permanente de observações."
},
"header": {
"title": "Painel: separador Armazenamento",
"description": "Todo o armazenamento do anfitrião num ecrã: NFS / CIFS / LVM / ZFS / dir Proxmox, estado dos pools ZFS, discos internos SATA/NVMe com SMART e unidades USB externas. Clique num disco para ver os atributos SMART e o histórico de observações.",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Apoiado por três fontes",
"body": "Os armazenamentos Proxmox vêm de <code>pvesm status</code>, ZFS de <code>zpool status</code>, discos de <code>lsblk</code> + <code>smartctl</code> e campos NVMe de <code>nvme</code>. O separador atualiza-se aproximadamente a cada 60 segundos; abrir o detalhe pede uma leitura SMART."
},
"thresholds": {
"title": "Cor do estado e limiares aplicados aqui",
"intro": "O Health Monitor classifica o estado como <green/> <strong>verde</strong> abaixo de Aviso, <amber/> <strong>âmbar</strong> entre Aviso e Crítico e <red/> <strong>vermelho</strong> a partir de Crítico. Seguem-se os valores predefinidos. As barras do painel podem usar outros limites visuais descritos abaixo.",
"items": [
"<strong>Capacidade</strong> (discos do anfitrião, armazenamentos PVE, pools ZFS, montagens LXC) — aviso 85%, crítico 95%.",
"<strong>Temperatura do disco</strong> — HDD 60/65 °C · SSD 70/75 °C · NVMe 80/85 °C · SAS 55/65 °C (alertar / crítico)."
],
"outro": "Cada valor é configurável por anfitrião. <link>Definições → Limites do Health Monitor</link> apresenta os valores de referência e explica como os ajustar."
},
"topRow": {
"heading": "Linha superior: resumo do armazenamento",
"intro": "Ao abrir, quatro cartões resumem capacidade total, utilização local, utilização remota e inventário de discos físicos. Dão respostas rápidas; os cartões abaixo contêm os detalhes.",
"imageAlt": "Separador Armazenamento com quatro cartões: capacidade total, utilização local, utilização remota e discos físicos",
"imageCaption": "Linha superior: capacidade total e número de discos, bytes usados localmente e remotamente e discos físicos por tipo com resumo do estado.",
"headerCard": "Cartão",
"headerWhat": "O que mostra",
"totalLabel": "Armazenamento Total",
"totalWhat": "Capacidade bruta total de todos os discos físicos. O rodapé indica quantos discos foram detetados.",
"localLabel": "Usado Localmente",
"localWhat": "Bytes usados no armazenamento local: LVM / LVM-thin / ZFS / dir nos discos do anfitrião. O valor principal mostra os bytes usados e o rodapé <em>X.XX % de Y TB</em> indica também a percentagem de ocupação.",
"remoteLabel": "Utilização remota",
"remoteWhat": "Mesmo formato da utilização local para armazenamentos remotos NFS / CIFS / PBS / Ceph / iSCSI. São contados separadamente porque as falhas locais e remotas têm efeitos distintos e estes recursos são dimensionados e monitorizados de forma diferente.",
"disksLabel": "Discos físicos",
"disksIntro": "Duas linhas de desagregação do inventário:",
"disksItems": [
"<strong>Por tipo</strong> — número de NVMe a roxo, SSD e HDD a azul. Aparecem os tipos detetados; um anfitrião apenas NVMe mostra só essa contagem.",
"<strong>Por estado</strong> — número de discos <em>normais</em> a verde, com <em>aviso</em> a amarelo e <em>críticos</em> a vermelho. Sem problemas aparece apenas «X normais»; os outros estados surgem quando há ocorrências."
]
},
"pveStorage": {
"heading": "Cartão de armazenamento Proxmox",
"intro": "Uma linha por armazenamento de <code>/etc/pve/storage.cfg</code> com tipo (<code>nfs</code> / <code>cifs</code> / <code>zfspool</code> / <code>lvm</code> / <code>lvmthin</code> / <code>dir</code> / <code>pbs</code>), nome, estado ativo/erro/não monitorizado, percentagem de uso e barra colorida:",
"items": [
"<strong>Até 75%</strong> — barra e valor azuis.",
"<strong>Acima de 75% até 90%</strong> — barra e valor amarelos. Estes limites visuais são distintos dos limites do Health Monitor.",
"<strong>> 90%</strong> — barra e valor vermelhos. Este limite visual é distinto do escalamento do Health Monitor.",
"<strong>Erro</strong> — contorno vermelho da linha se o armazenamento está configurado mas inacessível, por exemplo servidor NFS indisponível ou credenciais CIFS expiradas.",
"<strong>Excluído</strong> — contorno roxo e etiqueta «não monitorizado». Armazenamentos excluídos pelo utilizador, como volumes de arquivo mantidos desligados."
],
"calloutTitle": "Excluir um armazenamento da monitorização",
"calloutBody": "O menu de cada armazenamento permite marcá-lo como <em>excluído da monitorização</em>. A definição fica em <code>excluded_storages</code> e é aplicada pelo painel e Health Monitor: sem notificações nem efeito no estado geral."
},
"zfs": {
"heading": "Cartão ZFS Pools",
"intro": "Aparece apenas com ZFS instalado e pelo menos um pool. Cada linha mostra um pool com estado, tamanho, espaço alocado e livre e ícone de estado:",
"items": [
"<strong>ONLINE</strong> — verde. Tudo saudável.",
"<strong>DEGRADED</strong> — amarelo. O pool fornece dados, mas pelo menos um dispositivo está indisponível; é necessário tratar da substituição.",
"<strong>FAULTED</strong> / <strong>UNAVAIL</strong> / <strong>SUSPENDED</strong> — vermelho. O pool não fornece dados e exige intervenção imediata."
],
"outro": "O estado ZFS e SMART de cada disco contribui para a categoria <em>Discos e E/S</em> do <link>Health Monitor</link>."
},
"physical": {
"heading": "Discos físicos e status SMART",
"intro": "Discos internos (SATA / NVMe). Cada linha condensa os campos mais úteis num relance:",
"items": [
"<strong>Caminho do dispositivo</strong> — <code>/dev/sda</code>, <code>/dev/nvme0n1</code>.",
"<strong>Etiqueta de tipo</strong> — SATA / NVMe e respetivo ícone.",
"<strong>Etiqueta de sistema</strong> — marca laranja dos discos identificados como discos do sistema operativo. A deteção usa as montagens <code>/</code> e <code>/boot</code> e atribui <em>System</em>. A ausência da etiqueta não prova que o disco possa ser apagado ou reutilizado sem risco.",
"<strong>Modelo</strong> — fabricante e modelo de <code>smartctl -i</code>.",
"<strong>Capacidade</strong> — expressa em unidades legíveis.",
"<strong>Temperatura</strong> — valor atual em °C, com cor conforme o tipo de disco; NVMe usa limites mais altos que SATA.",
"<strong>Estado SMART</strong> — aprovado / falhou / desconhecido.",
"<strong>Etiqueta de observações</strong> — se o histórico permanente <code>disk_observations</code> contiver entradas do disco, uma etiqueta azul indica o número, como <em>3 obs.</em>. Clique no disco para as consultar.",
"<strong>Etiqueta de estado</strong> — Saudável / Aviso / Crítico, conforme SMART e as observações recentes."
],
"clickHint": "Um clique na linha abre o detalhe do disco descrito abaixo.",
"warningTitle": "Cuidado com os discos identificados como System",
"warningBody": "Os discos com etiqueta laranja <strong>System</strong> alojam o sistema ativo. A etiqueta ajuda a identificá-los; <link>ProxMenux → Gestor de discos → Formatar / Apagar</link> recusa ações destrutivas sobre eles. Para reutilizar o disco de arranque, use um ambiente de recuperação externo ao Proxmox em execução."
},
"external": {
"heading": "Armazenamento externo (USB)",
"body": "As unidades USB têm um cartão próprio, visível quando alguma está presente. Mostra os mesmos campos dos discos internos e uma etiqueta laranja <strong>USB</strong>. Como são frequentemente ligadas apenas para cópias ou transferências ocasionais, as observações são conservadas, mas os erros de E/S de unidades USB desligadas não são escalados."
},
"drillIn": {
"heading": "Diálogo de detalhe do disco",
"intro": "Clique num disco para abrir quatro separadores: <strong>Visão geral</strong> · <strong>SMART</strong> · <strong>Histórico</strong> · <strong>Agendamento</strong>. O cabeçalho mostra caminho, modelo, capacidade e, se aplicável, a etiqueta laranja <em>System</em>.",
"overviewTitle": "Separador 1 — Visão geral",
"overviewImageAlt": "Detalhe do disco, separador Visão geral com estado, indicador circular de desgaste e vida útil e atributos SMART principais",
"overviewImageCaption": "Visão geral: identificação, estado, vida restante com desgaste atual e dados escritos e atributos SMART principais.",
"overviewIntro": "Separador inicial para consultar o estado do disco sem executar um teste. Três blocos:",
"overviewItems": [
"<strong>Identificação</strong> — modelo, número de série, capacidade e estado Saudável / Aviso / Crítico.",
"<strong>Desgaste e vida útil</strong> — anel da vida restante (97%, 50%, …) com atributo de origem (<em>Media Wearout Indicator</em>, <em>Percentage Used</em>, …), barra da percentagem consumida, projeção <em>Vida estimada</em> em anos e total de dados escritos. NVMe mostra também <em>Available Spare</em>.",
"<strong>Atributos SMART</strong>: os valores principais são apresentados em duas colunas: temperatura, horas de funcionamento com uma duração legível como <em>3 anos e 116 dias</em>, velocidade de rotação ou <em>SSD</em>, ciclos de ligação, estado SMART, setores realocados, setores pendentes e erros CRC. A tabela completa dos atributos encontra-se no separador SMART."
],
"smartTitle": "Separador 2 — SMART",
"smartImageAlt": "Detalhe do disco, separador SMART com testes curto e alargado, último resultado e tabela completa de atributos",
"smartImageCaption": "Separador SMART: execute testes curtos ou alargados, consulte o último resultado e todos os atributos e abra o relatório completo para imprimir ou guardar como PDF.",
"smartIntro": "Ações disponíveis em três secções:",
"smartItems": [
"<strong>Executar teste SMART</strong> — dois botões. <em>Teste curto (~2 min)</em> espera pelo resultado e mostra-o no diálogo. <em>Teste alargado (segundo plano)</em> pode demorar horas em discos grandes, continua no servidor e avisa ao terminar.",
"<strong>Último teste</strong> — tipo, estado (<em>aprovado</em> / <em>falhou</em>) e data e hora da última execução.",
"<strong>Atributos SMART</strong> — tabela completa com ID, nome, valor, pior valor e estado normal, aviso ou crítico. SATA/SAS mostra a lista numerada. NVMe usa <code>nvme smart-log</code>: temperatura, reserva disponível, percentagem usada, unidades lidas/escritas, leituras/escritas do anfitrião, tempo de ocupação do controlador, ciclos de ligação, encerramentos inseguros, erros do suporte, entradas do registo de erros e tempo de temperatura composta em aviso/crítico."
],
"pdfTitle": "Ver relatório SMART completo (PDF)",
"pdfIntro": "No fim de SMART, <strong>Ver relatório SMART completo</strong> abre um relatório imprimível. Use o diálogo de impressão do navegador para o guardar como PDF, arquivar ou partilhar com o suporte num RMA.",
"pdfPreviewAlt": "Primeira página do relatório SMART com resumo executivo, indicador PASSED e informações do disco",
"pdfPreviewCaption": "Primeira página: resumo, indicador PASSED e informações completas do disco. O PDF de exemplo inclui desgaste SSD, todos os atributos SMART e histórico de testes.",
"pdfDownloadLabel": "Transferir relatório SMART de exemplo (PDF)",
"pdfSectionsIntro": "O relatório tem seis secções principais:",
"pdfSections": [
"<strong>Resumo executivo</strong> — estado PASSED/FAILED, avaliação clara do disco — saudável, com desgaste ou a falhar — e quatro dados: data do relatório, último tipo de teste, resultado e atributos verificados.",
"<strong>Informações do disco</strong> — modelo, série, capacidade, tipo HDD/SSD/NVMe, família, formato, interface (SATA 3.3 · 6.0 Gb/s, …), TRIM, temperatura e limite ideal, horas e ciclos de funcionamento, SMART, setores pendentes/realocados e erros CRC.",
"<strong>Desgaste e vida útil SSD</strong> (apenas SSD/NVMe) — vida restante, atributo de origem, desgaste atual, dados escritos e horas de funcionamento.",
"<strong>Atributos SMART completos</strong> — ID, nome, valor, pior valor, limite, valor bruto e estado de cada atributo. Os principais — Reallocated Sector Ct, Power On Hours, Reported Uncorrect, UDMA CRC Error Count, Media Wearout Indicator, … — têm uma breve explicação sob a linha.",
"<strong>Último autoteste e histórico completo</strong> — último teste com tipo, resultado, mensagem final e horas de funcionamento nessa altura, mais tabela numerada de todos os testes guardados.",
"<strong>Recomendações</strong> — ações conforme o resultado. Para discos saudáveis: <em>disco saudável / testes periódicos / estratégia de cópias</em>. Se os atributos saírem dos limites, surgem orientações de substituição."
],
"pdfOutro": "O navegador cria o relatório imprimível; Imprimir e Guardar como PDF abrem o diálogo de impressão. Escolha um nome como <code>SMART-&lt;short-id&gt;.pdf</code>. Conserve cópias datadas para comparar alterações ou partilhar com o suporte.",
"historyTitle": "Separador 3 — Histórico",
"historyImageAlt": "Detalhe do disco, separador Histórico com testes SMART anteriores e ações de transferência e eliminação",
"historyImageCaption": "Histórico SMART do disco. Cada linha mostra tipo, data e hora, antiguidade, marca do último teste e ações de transferência da saída <code>smartctl</code> e eliminação.",
"historyIntro": "Testes curtos e alargados concluídos e guardados para o disco. Cada entrada contém a saída original <code>smartctl</code> e os campos interpretados pelo Monitor para o painel. Ações por linha:",
"historyItems": [
"<strong>Transferir</strong> — guarda a cópia JSON com os dados <code>smartctl -a</code> usados pelo relatório. Útil se o suporte pedir os campos de diagnóstico originais.",
"<strong>Eliminar</strong> — remove manualmente um teste do histórico. A retenção em Agendamento (<em>últimos 5 / 10 / 20</em>) elimina automaticamente os mais antigos."
],
"scheduleTitle": "Separador 4 — Agendamento",
"scheduleImageAlt": "Detalhe do disco, separador Agendamento com interruptor de testes SMART automáticos, lista de horários e botão Adicionar agendamento",
"scheduleImageCaption": "Agendamento: escolha tipo, frequência e retenção; o Monitor configura <code>cron</code> para executar os testes automaticamente.",
"scheduleIntro": "Testes SMART automáticos através de cron, sem terminal. Três áreas:",
"scheduleItems": [
"<strong>Testes SMART automáticos</strong> — interruptor geral de todos os horários do disco. Permite suspendê-los durante a manutenção sem apagar a configuração.",
"<strong>Agendamentos configurados</strong> — uma linha por horário com tipo (<em>curto</em> / <em>longo</em>), expressão cron legível (<em>«Dia 1 do mês às 03:00»</em>, <em>«Todos os domingos às 02:00»</em>), discos abrangidos e retenção.",
"<strong>Adicionar / Editar agendamento</strong> — tipo (<em>curto ~2 min</em> / <em>longo 1–4 h</em>), frequência (<em>diária / semanal / mensal</em>), dia do mês ou semana, hora e resultados guardados (<em>últimos 5 / 10 / 20</em>)."
],
"scheduleOutro": "O horário cria uma entrada cron no anfitrião que chama o Monitor. Os resultados ficam no histórico SMART do separador 3 e a retenção elimina automaticamente os mais antigos quando termina um novo teste.",
"tempTitle": "Diálogo do histórico de temperatura",
"tempIntro": "O Monitor recolhe periodicamente as leituras dos discos com sensor de temperatura e guarda-as num histórico local. O valor atual aparece na Visão geral; um clique abre o histórico de temperatura.",
"tempImageAlt": "Histórico de temperatura com caminho e modelo, períodos de 1 hora, 24 horas, 7 ou 30 dias, indicadores Atual/Mínimo/Média/Máximo e gráfico de linhas colorido conforme os limites do tipo de disco",
"tempImageCaption": "O detalhe de temperatura abre-se na Visão geral se o sensor devolver um valor diferente de zero. O gráfico usa limites HDD / SSD / NVMe / SAS.",
"tempShowsTitle": "Conteúdo do diálogo",
"tempShowsItems": [
"<strong>Seletor de período</strong>: <em>1 hora</em>, <em>24 horas</em> por predefinição, <em>7 dias</em> ou <em>30 dias</em>. Cada pedido adapta a resolução para manter o gráfico legível.",
"<strong>Quatro indicadores</strong>: <em>Atual</em>, <em>Mínimo</em>, <em>Média</em> e <em>Máximo</em> no período. <em>Atual</em> usa os limites do armazenamento e notificações para distinguir temperatura normal, elevada ou muito alta.",
"<strong>Gráfico de linhas</strong> da temperatura no tempo, com linha e área coloridas conforme o tipo de disco:"
],
"tempDiskTypes": [
"HDD — limiares normalmente mais frios.",
"SSD — limiares moderados.",
"NVMe — limiares mais elevados (NVMe corre mais quente por projeto).",
"SAS — aviso a 55 °C e crítico a 65 °C, com limite de aviso diferente do HDD."
],
"tempConfigurable": "Os quatro tipos são configurados em <em>Definições → Limites do Health Monitor</em>.",
"tempWhyTitle": "Porque o histórico é útil",
"tempWhyItems": [
"<strong>Detetar tendências.</strong> Uma leitura isolada não revela que um disco aquece há semanas, por exemplo por falhas de ventilação, pó ou calor próximo. As vistas de 7 e 30 dias mostram a evolução.",
"<strong>Relacionar picos.</strong> Se uma cópia ou reconstrução ultrapassou brevemente o limite, as vistas de 1 e 24 horas mostram se o pico foi isolado ou recorrente.",
"<strong>Ajustar limites.</strong> Antes de os alterar em <em>Definições → Limites do Health Monitor</em>, consulte o gráfico de 30 dias para conhecer o intervalo real de funcionamento do disco."
],
"obsTitle": "Histórico de observações nos separadores",
"obsIntro": "As falhas podem desenvolver-se gradualmente. Um disco pode indicar SMART <strong>PASSED</strong> e registar erros de leitura em dmesg, perder ligações SATA ou mostrar setores pendentes intermitentes. O ProxMenux conserva estes <em>sinais</em> e mostra-os no diálogo junto do estado SMART atual.",
"obsImageAlt": "Visão geral de um disco com SMART aprovado e zero setores realocados/pendentes e erros CRC, mas uma observação de erro E/S com mensagem original do kernel, explicação ATA, primeira e última data e contagem",
"obsImageCaption": "Um disco que <strong>passa no SMART</strong> pode ter observações anteriores. O cartão acrescenta o histórico dos sinais ao estado atual.",
"obsWhatTitle": "O que é uma observação",
"obsWhatIntro": "O ProxMenux regista como <strong>observação</strong> os eventos de disco do registo do kernel, dmesg ou SMART demasiado específicos para uma notificação isolada. Cada linha mostra:",
"obsWhatItems": [
"<strong>Tipo</strong> — erro E/S, SMART, sistema de ficheiros, pool ZFS ou ligação.",
"<strong>Mensagem original do kernel</strong> de dmesg, para copiar para um motor de pesquisa ou pedido de suporte.",
"<strong>Breve explicação</strong> dos códigos ATA conhecidos: <code>IDNF</code>, endereço de setor não encontrado, possível setor ou cabo defeituoso; <code>UNC</code>, erro de leitura irrecuperável, setor defeituoso; e outros códigos padrão.",
"<strong>Primeira e última data</strong> e <strong>número de ocorrências</strong>, agrupadas por assinatura do erro."
],
"obsWhyTitle": "Porque o ProxMenux as regista e mostra",
"obsWhyItems": [
"<strong>As falhas podem evoluir.</strong> Erros do barramento ATA, setores UNC ou erros do suporte podem aparecer antes de SMART <em>FAILED</em>. O buffer dmesg não os conserva após reiniciar; o histórico de observações conserva.",
"<strong>SMART não exclui todas as falhas.</strong> Um disco pode ter atributos verdes e apresentar problemas. As observações conservam outros sintomas, como ICRC, IDNF, reinicializações de ligações SATA ou redução de velocidade.",
"<strong>Distingue o atual do recente.</strong> O Health Monitor resolve automaticamente erros transitórios que deixam de ocorrer. O histórico permite ver dias depois, por exemplo, três erros E/S de uma noite.",
"<strong>Alimenta as notificações por níveis.</strong> disk_io usa a frequência das observações para escolher silêncio, WARNING ou CRITICAL numa janela móvel de 24 horas introduzida em 1.2.1.2."
],
"obsDedupTitle": "Agrupamento de duplicados e novos avisos",
"obsDedupBody1": "As observações são agrupadas por <strong>assinatura</strong>, uma impressão estável do tipo de erro, dispositivo e campos-chave da mensagem. As repetições aumentam <code>occurrence_count</code> na linha existente. Uma <strong>assinatura diferente</strong> cria outra observação e conta como novo evento para as notificações.",
"obsDedupBody2": "Para evitar avisos em cascata, a primeira combinação de disco, assinatura e gravidade notifica o operador. A mesma combinação espera 24 horas antes de novo aviso, mesmo que a contagem aumente. A passagem de WARNING para CRITICAL interrompe a espera e avisa do agravamento.",
"obsDismissTitle": "Histórico permanente e erros ativos",
"obsDismissBody1": "As observações não podem ser descartadas, ocultadas ou apagadas. Cada assinatura tem um cartão; uma repetição aumenta a contagem e atualiza a última data. O histórico segue o número de série: outro disco começa vazio mesmo na mesma porta e uma mudança de nome pelo kernel conserva o histórico.",
"obsDismissBody2": "Resolver ou descartar um erro ativo no Health Monitor não altera as observações. Permanecem após a resolução automática, para que um aviso transitório da semana passada continue visível. Consulte <link>Health Monitor</link> para gerir os erros ativos."
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerSection": "Secção da página",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"section": "Cartões de resumo superiores",
"endpoint": "/api/storage/summary",
"source": "Agregado de <code>lsblk</code>, <code>zpool list</code>, <code>vgs</code> / <code>lvs</code>."
},
{
"section": "Inventário por disco",
"endpoint": "/api/storage",
"source": "<code>lsblk -O</code> + <code>smartctl -i</code> por dispositivo, com cache de identidade limpa nos eventos hotplug."
},
{
"section": "Armazenamentos Proxmox",
"endpoint": "/api/proxmox-storage",
"source": "<code>pvesh get /nodes/&lt;node&gt;/storage</code> com o estado ativo/online de cada um."
},
{
"section": "Valores SMART atuais",
"endpoint": "/api/storage/smart/<disk>",
"source": "<code>smartctl -A &lt;dev&gt;</code> é uma consulta disponível; o endpoint de detalhe usa também JSON SMART completo e dados específicos NVMe."
},
{
"section": "Histórico de autotestes SMART",
"endpoint": "/api/storage/smart/<disk>/history",
"source": "Guardado em <code>/usr/local/share/proxmenux/smart/&lt;disk&gt;/</code> como cópias JSON."
},
{
"section": "Observações permanentes",
"endpoint": "/api/storage/observations",
"source": "Tabela SQLite atualizada pelo Health Monitor a cada ciclo e conservada após resolver os erros ativos."
}
],
"outro": "Verificando a cadeia de coleta na máquina:",
"codeComment1": "# Obter o estado atual a partir de um script",
"codeComment2": "# Comparar os dados do painel com os do sistema operativo"
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tail": " — categoria Discos e E/S e regras de supressão."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — endpoints de armazenamento e SMART."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tailRich": " — ações posteriores desencadeadas por <code>disk_io_error</code>, <code>storage_unavailable</code> e <code>smart_test_failed</code>."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tail": " — as outras páginas."
},
{
"label": "ProxMenux → Gestor de discos",
"href": "/docs/disk-manager",
"tail": " — ações TUI: formatar, apagar, executar testes SMART e importar discos para VM ou contentores."
},
{
"label": "ProxMenux → Estado e testes SMART do disco",
"href": "/docs/disk-manager/smart-disk-test",
"tail": " — equivalente CLI: agendar testes SMART, exportar o JSON apresentado e consultar os tipos de teste e a sua interpretação."
}
]
}
}
@@ -0,0 +1,120 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: Registos do sistema | Documentação ProxMenux",
"description": "A guia System Logs consolida três fontes em uma tela: ao vivo journalctl com filtros e download, histórico de tarefas Proxmox (UPIDs) e registro de notificações — todos pesquisáveis, filtrados por intervalo de gravidade/tempo, e baixados como pacotes de texto."
},
"header": {
"title": "Painel: Registos do sistema",
"description": "Três subseparadores no mesmo ecrã: journal do sistema (journalctl com filtros), histórico de tarefas do Proxmox e registo de notificações. Todos permitem pesquisar, filtrar e transferir os dados como pacotes de texto.",
"section": "ProxMenux Monitor · Painel"
},
"readOnly": {
"title": "Apenas leitura por design",
"body": "Este separador não altera ficheiros de registo. Os filtros ficam no URL ou no estado da interface; as transferências são preparadas no servidor. O painel nunca apaga entradas. Para a manutenção dos registos, utilize <code>journalctl --vacuum-time=&lt;N&gt;</code> ou <code>logrotate</code> no host."
},
"topRow": {
"heading": "Linha superior: quatro contadores",
"items": [
"<strong>Total de entradas</strong> — número de registos no intervalo do filtro ativo.",
"<strong>Erros</strong> — número de entradas com gravidade ≤ 3 (<code>err</code> / <code>crit</code> / <code>alert</code> / <code>emerg</code>).",
"<strong>Avisos</strong> — número de entradas com gravidade 4 (<code>warning</code>).",
"<strong>Cópias de segurança</strong> — número de entradas de tarefas vzdump / PBS no mesmo intervalo."
]
},
"subtabs": {
"heading": "Três subseparadores",
"logsTitle": "Registros",
"logsIntro": "O journal do sistema, obtido no servidor com <code>journalctl</code>. Filtros disponíveis na barra de ferramentas:",
"logsFilters": [
"<strong>Gravidade</strong> — emerg / alert / crit / err / warning / notice / info / debug, ou qualquer combinação.",
"<strong>Tempo de alcance</strong> — último 5 min / 15 min / 1 h / 6 h / 24 h / 7 d / custom.",
"<strong>Pesquisa livre</strong> — subcadeia ou expressão regular (<code>journalctl --grep</code>).",
"<strong>Filtro por unidade</strong> — restringe a uma unidade systemd específica (<code>pveproxy.service</code>, <code>nginx.service</code>, …)."
],
"logsRowsAfter": "Cada linha mostra a hora, o crachá de gravidade, a unidade de origem e a mensagem. Mensagens longas colapsam com uma opção \"mostrar mais\". A ação <strong>Download</strong> agrupa o filtro atual em um único arquivo <code>.txt</code> via <code>GET /api/logs/download</code> — útil quando você deseja compartilhar uma fatia de diário com alguém.",
"logDetailsModalTitle": "Janela Detalhes do registo",
"logDetailsBody": "Clicar numa linha abre <strong>Detalhes do registo</strong> com todos os campos estruturados que journald capturou para essa entrada, como ao executar <code>journalctl --output=verbose</code> no host.",
"logDetailsImageAlt": "Janela Detalhes do registo — uma entrada do journal expandida com nível, serviço, data e hora, origem, unidade systemd, ID do processo, nome do host e mensagem completa",
"logDetailsImageCaption": "Detalhes do registo — todos os campos estruturados de journald para a entrada, com a mensagem completa sem cortes no final. Útil para registos de cron e serviços quando a linha de comando executada é relevante.",
"fieldsIntro": "Campos mostrados:",
"fields": [
"<strong>Level</strong> — emblema de gravidade colorido (INFO / AVISO / ERRO / CRÍTICO).",
"<strong>Service</strong> — nome curto da unidade / processo que emitiu a entrada.",
"<strong>Timestamp</strong> — data e hora completas da linha de registo.",
"<strong>Source</strong> — origem da entrada (jornal, kernel, auditoria, ...).",
"<strong>Systemd Unit</strong> — a unidade <code>.service</code> / <code>.timer</code> / <code>.socket</code> real se a entrada foi associada a uma.",
"<strong>Process ID</strong> — PID do processo de emissão.",
"<strong>Hostname</strong> — útil quando os periódicos são encaminhados através de nós de cluster.",
"<strong>Mensagem</strong> — mensagem completa sem cortes, num bloco monoespaçado pronto a copiar."
],
"maxLevelStoreTitle": "Journald MaxLevelStore",
"maxLevelStoreBody": "Numa instalação nova do Proxmox, journald utiliza por predefinição <code>MaxLevelStore=warning</code>, que descarta mensagens info. O Monitor deteta isto no arranque e acrescenta um ficheiro de configuração complementar (<code>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</code>) com o limiar <code>info</code>, para guardar mensagens informativas e mais graves. Isto não inclui debug.",
"backupsTitle": "Cópias de segurança",
"backupsBody": "Histórico de tarefas do Proxmox limitado às cópias de segurança. Uma linha por tarefa (<code>vzdump</code>, transferências PBS, recolha de dados não utilizados e verificação), com estado (OK / WARNINGS / ERROR), sistema convidado envolvido, armazenamento de origem, duração e UPID. Clique numa linha para carregar o registo completo através de <code>GET /api/task-log/&lt;upid&gt;</code>: os mesmos dados de <em>Datacenter → Tasks</em>, limitados às cópias de segurança.",
"notificationsTitle": "Notificações",
"notificationsBody1": "Todas as notificações enviadas pelo Monitor: Telegram, Discord, e-mail, Gotify, ntfy, Slack, Teams e webhook. Cada linha mostra data e hora, canal, tipo de evento, gravidade, título e corpo gerados e, se a IA estiver ativa, um controlo para comparar a sua reformulação com o original.",
"notificationsBody2": "Utilize este separador para verificar se um canal entrega notificações e comparar a reformulação da IA com o modelo de base. Os canais configuram-se na página detalhada <link>Notificações</link>."
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerSubtab": "Subseparador",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"subtab": "Registos (filtro em direto)",
"endpoint": "/api/logs",
"source": "<code>journalctl --output json --since &lt;range&gt;</code> com filtros de gravidade, unidade e pesquisa aplicados no servidor."
},
{
"subtab": "Transferir",
"endpoint": "/api/logs/download",
"source": "A mesma consulta, devolvida como texto simples para grep / less."
},
{
"subtab": "Cópias de segurança",
"endpoint": "/api/backups",
"source": "Histórico de tarefas PVE filtrado por <code>vzdump</code>, transferências PBS, recolha de dados não utilizados e verificação."
},
{
"subtab": "Detalhes de uma tarefa de cópia de segurança",
"endpoint": "/api/task-log/&lt;upid&gt;",
"source": "Registo completo da tarefa em texto simples, lido de <code>/var/log/pve/tasks/&lt;index&gt;/&lt;upid&gt;</code>."
},
{
"subtab": "Histórico de notificações",
"endpoint": "/api/notifications/history",
"source": "Tabela SQLite <code>notification_history</code> alimentada pelo ciclo de envio."
}
],
"apiIntro": "O filtro em direto e as transferências também estão acessíveis através da API:",
"codeComment1": "# Erros e eventos mais graves da última hora com uma palavra-chave",
"codeComment2": "# Transfira o journal completo das últimas 6 horas como texto simples",
"codeComment3": "# Procure o resultado completo de uma tarefa específica por UPID"
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tail": " — a categoria Registos do sistema, que deteta padrões persistentes, picos e cascatas."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tail": " — a monitorização do journal lê a mesma origem e transforma correspondências em notificações."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — os endpoints logs e task-log com os respetivos parâmetros de consulta."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tail": " — os outros separadores."
}
]
}
}
@@ -0,0 +1,177 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: Visão geral do sistema | Documentação ProxMenux",
"description": "O separador inicial predefinido do ProxMenux Monitor: quatro cartões (CPU, memória, VM e LXC ativos, temperatura) com atualização em direto e minigráfico de tendência, gráfico histórico e resumos de armazenamento e rede ligados aos respetivos separadores."
},
"header": {
"title": "Painel: Página Visão geral do sistema",
"description": "O separador aberto por predefinição: quatro cartões de métricas em direto no topo, gráfico histórico no centro e resumos de armazenamento e rede em baixo, com as mesmas API dos separadores dedicados.",
"section": "ProxMenux Monitor · Painel"
},
"readOnly": {
"title": "Um instantâneo somente de leitura",
"body": "Todos os painéis deste separador são informativos. As ações ficam nos separadores ligados: Armazenamento para gerir discos, VMs e LXCs para iniciar ou parar sistemas convidados e Segurança para configurar a autenticação."
},
"captureAlt": "Página Visão geral do sistema — quatro placas métricas (CPU, memória, VMs ativos, temperatura), gráfico de métricas de nós e placas de resumo de armazenamento / rede",
"captureCaption": "Visão geral do sistema, o separador inicial predefinido. Os quatro cartões atualizam em direto, o gráfico mostra o histórico e os dois cartões inferiores resumem armazenamento e rede.",
"topRow": {
"heading": "Linha superior: cartões de métricas em direto",
"intro": "Quatro cartões em grelha 2×2 no telemóvel e numa linha no computador. Cada um atualiza a partir de <code>/api/system</code> a cada poucos segundos.",
"headerCard": "Cartão",
"headerWhat": "O que mostra",
"headerSource": "Origem",
"rows": [
{
"card": "Uso da CPU",
"what": "Percentagem atual com barra de progresso. Atualiza a cada ~1 s através do amostrador de sinais vitais.",
"source": "psutil.cpu_percent()"
},
{
"card": "Uso de memória",
"what": "GB utilizados, percentagem e GB totais. A barra representa a percentagem.",
"source": "psutil.virtual_memory()"
},
{
"card": "VM ativa e LXC",
"what": "Número de sistemas convidados em execução, com distribuição Em execução / Parados e totais de VM e LXC no rodapé.",
"source": "/api/vms (consolidado)"
},
{
"card": "Temperatura",
"what": "Temperatura CPU em °C com estado (baixa / moderada / alta) e minigráfico dos últimos 5 minutos no fundo. Mostra <em>N/A</em> sem sensor. Clique para abrir os detalhes.",
"source": "sensors / coretemp"
}
],
"thresholdsTitle": "Cor do estado e limiares aplicados aqui",
"thresholdsIntro": "Anéis, barras e minigráficos usam a mesma escala: <green/> <strong>verde</strong> abaixo de Aviso, <amber/> <strong>âmbar</strong> entre Aviso e Crítico, <red/> <strong>vermelho</strong> a partir de Crítico. Valores recomendados incluídos no ProxMenux:",
"thresholdsItems": [
"<strong>Utilização CPU</strong> — aviso 85 %, crítico 95 %.",
"<strong>Memória</strong> — aviso 85 %, crítico 95 %. O swap também ativa Crítico a 5 % de utilização; um host Proxmox saudável deverá utilizá-lo raramente.",
"<strong>Temperatura CPU</strong> — aviso 80 °C, crítico 90 °C."
],
"thresholdsOutro": "Os valores são configuráveis por host. <link>Definições → Limiares do monitor de saúde</link> centraliza os ajustes e explica como os adaptar.",
"sparklineTitle": "O minigráfico mostra a tendência",
"sparklineBody": "A placa de temperatura desenha um traço de 5 minutos abaixo do valor, com a cor da linha e gradiente seguindo o mesmo par Aviso/Crítica documentado acima. É a maneira mais rápida de ver se o hospedeiro está em uma subida térmica sem abrir o modal detalhe."
},
"processes": {
"heading": "Principais processos por CPU / Memória",
"intro": "Os cartões Utilização CPU e Memória abrem uma lista ordenável dos 25 processos principais: por utilização CPU no primeiro caso e por memória residente no segundo.",
"listTitle": "A janela da lista",
"listItems": [
"<strong>Atualização automática</strong> — a lista atualiza a cada 5 segundos enquanto a janela está aberta e deixa de consultar ao fechar.",
"<strong>Filtro</strong> — a pesquisa limita a lista por comando, utilizador ou PID.",
"<strong>Barra inline</strong> — a coluna métrica primária desenha uma barra pequena escalonada para o valor mais alto da lista filtrada, então a classificação permanece visível mesmo quando nenhum processo está perto de 100 %.",
"<strong>Disposição móvel</strong> — abaixo de 640 px, PID e Utilizador ficam ocultos, para Comando, CPU % e Memória caberem sem deslocamento horizontal."
],
"captureListAlt": "Janela de processos por memória — tabela ordenada por RSS com PID, utilizador, comando, CPU % e memória",
"captureListCaption": "O cartão de memória abre a lista ordenada pelo RSS (acento indigo). O cartão CPU abre a mesma lista ordenada pelo uso de CPU (acento azul).",
"detailTitle": "Detalhes de cada processo",
"detailIntro": "Clique numa linha para abrir uma segunda janela com os dados em direto do processo, organizados em quatro secções:",
"detailItems": [
"<strong>Visão geral</strong> — estado, processo pai, número de threads, descritores de ficheiros abertos, utilizador e grupo.",
"<strong>Recursos</strong> — CPU %, memória %, memória residente (RSS), tamanho virtual, swap e totais de E/S de leitura e escrita.",
"<strong>Comando</strong> — nome curto, linha de comando completa, caminho do executável e diretório de trabalho.",
"<strong>Duração</strong> — data e hora de início e tempo de execução decorrido."
],
"detailRefresh": "Os detalhes atualizam a cada 3 segundos. Quando o processo termina, as consultas param e aparece o aviso âmbar <em>Este processo terminou</em>. O último estado capturado mantém-se visível, atenuado, para consultar o que acontecia antes do fim.",
"captureDetailAlt": "Detalhes do processo — Visão geral, Recursos, Comando e Duração para um PID",
"captureDetailCaption": "A janela de detalhes por processo foi aberta a partir de uma linha da lista. A cor do acento corresponde ao cartão que o abriu (azul para CPU, indigo para Memória)."
},
"middle": {
"heading": "Centro: gráficos de métricas do nó",
"body1": "Sob os cartões, <code>NodeMetricsCharts</code> apresenta históricos de CPU, memória e E/S de disco do armazenamento RRD do Proxmox através de <code>/api/node/metrics</code>. O seletor oferece <em>1 hora / 24 horas / 7 dias / 30 dias / 1 ano</em>. A resolução diminui em períodos maiores para manter o gráfico fluido.",
"body2": "Os mesmos gráficos da interface web do Proxmox para um nó, integrados no tema escuro do Monitor e alinhados com os outros painéis."
},
"bottom": {
"heading": "Linha inferior: Resumos de armazenamento e rede",
"storageTitle": "Cartão de visão geral do armazenamento",
"storageIntro": "Vista compacta do estado do armazenamento do host, dividida em três blocos:",
"storageItems": [
"<strong>Capacidade total do nó</strong> — soma dos armazenamentos VM/LXC e do armazenamento local do sistema, com barra em gradiente do espaço utilizado e livre.",
"<strong>Capacidade total / Discos físicos</strong> — capacidade bruta e número de discos físicos detetados.",
"<strong>Armazenamento VM/LXC</strong> — espaço utilizado, livre e percentagem dos armazenamentos dos sistemas convidados, com contagem quando há mais de um.",
"<strong>Armazenamento local (sistema)</strong> — ponto de montagem raiz ou de sistema do host, separado do pool dos sistemas convidados."
],
"storageDrillIn": "Os detalhes estão no <link>separador Armazenamento</link>: SMART por disco, pools ZFS, histórico de observações, etc.",
"networkTitle": "Cartão Visão Geral da Rede",
"networkBody1": "A linha superior mostra a contagem de interfaces ativas (física + pontes combinadas). Abaixo disso, duas fileiras de crachás coloridos para as interfaces que são <code>up</code> — NICs físicos em azul, pontes em uma cor secundária. Um seletor de tempo no topo direito (1 hora / 24 horas / 7 dias / 30 dias / 1 ano) controla um pequeno gráfico de tráfego RX / TX.",
"networkBody2": "Os detalhes por interface (IP/MAC, gráfico RRD, membros da bridge, modo bond, etc.) estão no <link>separador Rede</link>."
},
"refresh": {
"heading": "Modelo de atualização",
"intro": "Cada painel gere o seu estado de carregamento (<code>loadingStates.cpu</code>, <code>loadingStates.storage</code>, …), para que uma origem lenta não bloqueie as outras. Enquanto carrega mostra um marcador pulsante. As falhas são tratadas sem bloquear a vista: sem sensor de temperatura, o cartão mostra <em>N/A</em> em vez de um erro.",
"items": [
"<strong>Cartões superiores</strong> — atualização a cada ~5 s. CPU e temperatura também recebem dados a cada segundo do amostrador de sinais vitais.",
"<strong>Gráfico de métricas do nó</strong> — carrega ao abrir e ao mudar o período ou idioma. Se necessário, volta a tentar após 60 s.",
"<strong>Cartão de armazenamento</strong> — atualização a cada ~60 s. Os dados SMART ficam em cache mais tempo; o separador Armazenamento pede uma nova leitura quando necessário.",
"<strong>Cartão de rede</strong> — resumo a cada 59 s e gráfico de tráfego a cada 60 s no período ativo.",
"<strong>Atualização manual</strong> — o botão Atualizar no cabeçalho volta a carregar todos os painéis imediatamente."
]
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerCard": "Cartão",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"card": "Indicador de estado do cabeçalho",
"endpoint": "/api/health",
"source": "O estado geral em cache produzido pelo Health Monitor cada ciclo."
},
{
"card": "CPU / RAM / Swap / Tempo de atividade",
"endpoint": "/api/system",
"source": "<code>/proc/stat</code>, <code>/proc/meminfo</code>, <code>/proc/uptime</code> com amostragem de CPU de janela curta."
},
{
"card": "Informações da máquina (kernel, BIOS, distro)",
"endpoint": "/api/info",
"source": "<code>uname -a</code>, <code>dmidecode</code>, versão PVE. Cache por processo."
},
{
"card": "Cartões de armazenamento / rede / VMs",
"endpoint": "/api/storage/summary, /api/network/summary, /api/vms",
"source": "Consulte os separadores dedicados. Os cartões do cabeçalho apresentam uma vista compacta dos mesmos endpoints."
},
{
"card": "Frequência de atualização",
"endpoint": "—",
"source": "Sistema a cada 5 s; armazenamento, VM e resumo de rede a cada 59 s. O botão Atualizar no cabeçalho recarrega todos os painéis imediatamente."
}
],
"codeComment1": "# Chamada que alimenta o indicador de estado do cabeçalho",
"codeComment2": "# público, sem token",
"codeComment3": "# Instantâneo autenticado utilizado pelos cartões"
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tail": " — a janela do indicador de estado do cabeçalho: dez categorias, avisos dispensados e supressão."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — endpoints system, info e health."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tail": " — como os mesmos estados se transformam em mensagens Telegram / Discord / Email."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tail": " — os restantes separadores do painel de relance."
},
{
"label": "Arquitetura",
"href": "/docs/monitor/architecture",
"tail": " — as threads em segundo plano e as API que alimentam esta vista."
}
]
}
}
@@ -0,0 +1,174 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: Terminal | Documentação ProxMenux",
"description": "Shell do host Proxmox no navegador: até 4 terminais em grelha, botões de teclado para dispositivos móveis (ESC, TAB, setas, combinações Ctrl), guia de comandos integrado com cheat.sh e proteção JWT."
},
"header": {
"title": "Painel: Terminal",
"description": "Uma sessão shell real no host Proxmox através do navegador. Até quatro terminais em simultâneo, botões de teclado para dispositivos móveis e guia de comandos integrado, com o mesmo tema do resto do painel.",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Um PTY real no navegador",
"body": "O terminal cria um PTY no servidor através de <code>flask_terminal_routes</code>, liga-o por WebSocket a <code>xterm.js</code> no navegador e executa-se como <code>root</code>, o utilizador da unidade systemd. Como em <code>ssh root@&lt;host&gt;</code>, pode utilizar <code>vim</code>, <code>tmux</code>, ferramentas ncurses e as CLI Proxmox (<code>qm</code>, <code>pct</code>, <code>pvesh</code>, <code>pvecm</code>). Cada PTY exporta <code>PROXMENUX_TERMINAL=monitor</code>. Todos os processos filhos <code>bash</code>, incluindo um arranque posterior de <code>menu</code>, herdam a variável para reconhecer o terminal do Monitor."
},
"singleAlt": "Página do Terminal ProxMenux Monitor — sessão de terminal único mostrando o resumo do sistema Fastfetch no login",
"singleCaption": "Um terminal da máquina aberto — a barra de ferramentas acima mostra a contagem (<em>1 / 4 terminais</em>), <em>+ Novo</em>, <em>Procurar</em>, <em>Limpar</em> e <em>Fechar</em>. Os ajudantes de teclado móveis aparecem sob o terminal em dispositivos de toque.",
"target": {
"heading": "Alvo da conexão",
"body1": "A aba Terminal abre uma shell no próprio host <strong>Proxmox</strong> — o mesmo login que você teria sobre o SSH. Cada aba abre um novo terminal de host.",
"body2": "Para chegar a um container <strong>LXC</strong> do navegador, use o botão dedicado <em>Console</em> em cada cartão CT em execução na aba <link>VMs & LXCs</link>. Ele abre um modal que executa <code>pct enter &lt;vmid&gt;</code> e reutiliza a mesma barra de ferramentas amigável para dispositivos móveis descrita abaixo."
},
"menuGuard": {
"heading": "Proteção da atualização de menu neste terminal",
"body1": "Após confirmação, <code>menu</code> substitui a sua árvore de scripts e volta a carregar. Isto funciona por SSH ou consola Proxmox, mas no navegador fecharia o PTY da shell e interromperia o WebSocket. Para o evitar, <code>check_updates_stable</code>, <code>check_updates_beta</code> e <code>apply_release_channel</code> leem <code>PROXMENUX_TERMINAL</code> e detetam o contexto Monitor.",
"body2": "O diálogo sim/não é então substituído por uma mensagem com o comando oficial do instalador: <code>bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"</code> para stable e o URL equivalente de <code>install_proxmenux_beta.sh</code> para beta. Execute a atualização por SSH ou consola do host Proxmox; o terminal do navegador serve apenas para ler e confirmar a mensagem."
},
"fourTerminals": {
"heading": "Até quatro terminais ao mesmo tempo",
"intro": "A página permite- lhe abrir quatro terminais da máquina simultaneamente. Cada um tem o seu próprio PTY e o seu próprio WebSocket — são sessões totalmente independentes. Dois layouts alternam com os ícones ao lado do botão \"Novo\":",
"items": [
"<strong>Vista por separadores</strong> — um terminal visível, os outros como separadores com nome no topo (<em>Terminal 1</em>, <em>Terminal 2</em>…). Útil para uma tarefa, mantendo as outras em segundo plano.",
"<strong>Vista em grelha</strong> — todos os terminais abertos numa grelha 2×2. Permite observar <code>htop</code> num, <code>iftop</code> noutro e editar num terceiro sem mudar de separador."
],
"outro": "A barra indica a contagem (<em>1/4 terminais</em>, <em>4/4 terminais</em>). <strong>+ Novo</strong> abre um separador; o pequeno <code>×</code> do cabeçalho fecha esse separador. O botão vermelho grande <strong>Fechar</strong> no topo fecha todos os terminais."
},
"gridAlt": "Página do Terminal ProxMenux Monitor — vista em grelha com quatro terminais de máquinas em execução ls, configuração de rede, iftop e o menu principal ProxMenux lado a lado",
"gridCaption": "Vista em grelha (4 / 4 terminais) — quatro PTY independentes em paralelo: listagem de diretório, <code>/etc/network/interfaces</code>, <code>iftop</code> e menu principal ProxMenux. O seletor de disposição da barra alterna entre grelha e separadores.",
"keyboard": {
"heading": "Botões de teclado para dispositivos móveis",
"intro": "Os teclados de telemóvel e tablet geralmente não incluem ESC, TAB, setas ou combinações com modificadores. São necessárias para utilizar <code>vim</code>, <code>nano</code>, <code>htop</code> ou menus TUI. Terminal apresenta uma fila de botões táteis por baixo quando o ecrã é pequeno ou o dispositivo aceita toque:",
"headerButton": "Botão",
"headerSends": "Envia",
"headerUse": "Utilização típica",
"rows": [
{
"button": "ESC",
"sends": "\\x1b",
"use": "Sair do modo de inserção em <code>vim</code>, cancelar uma janela TUI, deixar uma pesquisa."
},
{
"button": "TAB",
"sends": "\\t",
"use": "Conclusão automática de caminhos e navegação entre campos em dialog/whiptail."
},
{
"button": "↑ ↓ ← →",
"sends": "\\x1bO[ABCD]",
"use": "Histórico da shell, movimento do cursor, navegação do menu."
},
{
"button": "↵ Enter",
"sends": "\\r",
"use": "Confirmar. Alguns teclados no ecrã substituem Enter por Ir/Concluído; este botão evita ambiguidades."
},
{
"button": "Ctrl ▾",
"sends": "Lista pendente",
"useRich": true
}
],
"ctrlIntro": "Três sequências de controlo:",
"ctrlItems": [
"<code>Ctrl+C</code> — cancelar / interromper o comando em execução (<code>\\x03</code>).",
"<code>Ctrl+X</code> — sair de <code>nano</code> (<code>\\x18</code>).",
"<code>Ctrl+R</code> — pesquisa inversa no histórico bash (<code>\\x12</code>)."
],
"modalTitle": "A mesma barra na janela da consola LXC",
"modalBody": "A consola aberta em <link>VMs e LXCs → Consola</link> apresenta os mesmos botões de teclado sob a janela. Ao ligar, introduz automaticamente <code>pct enter &lt;vmid&gt;</code> para entrar diretamente no contentor."
},
"lxcAlt": "Janela de consola LXC do ProxMenux Monitor — Terminal: ubuntu (ID: 103), com a mesma barra móvel (ESC, TAB, setas, Enter, Ctrl) por baixo",
"lxcCaption": "Consola LXC aberta em <em>VMs e LXCs → Consola</em>. O cabeçalho identifica o contentor de destino (<em>Terminal: ubuntu (ID: 103)</em>) e a mesma barra tátil aparece sob o terminal.",
"search": {
"heading": "Pesquisar comandos — guia de referência integrado",
"intro": "O botão azul <strong>Pesquisar</strong> abre uma pesquisa aproximada de comandos. Escreva algumas letras de um comando Linux ou Proxmox (<code>ls</code>, <code>tar</code>, <code>qm</code>, <code>pct</code>, <code>zpool</code>, <code>systemctl</code>…) para ver exemplos com <em>Enviar para o terminal ativo</em> num toque. Assim pode consultar opções sem mudar de separador.",
"modalAlt": "Janela Pesquisar comandos do ProxMenux Monitor — pesquisa aproximada de comandos Linux e Proxmox com cheat.sh e vários exemplos de ls",
"modalCaption": "Pesquisa de <code>ls</code> — cada resultado mostra comando, descrição e uma pequena seta de envio para o terminal ativo. A origem dos dados aparece no canto inferior direito (<em>Fornecido por cheat.sh</em>).",
"aboutLabel": "Sobre o cheat.sh:",
"aboutBody": "é um guia de referência de código aberto mantido pela comunidade, com exemplos curtos e práticos para centenas de comandos Linux, ferramentas de administração e linguagens de programação. Criado para ser consultado com <code>curl cheat.sh/&lt;command&gt;</code>, também funciona no navegador. O ProxMenux Monitor encaminha as consultas por um proxy no servidor para manter a mesma origem do painel.",
"headerSource": "Origem",
"headerWhen": "Quando é usado",
"headerWhat": "O que você vê",
"onlineLabel": "(em linha)",
"onlineWhen": "Quando o host tem acesso à internet e o proxy cheat.sh responde.",
"onlineWhat": "Vários exemplos práticos por comando, com a descrição por cima. O ponto de estado no cabeçalho é <green>verde</green>.",
"fallbackLabel": "Alternativa local",
"fallbackWhen": "Quando cheat.sh é inacessível (host offline, firewall restritivo, falha de cheat.sh).",
"fallbackWhat": "Uma lista incluída de comandos Linux e Proxmox comuns. O catálogo é menor, mas sempre disponível. O ponto de estado é <red>vermelho</red>.",
"sendingNote": "<strong>Como funciona o envio</strong>: a seta junto ao resultado envia o texto para o terminal ativo (separador selecionado ou último terminal clicado na grelha). A janela fecha automaticamente para poder premir Enter."
},
"auth": {
"heading": "Autenticação",
"items": [
"O navegador pede primeiro um ticket de utilização única através de <code>POST /api/terminal/ticket</code>, com JWT no cabeçalho <code>Authorization</code>. Envia depois o ticket ao abrir o WebSocket. Expira após 5 segundos; com autenticação ativa, um ticket ausente ou inválido fecha a ligação antes de criar um PTY.",
"Se o Monitor estiver atrás de um proxy inverso, este tem de encaminhar os upgrades WebSocket. Exemplos Nginx / Caddy / Traefik na página <link>Acesso e autenticação</link>."
]
},
"clipboard": {
"heading": "Área de transferência, rolagem e redimensionamento",
"items": [
"<strong>Copiar e colar</strong> — utiliza a área de transferência do navegador. Selecione texto com rato ou trackpad e use o atalho do sistema (<code>Cmd+C</code> em macOS, <code>Ctrl+Shift+C</code> em Linux/Windows). Os ambientes Linux também permitem colar com o botão central.",
"<strong>Histórico do ecrã</strong> — deslocamento com roda ou dois dedos. xterm.js mantém em memória os últimos milhares de linhas.",
"<strong>Redimensionamento</strong> — o terminal ajusta a janela PTY quando redimensiona o painel, para apresentar corretamente <code>htop</code> e <code>vim</code>.",
"<strong>Reconexão ao voltar ao separador</strong> — mudar de aplicação no telemóvel ou tablet, sobretudo no iPad, pode cortar o WebSocket. Terminal deteta a mudança de visibilidade e volta a ligar ao regressar, com um tempo limite de 15 segundos para VPN lentas."
]
},
"disconnect": {
"heading": "Causas de desconexão",
"intro": "As causas mais comuns do fim de uma sessão e como resolver cada uma:",
"headerCause": "Causa",
"headerFix": "Solução",
"rows": [
{
"cause": "JWT da sessão expirado ao abrir ou voltar a ligar um terminal (período de 24 h).",
"fix": "Atualizar a página e iniciar sessão novamente. O terminal não foi projetado para sessões sem acompanhamento, então a vida útil do JWT corresponde ao login regular do painel."
},
{
"cause": "Tempo limite de inatividade do proxy inverso.",
"fix": "Aumente <code>proxy_read_timeout</code> no Nginx ou o equivalente no Caddy / Traefik (exemplos em Acesso e autenticação)."
},
{
"cause": "Telemóvel ou tablet em suspensão.",
"fix": "Quando o dispositivo retoma, o separador volta a ligar automaticamente (tempo limite de 15 s para ligações VPN). Se falhar, recarregue-o."
},
{
"cause": "O serviço reinicia na máquina.",
"fix": "Reiniciar <code>proxmenux-monitor.service</code> fecha todos os PTY. Abra novos terminais quando o painel terminar de recarregar."
}
]
},
"warning": {
"title": "O terminal é uma shell root no host",
"body": "O terminal herda o utilizador da unidade systemd (<code>root</code>) e tem todos os privilégios no host Proxmox. Configure utilizador, palavra-passe e 2FA em <authLink>Acesso e autenticação</authLink> antes de permitir acesso fora da rede local. Com a autenticação desativada, qualquer pessoa que alcance a porta 8008 pode abrir uma shell root sem confirmações adicionais ou credenciais SSH. Para acesso externo, utilize <gatewayLink>Secure Gateway</gatewayLink> (Tailscale) ou um proxy inverso HTTPS em vez de publicar a porta na Internet."
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Acesso e autenticação",
"href": "/docs/monitor/access-auth",
"tail": " — exemplos de proxy inverso com as linhas de upgrade WebSocket necessárias para o terminal."
},
{
"label": "Arquitetura",
"href": "/docs/monitor/architecture",
"tail": " — transporte WebSocket (HTTP via flask-sock e HTTPS / WSS via gevent)."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — endpoints WebSocket /ws/terminal e /ws/script/<sid>, com o resto da API."
},
{
"label": "Integração → Portal seguro",
"href": "/docs/monitor/integrations",
"tail": " — para aceder ao terminal fora da LAN sem expor a porta 8008."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tail": " — os outros separadores."
}
]
}
}
@@ -0,0 +1,245 @@
{
"meta": {
"title": "Separador App LXC: deteção, ligações e versões | ProxMenux",
"description": "Descubra e registre aplicativos LXC, crie links web e, opcionalmente, rastreie versões instaladas e disponíveis."
},
"header": {
"title": "Separador App LXC: deteção, ligações e versões",
"description": "Dê a cada aplicação LXC uma identidade persistente, acesso web e dados opcionais de versão sem ligar o registo às atualizações."
},
"intro": {
"p1": "A aba <strong>App</strong> registra quais aplicativos pertencem a um LXC. Um registro pode conter apenas um nome e web link, ou também incluir um detector de versão instalado e uma fonte upstream.",
"p2": "O procedimento que altera o software configura-se no <link>separador Atualizações</link>. Guardar uma aplicação nunca executa um instalador nem atualizador.",
"callout": "Registro, rastreamento de versões e atualização são três capacidades independentes. Qualquer um pode ser usado sem exigir os outros dois.",
"dashboardTitle": "Desde o registo até ao lançador Apps",
"dashboard": "Cada ligação web guardada aqui aparece também como cartão no <appsLink>separador Apps</appsLink> principal. Esta página LXC continua a ser a referência para nome, logótipo, ligações e acompanhamento de versões."
},
"overview": {
"heading": "O que um registro de aplicação pode fornecer",
"lead": "Um único registro salvo pode incluir:",
"items": [
"Um nome visível e um logótipo adaptado ao tema.",
"Um ou mais links web clicáveis construídos a partir do endereço LXC, esquema e porta salva.",
"Um detector opcional para a versão atualmente instalada dentro do LXC.",
"Uma fonte opcional GitHub, HTTP JSON ou Docker Hub para a última versão disponível.",
"Notificações de novas versões e preferências de inclusão no contador de atualizações por aplicação.",
"Uma seção correspondente na aba Atualizações, mesmo quando o rastreamento de versões está desativado."
]
},
"discovery": {
"heading": "Deteção em cache e Procurar aplicações",
"lead": "As sugestões de aplicação fazem parte do cache modal per-LXC. A varredura inicial prepara-os em segundo plano para que a abertura da aba App possa mostrar resultados em cache imediatamente.",
"items": [
"Abrir a guia Aplicativo <strong>não</strong> inicia uma nova varredura de catálogo e não consulta repetidamente o LXC.",
"<strong>Procurar aplicações</strong> executa uma nova deteção nesse LXC. Utilize após instalar software enquanto o ProxMenux já está em execução.",
"A lista anterior permanece visível enquanto a varredura explícita é executada. Novas correspondências são adicionadas quando terminar.",
"Se não houver novas correspondências, o resultado aparece junto às ações e <strong>Registar aplicação</strong> continua disponível para introdução manual.",
"Salvar, remover ou restaurar um aplicativo atualiza o mesmo cache imediatamente. Iniciando ou restaurando um LXC atualiza apenas esse hóspede através de seu evento de ciclo de vida existente."
],
"callout": "Uma sugestão não é um registo. Mantém-se só de leitura até premir <strong>Registar</strong> e guardar o formulário."
},
"registration": {
"heading": "Registar uma aplicação",
"lead": "Uma sugestão detectada e um registro manual usam o mesmo editor:",
"steps": [
"Prima <strong>Registar</strong> numa sugestão ou <strong>Registar aplicação</strong> para escolher no catálogo ou introduzir um nome personalizado.",
"Reveja o nome e logotipo propostos pelo catálogo.",
"Adicione os links da web necessários. Portas de escuta detectadas são oferecidas como atalhos, mas nenhuma é salva automaticamente.",
"Deixe <strong>Acompanhar versão disponível</strong> desativado em registos só com ligações ou ative-o e reveja o detetor da versão instalada e a origem da versão disponível.",
"Com acompanhamento ativo, utilize <strong>Testar detetor</strong> e guarde o registo.",
"Prima <strong>Concluído</strong> após editar. App e Atualizações usam o mesmo registo atualizado em cache."
]
},
"catalog": {
"heading": "Registo assistido por catálogo",
"lead": "O catálogo fornece padrões, mas o registro salvo permanece editável.",
"items": [
"Os resultados da pesquisa podem preencher o nome canônico, logotipo e portas web comuns.",
"Detectores de versão conhecidos são baseados em nomes de pacotes reais, binários, arquivos, distribuições Python, etiquetas OCI ou comandos em vez de uma suposição universal <code>/root/.app</code>.",
"As sobreposições de tempo de execução verificadas têm precedência quando uma instalação usa um caminho que difere dos metadados do instalador.",
"Marcadores Proxmox VE Helper-Scripts como <code>/root/.slug</code> continuam a ser um sinal de compatibilidade para novas instalações auxiliares, não o único detector.",
"Cada valor proposto pode ser editado antes de salvar para cobrir instaladores oficiais e instalações manuais."
]
},
"docker": {
"heading": "Como Docker LXCs são representados",
"lead": "Para um LXC cuja plataforma primária é Docker, <strong>Docker</strong> é o aplicativo registrado no nível LXC.",
"items": [
"Uma carga de trabalho containerizada como Portainer, Frigate ou Vaultwarden não é sugerida como uma aplicação nativa independente LXC.",
"Os serviços Docker em execução com portas TCP publicadas são propostos como ligações web opcionais no editor Docker.",
"Cada link sugerido mostra o serviço, porta host e porta container. Apenas os links que fornecem uma interface web devem ser salvos.",
"O logotipo Docker global é usado quando um link não tem logotipo específico. Um logotipo por-link substitui-o quando um está configurado.",
"Após o registro do Docker, o Docker Engine e as atualizações de imagem são mostradas juntos em sua seção na aba Atualizações."
],
"callout": "Esta estrutura impede que uma carga de trabalho Docker pareça um software instalado diretamente no LXC preservando links rápidos para suas interfaces."
},
"webLinks": {
"heading": "Ligações Web e logotipos",
"lead": "Os links Web funcionam com ou sem rastreamento de versões.",
"items": [
"Cada link armazena um esquema, porta, descrição opcional e URL de logotipo opcional.",
"A URL exibida usa o endereço atual já detectado para o LXC; o endereço não é duplicado em cada registro de aplicativo.",
"Um link sem seu próprio logotipo cai de volta para o logotipo de nível de aplicativo.",
"Vários links podem representar uma interface de administração, API, UI secundária ou outro endpoint do mesmo aplicativo.",
"Um aplicativo salvo somente para links também aparece nas Atualizações, onde um atualizador personalizado pode ser configurado mais tarde."
]
},
"tracking": {
"heading": "Rastreamento opcional da versão",
"lead": "O acompanhamento combina um detetor da versão instalada com uma origem opcional da versão disponível. Os dois lados são verificados separadamente.",
"colMethod": "Método de versão instalada",
"colUse": "Usar",
"detectorRows": [
{
"method": "dpkg / apk",
"use": "Lê a versão de pacotes instalada a partir de metadados de pacotes Debian, Ubuntu ou Alpine."
},
{
"method": "binary",
"use": "Executa um caminho binário absoluto ou um nome de comando com argumentos de versão."
},
{
"method": "file + regex",
"use": "Lê um arquivo real e extrai a versão com um grupo de captura."
},
{
"method": "docker label / docker exec",
"use": "Lê um rótulo de versão OCI ou executa um comando de versão dentro de um recipiente Docker."
},
{
"method": "python distribution",
"use": "Usa importlib.metadata através do interpretador Python selecionado."
},
{
"method": "command",
"use": "Executa um comando avançado de estilo argv sem uma shell e extrai a versão de sua saída."
},
{
"method": "manual",
"use": "Armazena uma versão inserida manualmente; ela deve ser alterada após atualizar o aplicativo."
},
{
"method": "OCI image",
"use": "Para contentores instalados por OCI manager Apps. Lê as versões da aplicação e da imagem no registo da instalação e compara o digest instalado com o publicado pelo registo de imagens. Não requer configuração."
}
],
"sourcesHeading": "Origens da versão disponível",
"sources": [
"<strong>GitHub repositório</strong>: última versão ou tag de um repositório público <code>owner/name</code>.",
"<strong>HTTP JSON</strong>: um endpoint público mais um caminho pontilhado como o <code>data.version</code> ou o <code>releases[0].tag_name</code>.",
"<strong>Docker Hub</strong>: tags versionadas filtradas por uma expressão regular. Uma pré-visualização ao vivo mostra etiquetas de correspondência reais antes do registro ser salvo.",
"Etiquetas móveis como <code>latest</code>, <code>stable</code> ou <code>lts</code> não contêm versão. Acompanhe essas imagens por digest nas atualizações de imagens Docker."
],
"regexHeading": "Escrever a expressão de captura",
"regexLead": "A expressão regular tem de devolver a versão no <strong>primeiro grupo de captura</strong>.",
"regexRules": [
"Coincidir com o texto emitido pelo binário, ficheiro, comando ou origem da marca seleccionado; não adivinhar um caminho genérico.",
"Escape os pontos literais como <code>\\.</code> para não corresponderem a caracteres arbitrários.",
"Permita um <code>v</code> inicial apenas se a origem o puder incluir.",
"Inclua sufixos como pré-lançamento ou revisões distro apenas quando eles são significativos para a comparação.",
"Utilize <strong>Testar detetor</strong> antes de guardar e confirme que a versão instalada apresentada corresponde ao LXC."
],
"regexExampleLead": "Captura comum de versão semântica:",
"regexExample": "v?(\\d+\\.\\d+\\.\\d+)",
"regexCallout": "Uma correspondência regex bem sucedida não é prova de que o caminho do detector está correto. O caminho ou pacote também deve existir na instalação real que está sendo registrada."
},
"updater": {
"heading": "Rastreamento e atualização de versões são independentes",
"lead": "O <link>separador Atualizações</link> cria uma secção de aplicação logo que um registo é guardado.",
"items": [
"Um registro somente de links mostra que o rastreamento de versões não está configurado, mas ainda pode receber um comando de atualização personalizado.",
"Um aplicativo com rastreamento mas sem um método executável mostra uma mensagem neutra pedindo um comando personalizado.",
"Um aplicativo com um wrapper Proxmox VE Helper-Scripts verificado pode usar esse updater integrado mesmo quando o registro começou a partir de um link da web.",
"Adicionar ou editar um updater não altera o detector ou fonte upstream armazenado na aba App."
]
},
"states": {
"heading": "Os estados da versão no cartão App",
"colState": "Estado",
"colDisplay": "Visualização",
"colMeaning": "Significado",
"rows": [
{
"state": "Atualização disponível",
"display": "Versão disponível em roxo com um ícone de seta para cima",
"meaning": "As versões instaladas e a montante diferem."
},
{
"state": "Atual",
"display": "Versões instaladas e mais recentes sem o alerta roxo",
"meaning": "A última verificação não encontrou nenhuma versão mais recente a montante."
},
{
"state": "Rastreamento pendente",
"display": "Verificação ou estado pendente",
"meaning": "O registro está configurado, mas ainda não completou ambas as verificações."
},
{
"state": "Rastreamento desativado",
"display": "Apenas ligações Web; nenhum bloco de comparação de versões",
"meaning": "O registro permanece válido e ainda pode ter um updater."
},
{
"state": "Erro de verificação",
"display": "Explicação a âmbar no cartão",
"meaning": "O estado guardado anterior continua visível enquanto é comunicado o erro do detetor ou da origem da versão disponível."
}
]
},
"management": {
"heading": "Gerenciar aplicativos salvos e sugeridos",
"lead": "As ações na parte inferior da aba têm papéis distintos:",
"items": [
"<strong>Procurar aplicações</strong> atualiza a deteção apenas neste LXC.",
"<strong>Registe outra aplicação</strong> abre o catálogo e o editor manual sem voltar a analisar o LXC.",
"<strong>Editar</strong> mostra em cada cartão Remover, Verificar, notificações e Editar campos.",
"<strong>Ocultar</strong> remove uma sugestão indesejada. As deteções ocultas podem ser restauradas na vista de registo.",
"<strong>Verificar</strong> atualiza os dados de versão da aplicação guardada selecionada; não procura novas aplicações."
]
},
"troubleshooting": {
"heading": "Situações comuns",
"colProblem": "Situação",
"colResolution": "Resolução",
"rows": [
{
"problem": "O software foi instalado após o início do ProxMenux",
"resolution": "Prima Procurar aplicações. A análise explícita atualiza as sugestões em cache desse LXC."
},
{
"problem": "Nenhuma aplicação foi detectada",
"resolution": "Registre-o manualmente. Um nome e um link web são suficientes; o rastreamento pode ser adicionado mais tarde."
},
{
"problem": "O detector sugerido devolve a versão errada",
"resolution": "Abra Editar campos, escolha o pacote, binário ou caminho de ficheiro real e teste o detetor antes de guardar."
},
{
"problem": "Uma carga de trabalho Docker não é oferecida como uma aplicação LXC",
"resolution": "Registre o Docker e adicione a interface publicada da carga de trabalho como um link web do Docker. As atualizações de imagem permanecem na seção Docker."
},
{
"problem": "Um aplicativo salvo não tem botão de atualização",
"resolution": "Abra a aba Atualizações e configure seu método de atualização. O rastreamento de versões sozinho não define como uma atualização é instalada."
}
]
},
"figures": {
"catalog": {
"alt": "Catálogo de registro de aplicativos com resultados de busca, logotipos, portas e campos de detectores",
"caption": "Metadados de catálogo aceleram o registro enquanto cada valor proposto permanece editável."
},
"webLinks": {
"alt": "Cartão de aplicação LXC salvo contendo um link web clicável",
"caption": "Um registo só com ligações é válido: o acompanhamento pode ficar desativado e o atualizador pode ser adicionado separadamente."
},
"tracking": {
"alt": "Campos opcionais do detetor da versão instalada e da origem da versão disponível",
"caption": "A detecção de versão instalada e a fonte upstream são configuradas e testadas separadamente."
},
"card": {
"alt": "Cartão de aplicação salvo com versões instaladas e disponíveis, além de um link para a web",
"caption": "O cartão combina identidade, evidência de versão e acesso à web sem executar ações de atualização desta aba."
}
}
}
@@ -0,0 +1,203 @@
{
"meta": {
"title": "Atualizações LXC: sistema, aplicações e Docker | ProxMenux",
"description": "Configure e execute atualizações do sistema operativo, aplicações, Docker Engine e imagens Docker num contentor LXC."
},
"header": {
"title": "Atualizações LXC: sistema, aplicações e Docker",
"description": "Reveja cada alvo de atualização em um só lugar, execute-o de forma independente ou combine alvos selecionados em uma ação em massa controlada."
},
"intro": {
"p1": "O separador <strong>Atualizações</strong> separa a deteção de versões da instalação. O registo e o acompanhamento opcional ficam no <link>separador App</link>; os métodos executáveis gerem-se aqui.",
"p2": "Um aplicativo salvo aparece nas Atualizações mesmo quando contém apenas um link web. O rastreamento de versões é opcional e um atualizador pode ser configurado independentemente.",
"callout": "Registar uma aplicação não seleciona o atualizador. Se for detetado um atualizador Helper-Scripts correspondente, escolha e guarde <strong>Helper-Scripts</strong> ou <strong>Comando personalizado</strong>. A deteção não garante compatibilidade. A escolha pertence a cada aplicação, mesmo num LXC partilhado."
},
"overview": {
"heading": "Qual a composição da aba",
"lead": "Cada alvo disponível tem sua própria seção e ação:",
"items": [
"<strong>Pacotes do sistema</strong> para contentores Debian, Ubuntu e Alpine.",
"Uma secção por <strong>aplicação registada</strong>, incluindo registos apenas com ligações.",
"Uma seção <strong>Docker</strong> quando o Docker está registrado, com Docker Engine e imagens etiquetadas agrupadas.",
"Uma secção <strong>Atualização em bloco</strong> configurável, seguida de opções de cópia de segurança, reinício e agendamento."
]
},
"mechanisms": {
"heading": "Como um método de atualização é selecionado",
"lead": "O caminho integrado Proxmox VE Helper-Scripts segue o mecanismo oficial <helper>update-apps</helper>. Outros tipos de instalação usam o pacote correspondente, Docker ou caminho personalizado.",
"officialReference": "Referência oficial: a <helper>documentação update-apps de Proxmox VE Helper-Scripts</helper> abrange modos interativo e sem supervisão, cópias de segurança, simulações, recursos temporários de compilação, registos e códigos de saída.",
"colSource": "Origem",
"colAction": "Ação exibida",
"colNotes": "O que é executado",
"rows": [
{
"source": "Pacotes APT ou APK",
"action": "Aplicar atualizações do sistema operacional",
"notes": "Actualiza os pacotes de contentores. Aplicativos registrados instalados como pacotes dpkg ou apk são cobertos por este mesmo passe."
},
{
"source": "Proxmox VE Helper-Scripts",
"action": "Aplicar atualização",
"notes": "Após selecionar expressamente Helper-Scripts, executa o script oficial identificado pelo wrapper /usr/bin/update validado. Um marcador ou correspondência do catálogo nunca permite a execução por si só."
},
{
"source": "Comando personalizado",
"action": "Execute o atualizador",
"notes": "Executa o comando salvo dentro do LXC e substitui qualquer atualizador de aplicativo integrado para esse registro."
},
{
"source": "Docker Engine",
"action": "Atualizar Docker Engine",
"notes": "Atualiza apenas os pacotes Docker instalados e as dependências necessárias. Não altera outros pacotes do sistema nem contentores."
},
{
"source": "Imagem Docker",
"action": "Atualizar imagem",
"notes": "Transfere a imagem selecionada e recria o grupo de serviços Compose ou o contentor independente protegido."
}
],
"callout": "Um comando personalizado <strong>substitui</strong> Helper-Scripts nessa aplicação. As execuções manuais, em bloco e agendadas respeitam a escolha guardada. Mantêm-se os comandos existentes e as seleções antigas expressamente guardadas em planos em bloco ou agendamentos ativos; um agendamento antigo nunca inclui uma aplicação recém-registada."
},
"docker": {
"heading": "Docker Engine e imagens Docker",
"lead": "Após o Docker estar registrado na aba App, seu motor e inventário de imagens aparecem dentro da mesma seção <strong>Docker</strong>.",
"items": [
"O rastreamento de versão do Docker Engine é separado do contador do pacote OS e tem seu próprio botão de atualização.",
"As imagens locais com etiqueta são comparadas com o registo através de digests imutáveis. <strong>Verificar agora</strong> atualiza o inventário sem transferir imagens nem reiniciar contentores.",
"Os serviços Compose são atualizados a partir do projeto declarado. As imagens do mesmo grupo são tratadas juntas para evitar recriar o projeto repetidamente.",
"Um contentor independente é recriado com a configuração atual. O processo protegido conserva dados de reversão e restaura o contentor anterior se a recriação falhar.",
"Cada imagem pode ser selecionada separadamente em atualizações manuais, em massa e agendadas, exceto dependências declaradas Compose que devem seguir seu serviço pai."
],
"callout": "Os containers em funcionamento dentro de Docker não são mostrados como aplicações independentes LXC. Suas portas web publicadas podem ser salvas como links sob o registro Docker, enquanto as atualizações de imagem permanecem na seção Docker."
},
"actions": {
"heading": "Acções individuais e cores do estado",
"lead": "Cada seção permanece independentemente acionável, seja ou não uma atualização em massa está configurada.",
"items": [
"<strong>Configurar</strong> abre a seleção do atualizador quando não há método; <strong>Editar</strong> altera uma escolha guardada. Os botões informativos explicam as opções, ligam a documentação oficial e mostram um exemplo de script personalizado. Selecionar não executa a opção.",
"Com acompanhamento de versão desativado mas atualizador disponível, aparece a ação neutra <strong>Executar atualizador</strong>. O ProxMenux não afirma que há uma atualização pendente.",
"Sem um atualizador Helper-Scripts disponível, configure um comando personalizado. Desativar um método não seleciona silenciosamente outro; as seleções de plano/agenda existentes permanecem salvas e alvos indisponível são reportados.",
"<strong>Atualizar imagem</strong> aplica-se apenas à unidade Docker selecionada; não atualiza Docker Engine nem imagens não relacionadas."
],
"statusColState": "Estado conhecido",
"statusColAppearance": "Aparência",
"statusColMeaning": "Significado",
"statusRows": [
{
"state": "Actualização verificada disponível",
"appearance": "Texto roxo, ícone de seta ascendente e ação roxa",
"meaning": "As versões instaladas e disponíveis ou os digests das imagens diferem."
},
{
"state": "Atualizado e verificado",
"appearance": "Marca de verificação verde e ação Atualizado a verde",
"meaning": "A última verificação completa confirma que o alvo está atual."
},
{
"state": "Versão desconhecida",
"appearance": "Texto neutro e ação neutra",
"meaning": "O atualizador pode ser executado, mas faltam dados de versão para determinar se o alvo está atualizado ou tem atualização pendente."
}
]
},
"custom": {
"heading": "Comandos personalizados de actualização",
"lead": "Use um comando personalizado quando a instalação não tiver nenhum atualizador integrado verificado, ou quando seu procedimento normal deve ser substituído.",
"items": [
"Abra <strong>Configurar</strong> se o campo estiver vazio ou <strong>Editar</strong> se já houver um método.",
"Para um aplicativo integrado ou Docker Engine, o editor mostra o comando atualmente utilizado. Salvar conteúdo diferente transforma-o na sobreposição explícita para esse registro.",
"Teste o procedimento completo no terminal LXC primeiro. Deve ser não-interativo, usar o diretório de trabalho correto e retornar um status de saída não-zero na falha.",
"Não inclua <code>pct exec</code>; o ProxMenux já entra no contentor e executa como root."
],
"exampleLead": "Exemplo de procedimento completo dentro do contentor:",
"example": "cd /opt/my-app && ./update.sh",
"callout": "Um comando de versão como o <code>myapp --version</code> só lê uma versão; não é um updater. Comandos executados com privilégios administrativos, então o conteúdo armazenado deve ser revisado com o mesmo cuidado que um comando root shell."
},
"bulk": {
"heading": "Atualização em bloco",
"lead": "A atualização em massa cria uma ação reutilizável para um conjunto exato de alvos no LXC. É colocado após a aplicação individual e as secções Docker e antes de <strong>Opções</strong>.",
"items": [
"Os pacotes do sistema são obrigatórios. Selecione pelo menos uma aplicação, Docker Engine ou uma unidade de imagem Docker adicional.",
"Aplicações e unidades Docker são selecionadas individualmente. O serviço principal Compose mostra as dependências atualizadas com ele.",
"Alvos indisponíveis ou removidos são marcados como obsoletos e têm de ser retirados antes de guardar.",
"<strong>Aplicar atualizações</strong> é roxo se algum alvo tiver uma atualização verificada, verde se todos estiverem verificados como atualizados e neutro se o resultado for desconhecido.",
"A remoção da configuração em massa não remove métodos de atualização individuais ou configurações de atualização agendada."
],
"callout": "A atualização em massa não substitui os botões individuais. É um atalho opcional para uma seleção que deve ser executada em conjunto."
},
"options": {
"heading": "Opções de backup e reinicialização",
"lead": "As mesmas opções aplicam-se às execuções manuais, em bloco e agendadas:",
"items": [
"<strong>Snapshot antes de aplicar</strong> cria um backup vzdump no armazenamento selecionado. Se o backup necessário falhar, a atualização não será iniciada.",
"<strong>Reiniciar após a aplicação</strong> reinicia o LXC apenas após uma execução bem sucedida.",
"As seleções são armazenadas por LXC e permanecem independentes da lista alvo."
]
},
"scheduled": {
"heading": "Atualizações agendadas",
"lead": "Atualizações agendadas usam os mesmos alvos executáveis e opções de segurança como ações manuais.",
"items": [
"Escolha uma frequência predefinida ou expressão cron e depois os alvos exatos: pacotes do sistema, aplicações, Docker Engine, unidades Docker independentes ou grupos de serviços Compose.",
"O atraso após o lançamento aplica-se apenas a aplicações selecionadas com acompanhamento de versão. Sem acompanhamento, o atualizador é executado em cada agendamento.",
"O estado da última execução distingue sucesso, conclusão parcial, falha, suspensão de segurança e ausência de atualizações pendentes. Após a primeira execução agendada, <strong>Atualizações → Atualizações agendadas → Ver registo</strong> abre toda a saída do atualizador e dos scripts secundários invocados.",
"Após cada execução, o ProxMenux verifica o marcador padrão Debian reboot-required. Quando é necessário reiniciar, a aba Atualizações e a notificação de conclusão dizem isso; o aviso é apagado quando o LXC inicia ou reinicia.",
"No host Proxmox, os logs de execução programados são armazenados em <code>/usr/local/share/proxmenux/logs/lxc-updates/</code> usando o nome <code>&lt;VMID&gt;-scheduled-&lt;run-id&gt;.log</code>. Os últimos dez logs são mantidos por LXC e arquivos mais antigos são removidos automaticamente.",
"Este histórico retido se aplica às atualizações agendadas. Uma atualização manual exibe sua saída ao vivo na janela de execução do Monitor e não cria um log de execução agendado nesse diretório.",
"Os agendamentos externos no host detetados a partir de Proxmox VE Helper-Scripts aparecem separadamente para mostrar automações sobrepostas."
],
"callout": "Execute cada método manualmente antes de ativar um agendamento. Os comandos agendados não podem responder a perguntas interativas."
},
"completion": {
"heading": "O que acontece depois de uma atualização",
"lead": "A atualização não é considerada terminada quando o comando terminal simplesmente termina.",
"items": [
"A mesma execução registra seu resultado final e atualiza o estado do pacote OS, versões de aplicativos registrados e inventário Docker, conforme aplicável.",
"As execuções agendadas conservam a saída do terminal e indicam se ainda é preciso reiniciar para terminar de aplicar as alterações aos pacotes.",
"O cache LXC é substituído pelo estado de pós-atualização verificado, para que os crachás e botões não mantenham o resultado anterior.",
"Ao iniciar um LXC parado ou restaurado, o evento de ciclo de vida volta a atualizar os dados. O inventário Docker espera que o daemon esteja pronto sem guardar um resultado inicial vazio como definitivo.",
"As notificações habilitadas são emitidas a partir da execução finalizada, incluindo falhas parciais e resultados agrupados de imagem Docker."
]
},
"troubleshooting": {
"heading": "Situações comuns",
"colProblem": "Situação",
"colResolution": "Resolução",
"rows": [
{
"problem": "Nenhum método de atualização foi identificado",
"resolution": "Abra Configurar, adicione o procedimento oficial não-interativo e teste-o manualmente antes de agendar."
},
{
"problem": "Uma identidade Proxmox VE Helper-Scripts é mostrada mas nenhuma ação existe",
"resolution": "O LXC tem dados de identificação antigos, mas nenhum wrapper /usr/bin/update verificado. Adicione uma opção personalizada só depois de confirmar o procedimento correto."
},
{
"problem": "As imagens Docker estão temporariamente vazias após a inicialização ou restauração",
"resolution": "Aguarde que o Docker fique pronto ou pressione Verificar agora. O inventário repete a inicialização e não trata um resultado vazio transitório como final."
},
{
"problem": "Um alvo em massa salvo não está mais disponível",
"resolution": "Edite a configuração em massa, remova o alvo obsoleto e selecione sua substituição atual se existir."
},
{
"problem": "Um comando personalizado falhou",
"resolution": "Execute-o no terminal LXC e reveja caminho, dependências, parâmetros não interativos e código de saída."
},
{
"problem": "Uma atualização agendada diz que é necessário reiniciar",
"resolution": "Abra Ver registo para rever a execução concluída e reinicie esse LXC. O ProxMenux limpa o aviso quando o evento de ciclo de vida deteta o novo arranque."
}
]
},
"figures": {
"osPending": {
"alt": "Seção de pacotes do sistema operacional com contagem de atualizações pendentes e de segurança",
"caption": "A seção sistema operacional mantém atualizações de pacotes independentes de aplicativos e ações Docker."
},
"options": {
"alt": "Opções de atualização LXC com backup pré-atualização e reinicialização pós-atualização",
"caption": "As preferências de backup e reinicialização se aplicam às execuções manuais, em massa e agendadas."
}
}
}
@@ -0,0 +1,244 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel: VM e LXC | Documentação ProxMenux",
"description": "Inventário dos sistemas convidados com CPU, memória e disco em direto. Os detalhes mostram configuração, recursos, cópias de segurança, resultados recentes do registo Proxmox, notas e Iniciar / Desligar / Reiniciar / Forçar paragem."
},
"header": {
"title": "Painel: VM e LXC",
"description": "Inventário completo dos sistemas convidados: quatro métricas no topo, lista ordenável de VM e LXC e detalhes com configuração, recursos, cópias de segurança, registos e controlos Iniciar / Desligar / Reiniciar / Forçar paragem.",
"section": "ProxMenux Monitor · Painel"
},
"intro": {
"title": "Controlos dos sistemas convidados",
"body": "Este separador controla o ciclo de vida dos sistemas convidados. As ações passam por <code>POST /api/vms/&lt;vmid&gt;/control</code> com confirmação explícita e atualizam a linha do sistema. O desligamento forçado exige o botão específico Forçar paragem."
},
"topRow": {
"heading": "Linha superior: quatro cartas estatísticas",
"intro": "Quatro cartões resumem o estado dos sistemas convidados: totais, uso CPU, memória atribuída face à capacidade do host e espaço de disco atribuído.",
"imageAlt": "Página VMs & LXCs — linha superior de quatro placas estatísticas: Total de VMs & LXCs, Total de CPU, Memória Total, Disco Total",
"imageCaption": "Linha superior: totais e estados Em execução / Parados, uso CPU, memória utilizada / atribuída a sistemas ativos / atribuída total com indicador Dentro dos limites e espaço de disco atribuído.",
"headerCard": "Cartão",
"headerWhat": "O que mostra",
"totalLabel": "Total de VMs e LXCs",
"totalWhat": "Contagem total com dois emblemas — <em>X Running</em> (verde) e <em>Y parado</em> (vermelho, apenas quando > 0). O número que vês quando algo não aparece depois de uma reinicialização.",
"cpuLabel": "CPU total",
"cpuWhat": "Utilização CPU total em direto dos sistemas convidados, como percentagem da CPU física do host, com o texto <em>“Uso CPU atribuído”</em>.",
"memoryLabel": "Memória total",
"memoryIntro": "Três leituras empilhadas verticalmente:",
"memoryItems": [
"<strong>Utilizada atualmente</strong> — valor principal, como <em>15.4 GB</em>, e <em>X.X % de Y GB</em> face à RAM do host. A barra azul indica a percentagem.",
"<strong>Atribuída aos ativos</strong> + <strong>Atribuída total</strong> — soma de <code>maxmem</code> dos sistemas <em>em execução</em> e de <em>todos</em>, incluindo os parados. A primeira importa agora, a segunda ao iniciá-los todos.",
"<strong>Dentro dos limites</strong>, a verde, muda para <em>Sobre-alocada</em> se o total ultrapassar a RAM do host. Uma sobre-alocação controlada pode funcionar com KSM; o indicador avisa quando a margem diminui."
],
"diskLabel": "Disco total",
"diskWhat": "Soma do espaço em disco alocado em todos os hóspedes, na unidade apropriada (GB / TB), com a linha de rodapé <em>\"Espaço em disco alocado\"</em>."
},
"inventory": {
"heading": "Lista de máquinas virtuais e contentores",
"intro": "Uma fila por convidado. A lista é de origem única a partir de <code>/api/vms</code>, que consolida <code>qm list</code> + <code>pct list</code> + <code>pvesh /cluster/resources</code> no host.",
"imageAlt": "Lista de máquinas virtuais e contentores — uma linha por sistema, com estado, tipo, nome, ID e percentagens CPU/memória/disco",
"imageCaption": "O layout otimizado para dispositivos móveis do inventário — os mesmos dados que a área de trabalho mostra, recolocado em uma única coluna com as porcentagens e indicadores de status mantidos compactos.",
"rowsIntro": "Cada linha mostra:",
"rows": [
"<strong>Ícone de estado</strong> — triângulo verde para Em execução ou quadrado vermelho para Parado. O restante da linha fica atenuado nos sistemas parados.",
"<strong>Tipo</strong> — <em>LXC</em> a ciano para contentores, <em>VM</em> a roxo para máquinas virtuais.",
"<strong>Nome</strong> — nome do host ou nome apresentado do sistema convidado.",
"<strong>VMID</strong> — o ID numérico Proxmox abaixo do nome.",
"<strong>Metricas em linha</strong> — três percentagens com o seu ícone (CPU %, Memória %, Disco %). Cada ícone fica laranja quando a métrica cruza um limiar de atenção (por exemplo, memória acima de 90 %), então uma varredura rápida lhe diz qual hóspede está sob pressão sem abri-lo."
],
"clickHint": "Clique numa linha para abrir os detalhes, esteja o sistema em execução ou parado.",
"mobileTitle": "Lista concebida para dispositivos móveis",
"mobileBody": "Em telemóveis e janelas estreitas, tipo, nome, ID e três percentagens ficam empilhados numa coluna, como na imagem. Em ecrãs largos distribuem-se na horizontal. Toda a linha permite abrir os detalhes."
},
"drillIn": {
"heading": "Janela de detalhes do sistema convidado",
"intro": "A janela mostra nome, VMID, tipo, estado e tempo de atividade. Os separadores adaptam-se ao sistema: <strong>Estado</strong>, <strong>App</strong> e <strong>Atualizações</strong> para aplicações LXC, <strong>Montagens</strong> quando existem, <strong>Registos</strong> para contentores OCI manager Apps, <strong>Cópias de segurança</strong> e <strong>Firewall</strong>. A barra fixa mantém os controlos de ciclo de vida e o terminal LXC disponíveis.",
"statusTitle": "Página 1 — Estado",
"statusImageAlt": "Detalhes do sistema — Estado com CPU, memória e disco em direto, E/S de disco e rede, logótipo do sistema e Recursos / Endereços IP",
"statusImageCaption": "Estado: CPU, memória e disco com barras no topo; totais de E/S (disco lido/escrito, rede recebida/enviada); depois Recursos com Notas, + Info e lista de endereços IP.",
"statusIntro": "O separador inicial permite verificar o estado do sistema. Três blocos:",
"liveTitle": "1. Linha de métricas ao vivo",
"liveItems": [
"<strong>Utilização CPU (X núcleos)</strong> — percentagem com barra. O número de núcleos configurados no cabeçalho esclarece o que significa 100 %.",
"<strong>Memória</strong> — <em>utilizada / máxima</em> em GB com barra.",
"<strong>Disco</strong> — <em>utilizado / máximo</em> da imagem de disco principal, no mesmo formato."
],
"ioTitle": "2. Total I/O + Logótipo do sistema operacional",
"ioItems": [
"<strong>E/S de disco</strong> — totais de leitura (↓) e escrita (↑) desde o arranque. Ajuda a detetar aumentos súbitos face à atividade habitual do sistema convidado.",
"<strong>E/S de rede</strong> — receção (↓) e envio (↑) acumulados, com o mesmo princípio.",
"<strong>Logótipo do sistema</strong> — ícone Debian / Ubuntu / Alpine / Windows / etc. conforme o sistema detetado. Ajuda a identificar as janelas abertas."
],
"resourcesTitle": "3. Bloco de recursos",
"resourcesIntro": "Configuração segundo o Proxmox: núcleos CPU, memória (<code>maxmem</code> configurado) e swap. Duas secções expansíveis no cabeçalho:",
"resourcesItems": [
"<strong>Notas</strong> — descrição editável do sistema convidado. Guardar chama <code>PUT /api/vms/&lt;vmid&gt;/config</code> e escreve em <code>/etc/pve/qemu-server/&lt;vmid&gt;.conf</code> ou <code>/etc/pve/lxc/&lt;vmid&gt;.conf</code>.",
"<strong>+ Info</strong> — campos extras que são muito verbosos para a visualização padrão: modo bios, tipo de máquina, estado do agente, entradas hostpci passthrough, pontos de montagem (CT), ordem de inicialização."
],
"ipsTitle": "4. Endereços IP",
"ipsBody": "Cada endereço IPv4 ou IPv6 aparece numa etiqueta verde. A lista fica vazia com o sistema parado ou numa VM sem agente QEMU; os LXC comunicam os endereços diretamente.",
"appTitle": "Página 2 — Aplicação (LXC apenas)",
"appIntro": "Regista aplicações LXC, guarda ligações web e compara versões opcionalmente. As sugestões vêm da cache inicial; <strong>Procurar aplicações</strong> repete a deteção neste LXC após novas instalações.",
"appLinkLead": "Veja o",
"appLinkLabel": "página de aplicação dedicada",
"appLinkTail": "para descoberta em cache, registro assistido por catálogo, links web Docker e detectores de versões.",
"updatesTitle": "Página 3 — Actualizações (LXC apenas)",
"updatesIntro": "Mantém separados <strong>pacotes do sistema</strong>, aplicações, <strong>Docker Engine</strong> e imagens Docker. Cada alvo pode ser executado sozinho ou selecionado para uma ação em bloco ou agendada.",
"updatesLinkLead": "Veja o",
"updatesLinkLabel": "página de atualizações dedicadas",
"updatesLinkTail": "para atualizadores integrados e personalizados, recriação Docker, seleção em bloco, opções de segurança e agendamento.",
"mountsTitle": "Tab 4 — Montagens (LXC apenas, quando presente)",
"mountsImageAlt": "Detalhes LXC, Montagens: volumes PVE, bind mounts do host ou armazenamento PVE e NFS/CIFS montados no CT. Cada cartão mostra tipo, capacidade, bytes utilizados/totais, opções e estado: verde normal, âmbar só leitura/divergente, vermelho inacessível.",
"mountsImageCaption": "Montagens só aparece em LXC com pelo menos um ponto de montagem ou montagem remota adicionada. Sem montagens, o separador está ausente.",
"mountsIntro": "O Proxmox mostra montagens configuradas como <code>mpX</code>, mas não as adicionadas depois no CT com <code>mount.cifs</code>, NFS via <code>autofs</code>, etc. Este separador reúne <strong>as duas vistas</strong>: montagens configuradas <strong>e</strong> detetadas no contentor, com estado e capacidade quando o servidor a consegue obter.",
"mountTypesTitle": "Tipos de montagem detectados",
"mountTypesItems": [
"<strong>Volume PVE</strong> — armazenamento gerido pelo Proxmox, como subvolume ZFS, diretório ou Ceph RBD. A capacidade vem das estatísticas PVE e coincide com o Proxmox.",
"<strong>Bind de armazenamento PVE</strong> — entrada <code>mpX</code> que aponta para um caminho de armazenamento conhecido pelo PVE.",
"<strong>Bind do host</strong> — entrada <code>mpX</code> com um caminho arbitrário do host (<code>/mnt/something</code>). A capacidade vem de <code>df</code> desse caminho.",
"<strong>Ad-hoc dentro de CT</strong> — montagem que <em>somente</em> existe no namespace de montagem do contêiner (por exemplo, um compartilhamento NFS que o CT monta sozinho). A capacidade é lida por meio de <code>pct exec &lt;vmid&gt; df</code>, que é a única maneira de vê-la - <code>/proc/&lt;pid&gt;/root</code> do host não expõe as estatísticas reais da montagem remota."
],
"mountStateTitle": "Ponto de estado e avisos por cartão",
"mountStateItems": [
"<green/> <strong>Verde</strong> — montagem normal e acessível.",
"<amber/> <strong>Âmbar</strong> — configurado mas não montado, só leitura ou <em>bind zombie</em>. A origem desapareceu do host mas o CT ainda a vê montada, por exemplo após desligar um disco USB ou executar <code>umount</code> no host.",
"<red/> <strong>Vermelho</strong> — inacessível: a verificação não alcança a montagem, por exemplo uma partilha NFS com servidor indisponível."
],
"mountsCalloutTitle": "Informação adicional face ao Proxmox",
"mountsCalloutBody": "Vista dos caminhos lidos e escritos pelo contentor e respetiva capacidade. Partilhas NFS/CIFS montadas no CT, invisíveis no Proxmox, têm aqui a mesma apresentação e controlo. Montagens inacessíveis e binds zombie são assinalados antes de causarem problemas numa cópia de segurança.",
"logsTitle": "Tab 5 — Registos (apenas contentores OCI)",
"logsBody": "Só para contentores OCI manager Apps. Mostra a consola do processo principal da imagem em <code>/var/log/proxmenux/oci/VMID.console.log</code>: últimas 100, 500 ou 1000 linhas, acompanhamento em direto enquanto ativo, filtro e transferência. Relê o ficheiro ao abrir, mesmo com o contentor parado. Detalhes: <ociLink>Contentores OCI no ProxMenux Monitor</ociLink>.",
"backupsTitle": "Página 6 — Cópias de segurança",
"backupsImageAlt": "Detalhes do sistema — Cópias de segurança com lista de cópias disponíveis, destinos, tamanhos e botão Criar cópia",
"backupsImageCaption": "Todas as cópias do sistema nos armazenamentos Proxmox configurados, da mais recente à mais antiga. O cabeçalho mostra a contagem.",
"backupsIntro": "Lista as cópias do sistema nos armazenamentos Proxmox, da mais recente à mais antiga. O contador no título permite ver se existem cópias. Cada linha mostra:",
"backupsItems": [
"<strong>Data e hora</strong> — momento da execução.",
"<strong>Destino</strong> — armazenamento (PBS-Cloud, PBS-Local, NFS-Backup, …), colorido conforme o estado.",
"<strong>Tamanho</strong> — tamanho final em disco da cópia."
],
"backupsOutro": "<strong>+ Criar cópia de segurança</strong> inicia uma cópia no armazenamento marcado “Backup target” no Proxmox. O restauro faz-se na interface web Proxmox; o Monitor mostra as cópias recentes do sistema e permite criar novas.",
"firewallTitle": "Página 7 — Firewall",
"firewallIntro": "Lê o registo do firewall Proxmox de cada sistema diretamente do host, sem serviço adicional nem consultas periódicas. O separador está sempre presente; o conteúdo depende da ativação do firewall e de uma regra registar pacotes.",
"firewallItems": [
"<strong>Firewall desativado</strong> — um aviso a laranja indica onde o ativar no Proxmox (<em>&lt;Container|VM&gt; → Firewall → Options</em>) e recorda que pelo menos uma regra precisa de <code>log: info</code> ou nível superior para os pacotes aparecerem.",
"<strong>Firewall ativo, sem eventos</strong> — a vista vazia lembra o requisito de registo, útil logo após a ativação.",
"<strong>Eventos presentes</strong> — painel monoespaçado com deslocamento e entradas originais por ação: <green>ACCEPT</green> verde, <orange>REJECT</orange> laranja, <red>DROP</red> vermelho. O contador no cabeçalho mostra as entradas carregadas."
],
"firewallRefresh": "<em>Atualizar</em> carrega as entradas recentes a pedido. Sem atualização automática, a lista mostra o momento da abertura ou do último clique. A origem é <code>/var/log/pve-firewall.log</code>, filtrada por VMID através de <code>GET /api/vms/&lt;vmid&gt;/firewall/log</code>.",
"firewallCalloutTitle": "Porquê tê-lo aqui quando a UI Proxmox já o mostra?",
"firewallCalloutBody": "Evita mudar para o Proxmox e mantém a vista do mesmo VMID: inicie o sistema, verifique montagens e eventos do firewall e volte a pará-lo no painel. As regras editam-se no Proxmox; o Monitor não as altera.",
"actionBarTitle": "Barra de ação inferior",
"actionBarIntro": "Sempre visível no pé do modal, independentemente da aba ativa:",
"consoleItem": "<strong>Consola</strong>, apenas em LXC ativos, abre <code>pct enter &lt;vmid&gt;</code> no contentor. Usa xterm.js e WebSocket como o <link>separador Terminal</link>, com a <strong>barra móvel</strong>: ESC, TAB, setas, Enter e Ctrl+C / Ctrl+X / Ctrl+R. Funciona em telemóvel ou tablet. Para VM use a consola Proxmox noVNC.",
"lifecycleIntro": "Quatro botões em grelha 2×2 enviam <code>POST /api/vms/&lt;vmid&gt;/control</code> com a <code>action</code> correspondente. A disponibilidade depende do estado do sistema.",
"headerButton": "Botão",
"headerEnabled": "Activado quando",
"headerAction": "Acção enviada para a máquina",
"lifecycleRows": [
{
"button": "Iniciar",
"color": "green",
"enabled": "O hóspede está parado.",
"action": "qm start / pct start"
},
{
"button": "Desligar",
"color": "blue",
"enabled": "O sistema convidado está em execução.",
"action": "qm shutdown / pct shutdown — desligamento ordenado, ACPI"
},
{
"button": "Reiniciar",
"color": "blue",
"enabled": "O sistema convidado está em execução.",
"action": "qm reboot / pct reboot — reinício ordenado"
},
{
"button": "Forçar parada",
"color": "red",
"enabled": "O sistema convidado está em execução.",
"action": "qm stop / pct stop — desligamento forçado"
}
],
"forceStopTitle": "Forçar paragem interrompe imediatamente a execução",
"forceStopBody": "<strong>Forçar paragem</strong> ignora o desligamento, como cortar a alimentação. Use <strong>Desligar</strong> enquanto o sistema responder. Force apenas se o desligamento bloquear e aceitar o risco de perda de dados. O botão vermelho e a etiqueta ajudam a evitar cliques acidentais."
},
"dataCollected": {
"heading": "Como os dados são coletados",
"headerSection": "Secção da página",
"headerEndpoint": "Endpoint",
"headerSource": "Origem",
"rows": [
{
"section": "Lista de inventários",
"endpoint": "/api/vms",
"source": "<code>pvesh get /cluster/resources --type vm</code> para VMs e CTs."
},
{
"section": "Painel de detalhes (configuração, rede, discos)",
"endpoint": "/api/vms/<vmid>",
"source": "<code>qm config &lt;id&gt;</code> para VMs / <code>pct config &lt;id&gt;</code> para CTs."
},
{
"section": "Gráfico de métricas do sistema convidado",
"endpoint": "/api/vms/<vmid>/metrics",
"source": "Dados PVE RRD (<code>pvesh get /nodes/&lt;node&gt;/qemu/&lt;id&gt;/rrddata</code>) condensados a uma forma amigável a gráficos."
},
{
"section": "Resultados recentes do registo Proxmox",
"endpoint": "/api/vms/<vmid>/logs",
"source": "<code>pvesh get /nodes/&lt;node&gt;/&lt;qemu|lxc&gt;/&lt;vmid&gt;/log --start 0 --limit 1000</code>. Uma falha devolve uma lista vazia; não fornece todos os registos internos do sistema convidado."
},
{
"section": "Backups disponíveis para hóspedes",
"endpoint": "/api/vms/<vmid>/backups",
"source": "<code>pvesm list &lt;storage&gt;</code> filtrado por VMID."
},
{
"section": "Registo do firewall do sistema convidado (separador Firewall)",
"endpoint": "/api/vms/<vmid>/firewall/log",
"source": "<code>/var/log/pve-firewall.log</code> filtrado por VMID."
},
{
"section": "Botões de energia (Iniciar / Parar / Reiniciar / Desligar)",
"endpoint": "/api/vms/<vmid>/control",
"source": "Equivalências <code>qm start|stop|reboot|shutdown</code> ou <code>pct</code>."
}
],
"codeComment1": "# Comparar os dados do painel com PVE",
"codeComment2": "# Inspecionar a configuração do sistema como aparece na janela",
"codeComment3": "# VM",
"codeComment4": "# CT"
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Monitor de Saúde",
"href": "/docs/monitor/health-monitor",
"tailRich": " — a categoria VMs & Containers (boot falhado, tempo limite QMP, falhas de desligamento CT)."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tailRich": " — o que os acontecimentos <code>vm_*</code>, <code>ct_*</code>, <code>migration_*</code> e <code>backup_*</code> provocam a jusante."
},
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tailRich": " — endpoints de VM e cópias de segurança."
},
{
"label": "Índice do painel",
"href": "/docs/monitor/dashboard",
"tailRich": " — os outros separadores."
},
{
"label": "ProxMenux → Criar VM",
"href": "/docs/create-vm",
"tailRich": " — criação de sistemas: modelos NAS (Synology e outros), VM Linux/Windows e valores adaptados ao Proxmox."
}
]
}
}
@@ -0,0 +1,372 @@
{
"meta": {
"title": "Monitorização do Proxmox — CPU, memória, armazenamento, SMART, ZFS, registos | ProxMenux",
"description": "Monitorização proativa do Proxmox VE: dez categorias a cada cinco minutos (CPU e temperatura, memória e swap, armazenamento, discos/SMART, rede, VMs, serviços, registos, atualizações e segurança), quatro níveis de gravidade, supressão por categoria, limpeza dos erros resolvidos, histórico permanente de discos e notificações por Telegram, Discord, Gotify ou e-mail.",
"ogTitle": "Monitorização do Proxmox — CPU, memória, armazenamento, SMART, ZFS, registos",
"ogDescription": "Monitorização proativa do Proxmox VE em dez categorias, com níveis de gravidade, períodos de supressão e notificações por evento.",
"twitterTitle": "Monitor de Saúde Proxmox ProxMenux",
"twitterDescription": "Monitorização proativa do Proxmox VE em dez categorias, com níveis de gravidade e notificações."
},
"header": {
"title": "Monitor de Saúde",
"description": "A verificação contínua analisa dez categorias do estado do anfitrião em ciclos de cinco minutos, recolhe medições entre ciclos, elimina ocorrências duplicadas e alimenta o painel, as notificações e a reformulação IA opcional a partir da mesma fonte.",
"section": "Monitor do ProxMenux"
},
"intro": {
"title": "Um scanner, três consumidores",
"body": "Um processo em segundo plano executa o ciclo completo a cada cinco minutos e guarda cada ocorrência no SQLite com um <code>error_key</code> estável. Assim, <strong>(1)</strong> o painel apresenta o estado atual, <strong>(2)</strong> o sistema de notificações distribui novos eventos e <strong>(3)</strong> o assistente IA opcional reformula os alertas em linguagem simples. Uma única configuração alimenta todos estes componentes."
},
"howItWorks": {
"heading": "Como funciona",
"intro": "A monitorização usa duas linhas de execução paralelas. Um <strong>módulo de recolha de métricas</strong> leve preenche os históricos de CPU, memória e temperatura. O <strong>ciclo completo de verificação</strong> lê esses dados, avalia condições prolongadas e executa as restantes verificações aproximadamente a cada cinco minutos, guardando depois as ocorrências no SQLite para o painel e as notificações.",
"scannerTitle": "Da amostra ao achado armazenado",
"scannerCaption": "O módulo preenche os históricos entre ciclos: CPU a cada 5 s, memória a cada 30 s e temperatura a cada 15 s. Não avalia os alertas. O ciclo completo analisa os históricos e verifica SMART, ZFS, registos e serviços antes de guardar as ocorrências no SQLite.",
"scannerArrowLabel": "passo",
"scannerNodes": {
"samplerLabel": "Recolha de métricas",
"samplerDetail": "Uso da CPU 5 s\nMemória 30 s\nTemperatura 15 s\n→ históricos",
"cycleLabel": "Ciclo completo de saúde",
"cycleDetail": "A cada 5 min\nLê os históricos\n+ verificações diretas\n(SMART, ZFS,\nserviços, registos…)",
"checksLabel": "Controlos por categoria",
"checksDetail": "Dez categorias\n(CPU, memória,\narmazenamento, discos,\nrede, VMs,\nserviços, registos,\natualizações, segurança)",
"sqliteLabel": "SQLite",
"sqliteDetail": "tabela errors\n(ativos +\nsuprimidos)\n+ disk_observations\n(histórico permanente\npor disco)"
},
"notifTitle": "Do achado armazenado ao usuário",
"notifCaption": "O caminho da notificação. A mesma tabela de erros também impulsiona a visão do painel (listas ativa/descartada renderizadas ao vivo) e é consumida pela rotina de limpeza no final de cada ciclo para resolver automaticamente entradas antigas — ambas são executadas a partir dos mesmos dados sem passar pelo expedidor.",
"notifArrowLabel": "evento",
"notifNodes": {
"errorsLabel": "tabela de erros",
"errorsDetail": "Linhas ativas +\nsuprimidas\nidentificadas por\nerror_key",
"dispatcherLabel": "Enviador de notificações",
"dispatcherDetail": "Eventos novos +\nagravados em fila\nConforme opções\n+ intervalo mínimo",
"templatesLabel": "Modelos + reescrita de IA",
"templatesDetail": "Modelo\npor evento\n→ reformulação IA\nopcional em\nlinguagem simples",
"channelsLabel": "Canais",
"channelsDetail": "Telegram\nDiscord\nGotify\nCorreio eletrónico (SMTP)"
}
},
"categories": {
"heading": "As dez categorias",
"imageAlt": "Visão Monitor de Saúde mostrando as dez categorias com seus status atuais (CPU, Memória, Armazenamento, Discos, Rede, VMs, Serviços, Logs, Atualizações, Segurança)",
"imageCaption": "Health Monitor view — as dez categorias com seu status atual. Categorias em um host saudável todas mostram OK; avisos e eventos críticos aparecem em linha com as linhas que os produziram.",
"intro": "Cada ciclo executa dez verificações independentes. Cada uma devolve um dos quatro estados (<strong>OK</strong>, <strong>INFO</strong>, <strong>WARNING</strong>, <strong>CRITICAL</strong>) e dados estruturados, como nomes de dispositivos, excertos de registos e limiares exatos, apresentados no painel e nas notificações.",
"headerCategory": "Categoria",
"headerChecks": "Verificações individuais",
"headerEvents": "Eventos típicos",
"rows": [
{
"category": "CPU & Temperatura",
"checks": "Uso de CPU com histerese, temperatura do sensor",
"events": "Uso elevado e prolongado da CPU; avisos de temperatura baseados nas leituras recolhidas."
},
{
"category": "Memória e swap",
"checks": "Utilização do RAM, utilização do swap",
"events": "Pressão prolongada sobre a memória; atividade do OOM-killer; esgotamento do swap."
},
{
"category": "Armazenamento",
"checks": "Armazenamento do Proxmox, sistema de arquivos raiz",
"events": "Limiares de ocupação ultrapassados na raiz ou noutros sistemas de ficheiros monitorizados (85% aviso / 95% crítico por predefinição); exportação NFS indisponível; falha de autenticação CIFS; pool LVM-thin cheio."
},
{
"category": "Discos e SMART",
"checks": "SMART, erros de E/S no dmesg, pools ZFS, LVM, erros do sistema de ficheiros",
"events": "Falha no estado SMART; setores realocados ou pendentes; erros de E/S ATA; pool ZFS DEGRADED / FAULTED; ext4 remontado só de leitura."
},
{
"category": "Rede",
"checks": "Conectividade, estado de ligação, latência do gateway",
"events": "Bridge ou ligação agregada em baixo; gateway inacessível; picos de latência persistentes."
},
{
"category": "VMs e contêineres",
"checks": "Comunicação QMP, arranque do VM, arranque do contentor",
"events": "Falha na inicialização do VM; falha no desligamento do CT; tempo- limite do socket do QMP; falta a configuração / disco após um clone."
},
{
"category": "Serviços PVE",
"checks": "<code>pveproxy</code>, <code>pvedaemon</code>, <code>pvestatd</code>, <code>pve-cluster</code>, modo de cluster",
"events": "O serviço caiu; quórum de cluster perdido; o <code>pmxcfs</code> ficou preso."
},
{
"category": "Registros do sistema",
"checks": "Erros persistentes, picos de erro, cascatas de erros, mensagens críticas do kernel",
"events": "Erros idênticos repetidos; explosão súbita de avisos (padrão cascata); <code>BUG:</code> / <code>OOPS:</code> / <code>oom-killer</code> em dmesg."
},
{
"category": "Atualizações do sistema",
"checks": "Atualizações pendentes, atualizações de segurança, kernel / versão PVE, idade do sistema",
"events": "Atualizações de segurança ou do kernel em uso pendentes; sistema sem atualizar há muito tempo. O cabeçalho da vista geral apresenta <em>Atualizar agora</em> quando há atualizações. O botão executa todo o processo ProxMenux; ao fechar, atualiza o estado com <code>?refresh=1</code> sem esperar pelo ciclo seguinte."
},
{
"category": "Segurança e Certificados",
"checks": "Tentativas de início de sessão, certificados a expirar, estado das jails Fail2Ban se instalado",
"events": "Falhas repetidas de autenticação SSH ou web; certificado PVE a expirar em menos de 30 dias; bloqueios Fail2Ban ativos."
}
]
},
"severity": {
"heading": "Modelo de gravidade",
"headerStatus": "Estado",
"headerColour": "Cor",
"headerMeaning": "Significado",
"headerNotification": "Notificação",
"rows": [
{
"status": "OK",
"colour": "Verde",
"meaning": "Saudável. Não há resultados nesta categoria.",
"notification": "Silêncio."
},
{
"status": "INFO",
"colour": "Azul",
"meaning": "Condição transitória ou já resolvida que vale a pena observar uma vez. Também usado para categorias que possuem <em>apenas</em> itens descartados restantes.",
"notification": "Opcional. Cada tipo de evento pode ser ativado ou desativado por canal."
},
{
"status": "WARNING",
"colour": "Amarelo",
"meaning": "Atenção é necessária, mas o hospedeiro ainda está funcional. A causa não é trivial — leia os detalhes.",
"notification": "Enviada quando o tipo de evento está ativo no canal."
},
{
"status": "CRITICAL",
"colour": "Vermelho",
"meaning": "Funcionalidade quebrada ou perda de dados possível. Acção necessária.",
"notification": "Enviada se o tipo de evento estiver ativo no canal. Um alerta de temperatura da CPU CRITICAL volta a ser emitido por segurança mesmo após ser silenciado."
}
],
"infoNote": "Uma categoria <strong>OK</strong> com eventos ainda no período de supressão aparece como <strong>INFO</strong>, para recordar que há alertas silenciados.",
"unknownTitle": "UNKNOWN quando uma verificação não pode ser concluída",
"unknownBody": "Uma verificação indisponível devolve <code>UNKNOWN</code>; após três ciclos consecutivos é guardada uma ocorrência persistente. O painel mostra-a a amarelo. O estado global limita <code>UNKNOWN</code> a <strong>WARNING</strong>: uma verificação indisponível, por si só, não torna o anfitrião crítico."
},
"dashboardView": {
"heading": "A visão do painel",
"intro": "A monitorização encontra-se no separador <strong>Vista geral</strong>. O indicador no cabeçalho (Saudável / Aviso / Crítico) abre uma janela com duas listas:",
"items": [
"<strong>Ativos</strong> — categorias com ocorrências por resolver. Cada linha expande os controlos envolvidos, o texto original <code>reason</code>, o ID do dispositivo ou VM e, quando disponível, uma ligação para Armazenamento, Rede, VMs, Registos ou Hardware.",
"<strong>Suprimidos</strong> — alertas reconhecidos pelo utilizador ainda no período de supressão. Cada linha mostra o tempo restante e a duração escolhida. Ao terminar, sai desta lista; se a causa persistir e a categoria o permitir, volta aos <em>Ativos</em>."
],
"pillTitle": "O indicador reflete a categoria mais grave",
"pillBody": "A cor do cabeçalho reflete a gravidade máxima: CRITICAL → vermelho, senão WARNING → amarelo, senão INFO → azul, senão verde. A mesma lógica controla o ponto do favicon e o distintivo PWA.",
"updateNowTitle": "Atualizar agora no cabeçalho Visão geral",
"updateNowBody1": "Se <em>Atualizações do sistema</em> indicar atualizações pendentes, surge <strong>Atualizar agora</strong> junto do indicador. A janela executa o fluxo de <em>ProxMenux → Settings post-install Proxmox → Proxmox System Update</em>: limpeza de repositórios, <code>apt full-upgrade</code> através de <code>update-pve-safe.sh</code>, reconstrução DKMS dos controladores geridos com um novo kernel, autoremove/autoclean e pedido de reinício se o kernel mudar. O progresso aparece em direto.",
"updateNowBody2": "No fim, fechar a janela chama <code>GET /api/health/details?refresh=1</code> e invalida a cache do endpoint. As atualizações pendentes e a gravidade são recalculadas a partir do novo estado dos pacotes; o distintivo desaparece sem esperar pelo próximo ciclo. Se o anfitrião já estiver atualizado, o botão fica oculto."
},
"dismiss": {
"heading": "Silenciar alertas e definir a duração da supressão",
"intro": "Alguns eventos persistem, como <em>Atualizações do sistema: atualizações disponíveis</em> até atualizar o anfitrião. Uma notificação a cada cinco minutos seria desnecessária. O botão <em>Atualizar agora</em> na vista geral resolve diretamente esse caso. Para os restantes casos ou atualizações adiadas, há dois mecanismos ligados de silenciamento:",
"step1": "<strong>Silenciar um evento</strong> na janela. O menu oferece <strong>24 horas</strong>, <strong>7 dias</strong> ou <strong>Permanentemente</strong>, independentemente da categoria. A escolha envia <code>POST /api/health/acknowledge</code> com <code>error_key</code> e <code>suppression_hours</code> (<code>-1</code> para permanente). O evento passa aos suprimidos com a data <code>acknowledged_at</code>.",
"dropdownImageAlt": "Menu para silenciar um alerta: 24 horas, 7 dias ou permanentemente",
"dropdownImageCaption": "A duração escolhida aplica-se só a este alerta; sem escolha individual, usa-se o valor da categoria. Os alertas silenciados permanentemente têm uma etiqueta âmbar <em>Permanente</em> e normalmente não reaparecem. A temperatura crítica da CPU é a exceção descrita abaixo.",
"step2": "<strong>Duração da supressão por categoria</strong>. Em Definições → Monitorização, ou por <code>POST /api/health/settings</code>, cada uma das dez categorias tem uma duração predefinida usada sem escolha individual:",
"imageAlt": "Duração da supressão por categoria em Definições → Monitorização",
"imageCaption": "Um menu por categoria. Escolha uma duração maior para eventos repetitivos, como atualizações pendentes, e menor para os que pretende reavaliar depressa. As supressões ativas aparecem abaixo.",
"outro": "Durante a supressão, a verificação continua e atualiza <code>last_seen</code>, sem nova notificação. No fim, o ciclo seguinte reavalia a causa: o alerta pode voltar a ser emitido ou desaparecer se o problema estiver resolvido.",
"activeSuppressionsTitle": "Consultar e anular as supressões ativas",
"activeSuppressionsBody": "Os alertas silenciados, temporários ou permanentes, aparecem em <strong>Definições → Monitorização → Supressões ativas</strong>. Cada linha mostra identificador, categoria, gravidade, data e tempo restante. <strong>Reativar</strong> remove o reconhecimento para a próxima verificação. As supressões permanentes anulam-se aqui; as temporárias também podem terminar antes do prazo. Ative <em>Editar</em>, escolha as linhas (contorno verde e texto rasurado) e guarde. Cancelar limpa a seleção.",
"autoTitle": "Supressão automática ao alterar a duração",
"autoBody": "Escolher uma duração diferente das 24 h predefinidas tem um segundo efeito: <strong>as futuras ocorrências da categoria são guardadas já reconhecidas</strong>. Uma semana escolhida para os discos também vale para os novos alertas, sem os silenciar individualmente. Surgem diretamente nos suprimidos com a duração escolhida. As categorias mantidas em 24 h conservam o funcionamento habitual: as novas ocorrências ficam ativas até intervir.",
"tempTitle": "Exceção para temperatura da CPU CRITICAL",
"tempBody": "A persistência tem uma regra especial para <strong>Temperatura da CPU CRITICAL</strong>: esse registo ignora o reconhecimento anterior e a supressão automática. Isso não significa que todas as verificações de temperatura emitam um registo crítico ao ultrapassar um limiar configurado.",
"nonDismissableTitle": "Que ocorrências podem ser silenciadas?",
"nonDismissableBody": "A janela mostra Silenciar apenas se a verificação devolver explicitamente dismissable = true. Um valor falso ou ausente oculta o botão. A gravidade não determina esta permissão: várias verificações críticas permitem o reconhecimento. Os exemplos descrevem os dados atuais; silenciar um alerta não resolve a causa.",
"headerFinding": "Ocorrência",
"headerWhy": "Comportamento da supressão",
"rows": [
{
"finding": "Temperatura da CPU: aviso / crítica",
"why": "O aviso baseado nas amostras de temperatura permite explicitamente a supressão. Uma regra separada ignora o reconhecimento se chegar um registo de temperatura da CPU com gravidade CRITICAL."
},
{
"finding": "Espaço do sistema de arquivos crítico (montagem da raiz)",
"why": "As verificações de espaço permitem a supressão mesmo com ocupação crítica. Reconhecer o alerta não liberta espaço nem elimina o risco de falhas de escrita."
},
{
"finding": "ZFS pool DEGRADED / FAULTED",
"why": "As verificações de capacidade dos pools ZFS permitem a supressão. As restantes ocorrências seguem o seu próprio indicador. Reconhecer não repara um pool degradado ou avariado."
},
{
"finding": "Erros de E/S de disco com SMART FAILED",
"why": "As ocorrências de disco guardadas a partir do journal podem permitir a supressão. SMART FAILED continua a exigir investigação; o botão depende do indicador da verificação, não apenas do texto do alerta."
},
{
"finding": "Interface de rede DOWN",
"why": "As verificações persistentes de interface DOWN permitem a supressão. Isso não restaura o bridge, o bond, a ligação física ou o acesso remoto."
},
{
"finding": "E/S eventos em discos saudáveis (INFO)",
"why": "Os eventos ATA ou dmesg transitórios com SMART saudável podem ser informativos e resolver-se sozinhos. As linhas informativas podem não oferecer Silenciar; a verificação determina quando a condição está resolvida."
}
],
"principle": "Use o botão apresentado na ocorrência concreta, sem deduzir a disponibilidade pela categoria ou gravidade. O reconhecimento controla a apresentação e as notificações. As verificações de recuperação e o histórico do disco são independentes."
},
"autoresolve": {
"heading": "Resolução automática e limpeza",
"intro": "Muitos alertas devem desaparecer quando a causa termina: uma VM volta a arrancar, um disco foi retirado ou a temperatura regressa ao normal. A limpeza no fim de cada ciclo de cinco minutos aplica estas regras:",
"headerTrigger": "Acionador",
"headerAction": "Ação",
"rows": [
{
"trigger": "Uso da CPU ou temperatura de volta ao normal.",
"action": "Marcado resolvido. Sai da lista Active."
},
{
"trigger": "Pressão de memória de volta abaixo do limiar de aviso após um OOM / aviso de memória.",
"action": "Marcado resolvido."
},
{
"trigger": "VM / CT referenciado pelo erro já não existe (<code>qm status</code> / <code>pct status</code> non-zero).",
"action": "Marcado resolvido como recurso removido."
},
{
"trigger": "Disco referenciado pelo erro não mais presente em <code>/dev/</code>.",
"action": "Marcado resolvido como dispositivo removido. O histórico de observação permanente está preservado (ver secção seguinte)."
},
{
"trigger": "Ocorrências do journal do sistema (categoria <code>logs</code>, entradas SMART, erros ATA ou E/S) quando termina o período de supressão.",
"action": "São removidas. Cada análise examina novas entradas do journal a partir desse momento; a mesma linha antiga não volta a ser emitida."
},
{
"trigger": "Erros resolvidos com mais de sete dias.",
"action": "Excluído da base de dados para manter a tabela pequena. O histórico de notificação é independente e mantido por mais tempo."
}
],
"permanentTitle": "Supressão permanente não significa resolução",
"permanentBody": "Uma duração por categoria de <code>-1</code> (<em>permanente</em>) silencia futuros alertas dos itens reconhecidos, mas não ignora a resolução automática. Se a causa desaparecer, por remoção do recurso ou regresso abaixo do limiar, o item continua a ser limpo automaticamente."
},
"observations": {
"heading": "Observações de discos — o histórico permanente",
"intro": "Os eventos de disco devem ser conservados. Um aviso SMART em <code>/dev/sdh</code> às 02:14 continua a ser relevante após terminar a sequência de erros de E/S e a resolução automática: o disco já tem antecedentes. A monitorização mantém por isso uma tabela <strong>permanente</strong> separada: <code>disk_observations</code>.",
"headerProperty": "Propriedade",
"headerErrors": "Tabela <code>errors</code> (Ativos)",
"headerObs": "Tabela <code>disk_observations</code>",
"rows": [
{
"property": "Finalidade",
"errors": "Alimenta a vista do estado <em>atual</em> e o envio de notificações.",
"obs": "Trilha de auditoria permanente por disco."
},
{
"property": "Resolver automaticamente",
"errors": "Sim — as linhas são limpas quando a condição desaparece.",
"obs": "Não — as entradas persistem para sempre, a menos que o usuário as descarte explicitamente."
},
{
"property": "Chave de deduplicação",
"errors": "<code>error_key</code> (por exemplo <code>smart_sdh</code>).",
"obs": "<code>(disk_registry_id, error_type, error_signature)</code> com assinaturas estáveis sem dados voláteis."
},
{
"property": "Onde mostrado",
"errors": "Janela de monitorização (listas Ativos / Suprimidos).",
"obs": "Cartão do disco no separador <strong>Armazenamento</strong>, com um indicador «X obs.» por disco."
},
{
"property": "O que grava",
"errors": "O que quer que esteja a falhar.",
"obs": "Avisos SMART (setores, temperatura, CRC, autotestes falhados), erros de E/S (ATA / NVMe / dm), erros do sistema de ficheiros e eventos dos pools ZFS."
}
],
"outro": "Um alerta pode desaparecer do painel e continuar no histórico do disco. Ao abrir o disco em Armazenamento, o cartão mostra o número de observações pendentes com datas, gravidade e mensagem original não processada. Isto ajuda a decidir se deve substituir a unidade.",
"renameTitle": "Renomeamentos entre dispositivos são mesclados automaticamente",
"renameBody": "Os discos podem surgir primeiro com nomes provisórios como <code>ata8</code> ou <code>nvme0n1p3</code>. As observações são agrupadas pelo número de série conhecido: se um evento for registado como <code>ata8</code> e o disco depois identificado como <code>sdh</code>, no ciclo seguinte as observações anteriores são associadas a <code>sdh</code>, mantendo o histórico unido."
},
"notification": {
"heading": "De uma constatação a uma notificação",
"intro": "Cada erro ativo também é um candidato para o motor de notificação. O fluxo:",
"items": [
"O scanner registra o achado com categoria + gravidade + detalhes estruturados.",
"Se o tipo de evento estiver <strong>ativo</strong> nas notificações globais e o canal não tiver silenciado a categoria, o evento entra na fila.",
"O motor de modelos produz título e corpo a partir dos dados estruturados. Se a reformulação IA estiver ativa, o par passa pelo fornecedor configurado para uma versão em linguagem simples.",
"O canal envia uma mensagem Telegram, um embed Discord, uma notificação push Gotify ou um e-mail. O resultado é guardado em <code>notification_history</code>.",
"Silenciar um alerta inicia o período de supressão. Novas deteções do mesmo <code>error_key</code> normalmente não geram notificações nem ficam automaticamente em fila para o fim do período. Mantém-se a exceção da temperatura crítica da CPU."
],
"outro": "A configuração dos canais — token do bot Telegram, URLs de webhook, chaves IA, opções por evento e por canal — está em <notifLink>Notificações</notifLink> e <aiLink>Assistente de IA</aiLink>."
},
"rest": {
"heading": "Endpoints REST",
"intro": "As ações da janela estão disponíveis pela API para scripts, painéis ou bots. Com a autenticação do Monitor ativa, é necessário um token Bearer válido, obtido no início de sessão ou no ecrã de tokens API. As alterações, como reconhecer alertas, guardar ou limpar erros órfãos, exigem full_admin; read_only recebe 403. Com autenticação desativada ou recusada, estes controlos permitem acesso sem token.",
"headerEndpoint": "Endpoint",
"headerMethod": "Método",
"headerUse": "Utilização",
"rows": [
{
"endpoint": "/api/health",
"method": "GET",
"use": "Verificação leve que devolve JSON com <code>status</code>, <code>timestamp</code> e <code>version</code>. Serve para verificações de palavras-chave Uptime Kuma; com autenticação do Monitor ativa, o cliente tem de enviar um cabeçalho Bearer."
},
{
"endpoint": "/api/health/status",
"method": "GET",
"use": "Estado global: um nível de gravidade e um resumo. Requer autenticação."
},
{
"endpoint": "/api/health/details",
"method": "GET",
"use": "As dez categorias com os respetivos estados e os dados estruturados que os produziram."
},
{
"endpoint": "/api/health/full",
"method": "GET",
"use": "Vista completa: categorias, erros ativos, suprimidos e definições personalizadas. Alimenta a janela numa só chamada e usa uma cache de seis minutos em segundo plano para responder rapidamente."
},
{
"endpoint": "/api/health/active-errors",
"method": "GET",
"use": "Só a lista dos Activos. Filtrado por <code>?category=&lt;name&gt;</code>."
},
{
"endpoint": "/api/health/dismissed",
"method": "GET",
"use": "Apenas os suprimidos, com as horas restantes."
},
{
"endpoint": "/api/health/acknowledge",
"method": "POST",
"use": "Corpo: <code>'{'\"error_key\":\"smart_sdh\"'}'</code>. Descarte um alerta com a janela configurada da categoria."
},
{
"endpoint": "/api/health/settings",
"method": "GET / POST",
"use": "Ler ou guardar a duração da supressão por categoria."
},
{
"endpoint": "/api/health/cleanup-orphans",
"method": "POST",
"use": "Limpeza manual de erros cujo dispositivo subjacente / VM se foi. Idempotente."
}
],
"codeComment1": "# Obter o estado atual para um script",
"codeComment2": "# Rejeite um erro específico",
"codeComment3": "# Configura a supressão da categoria de discos para uma semana"
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Painel",
"href": "/docs/monitor/dashboard",
"tail": " — ponto de abertura da janela de monitorização na interface."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tail": " — canais, opções por evento, reformulação IA e histórico."
},
{
"label": "Assistente de IA",
"href": "/docs/monitor/ai-assistant",
"tail": " — fornecedor (OpenAI / Anthropic / Gemini / Groq / Ollama / OpenRouter), modo do prompt, detalhe por canal e idioma."
},
{
"label": "Arquitetura",
"href": "/docs/monitor/architecture",
"tailRich": " — esquema SQLite (<code>errors</code>, <code>disk_observations</code>, <code>events</code>) e frequência das tarefas em segundo plano."
}
]
}
}
+151
View File
@@ -0,0 +1,151 @@
{
"meta": {
"title": "ProxMenux Monitor — Painel da Web auto-hospedado para Proxmox VE | ProxMenux",
"description": "ProxMenux Monitor é um painel web auto-hospedado para Proxmox VE: métricas de host em tempo real, armazenamento e dados SMART, rede, VMs e contêineres, hardware, logs, um terminal web integrado, um Health Monitor proativo, notificações para Telegram / Discord / Email, um assistente de IA opcional, um REST API e integrações com ferramentas como Homepage e Home Assistant.",
"ogTitle": "ProxMenux Monitor — Painel da Web auto-hospedado para Proxmox VE",
"ogDescription": "Painel Proxmox VE em tempo real: métricas de host, armazenamento SMART, rede, VMs e contêineres, hardware, logs, terminal web, Health Monitor, notificações, assistente de IA, REST API.",
"twitterTitle": "ProxMenux Monitor | ProxMenux",
"twitterDescription": "Painel Proxmox VE auto-hospedado com Health Monitor, notificações, assistente de IA e REST API."
},
"header": {
"title": "ProxMenux Monitor",
"description": "Um painel web Proxmox VE alojado no próprio host e distribuído como AppImage. Corre como serviço systemd único, escuta na porta TCP 8008 e serve API e interface no mesmo processo.",
"section": "ProxMenux Monitor"
},
"atGlance": {
"title": "Resumo",
"body": "Único AppImage no host Proxmox → Flask backend (porta 8008) coletando dados ao vivo via <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code> → Painel Next.js servido no mesmo processo. Autenticação opcional (senha + 2FA), assistente de IA opcional, notificações opcionais, REST API para integrações."
},
"hero": {
"alt": "ProxMenux Monitor painel — tela de visão geral do sistema com CPU, widgets de memória, temperatura e tempo de atividade",
"caption": "Tela de destino padrão: visão geral das métricas e do estado de integridade no nível do host."
},
"coverage": {
"heading": "O que o painel cobre",
"intro": "Oito secções principais, cada uma com os seus endpoints API:",
"tableSection": "Seção",
"tableWhat": "O que mostra",
"sections": [
{
"name": "Monitor de Saúde",
"description": "Alertas ativos e dispensados em CPU, memória, armazenamento, discos, rede, serviços, logs, VMs, atualizações e segurança. Aciona o mecanismo de notificação."
},
{
"name": "Armazenamento",
"description": "Pools de armazenamento Proxmox, discos físicos (SATA / NVMe / USB), atributos SMART, estado dos pools ZFS, desgaste e vida útil, atividade E/S."
},
{
"name": "Rede",
"description": "Todas as interfaces (físicas, ligações, pontes, OVS), IP/MAC/estado, gráficos RX/TX em tempo real, dados históricos de RRD por interface."
},
{
"name": "VMs e contêineres",
"description": "Inventário VM/LXC com estado, recursos e tempo de atividade. Os detalhes mostram configuração, métricas históricas, transferência de registos Proxmox e ações iniciar/parar/reiniciar/desligar. Os registos dependem do endpoint Proxmox; não é um arquivo completo do sistema convidado."
},
{
"name": "Hardware",
"description": "CPU modelo e topologia, layout de memória, dispositivos PCIe, lista GPU com driver e monitoramento em tempo real por slot (NVIDIA / Intel iGPU)."
},
{
"name": "Registros e eventos",
"description": "<code>journalctl</code> ativo com filtros de gravidade/intervalo de tempo/palavra-chave, histórico de tarefas Proxmox, log de notificação, pacotes de log para download."
},
{
"name": "Terminal",
"description": "Shell do host e consolas VM/CT suportadas no navegador via <code>xterm.js</code> e WebSockets. Segue a autenticação configurada: desativada ou recusada, permite sessões sem início de sessão a clientes com acesso de rede. Não implica auditoria de cada comando."
},
{
"name": "Segurança",
"description": "Falhas de autenticação, estado das jails do Fail2Ban, bloqueios recentes e integração com a jail <code>[proxmenux]</code> do host."
}
],
"footer": "Cada seção tem uma página de documentação dedicada em <link>Painel</link> na barra lateral."
},
"howItRuns": {
"heading": "Como funciona",
"intro": "O ProxMenux Monitor é distribuído como uma AppImage autónoma. Uma única unidade systemd (<code>proxmenux-monitor.service</code>) inicia um processo Flask que:",
"bullets": [
"Ouve em <strong>TCP 8008</strong> no host (HTTP).",
"Serve o painel Next.js como ficheiros estáticos em <code>/</code> e a API em <code>/api/*</code> no mesmo processo.",
"Extrai dados ativos com ferramentas de host padrão: <code>psutil</code>, <code>pvesh</code>, <code>smartctl</code>, <code>journalctl</code>, <code>zpool</code>, <code>ip</code>, <code>nvidia-smi</code>, etc.",
"Persiste seu próprio estado em um banco de dados local SQLite (<code>/usr/local/share/proxmenux/health_monitor.db</code>): alertas descartados, observações de disco, configuração de notificação, configuração de IA. O estado de autenticação reside separadamente em <code>/root/.config/proxmenux-monitor/auth.json</code>."
],
"footer": "O fluxo completo da solicitação, o layout do arquivo e a integração systemd estão descritos em <link>Arquitetura</link>."
},
"noAgent": {
"title": "Nenhum agente nos convidados",
"body": "O Monitor recolhe todos os dados a partir do host. Não é necessário instalar agentes nas VM ou nos CT: os dados vêm da API do Proxmox e das informações que o kernel do host disponibiliza sobre os sistemas convidados em execução."
},
"access": {
"heading": "Acessando o painel",
"intro": "Dois padrões de acesso são suportados e o aplicativo detecta qual deles está em uso:",
"codeComment1": "# 1) Acesso direto no host",
"codeComment2": "# 2) Via proxy reverso (Nginx/Caddy/Traefik)",
"afterCode": "O proxy inverso deve definir <code>X-Forwarded-For</code>, <code>X-Forwarded-Proto</code> e <code>X-Forwarded-Host</code> corretamente e encaminhar WebSockets. Nas portas padrão o navegador usa a origem atual. O backend só confia nos IPs encaminhados com PROXMENUX_TRUST_PROXY=1 explícito; restrinja o acesso direto ao backend ao ativá-lo.",
"footer": "Configuração de primeira inicialização, senha + TOTP 2FA e snippets de proxy reverso são abordados em <link>Acesso e autenticação</link>."
},
"mobile": {
"heading": "Uso móvel e instalação na tela inicial",
"intro": "O painel é responsivo e vem como um Progressive Web App. O pacote <code>public/manifest.json</code> declara <code>display: standalone</code> com um nome de aplicativo, ícone e cor de tema, portanto, adicionar o URL à tela inicial produz um verdadeiro iniciador independente - sem barra de endereço do navegador, splash personalizado, tema escuro correspondente ao painel.",
"phoneAlt": "ProxMenux Monitor em execução em um telefone — visualização do painel principal",
"phoneCaption": "Painel principal em um telefone: o layout reflui para pequenas janelas de visualização.",
"addHeading": "Adicionar à tela inicial",
"iosLabel": "iOS Safari:",
"iosBody": "botão compartilhar → <em>Adicionar à tela inicial</em>. O ícone vem de <code>/apple-touch-icon.png</code> enviado no AppImage.",
"androidLabel": "Android Chrome/Edge:",
"androidBody": "menu de três pontos → <em>Instalar aplicativo</em> (ou <em>Adicionar à tela inicial</em> em versões mais antigas).",
"afterInstall": "Depois de instalado, abrir o ícone inicia o painel em modo independente com sua própria entrada no alternador de tarefas.",
"onlineOnlyTitle": "Requer ligação à rede",
"onlineOnlyBody": "A PWA pode ser instalada, mas <strong>não</strong> funciona offline: não inclui um service worker. O atalho comporta-se como uma aplicação nativa, mas o dispositivo tem de conseguir contactar o host através de TCP 8008, por LAN, VPN ou HTTPS com proxy inverso, para carregar o painel."
},
"health": {
"heading": "Monitor de integridade e notificações",
"alt": "Tela do Health Monitor mostrando as categorias 10 rastreadas (CPU, memória, armazenamento, discos, rede, serviços, logs, VMs, atualizações, segurança) com status atual",
"caption": "Visualização do Health Monitor — as categorias 10 monitoradas, com seu status atual. Alertas ativos e dispensados aparecem aqui quando o sistema gera algum.",
"body1": "O <strong>Health Monitor</strong> corre em segundo plano e gera eventos estruturados: temperatura CPU elevada, avisos SMART, degradação dos pools ZFS, processos terminados por OOM, falhas VM/CT e incidentes de segurança. Cada evento tem categoria, gravidade (INFO / WARNING / CRITICAL) e <code>error_key</code> estável para agrupar duplicados sem encher o ecrã.",
"feedsIntro": "Os eventos alimentam três coisas ao mesmo tempo:",
"feedsHealth": "A <strong>visualização do Health Monitor</strong> no painel (listas ativas + dispensadas).",
"feedsChannels": "O <strong>mecanismo de notificação</strong> — Telegram, Discord, E-mail, Gotify, Pushover e Apprise (multicanal). Cada canal é configurado de forma independente e as categorias por evento podem ser silenciadas.",
"feedsAI": "O <strong>assistente de IA</strong> opcional — quando ativado, o provedor configurado (OpenAI, Anthropic, Gemini, Groq, Ollama ou OpenRouter) explica os eventos recebidos em linguagem simples e, se habilitado nas configurações de IA, propõe as próximas etapas.",
"suppressionTitle": "Supressão em vez de silenciar tudo",
"suppressionBody": "Cada categoria tem sua própria <em>Duração de supressão</em>: quando você dispensa um alerta, o mesmo alerta é silenciado para aquela janela (padrão 24 horas, configurável por categoria até permanente). Escalações reais - por ex. CPU temperatura ultrapassando o limite crítico — sempre aciona novamente, independentemente da supressão."
},
"api": {
"heading": "REST API e integrações",
"intro": "Os endpoints REST expõem dados de monitorização JSON por HTTP/HTTPS para Homepage, Home Assistant, Uptime Kuma e scripts. Grafana pode usar o exportador de texto Prometheus separado em <code>/api/prometheus</code>. As chamadas podem usar <code>curl</code>.",
"tokens": "Tokens API de longa duração (365 dias) são gerados em <strong>Configurações → API Tokens de acesso</strong> ou via <code>POST /api/auth/generate-api-token</code>.",
"bearer": "Envie tokens com <code>Authorization: Bearer …</code>. O endpoint público <code>/api/health</code> serve a testes de disponibilidade sem credenciais. Em <code>/api/auth/*</code> existem rotas públicas de configuração/início/estado e rotas protegidas de contas e tokens; nem todas são anónimas.",
"catalog": "O catálogo de endpoints, rotação de tokens e segurança estão na <linkApi>Referência da API</linkApi>; exemplos para Homepage, Home Assistant, Grafana, Uptime Kuma e cURL estão em <linkIntegrations>Integrações</linkIntegrations>."
},
"serviceControl": {
"heading": "Controle de serviço",
"intro": "Diariamente, o Monitor é gerenciado exatamente como qualquer outro serviço systemd. Ele também é exposto como duas entradas dentro da TUI ProxMenux em <em>Configurações</em>:",
"codeComment": "# Controle manual",
"footer": "Consulte <link>Configurações → ProxMenux Monitor</link> para alternar no menu e fluxo de verificação de status."
},
"nextSteps": {
"heading": "Para onde ir",
"items": [
{
"label": "Arquitetura",
"description": "— back-end Flask, unidade systemd, esquema SQLite, provedores de IA, canais de notificação."
},
{
"label": "Acesso e autenticação",
"description": "— primeira inicialização, configuração de senha, TOTP 2FA, configuração de proxy reverso, integração Fail2Ban."
},
{
"label": "Painel",
"description": "— cada secção da interface, uma página por secção."
},
{
"label": "Referência da API",
"description": "— cada endpoint, formato de solicitação/resposta e gerenciamento de token."
},
{
"label": "Integrações",
"description": "— Homepage, Home Assistant, Grafana / Prometheus, Uptime Kuma e padrão cURL genérico."
}
]
}
}
@@ -0,0 +1,255 @@
{
"meta": {
"title": "Integrações Proxmox — Homepage, Home Assistant, Grafana, Prometheus | ProxMenux Monitor",
"description": "Exemplos para copiar e ligar o ProxMenux Monitor ao Homepage, Home Assistant, Grafana via Prometheus e Uptime Kuma, com a configuração necessária, endpoints API e cabeçalho de autenticação.",
"ogTitle": "Integrações Proxmox — Homepage, Home Assistant, Grafana, Prometheus",
"ogDescription": "Guia para ligar o ProxMenux Monitor ao Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma.",
"twitterTitle": "Integrações Proxmox | ProxMenux Monitor",
"twitterDescription": "Receitas para Homepage, Home Assistant, Grafana, Prometheus e Uptime Kuma."
},
"header": {
"title": "Integrações",
"description": "Exemplos para copiar para as ferramentas do seu homelab: Homepage, Home Assistant, Grafana via Prometheus e Uptime Kuma. Cada exemplo mostra a configuração esperada, o endpoint do Monitor utilizado e o cabeçalho de autenticação necessário.",
"section": "Monitor do ProxMenux"
},
"intro": {
"title": "O que você pode construir a partir desta página",
"body": "Copie cada exemplo para a ferramenta escolhida. Os endpoints estão na <link>Referência da API</link>; esta página explica como usá-los no Homepage, Home Assistant e Grafana. As imagens mostram o resultado das configurações."
},
"auth": {
"heading": "Autenticação: a única coisa que cada receita precisa",
"intro": "A maioria dos endpoints usados por essas integrações são autenticados. Tem duas maneiras de satisfazer esse requisito.",
"optAtitle": "Opção A — API token (recomendado para integrações)",
"optAbody1": "Abra <strong>Definições → Segurança → Tokens API</strong>. Clique em <em>Gerar token</em>, dê-lhe um nome como <em>homepage</em>, <em>home-assistant</em> ou <em>prometheus</em> e copie-o: é apresentado <em>uma única vez</em>. Expira ao fim de um ano por predefinição e pode ser revogado individualmente. Use-o em clientes externos ao navegador.",
"optAbody2": "A partir desse ponto cada pedido é apenas:",
"optBtitle": "Opção B – fluxo de login (nome de usuário + senha)",
"optBbody": "Útil para scripts que autenticam como um usuário humano. O token retornado é de curta duração; a maioria das integrações deve preferir a Opção A.",
"outro": "O campo TOTP só é necessário com autenticação de dois fatores ativa. A rotação e revogação dos tokens, a política de palavras-passe e o registo de auditoria estão em <link>Acesso e autenticação</link>.",
"httpsTitle": "Usando HTTPS em vez de HTTP",
"httpsIntro": "Cada receita abaixo usa <code>http://</code> nas URLs para manter os exemplos curtos. Se você ativou TLS no Monitor (<strong>Configurações → Segurança → SSL/HTTPS</strong>), troque <code>http://</code> para <code>https://</code> em cada URL — essa é a única mudança. Duas notas específicas para certos instrumentos:",
"httpsItems": [
"<strong>Certificados autoassinados.</strong> A integração Home Assistant <code>rest:</code> verifica TLS por predefinição. Para um certificado autoassinado do Monitor, adicione <code>verify_ssl: false</code> a cada bloco REST junto de <code>scan_interval:</code>, ou importe a CA do Monitor para os certificados de confiança. O mesmo se aplica a outras ferramentas que verificam certificados.",
"<strong>Prometheus</strong> já inclui <code>scheme: https</code> no exemplo abaixo. Ative ou mantenha <code>https</code> se TLS estiver ativo no Monitor."
]
},
"homepage": {
"heading": "Homepage",
"headingHref": "https://gethomepage.dev",
"intro": "Homepage é um painel de aplicações estático e personalizável. O ProxMenux Monitor liga-se pelo widget integrado <code>customapi</code>: adicione um serviço a <code>services.yaml</code>, reinicie o Homepage e o cartão mostra valores atualizados.",
"iconCalloutTitle": "O logótipo oficial do ProxMenux está em dashboardicons.com",
"iconCalloutBody": "Os exemplos usam <code>icon: proxmenux.png</code>. O Homepage procura nomes simples em <a1>dashboardicons.com</a1>, uma biblioteca de ícones para painéis autoalojados. A entrada ProxMenux está em <a2>dashboardicons.com/icons/external/proxmenux</a2> e é carregada na primeira apresentação. Funciona para milhares de ferramentas como Telegram, Discord, Grafana e Tailscale: indique <code>icon: &lt;name&gt;.png</code> no serviço.",
"imageAlt": "Painel Homepage com três cartões ProxMenux Monitor (EDGE, VOID, DREAM), com tempo de funcionamento, CPU, RAM e temperatura de cada anfitrião",
"imageCaption": "Três instâncias ProxMenux Monitor como cartões Homepage: tempo de funcionamento, CPU, RAM e temperatura lidos de <code>/api/system</code> em cada anfitrião a cada 10 s.",
"basicTitle": "Elemento básico — sem autenticação",
"basicIntro": "Use isso quando o ProxMenux Monitor estiver em uma rede confiável e você ainda não tiver habilitado a autenticação no lado Monitor. A entrada <code>services.yaml</code> mais simples possível:",
"authedTitle": "Elemento autenticado",
"authedIntro": "Gere um token API em <strong>Configurações → Segurança → API Tokens</strong> no Monitor, copie-o e cole-o no cabeçalho <code>Authorization</code> abaixo — substitua o token de exemplo mostrado após <code>Bearer</code> pelo que você acabou de copiar:",
"authedOutro": "Reinicie o Homepage para apresentar valores atualizados. Reutilize o token nos widgets que consultam a mesma instância do Monitor.",
"multiTitle": "Configuração multi-widget — sistema, armazenamento, rede",
"multiIntro": "Para mais detalhes, crie três cartões com endpoints diferentes: sistema, armazenamento e rede. Use o mesmo token para esta instância do Monitor.",
"multiCalloutTitle": "Múltiplas máquinas Proxmox",
"multiCalloutBody": "Repita o bloco por anfitrião para obter os cartões mostrados. Cada entrada usa <code>http://&lt;host&gt;:8008</code> da sua instância. Gere e guarde um token por anfitrião: cada instalação tem a sua chave de assinatura, pelo que um token não funciona automaticamente noutra."
},
"homeAssistant": {
"heading": "Home Assistant",
"headingHref": "https://www.home-assistant.io",
"intro": "Os exemplos usam a integração <code>rest</code> do Home Assistant, sem componente HACS específico. Lê os endpoints da <link>Referência da API</link> e cria sensores e atributos para automações. A configuração fornece cerca de 25 sensores de recursos, estado, VMs/CTs, armazenamento, rede e atualizações. Adicione-a a <code>configuration.yaml</code> e recarregue ou reinicie o HA.",
"imageAlt": "Painel Home Assistant mostrando entidades ProxMenux Monitor — emblema de estado de saúde, CPU / RAM / medidores de temperatura, contagem de VM, uso de armazenamento e contador de erros ativos",
"imageCaption": "ProxMenux Monitor como integração Home Assistant de primeira classe — sensores construídos a partir da receita YAML abaixo.",
"step1Title": "1 · Guardar o token API",
"step1Body": "Guarde o token em <code>secrets.yaml</code> para o separar da configuração principal. Inclua o prefixo Bearer e o token num valor utilizável como cabeçalho. O ficheiro não é cifrado e também deve permanecer privado. A localização depende da instalação, normalmente <code>/config/secrets.yaml</code> em HA OS ou Container.",
"step2Title": "2 · Adicionar a configuração REST",
"step2Body": "Seis blocos REST cobrem as áreas principais. O <code>scan_interval</code> acompanha a frequência das alterações: recursos a cada 30 s, estado a cada 60 s, inventários a cada 5–10 min. Cole em <code>configuration.yaml</code>:",
"step3Title": "3 · Adicionar sensores binários e auxiliares de modelos",
"step3Body": "Dois sensores binários e dois sensores de modelo completam a integração, simplificando automações e cartões condicionais Lovelace sem repetir expressões Jinja em todo o lado.",
"step4Title": "4 · Recarregar e verificar",
"step4Body": "Verifique primeiro a sintaxe em <em>Ferramentas de programador → YAML → Verificar configuração</em>. Recarregue <em>Toda a configuração YAML</em> ou reinicie o HA. Em <em>Definições → Dispositivos e serviços → Entidades</em>, filtre por <em>proxmenux</em>. As cerca de 25 entidades deverão receber valores num intervalo de leitura.",
"replaceTitle": "Substituindo uma versão anterior desta receita?",
"replaceBody": "Após uma versão anterior, o registo pode conservar IDs obsoletos e os cartões mostrar <em>Entidade não encontrada</em>. Remova os blocos antigos <code>rest:</code> e <code>template:</code> de <code>configuration.yaml</code> e recarregue. Em <em>Definições → Dispositivos e serviços → Entidades</em>, filtre por <em>proxmenux</em> e remova as entradas antigas restauradas ou indisponíveis. Adicione o YAML atual e recarregue para registar as novas.",
"step5Title": "5 · Painel Lovelace",
"step5Body": "O YAML cria um cartão <strong>vertical-stack</strong> com logótipo, indicadores, sistema, VMs, armazenamento, rede e problemas condicionais. Abra o painel, escolha o lápis, <em>Adicionar cartão</em> e depois <em>Manual</em> no fundo, e cole:",
"viewTipTitle": "Quer como uma visão completa do painel em vez de uma única carta?",
"viewTipBody": "Abra o menu de três pontos → <em>Editor de configuração em bruto</em> e adicione uma vista com este cabeçalho acima da lista <code>cards:</code>:",
"viewTipOutro": "Isso lhe dá uma guia/visão dedicada em seu painel com seu próprio ícone e título, em vez de uma carta longa em uma visão existente.",
"altViewTitle": "Alternativa — uma visão específica do painel",
"altViewIntro": "Para criar um separador num painel existente, adicione uma vista com o YAML abaixo. Uma vista é um separador do painel e não cria uma entrada na barra lateral. Passos:",
"altViewSteps": [
"Abra o painel onde deseja a nova guia.",
"Clique no lápis (painel de edição) na parte superior direita.",
"Clique na aba <em>+</em> no final das abas existentes para criar uma nova visão.",
"Na janela, escolha <em>Editor de código</em> no canto superior direito para alternar entre o editor visual e YAML.",
"Colar o YAML abaixo.",
"Guarde. A vista <em>ProxMenux Monitor</em> aparece como separador no painel com os seus cartões."
],
"twoEditorsTitle": "Dois editores YAML no HA — escolha o certo",
"twoEditorsIntro": "Home Assistant tem dois editores YAML que parecem semelhantes, mas esperam formatos diferentes:",
"twoEditorsItems": [
"<strong>Editor de uma vista</strong> — por <em>+</em> ou <em>Editar vista → Editor de código</em>. Espera uma vista com <code>title:</code>, <code>path:</code> e <code>cards:</code> no nível superior, sem traço inicial.",
"<strong>Editor em bruto do painel completo</strong> — pelo menu de três pontos. Espera toda a lista <code>views:</code>, com cada vista como item iniciado por <code>-</code>."
],
"twoEditorsOutro": "O formato errado pode criar uma <em>Vista sem nome</em> e <code>cards: []</code>. O YAML abaixo destina-se ao editor de uma vista; copie-o como está.",
"viewImageAlt": "Vista Home Assistant para o ProxMenux Monitor: cabeçalho picture-entity, indicadores glance e cartões de sistema, VMs, armazenamento e rede em várias colunas",
"viewImageCaption": "A vista <em>ProxMenux Monitor</em> num ecrã largo. A disposição Masonry organiza os cartões em colunas; o resultado depende do tipo de vista configurado.",
"twoColTipTitle": "Deseja um layout fixo de duas colunas em vez do layout automático?",
"twoColTipBody": "Agrupe dois cartões, como <em>Sistema</em> + <em>VMs</em> ou <em>Armazenamento</em> + <em>Rede</em>, num <code>horizontal-stack</code> para os apresentar lado a lado a qualquer largura:",
"twoColTipOutro": "No telemóvel, a linha continua comprimida. A disposição automática do HA sem horizontal-stack adapta-se melhor a ecrãs estreitos.",
"step6Title": "6 · Automação",
"step6Body": "Três automações para os cenários reativos mais comuns: substitua <code>notify.mobile_app_&lt;your_phone&gt;</code> pelo serviço de notificação que usa.",
"logoTitle": "Sobre o logotipo ProxMenux",
"logoBody": "O cartão picture-entity carrega o logótipo oficial de <a1>dashboardicons.com</a1>, uma biblioteca gratuita para painéis autoalojados. A entrada está em <a2>dashboardicons.com/icons/external/proxmenux</a2>. O Home Assistant obtém o SVG por HTTPS na primeira apresentação e guarda-o em cache.",
"logoBrokenTitle": "Se o cartão de logotipo mostrar uma imagem quebrada",
"logoBrokenIntro": "Algumas instalações HA (redes firewalled, bloqueadores de conteúdo, hosts sem internet pública) não podem alcançar jsdelivr.net no tempo de renderização. A correção é uma cópia local:",
"logoBrokenSteps": [
"Baixar o SVG de <a>cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/proxmenux.svg</a>.",
"Salve-o em <code>/config/www/icons/proxmenux.svg</code> em seu host HA.",
"No Lovelace YAML, substitua o URL <code>image:</code> por <code>/local/icons/proxmenux.svg</code>. Salvar e recarregar — a imagem renderiza do arquivo local, sem necessidade de internet."
],
"scanTipTitle": "Regra prática para scan_interval",
"scanTipBody": "Comece por consultar <code>/api/system</code> a cada 30 s. <code>/api/health/full</code> usa normalmente um resultado válido até seis minutos; consultar a cada 60 s não ignora essa cache. Experimente cinco minutos para <code>/api/storage/summary</code> e uma hora para <code>/api/proxmenux/update-status</code>. Adapte ao hardware e número de anfitriões."
},
"grafana": {
"heading": "Prometheus + Grafana",
"promHref": "https://prometheus.io",
"grafanaHref": "https://grafana.com",
"intro": "O ProxMenux Monitor disponibiliza <code>GET /api/prometheus</code> no formato de texto Prometheus 0.0.4. Com autenticação ativa exige um token Bearer. Configure o Prometheus para recolher as métricas e o Grafana para visualizar a base de séries temporais.",
"imageAlt": "Painel Grafana com métricas ProxMenux: medidor CPU, série temporal da memória, número de VMs em execução e tráfego de rede",
"imageCaption": "Um painel Grafana com os dados ProxMenux recolhidos pelo Prometheus: CPU, memória, VMs em execução e tráfego de rede. O catálogo completo está em <link>Referência da API → Métricas Prometheus</link>.",
"step1Title": "1 · Adicionar a tarefa de recolha ao Prometheus",
"step1Body": "Passe o token API pelo bloco nativo <code>authorization</code> do Prometheus, que também permite credenciais num ficheiro.",
"step1After": "Recarregue o Prometheus com <code>kill -HUP &lt;PID&gt;</code> (substitua PID pelo ID do processo), <code>systemctl reload prometheus</code> se suportado ou <code>docker compose restart prometheus</code> no contentor. Em <em>Status → Targets</em>, proxmenux deverá passar a UP num intervalo. A etiqueta <code>node=\"&lt;hostname&gt;\"</code> distingue os anfitriões.",
"tokenTipTitle": "Guardar o token num ficheiro separado",
"tokenTipBody": "Em produção separe o token da configuração. Com <code>credentials_file: /etc/prometheus/secrets/proxmenux.token</code>, o Prometheus lê-o de um ficheiro com permissões 0600.",
"step2Title": "2 · Verificar a recolha com algumas consultas",
"step2Body": "Antes do Grafana, confirme que o Prometheus tem os dados. Abra <code>http://&lt;prometheus-host&gt;:9090</code>, escolha <em>Query</em> e execute uma destas consultas. Deverá obter valores atuais do anfitrião Proxmox:",
"headerQuery": "Consulta",
"headerConfirms": "O que confirma",
"verifyRows": [
{
"query": "up{job=\"proxmenux\"}",
"confirms": "Devolve <code>1</code> se o Prometheus recolher corretamente os dados do Monitor, ou <code>0</code> se falhar. A verificação inicial mais rápida."
},
{
"query": "proxmox_cpu_usage",
"confirms": "Utilização atual de CPU % da máquina Proxmox. Deve mudar se você atualizar a consulta com alguns segundos de intervalo."
},
{
"query": "proxmox_vms_running",
"confirms": "Número de máquinas convidadas em execução. Compare com a interface do Proxmox."
},
{
"query": "proxmox_uptime_seconds / 86400",
"confirms": "Tempo de funcionamento em dias. Deve corresponder ao valor que você verá em <code>uptime</code> no shell Proxmox."
}
],
"calloutTitle": "Um 401 ao abrir diretamente o URL do endpoint pode ser normal",
"calloutBody": "Com autenticação ativa, a ligação em <em>Status → Targets</em> abre <code>/api/prometheus</code> no navegador sem o cabeçalho Bearer do Prometheus. A resposta pode conter <code>'{'\"error\":\"Authentication required\"'}'</code>. Verifique o verdadeiro <em>State: UP</em> do destino para confirmar a recolha pelo Prometheus.",
"step3Title": "3 · Adicionar o Prometheus como fonte de dados no Grafana",
"step3Body": "No Grafana, abra <em>Connections → Data sources → Add new → Prometheus</em>. Indique o URL, por exemplo <code>http://prometheus.lan:9090</code>, guarde e teste. Se o Prometheus exigir autenticação, configure-a aqui separadamente. O token do Monitor pertence à tarefa de recolha do Prometheus.",
"step4Title": "4 · Construir painéis com estas consultas PromQL",
"step4Body": "Uma seleção inicial das métricas habitualmente acompanhadas num anfitrião Proxmox:",
"headerPanel": "Ideia do painel",
"headerPromql": "Consulta do PromQL",
"panelRows": [
{
"panel": "Medidor de utilização CPU por máquina",
"promql": "proxmox_cpu_usage"
},
{
"panel": "Medidor de utilização da memória por máquina",
"promql": "proxmox_memory_usage_percent"
},
{
"panel": "Memória usada e total (séries temporais)",
"promql": "proxmox_memory_used_bytes / 1024 / 1024 / 1024"
},
{
"panel": "VMs/CTs em execução por anfitrião",
"promql": "proxmox_vms_running"
},
{
"panel": "Temperatura da CPU",
"promql": "proxmox_cpu_temperature_celsius"
},
{
"panel": "Tráfego de rede RX (bytes/s)",
"promql": "rate(proxmox_interface_bytes_received_total[5m])"
},
{
"panel": "Transferência de rede TX (bytes/s)",
"promql": "rate(proxmox_interface_bytes_sent_total[5m])"
},
{
"panel": "Média de carga (1m)",
"promql": "proxmox_load_average{period=\"1m\"}"
},
{
"panel": "Espaço em disco usado % por ponto de montagem",
"promql": "proxmox_disk_usage_percent"
},
{
"panel": "Carga da bateria UPS",
"promql": "proxmox_ups_battery_charge_percent"
},
{
"panel": "Temperatura da GPU por slot",
"promql": "proxmox_gpu_temperature_celsius"
}
],
"outro": "Adicione cada consulta como painel Grafana, com <em>Stat</em> para valores e <em>Time series</em> para tendências, e agrupe por categoria. Use <code>node</code> como variável do painel (<em>Settings → Variables → New → Query → label_values(proxmox_cpu_usage, node)</em>) para filtrar por anfitrião."
},
"uptimeKuma": {
"heading": "Uptime Kuma e outras ferramentas de verificação de estado",
"href": "https://github.com/louislam/uptime-kuma",
"intro": "Para verificar uma palavra-chave, use <code>GET /api/system-info</code>. Esta rota não exige token e devolve nome, tempo de funcionamento e estado como <code>healthy</code>, <code>warning</code> ou <code>critical</code>. É pública, ao contrário dos endpoints detalhados protegidos.",
"kumaTitle": "Uptime Kuma — Monitor de palavras-chave HTTP",
"kumaSteps": [
"Em Uptime Kuma, clique em <em>+ Adicionar Novo Monitor</em>.",
"Tipo de monitor: <em>HTTP(s) - Palavra-chave</em>.",
"Nome amigável: <em>ProxMenux Monitor — pve01</em>.",
"URL: <code>http://pve01.lan:8008/api/system-info</code>.",
"Palavra-chave: <code>healthy</code> (o valor de <code>health.status</code> quando a máquina está OK).",
"Intervalo de verificação: 60 segundos são suficientes.",
"Guarde. A rota system-info não exige um cabeçalho Bearer."
],
"healthchecksTitle": "healthchecks.io / pings de tarefas cron",
"healthchecksBody": "Uma tarefa cron pode consultar <code>/api/system-info</code> e testar <code>.health.status == \"healthy\"</code>. Só após sucesso deve enviar um ping ao seu URL Healthchecks.io. O serviço recebe pings das tarefas; não consulta o Monitor. Um HTTP 2xx, por si só, não prova o bom estado do anfitrião.",
"richTitle": "Quer dados de saúde mais ricos",
"richBody": "Para o estado completo — dez categorias, erros ativos e suprimidos — use <code>GET /api/health/full</code>. Uma resposta contém os dados da janela do painel. Com autenticação ativa exige um token Bearer."
},
"workflows": {
"heading": "n8n, Zapier e scripts personalizados",
"intro": "Workflows e scripts podem <em>enviar</em> notificações por POST para <code>/api/notifications/send</code>, por exemplo após falha CI ou tarefa demasiado longa. O envio direto ignora a fila e o intervalo entre impressões digitais dos eventos. Mantém a formatação, IA opcional e entrega por canal. Controle os duplicados na origem.",
"n8nBody": "No n8n use um nó <em>HTTP Request</em> com POST, o URL acima e o mesmo JSON do curl. Escolha credenciais genéricas Header Auth: nome <em>Authorization</em> e valor <code>Bearer YOUR_API_TOKEN</code>, substituindo o marcador. Ligue um agendamento, webhook ou outro nó para iniciar o pedido.",
"severityBody": "A gravidade usa <code>INFO</code>, <code>WARNING</code> ou <code>CRITICAL</code> em maiúsculas. O objeto <code>data</code> fornece contexto. A IA usa título e mensagem gerados e os enriquecimentos suportados; nem todos os campos entram necessariamente no prompt ou resultado. Veja <link>Notificações → Catálogo de eventos</link>."
},
"pveWebhook": {
"heading": "Webhook nativo Proxmox VE (entrada)",
"intro1": "O sistema de notificações surgiu no PVE 8.1; os destinos webhook nativos exigem Proxmox VE 8.3 ou posterior. <em>Ativar notificações</em> nas definições tenta registar o Monitor como destino. Os avisos PVE encaminhados para lá, como relatórios de cópia ou replicação, entram no fluxo de envio. A configuração tem de estar disponível e permitir escrita.",
"intro2": "O funcionamento, o modelo enviado pelo PVE, as entradas em <code>/etc/pve/notifications.cfg</code> e o comportamento em cluster estão em <link>Notificações → Integração do webhook PVE</link>."
},
"whereNext": {
"heading": "Para onde seguir",
"items": [
{
"label": "Referência da API",
"href": "/docs/monitor/api",
"tail": " — endpoints com método, caminho e catálogo completo de métricas Prometheus."
},
{
"label": "Notificações",
"href": "/docs/monitor/notifications",
"tail": " — fontes de eventos, canais, processo de envio e integração do webhook PVE."
},
{
"label": "Assistente de IA",
"href": "/docs/monitor/ai-assistant",
"tail": " — reformulação opcional dos modelos em linguagem simples antes do envio para Telegram, Discord, e-mail ou Gotify."
},
{
"label": "Acesso e autenticação",
"href": "/docs/monitor/access-auth",
"tail": " — criação e revogação dos tokens API destes exemplos, registo de auditoria e configuração TLS."
}
]
}
}
@@ -0,0 +1,535 @@
{
"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&lt;YOUR_TOKEN&gt;/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/&lt;id&gt;/&lt;token&gt;</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 SMTP por palavra-passe for permitido, use os parâmetros aprovados: <em>Servidor</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 email e <em>Palavra-passe</em> com a credencial permitida. Outlook.com pessoal tem requisitos diferentes; não presuma que funcione."
],
"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>&lt;channel&gt;.events.&lt;group&gt;</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>&lt;channel&gt;.event.&lt;event_type&gt;</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>, como <em>atualizações de aplicações</em>, <em>atualizações Tailscale</em>, <em>atualizações de otimizações ProxMenux</em>, <em>atualizações de segurança APT</em> e <em>avisos de limite de frequência</em>. Resultados de cópias e outras 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": "Sim: definições explícitas do intervalo por evento ou grupo substituem os valores predefinidos do processo de envio."
},
{
"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> Cria o bloco <code>webhook: proxmenux-webhook</code> em <code>/etc/pve/priv/notifications.cfg</code> com o segredo partilhado em base64. O destino público usa-o para X-Webhook-Secret. O bloco não está 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://&lt;monitor-host&gt;:&lt;port&gt;/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."
}
]
}
}