{ "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 «Proteger o painel?», com os botões Sim, configurar palavra-passe e Não, continuar sem proteção. 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) não faz parte desta escolha inicial; é configurada mais tarde no separador Segurança, depois de definir uma palavra-passe." }, "reaching": { "heading": "Alcançar o painel", "intro": "ProxMenux Monitor liga-se a 0.0.0.0:8008. 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. Confiar nos IP de cliente em X-Forwarded-For exige PROXMENUX_TRUST_PROXY=1 e um proxy sob o seu controlo. A simples presença de X-Forwarded-Proto ou X-Forwarded-Host não ativa a confiança no proxy. Nas portas 80/443, o frontend usa URL /api/* relativos; em qualquer outra porta, chama a porta 8008 no mesmo nome de anfitrião." }, "firstLaunch": { "heading": "Procedimento do primeiro arranque", "intro": "A primeira vez que você abre o painel, o frontend chama GET /api/auth/status. Se a configuração de autenticação nunca foi escrita (configured: false), aparece uma única janela intitulada \"Proteger o seu painel?\" 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 nome de apresentação e imagem de avatar opcionais. Ativa a autenticação em auth.json com enabled: true 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 declined: true em auth.json. 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 autenticação de dois fatores (TOTP) é configurada depois no separador Segurança, após iniciar sessão com palavra-passe. O procedimento completo aparece mais abaixo.", "createTitle": "Criando o primeiro usuário", "createIntro": "Sim, configurar palavra-passe 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 auth.json 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 password, 12345678 e proxmenux 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 Avatar → Ver perfil." }, { "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 POST /api/auth/setup com utilizador e palavra-passe. Com o novo JWT, envia PUT /api/auth/profile para o nome e POST /api/auth/profile/avatar 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 Terminar sessão. 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 (has_avatar, avatar_mtime)." }, { "endpoint": "PUT /api/auth/profile", "what": "Atualiza o nome de apresentação. Corpo do pedido: '{' \"display_name\": \"...\" '}'." }, { "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 Não, continuar sem proteção, o diálogo inicial não volta a aparecer. Ative a autenticação no separador Segurança ou edite /root/.config/proxmenux-monitor/auth.json, remova o indicador declined 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 Authorization: Bearer <token>:", "items": [ "Token de sessão: válido por 24 horas, emitido por POST /api/auth/login.", "Token API para integrações: válido por 365 dias, emitido por POST /api/auth/generate-api-token. 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 requires_totp: true. Repita-a com o código de seis dígitos:", "publicTitle": "Endpoints públicos (sem token)", "publicIntro": "O início de sessão, o estado da autenticação, a configuração inicial e o endpoint leve /api/system-info são públicos:", "publicItems": [ "/api/auth/login e /api/auth/status são públicos. /api/auth/setup cria a primeira conta e recusa substituir credenciais existentes.", "/api/system-info é um endpoint público com informações básicas do sistema, incluindo health.status. 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 scripts/auth_manager.py 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 pbkdf2_sha256$<iters>$<salt>$<hash>.", "where": "auth.json → password_hash" }, { "asset": "Sessão / API JWT", "algorithm": "Assinatura HS256 com segredo próprio da instalação, gerado no primeiro arranque (secrets.token_urlsafe, ≥48 bytes). Os tokens incluem iss=proxmenux-monitor e aud=api; cada pedido verifica a assinatura com o segredo atual.", "where": "Segredo: auth.json → jwt_secret. JWT em si: apenas no cliente." }, { "asset": "Metadados de token API", "algorithm": "O hash SHA-256 do JWT é guardado com a impressão digital signed_with do jwt_secret utilizado. Permite apresentar os metadados e detetar tokens afetados pela substituição do segredo.", "where": "auth.json → api_tokens[]" }, { "asset": "Segredo TOTP de 2FA", "algorithm": "TOTP padrão (RFC 6238), com segredo codificado em base32. Os oito códigos de backup são de utilização única e guardados como hashes SHA-256.", "where": "auth.json → totp_secret + backup_codes[]" }, { "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": "auth.json → revoked_tokens[]" } ], "authJsonTitle": "auth.json — o que contém e como está protegido", "authJsonBody": "Os dados de autenticação ficam em /root/.config/proxmenux-monitor/auth.json, modo 0600, proprietário root. Contém hashes PBKDF2 e segredos criptográficos (jwt_secret, totp_secret), 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 auth.json for recriado ou restaurado com outro segredo, jwt_secret muda. Os JWT antigos de sessão e API falham com \"Invalid or expired token\". A interface assinala-os com Inválido — gerar novamente. 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 auth.json:", "survivesTitle": "O que sobrevive ao reset", "survivesBody": "O início de sessão interativo é apagado, mas jwt_secret e os api_tokens registados são conservados. O Home Assistant e os outros scripts mantêm os tokens. Para recomeçar com novo segredo, elimine auth.json e reinicie o serviço: todos os tokens antigos tornam-se inválidos.", "physicalTitle": "Pré-requisito de acesso físico", "physicalBody": "Exige uma shell root no anfitrião. Quem executa menu 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 TOTP (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 autenticador, use um código de backup guardado ou restaure a aplicação a partir de uma cópia configurada previamente. A sincronização na nuvem e as exportações locais variam por aplicação: verifique se o método escolhido restaura de facto 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 de configuração 2FA mostra um QR, um segredo Base32 para introdução manual e, após a verificação, oito códigos de backup de utilização única. Copie os códigos antes de fechar o diálogo: não serão apresentados novamente.", "setupSteps": [ "Instale o aplicativo autenticador no telefone (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.", "Fazer login no painel com seu nome de usuário e senha.", "Abra o separador Segurança na barra lateral do painel e clique em Ativar 2FA e em Iniciar configuração. O diálogo mostra o QR e a chave manual; os oito códigos de backup aparecem depois de o código ser verificado.", "Adicione a entrada ao aplicativo autenticador:", "Confirme com o código atual de seis dígitos da aplicação no campo \"Código de verificação\" do diálogo de configuração e envie. Muda a cada 30 segundos; se expirar durante a escrita, use o seguinte.", "Guarde os códigos de backup. Depois da verificação, conserve os oito em segurança num gestor de palavras-passe, nota cifrada ou cópia impressa segura. Cada um funciona uma vez se o autenticador estiver indisponível.", "Concluído. 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": [ "Método simples: na aplicação, escolha Adicionar conta → Ler código QR e aponte a câmara ao QR. A entrada recebe um nome como ProxMenux Monitor (your-username) e mostra um código de seis dígitos renovado a cada 30 segundos.", "Alternativa manual, se não puder ler o QR, por exemplo no mesmo telefone: Adicionar conta → Introduzir chave de configuração. Escolha um nome como Proxmox Monitor, cole o segredo Base32, mantenha Tipo em Baseado no tempo 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 imediatamente após configurar. Se o código for rejeitado, 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 backup ou edite auth.json na shell do anfitrião.", "lostTitle": "Autenticador perdido", "lostIntro": "Três métodos de recuperação, do menos ao mais intrusivo:", "lostItems": [ "Use um código de backup. Introduza um dos oito códigos guardados no campo TOTP. Funciona uma vez; os códigos não usados continuam válidos. Depois de entrar, abra Segurança, escolha Desativar 2FA e depois Ativar 2FA para obter oito códigos novos.", "Restaure a aplicação da nuvem ou de uma cópia. 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.", "Desativar 2FA do shell do host. Quando as opções anteriores não estiverem disponíveis, edite /root/.config/proxmenux-monitor/auth.json no host Proxmox (você precisa de acesso raiz SSH ou console), defina totp_enabled para false, 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 Segurança e escolha Desativar 2FA. POST /api/auth/totp/disable exige a palavra-passe atual e um código TOTP ou de backup válido. Elimina o segredo TOTP e os códigos de backup. Remova também a entrada antiga da aplicação autenticadora.", "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": [ "Telefone: Definições → Data e hora → ativar sincronização automática / de rede.", "Anfitrião Proxmox: timedatectl status deve mostrar \"System clock synchronized: yes\". Caso contrário, execute timedatectl set-ntp true 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 token API válido por 365 dias. O JWT usa o mesmo segredo; o campo token_name 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 Segurança → Tokens de acesso API.", "Introduza um nome descritivo, por exemplo \"Home Assistant\".", "Volta a inserir a tua senha. Se 2FA está ligado, também o código atual 6 dígitos.", "Clique em Gerar token. Aparece uma única vez: copie-o imediatamente." ], "generateCli": "Da linha de comando:", "useTitle": "Usar um token", "revokeTitle": "Revogar um token", "revokeBody": "Cada linha oferece Revogar, que adiciona o hash a revoked_tokens em auth.json. 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 secrets.yaml, Home Assistant !secret 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: Referência API → Gestão de tokens e Integrações." }, "https": { "heading": "HTTPS", "intro": "Dois caminhos para o TLS:", "items": [ "Proxy inverso (recomendado). Terminar TLS em Nginx / Caddy / Traefik e encaminhar HTTP na porta 8008 para o processo Flask. Excertos abaixo.", "HTTPS direto na AppImage. Configure um certificado com POST /api/ssl/configure (interface: Definições → SSL). HTTPS usa gevent.pywsgi 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. Secure Gateway evita expor TCP 8008: cria um LXC Alpine com Tailscale 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 http://<proxmox-lan-ip>:8008 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 100.x.y.z 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 login.tailscale.com/admin/settings/keys, 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 Painel → Segurança → Secure Gateway, juntamente com o assistente. Aqui descreve-se o acesso." }, "proxy": { "heading": "Exemplos de proxy inverso", "intro": "Use um nome de anfitrião dedicado, como monitor.example.com, encaminhado para a porta 8008 do Proxmox. Os exemplos seguem esse modelo. Um subcaminho como example.com/proxmenux-monitor/ 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 /api/*. Retirar um prefixo como example.com/proxmenux-monitor/ 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 /var/log/proxmenux-auth.log. Este logger não regista acessos bem-sucedidos:", "outro": "Siga-o da maneira habitual: tail -F /var/log/proxmenux-auth.log. O arquivo é rodado pelo logrotate 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 não é instalado pelo próprio ProxMenux Monitor. Instale-o via Segurança → Fail2Ban 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 [proxmenux] que:", "items": [ "Lê-se /var/log/proxmenux-auth.log.", "Corresponde ao padrão authentication failure; rhost=<ip> com um filtro dedicado.", "Bane o IP ofensivo no nível de firewall do kernel por padrão.", "O hook Flask before_request 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: Segurança → Fail2Ban." }, "troubleshoot": { "heading": "Resolução de Problemas", "noScreenTitle": "O ecrã do primeiro lançamento nunca aparece", "noScreenBody": "Ou a autenticação já está configurada (configured: true) 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 auth.json 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 revoked_tokens. Gere um novo em Configurações e atualize a integração. Verificar:", "tokenOutro": "Os tokens expirados ou revogados retornam '{'\"error\":\"Invalid or expired token\"'}'.", "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 /root/.config/proxmenux-monitor/auth.json de uma shell host, definir totp_enabled para false, 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: proxy_read_timeout 86400s; Traefik: idleTimeout no ponto de entrada ou middleware). No Nginx, confirme proxy_set_header Upgrade $http_upgrade e Connection \"upgrade\"." }, "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." } ] } }