mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
Merge remote-tracking branch 'origin/develop' into HEAD
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Código de conduta | Documentação ProxMenux",
|
||||
"description": "Código de conduta e boas práticas do ProxMenux para colaboradores, responsáveis pelos testes e utilizadores.",
|
||||
"ogTitle": "Código de conduta | Documentação ProxMenux",
|
||||
"ogDescription": "Expectativas sobre a responsabilidade pelo código, a comunicação de vulnerabilidades e o âmbito dos PR no projeto ProxMenux."
|
||||
},
|
||||
"errors": {
|
||||
"notFound": "Erro: O ficheiro CODE_OF_CONDUCT.md não foi encontrado.",
|
||||
"loadFailed": "Erro: Não foi possível carregar o conteúdo do Código de Conduta."
|
||||
},
|
||||
"contentMarkdown": "# 📝 Código de conduta e boas práticas\n\nEste documento define os **princípios e as orientações** para o uso do **ProxMenux**, promovendo o **respeito, a colaboração e a segurança** no desenvolvimento.\n\n## 📌 1. Autoria do código e reconhecimento\n\n- Se forem usados **scripts, excertos de código ou ideias** de outros repositórios ou programadores, o autor original será sempre reconhecido.\n- Será acrescentado um comentário no código ou na documentação que indique a origem e, se possível, uma ligação para o repositório original.\n- Ao usar código com uma **licença** específica, é obrigatório respeitar as suas condições.\n\n### ✅ Exemplo de atribuição correta no código:\n\n```bash\n# Script baseado no trabalho de [Autor] em [Ligação do repositório]\n```\n\n## 🔒 2. Segurança e responsabilidade pelo código\n\n- Todo o código deste repositório segue boas práticas de desenvolvimento seguro.\n- Não são permitidos contributos que introduzam vulnerabilidades intencionais ou práticas inseguras.\n- Os scripts nunca devem comprometer a segurança do sistema nem os dados dos utilizadores.\n- Antes da implementação, os contributos devem ser revistos para verificar a segurança e a estabilidade.\n\n### ⚠️ Divulgação responsável de vulnerabilidades\n\nSe descobrir uma vulnerabilidade de segurança, NÃO a comunique em issues ou fóruns públicos.\n\nComunique-a em privado por e-mail:\n\n📧 proxmenux@macrimi.pro\n\nPara mais informações sobre vulnerabilidades e como as comunicar, consulte a nossa [política de segurança](./SECURITY.md).\n\n## 🤝 3. Regras da comunidade\n\nPara manter um ambiente respeitador e profissional, todos os utilizadores devem seguir estas regras:\n\n- ✅ Seja respeitador e construtivo nas discussões.\n- ❌ Não serão tolerados assédio, discurso de ódio ou comportamentos ofensivos.\n- ✅ Dê opiniões de forma profissional, evitando ataques pessoais.\n- ❌ O incumprimento pode resultar em avisos ou exclusões, consoante a gravidade.\n\n##\n\nEste documento promove o uso ético do código, a consciência de segurança e uma comunidade respeitadora.\n\n📢 Vamos construir algo extraordinário em conjunto!\n"
|
||||
}
|
||||
@@ -0,0 +1,293 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Contribuir para ProxMenux | ProxMenux Documentação",
|
||||
"description": "Como contribuir para o ProxMenux: modelo de ramos (main / develop / feature/*), processo de pull request, cabeçalho com autoria e ligação de apoio opcional, interface em duas fases, funções de mensagens e percurso até uma versão estável.",
|
||||
"ogTitle": "Contribuição para ProxMenux",
|
||||
"ogDescription": "Modelo de ramos, processo, autoria no cabeçalho e regra da interface em duas fases a seguir pelos colaboradores."
|
||||
},
|
||||
"header": {
|
||||
"title": "Contribuição para ProxMenux",
|
||||
"description": "O ProxMenux está aberto a contribuições comunitárias — novos scripts, correções para os existentes, melhorias de diálogo, traduções, integrações. Esta página é a porta formal: como o repositório é estruturado, o modelo de ramificação e fluxo de trabalho pull-request, o cabeçalho do script com atribuição do autor e link de patrocinador opcional, e as convenções de projeto cada contribuição deve seguir.",
|
||||
"section": "Sobre"
|
||||
},
|
||||
"twoPagesCallout": {
|
||||
"title": "Duas páginas relacionadas, um projecto",
|
||||
"body": "Não confunda esta página com <contributorsLink>Colaboradores</contributorsLink>, que reconhece testadores, revisores e programadores já envolvidos. Esta página é para <em>si</em>, futuro colaborador, e explica como preparar uma pull request para integração."
|
||||
},
|
||||
"branching": {
|
||||
"heading": "Modelo de ramificação",
|
||||
"intro": "ProxMenux usa um modelo de ramificação de três camadas:",
|
||||
"headerBranch": "Ramo",
|
||||
"headerPurpose": "Finalidade",
|
||||
"rows": [
|
||||
{
|
||||
"branch": "main",
|
||||
"purposeRich": "Código estável, pronto para produção. Só são integradas aqui alterações prontas para lançamento. É a versão recebida numa instalação normal do ProxMenux."
|
||||
},
|
||||
{
|
||||
"branch": "develop",
|
||||
"purposeRich": "Ramo de desenvolvimento ativo. O trabalho novo é integrado primeiro aqui: é o canal beta. Quando uma versão estável está pronta, passa daqui para <code>main</code>."
|
||||
},
|
||||
{
|
||||
"branch": "feature/*",
|
||||
"purposeRich": "Ramos de curta duração por recurso, correção ou melhoria. Criado a partir de <code>develop</code>, fundiu-se novamente em <code>develop</code> através de um Pull Request após revisão."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "O que isto significa para os utilizadores",
|
||||
"calloutBody": "Usuários finais rastreando <code>main</code> recebem versões testadas. Usuários que querem os recursos mais recentes cedo — e não se importem com as bordas ásperas ocasionais — podem seguir o <code>develop</code>. Novos recursos sempre passam por <code>develop</code> primeiro; nada atinge <code>main</code> sem passar por esse ciclo."
|
||||
},
|
||||
"workflow": {
|
||||
"heading": "Processo de pull request",
|
||||
"intro": "Da ideia ao lançamento mesclado em cinco etapas:",
|
||||
"step1Lead": "<strong>Criar um ramo de recursos de <code>develop</code></strong>:",
|
||||
"step1Code": "git clone https://github.com/MacRimi/ProxMenux.git\ncd ProxMenux\ngit checkout develop\ngit pull origin develop\ngit checkout -b feature/your-feature-name",
|
||||
"step1Trail": "Use um nome de ramo descritivo: <code>feature/zfs-arc-tuning</code>, <code>feature/fix-iommu-detection</code>, <code>feature/add-tailscale-script</code>.",
|
||||
"step2Lead": "<strong>Trabalhe nas suas alterações e empurre o branch:</strong>",
|
||||
"step2Code": "# Make your changes, then:\ngit add scripts/...\ngit commit -m \"Add ZFS ARC tuning script\"\ngit push -u origin feature/your-feature-name",
|
||||
"step3": "<strong>Abra um pedido de pull contra <code>develop</code></strong> (não contra <code>main</code>). Na página de criação de GitHub PR, verifique novamente se o ramo base está definido como <code>develop</code>. Incluir na descrição: o que o script faz, o que ele muda, e em quais versões Proxmox VE você testou.",
|
||||
"step4": "<strong>Após a revisão, as alterações são integradas em <code>develop</code>.</strong> Um responsável verifica o código, o cabeçalho e a interface em duas fases. Se pedir alterações, envie novos commits para o mesmo ramo: a PR atualiza-se automaticamente.",
|
||||
"step5": "<strong>As versões estáveis passam de <code>develop</code> para <code>main</code>.</strong> No lançamento, <code>main</code> avança até <code>develop</code> por fast-forward e recebe uma etiqueta. A contribuição passa a integrar a próxima versão estável."
|
||||
},
|
||||
"scriptHeader": {
|
||||
"heading": "Cabeçalho do programa — metadados e descrição",
|
||||
"intro": "Cada script em ProxMenux abre com dois blocos de comentários adjacentes que juntos formam o cabeçalho. Eles são <strong> ambos necessários</strong> — juntos eles deixam qualquer leitor saber quem escreveu o script e o que ele faz, tudo sem abrir o próprio código.",
|
||||
"bullets": [
|
||||
"<strong>Bloco superior: metadados.</strong> Autor, ligações GitHub/de apoio opcionais, responsável, copyright, licença, versão e data de atualização. É também o <em>reconhecimento dos colaboradores</em>: num script novo, inclua o seu nome e, se quiser, a página GitHub e um perfil como Ko-fi, GitHub Sponsors ou Buy Me a Coffee.",
|
||||
"<strong>Bloco inferior: descrição.</strong> Um parágrafo curto em inglês simples explica o script. É lido <em>antes</em> do código e deve bastar para compreender o objetivo, ações principais, recursos afetados e requisitos."
|
||||
],
|
||||
"licenseCalloutTitle": "A linha de licença é fixa — GPL-3.0",
|
||||
"licenseCalloutBody": "ProxMenux é publicado sob a Licença Pública Geral <strong>GNU v3.0</strong>. Cada script no projeto envia sob essa mesma licença; a linha <code>License</code> no cabeçalho é sempre a referência GPL-3.0 mostrada no exemplo abaixo — não é uma escolha por script. Ao contribuir com um script, você concorda em lançá-lo sob GPL-3.0, o que significa que qualquer um pode lê-lo, modificá-lo e redistribuí-lo (incluindo modificações), desde que o mantenha sob a mesma licença. O texto completo vive em <licenseLink>MacRimi/ProxMenux/LICENSE</licenseLink>.",
|
||||
"templateCode": "#!/bin/bash\n\n# ==========================================================\n# ProxMenux - A menu-driven script for Proxmox VE management\n# ==========================================================\n# Author : Your Name\n# GitHub : github.com/yourhandle\n# Sponsor : ko-fi.com/yourhandle\n# Maintainer : MacRimi\n# Copyright : (c) 2026 MacRimi & contributors\n# License : (GPL-3.0) (https://github.com/MacRimi/ProxMenux/blob/main/LICENSE)\n# Version : 1.0\n# Last Updated: DD/MM/YYYY\n# ==========================================================\n# Description:\n# Short paragraph explaining what the script does.\n# Mention the main actions (e.g. \"creates a ZFS pool\",\n# \"configures IOMMU and reboots\", \"imports an ISO into a VM\"),\n# the resources it touches, and any prerequisites the user\n# should be aware of before running it.\n# ==========================================================",
|
||||
"optionalNote": "As linhas <code>GitHub</code> e <code>Sponsor</code> são opcionais — deixe-as de fora se não quiser publicá-las. Tudo o resto é necessário.",
|
||||
"whyCalloutTitle": "Por que isso importa?",
|
||||
"whyCalloutBody": "A contribuição de código aberto é trabalho voluntário. Colocar o nome do contribuinte e (quando fornecido) o link do patrocinador diretamente na fonte dá às pessoas que constroem os scripts reconhecimento visível cada vez que alguém lê o código — sua autoria é preservada, não escondida sob “o projeto”. O bloco de descrição importa por uma razão diferente: é a primeira coisa que um futuro mantenedor ou usuário curioso lê, e uma descrição clara é muitas vezes a diferença entre um script que as pessoas confiam e uma que elas evitam."
|
||||
},
|
||||
"structure": {
|
||||
"heading": "Estrutura do projecto",
|
||||
"intro": "Onde cada tipo de script vive no repositório:",
|
||||
"treeCode": "scripts/\n├── menus/ # Top-level menu scripts (entry points)\n├── storage/ # Disk, storage and passthrough scripts\n├── share/ # NFS, Samba, local share scripts\n├── vm/ # VM creation and configuration scripts\n├── gpu_tpu/ # GPU / TPU passthrough scripts\n├── post_install/ # Post-install automation scripts\n├── backup_restore/ # Backup and restore scripts\n├── utilities/ # System utility scripts\n├── global/ # Shared helper libraries (sourced by other scripts)\n├── utils.sh # Shared utility functions and message helpers\n└── help_info_menu.sh # Interactive help and command reference",
|
||||
"outro": "Cada script carrega <code>utils.sh</code> no arranque através de source para obter funções de mensagens, indicador de espera, cores e sistema de tradução. As bibliotecas partilhadas em <code>scripts/global/</code> são carregadas explicitamente pelos scripts que delas precisam."
|
||||
},
|
||||
"twoPhase": {
|
||||
"heading": "A política de design de IU em duas fases",
|
||||
"intro": "É a convenção mais importante do ProxMenux e a que mais frequentemente leva a pedidos de correção nas PR. Cada script divide-se em <strong>exatamente duas fases</strong>:",
|
||||
"headerPhase": "Fase",
|
||||
"headerPurpose": "Finalidade",
|
||||
"headerScreen": "Estado da tela",
|
||||
"rows": [
|
||||
{
|
||||
"phaseRich": "<strong>Fase 1 — Selecção</strong>",
|
||||
"purposeRich": "Recolha todas as decisões do utilizador. Executar todos os trabalhos preparatórios necessários (sondas, sondagens, verificações).",
|
||||
"screenRich": "Janelas <code>dialog</code>. Se uma verificação entre dois menus demorar mais de um ou dois segundos, mostre um indicador <code>msg_info</code> para sinalizar que o script não bloqueou, e chame <code>stop_spinner</code> imediatamente antes do próximo diálogo."
|
||||
},
|
||||
{
|
||||
"phaseRich": "<strong>Fase 2 — Execução</strong>",
|
||||
"purposeRich": "Executar todas as operações. Mostra o histórico de progresso completo acumulado na tela.",
|
||||
"screenRich": "Mensagens visíveis <code>msg_info</code> / <code>msg_ok</code>; nunca <code>dialog</code>."
|
||||
}
|
||||
],
|
||||
"principle": "O princípio: <strong>colha tudo primeiro, depois executa tudo</strong>. O usuário vê um menu de diálogo limpo (Fase 1), em seguida, uma visão de execução de log-style limpo (Fase 2). Nenhuma mistura — nenhuma janela que apareça no meio da execução, nenhum ruído de progresso durante a selecção.",
|
||||
"phase1Heading": "Fase 1 — padrão típico",
|
||||
"phase1Code": "# Silent preparatory work between dialogs\nmsg_info \"$(translate \"Checking disk assignments...\")\"\nASSIGNED_TO=$(check_assignments \"$DISK\")\nstop_spinner # ← clears line silently, result saved in variable\n\n# Next dialog can now use ASSIGNED_TO\nif [ -n \"$ASSIGNED_TO\" ]; then\n dialog --yesno \"$(translate \"Disk already assigned. Continue?\")\" $UI_YESNO_H $UI_YESNO_W\nfi\n\n# Collect multiple decisions per item with parallel arrays\ndeclare -a DISK_LIST=()\ndeclare -a DISK_FORMAT_TYPES=()\ndeclare -a DISK_MOUNT_POINTS=()\nfor DISK in $SELECTED; do\n msg_info \"$(translate \"Analyzing disk...\")\"\n CURRENT_FS=$(lsblk -no FSTYPE \"$DISK\" | xargs)\n stop_spinner\n\n FORMAT=$(dialog --backtitle \"$BACKTITLE\" \\\n --title \"$(translate \"Select Filesystem\")\" \\\n --menu \"...\" $UI_SHORT_MENU_H $UI_SHORT_MENU_W $UI_SHORT_MENU_LIST_H \\\n \"ext4\" \"...\" \"xfs\" \"...\" \"btrfs\" \"...\" \\\n 2>&1 >/dev/tty)\n [ -z \"$FORMAT\" ] && continue\n\n DISK_LIST+=(\"$DISK\")\n DISK_FORMAT_TYPES+=(\"$FORMAT\")\ndone",
|
||||
"phase1RulesIntro": "<strong>Regras para fase 1:</strong>",
|
||||
"phase1Rules": [
|
||||
"Se estiver ativo um indicador <code>msg_info</code> e precisar de abrir um menu <code>dialog</code> ou <code>whiptail</code>, chame primeiro <code>stop_spinner</code>: o indicador não pode coexistir com a sobreposição das ferramentas. Se nenhum estiver ativo, a chamada não é necessária.",
|
||||
"Use <code>show_proxmenux_logo</code> + <code>msg_title</code> + <code>msg_info</code> quando você precisa dar ao usuário contexto visual para uma operação de longa duração em fase 1 (por exemplo, uma sonda que leva 5+ segundos). A função inclui uma tela limpa, então não chame <code>clear</code> antes.",
|
||||
"Não chame o <code>show_proxmenux_logo</code> entre menus de diálogo onde não há nada para exibir — limpar a tela para um terminal vazio é apenas ruído visual.",
|
||||
"Armazene todas as decisões e resultados de sonda em variáveis ou arrays paralelos. A recapitulação visível ocorre no início da Fase 2, não na Fase 1."
|
||||
],
|
||||
"phase2Heading": "Fase 2 — padrão típico",
|
||||
"phase2Code": "# ── PHASE 2 — EXECUTION ─────────────────────────────\nshow_proxmenux_logo\nmsg_title \"$(translate \"My Script Title\")\"\n\n# Recap Phase 1 preparatory results — show what was already done\nmsg_ok \"$(translate \"CT $CTID selected.\")\"\nmsg_ok \"$(translate \"Repositories verified.\")\"\nmsg_ok \"$(translate \"Disks to process: ${#DISK_LIST[@]}\")\"\n\n# Now execute operations\nfor i in \"${!DISK_LIST[@]}\"; do\n DISK=\"${DISK_LIST[$i]}\"\n FORMAT=\"${DISK_FORMAT_TYPES[$i]}\"\n\n msg_info \"$(translate \"Formatting\") $DISK $(translate \"as\") $FORMAT...\"\n mkfs.\"$FORMAT\" \"$DISK\" >/dev/null 2>&1\n msg_ok \"$(translate \"Formatted.\")\"\ndone\n\nmsg_ok \"$(translate \"Completed. ${#DISK_LIST[@]} disk(s) processed.\")\"\nmsg_success \"$(translate \"Press Enter to return to menu...\")\"\nread -r",
|
||||
"phase2Rules": "<strong>Regras para a fase 2:</strong> comece com <code>show_proxmenux_logo + msg_title</code> e resuma de imediato a fase 1 em linhas <code>msg_ok</code>. Não volte a chamar <code>show_proxmenux_logo</code>, pois apagaria o progresso acumulado. Não utilize <code>dialog</code>; se uma decisão durante a execução for inevitável, utilize <code>whiptail</code> como na secção seguinte."
|
||||
},
|
||||
"dialogVsWhiptail": {
|
||||
"headingRich": "Quando usar <code>dialog</code> vs <code>whiptail</code>",
|
||||
"intro": "Ambas as ferramentas desenham interfaces de usuário de modo texto, mas elas se comportam de forma muito diferente na tela — e ProxMenux as usa em duas fases distintas por uma razão.",
|
||||
"headerTool": "Ferramenta",
|
||||
"headerWhen": "Quando usá-lo",
|
||||
"headerEffect": "Efeito no ecrã",
|
||||
"rows": [
|
||||
{
|
||||
"toolRich": "<strong><code>dialog</code></strong>",
|
||||
"whenRich": "<strong>Sempre em fase 1.</strong> Cada seleção interativa — escolhendo um VM, um disco, um sistema de arquivos, confirmando uma ação — usa <code>dialog</code>. Esta é a ferramenta padrão de UI do ProxMenux.",
|
||||
"effectRich": "Assume o terminal: limpa a tela, desenha sua sobreposição, e ao fechar retorna o terminal ao seu estado anterior. Tudo bem na fase 1 porque nada de útil está mostrando ainda."
|
||||
},
|
||||
{
|
||||
"toolRich": "<strong><code>whiptail</code></strong>",
|
||||
"whenRich": "<strong>Apenas na Fase 2, somente quando inevitável.</strong> O caso típico é um prompt de reinicialização no final da execução. Não procure o <code>whiptail</code> para pedir “continuar?” no meio da execução — essa decisão deveria ter sido tomada na Fase 1.",
|
||||
"effectRich": "Sobreposição mais leve que <em>não limpa</em> o contexto do terminal. O histórico <code>msg_ok</code>/<code>msg_info</code> da fase 2 permanece visível atrás do diálogo. É por isso a escolha indicada quando o progresso já está no ecrã."
|
||||
}
|
||||
],
|
||||
"calloutTitle": "Por que a divisão importa",
|
||||
"calloutBody": "Se você chamar <code>dialog</code> no meio da fase 2, cada linha <code>msg_ok</code> que o usuário tem assistido desaparece. Limpas o rasto da auditoria. <code>whiptail</code> evita isso. Então a regra não é arbitrária — é sobre preservar a visão do usuário sobre o que o script tem feito até agora.",
|
||||
"rebootHeading": "Pedido de reinício: o caso típico de whiptail na fase 2",
|
||||
"rebootIntro": "Quando um script termina e uma reinicialização pode ser necessária (por exemplo: IOMMU habilitado, parâmetros do kernel alterados), o prompt no final da Fase 2 usa <code>whiptail</code>. Sempre inclua um branch “Não” que avisa o usuário para não usar o recurso afetado até que ele reinicie:",
|
||||
"rebootCode": "if [[ \"$HOST_REBOOT_REQUIRED\" == \"yes\" ]]; then\n echo \"\"\n if whiptail --title \"$(translate \"Reboot Required\")\" --yesno \\\n \"\\n$(translate \"A host reboot is required before starting the VM. Reboot now?\")\" \\\n 13 78; then\n msg_warn \"$(translate \"Rebooting the system...\")\"\n reboot\n else\n echo \"\"\n msg_info2 \"$(translate \"Do not start the VM until the system has been rebooted.\")\"\n fi\nfi\n\nmsg_success \"$(translate \"Press Enter to return to menu...\")\"\nread -r"
|
||||
},
|
||||
"messageFunctions": {
|
||||
"heading": "Referência das funções da mensagem",
|
||||
"intro": "Todos definidos em <code>utils.sh</code>. Use-os como padrão para qualquer saída visível pelo usuário — visual consistente entre scripts é o ponto principal. Se seu script precisar de uma nova função que não se encaixe no conjunto existente (um novo nível de gravidade, um novo auxiliar de layout, etc.), proponha-o em seu pedido de pull — ele será revisado e adicionado ao <code>utils.sh</code> se for amplamente útil.",
|
||||
"headerFunction": "Função",
|
||||
"headerWhen": "Quando utilizar",
|
||||
"headerSpinner": "Indicador de progresso",
|
||||
"rows": [
|
||||
{
|
||||
"function": "msg_info \"text\"",
|
||||
"whenRich": "Operação em curso.",
|
||||
"spinner": "Inicia"
|
||||
},
|
||||
{
|
||||
"function": "stop_spinner",
|
||||
"whenRich": "Fim dos trabalhos preparatórios silenciosos na fase 1 — mata spinner, limpa a linha.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_ok \"text\"",
|
||||
"whenRich": "Operação concluída. Utilize também para uma funcionalidade ativada, mesmo que ainda seja necessário reiniciar.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_warn \"text\"",
|
||||
"whenRich": "Aviso real ou estado degradado.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_error \"text\"",
|
||||
"whenRich": "Erro fatal.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_info2 \"text\"",
|
||||
"whenRich": "Informação sem bloqueio, numa linha ciano.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_success \"text\"",
|
||||
"whenRich": "Final “Pressione Enter para retornar” no final da fase 2.",
|
||||
"spinner": "Para"
|
||||
},
|
||||
{
|
||||
"function": "msg_title \"text\"",
|
||||
"whenRich": "Título negrito com espaçamento embutido. Utilizado no início da fase 2.",
|
||||
"spinner": "—"
|
||||
},
|
||||
{
|
||||
"function": "show_proxmenux_logo",
|
||||
"whenRich": "Limpa o ecrã, mostra o logótipo. Chamado <em> uma vez</em> apenas no início da Fase 2.",
|
||||
"spinner": "—"
|
||||
}
|
||||
]
|
||||
},
|
||||
"dialogConventions": {
|
||||
"heading": "convenções de diálogo",
|
||||
"bullets": [
|
||||
"Passe sempre <code>--backtitle \"$BACKTITLE\"</code> para cada chamada <code>dialog</code> e <code>whiptail</code>. <code>$BACKTITLE</code> é sempre <code>\"ProxMenux\"</code> — definido uma vez no cabeçalho do script e nunca substituído. O usuário deve sempre ver o nome do projeto como o contexto de enquadramento, nunca o próprio título do script.",
|
||||
"Enrole sempre títulos e mensagens com <code>$(translate \"...\")</code>.",
|
||||
"Sempre redirecionar saída <code>dialog</code> com <code>2>&1 >/dev/tty</code> - o stdout capturado torna-se a seleção do usuário, enquanto o diálogo em si desenha no terminal.",
|
||||
"Use as variáveis de dimensão padrão de UI (<code>$UI_MENU_H</code>, <code>$UI_MSG_W</code>, etc.) para dimensionamento consistente entre scripts.",
|
||||
"Verifique sempre escolhas vazias ou canceladas e trate-as corretamente."
|
||||
],
|
||||
"exampleIntro": "Exemplo completo: criar um menu de seleção de VM e tratar o cancelamento.",
|
||||
"exampleCode": "# 1) Build the list of VMs as alternating \"ID NAME\" pairs.\n# dialog --menu expects this exact shape: tag1 description1 tag2 description2 ...\nVM_LIST=\"\"\nfor vmid in $(qm list | awk 'NR>1 {print $1}'); do\n vm_name=$(qm config \"$vmid\" | awk -F': ' '/^name:/ {print $2}')\n VM_LIST=\"$VM_LIST $vmid \\\"$vm_name\\\"\"\ndone\n\n# 2) Show the dialog. Captured stdout is the user's selection (the VMID).\nVMID=$(eval \"dialog --backtitle \\\"\\$BACKTITLE\\\" \\\n --title \\\"\\$(translate \\\"Select VM\\\")\\\" \\\n --menu \\\"\\$(translate \\\"Choose a VM from the list:\\\")\\\" \\\n \\$UI_MENU_H \\$UI_MENU_W \\$UI_MENU_LIST_H \\\n $VM_LIST \\\n 2>&1 >/dev/tty\")\n\n# 3) Empty result means the user pressed Cancel or Esc — exit silently.\nif [ -z \"$VMID\" ]; then\n exit 0\nfi\n\n# 4) Continue with the rest of Phase 1, knowing VMID is now set.\necho \"User selected VMID=$VMID\""
|
||||
},
|
||||
"translation": {
|
||||
"heading": "Política de tradução",
|
||||
"intro": "Todas as strings visíveis ao usuário devem ser enroladas com a função <code>translate</code>. ProxMenux traduz-os automaticamente em todas as línguas suportadas — você escreve inglês, o usuário lê sua língua nativa.",
|
||||
"code": "msg_ok \"$(translate \"Operation completed successfully.\")\"\nmsg_error \"$(translate \"Failed to start container\") $CTID.\"\ndialog --title \"$(translate \"Select Storage\")\" ...",
|
||||
"bullets": [
|
||||
"Escreva strings em inglês — a tradução é tratada automaticamente pela compilação.",
|
||||
"Mantenha as cadeias de texto concisas. Evite, se possível, variáveis dentro de frases longas.",
|
||||
"<strong>Não</strong> traduza nomes de variáveis, caminhos ou identificadores técnicos."
|
||||
]
|
||||
},
|
||||
"variableStyle": {
|
||||
"heading": "Convenções de variáveis e estilo",
|
||||
"bullets": [
|
||||
"Usar <code>UPPER_CASE</code> para variáveis de nível de script.",
|
||||
"Use <code>lower_case</code> para variáveis de função local (declare com <code>local</code>).",
|
||||
"Coloque todas as expansões de variáveis entre aspas: <code>\"$VAR\"</code>, não <code>$VAR</code>.",
|
||||
"Usar <code>[[ ]]</code> para condicionantes, não <code>[ ]</code> (exceto onde POSIX é necessário).",
|
||||
"<code>show_proxmenux_logo</code> é a forma prevista de limpar o ecrã: limpa-o e mostra o logótipo do projeto para manter o contexto visual. Chame-o uma vez no início da fase 2, e opcionalmente antes de uma espera longa na fase 1."
|
||||
],
|
||||
"standardNamesIntro": "Nomes de variáveis padrão em todo o projeto:",
|
||||
"standardNamesCode": "CTID # container ID\nVMID # virtual machine ID\nDISK # device path (e.g. /dev/sdb)\nPARTITION # partition path (e.g. /dev/sdb1)\nSTORAGE # Proxmox storage name\nMOUNT_POINT # filesystem mount path",
|
||||
"redirectHeading": "Redirecionando a saída da ferramenta durante a fase 2",
|
||||
"redirectIntro": "A fase 2 mostra um registo de linhas <code>msg_info → msg_ok</code>. Se uma ferramenta chamada, como apt, mkfs, qm, pct ou dd, escrever em stdout/stderr, a sua saída desloca as mensagens e confunde o ecrã. O utilizador deixa de distinguir o progresso do script dos detalhes da ferramenta.",
|
||||
"withoutRedirectIntro": "<strong>Sem redirecionar</strong> — o que o usuário vê se você não lidar com o ruído:",
|
||||
"withoutRedirectCode": "ℹ Installing kernel package...\nReading package lists... Done\nBuilding dependency tree... Done\nReading state information... Done\nThe following NEW packages will be installed:\n proxmox-kernel-6.5\n0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.\nNeed to get 12.5 MB of archives.\nAfter this operation, 47.2 MB of additional disk space will be used.\nGet:1 http://download.proxmox.com/debian/pve trixie/pve-no-subscription amd64 ...\n... [200+ more lines of dpkg output] ...\n✓ Kernel installed.",
|
||||
"withRedirectIntro": "<strong>Com redirecionamento</strong> — como é a mesma operação quando o ruído é enviado para outro lugar:",
|
||||
"withRedirectCode": "ℹ Installing kernel package...\n✓ Kernel installed.\nℹ Configuring kernel command line...\n✓ Configured.\nℹ Refreshing boot loader...\n✓ Boot loader updated.",
|
||||
"twoPatternsIntro": "Dois padrões para escolher:",
|
||||
"discardLead": "<strong>Descarte a saída</strong> quando você não precisar — mais rápido, mais simples:",
|
||||
"discardCode": "DEBIAN_FRONTEND=noninteractive apt-get install -y \"$package\" >/dev/null 2>&1",
|
||||
"logLead": "<strong>Envie a saída para um arquivo de log</strong> quando você quiser inspeccioná-lo mais tarde (depurando uma instalação falhada, verificando o que o dpkg realmente fez). Este é o padrão preferido para qualquer operação apt:",
|
||||
"logCode": "apt-get install -y \"$package\" >> \"$log_file\" 2>&1",
|
||||
"referenceOutro": "O script <code>scripts/global/update-pve9_2.sh</code> é uma implementação de referência — cada chamada <code>apt-get</code> envia saída para um arquivo de log para que o usuário apenas veja o fluxo limpo <code>msg_info → msg_ok</code>, enquanto o log no disco permite reconstruir exatamente o que o apt fez se algo der errado."
|
||||
},
|
||||
"dosAndDonts": {
|
||||
"heading": "Fazer e Não Fazer",
|
||||
"doHeading": "✅ Fazer",
|
||||
"doBullets": [
|
||||
"<code>stop_spinner</code> antes de um <code>dialog</code> em fase 1 somente quando um spinner <code>msg_info</code> está em execução atualmente.",
|
||||
"Fase 2 começa com <code>show_proxmenux_logo + msg_title + msg_ok</code> recap dos resultados da Fase 1.",
|
||||
"Use <code>msg_ok</code> para recursos habilitados com sucesso — mesmo que seja necessário reiniciar.",
|
||||
"Use <code>whiptail</code> (não <code>dialog</code>) para qualquer prompt pós-execução que deve aparecer na Fase 2.",
|
||||
"Sempre inclua um branch \"Não\" nas janelas de reinicialização que alerta o usuário para não iniciar o recurso afetado até reiniciar.",
|
||||
"Limite a lógica exclusiva de VM verificando <code>[[ -f \"/etc/pve/qemu-server/$'{'vmid'}'.conf\" ]]</code>: controladores e NVMe PCIe não podem ser atribuídos a LXC por passthrough PCI.",
|
||||
"Utilizar <code>ensure_repositories</code> de <code>utils-install-functions.sh</code> em vez de <code>apt-get update</code> incondicional.",
|
||||
"Use arrays paralelos na Fase 1 quando cada item precisar de múltiplas janelas."
|
||||
],
|
||||
"dontHeading": "❌ Não fazer",
|
||||
"dontBullets": [
|
||||
"Chame <code>dialog</code> enquanto um spinner está ativo.",
|
||||
"Pular a fase 1 recap no início da fase 2.",
|
||||
"Chame o <code>show_proxmenux_logo</code> pela segunda vez — ele apaga tudo que a Fase 2 imprimiu.",
|
||||
"Utilizar <code>dialog</code> na Fase 2 (utilizar <code>whiptail</code> para o caso raro inevitável).",
|
||||
"Utilizar apenas <code>clear</code>.",
|
||||
"Enrole <code>msg_title</code> em linhas em branco <code>echo \"\"</code> — já inclui espaçamento.",
|
||||
"Use o <code>msg_warn</code> para relatar um recurso habilitado com sucesso — que é um <code>msg_ok</code>.",
|
||||
"Executar <code>apt-get update</code> incondicional — utilizar <code>ensure_repositories</code>."
|
||||
]
|
||||
},
|
||||
"submitting": {
|
||||
"heading": "Submissão da sua contribuição",
|
||||
"steps": [
|
||||
"Crie um fork de <code>MacRimi/ProxMenux</code> no GitHub e clone esse fork.",
|
||||
"Crie um ramo <code>feature/*</code> a partir de <code>develop</code> (veja <em>Modelo de ramos</em> acima).",
|
||||
"Siga este guia para quaisquer scripts novos ou modificados. Escreva o cabeçalho com o seu nome; adicione a linha de patrocinador opcional se quiser.",
|
||||
"Teste o script numa instância real do Proxmox VE: fase 1 com todos os ramos dos diálogos e fase 2 com cada operação e a reversão correta em caso de erro.",
|
||||
"Abra um Pull Request <strong> contra <code>develop</code></strong> com uma descrição clara: o que o script faz, o que mudou, em que versão Proxmox VE foi testado.",
|
||||
"Certifique-se de que sua contribuição respeite o <cocLink>Código de Conduta</cocLink>."
|
||||
],
|
||||
"securityOutro": "Para questões sensíveis à segurança, siga o fluxo de divulgação em <securityLink>SECURITY.md</securityLink> em vez de abrir um problema público."
|
||||
},
|
||||
"whereNext": {
|
||||
"heading": "Para onde seguir",
|
||||
"items": [
|
||||
{
|
||||
"kind": "external",
|
||||
"url": "https://github.com/MacRimi/ProxMenux/blob/main/CONTRIBUTING.md",
|
||||
"label": "CONTRIBUTING.md (guia completo)",
|
||||
"tail": " — a fonte da verdade para cada convenção, incluindo os padrões avançados de hardware."
|
||||
},
|
||||
{
|
||||
"kind": "internal",
|
||||
"href": "/docs/about/contributors",
|
||||
"label": "Contribuidores",
|
||||
"tail": " — as pessoas cuja obra moldou os lançamentos do ProxMenux (página diferente deste)."
|
||||
},
|
||||
{
|
||||
"kind": "internal",
|
||||
"href": "/docs/about/code-of-conduct",
|
||||
"label": "Código de Conduta",
|
||||
"tail": " — as normas que cada contribuinte aceita respeitar."
|
||||
},
|
||||
{
|
||||
"kind": "external",
|
||||
"url": "https://github.com/MacRimi/ProxMenux/discussions",
|
||||
"label": "GitHub Discussions",
|
||||
"tail": " — pergunte antes de você construir se você não tem certeza se uma ideia se encaixa, ou para encontrar colaboradores em um recurso maior."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Colaboradores | Documentação ProxMenux",
|
||||
"description": "Reconhecimento às pessoas que tornam o ProxMenux possível: quem testa, revê e desenvolve cada versão.",
|
||||
"ogTitle": "Colaboradores | Documentação ProxMenux",
|
||||
"ogDescription": "Conheça os colaboradores por trás do ProxMenux."
|
||||
},
|
||||
"header": {
|
||||
"title": "Colaboradores",
|
||||
"description": "O projeto ProxMenux cresce graças aos seus colaboradores. Esta página reconhece o seu trabalho: testar versões antes da publicação, detetar regressões, rever PR e ajudar a orientar novas funcionalidades.",
|
||||
"section": "Sobre"
|
||||
},
|
||||
"beyond": {
|
||||
"title": "Para além desta lista",
|
||||
"body": "Muitas outras pessoas contribuem ao comunicar erros, propor funcionalidades em Discussions, testar versões beta e traduzir o projeto. A lista completa de colaboradores do código está no <extlink>gráfico de colaboradores do GitHub</extlink>. Esta página destaca quem participa mais ativamente nos testes e na revisão das versões do ProxMenux."
|
||||
},
|
||||
"testers": {
|
||||
"heading": "Testadores e revisores",
|
||||
"intro": "Estas pessoas estiveram entre as primeiras a contribuir para o projeto. Os seus testes, relatos de problemas e sugestões de melhoria ajudaram o ProxMenux a tornar-se no que é hoje.",
|
||||
"roles": {
|
||||
"testing": "Teste",
|
||||
"testingReviewer": "Testes e revisão"
|
||||
},
|
||||
"youtube": "YouTube"
|
||||
},
|
||||
"contribute": {
|
||||
"heading": "Queres contribuir?",
|
||||
"intro": "Todos os contributos são bem-vindos: código, testes, design, documentação ou simplesmente partilhar ideias:",
|
||||
"tester": "<strong>Testes</strong> — experimente o <beta>canal beta</beta> e comunique o que funciona ou não antes da publicação das versões estáveis.",
|
||||
"developer": "<strong>Desenvolvimento</strong> — Bash, Next.js (TypeScript) e algum Python para o ambiente virtual de tradução (venv). Os PR são bem-vindos no <gh>GitHub</gh>.",
|
||||
"designer": "<strong>Designer</strong> — Melhorias de interface, ícones, capturas de tela para documentação.",
|
||||
"ideas": "<strong>Ideias</strong> — abra um tópico em <disc>GitHub Discussions</disc> antes de criar uma issue para pedir uma funcionalidade."
|
||||
},
|
||||
"coc": {
|
||||
"title": "Leia primeiro o Código de Conduta",
|
||||
"body": "Antes de propor código ou comunicar problemas, leia o <coclink>Código de conduta e as boas práticas</coclink>. Explica as expectativas sobre a responsabilidade pelo código, a comunicação de vulnerabilidades e o âmbito dos PR."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Perguntas frequentes | Documentação ProxMenux",
|
||||
"description": "Perguntas frequentes sobre o ProxMenux: funcionalidades, instalação, compatibilidade a partir do PVE 8, personalização, atualizações, segurança, uso em produção, ficheiros do sistema, contributos e desinstalação.",
|
||||
"ogTitle": "Perguntas frequentes | Documentação ProxMenux",
|
||||
"ogDescription": "Perguntas frequentes sobre instalação, compatibilidade, segurança e contribuição do ProxMenux."
|
||||
},
|
||||
"header": {
|
||||
"title": "Perguntas frequentes",
|
||||
"description": "Perguntas comuns sobre o ProxMenux: o que é, a quem se destina, instalação, atualização, desinstalação, compatibilidade, personalização, segurança e contributos. Se não encontrar a sua pergunta, consulte GitHub Discussions ou abra uma issue.",
|
||||
"section": "Sobre"
|
||||
},
|
||||
"quickLinks": {
|
||||
"title": "Ligações rápidas",
|
||||
"installationLabel": "Instalação",
|
||||
"installationSuffix": " — o comando de instalação de uma linha + dependências.",
|
||||
"introductionLabel": "Introdução",
|
||||
"introductionSuffix": " — o que faz ProxMenux, em 5 minutos.",
|
||||
"uninstallLabel": "Desinstalar",
|
||||
"uninstallSuffix": " — remoção limpa.",
|
||||
"issuesLabel": "GitHub Issues",
|
||||
"discussionsLabel": "Discussões"
|
||||
},
|
||||
"q1": {
|
||||
"question": "O que é o ProxMenux e para que é utilizado?",
|
||||
"p1Rich": "<strong>ProxMenux</strong> é uma ferramenta de menu interativa projetada para tornar o <strong>Proxmox VE</strong> acessível a todos os usuários, independentemente de sua experiência técnica. Ele simplifica a execução de comandos, permitindo que os usuários executem ações em seu sistema sem exigir conhecimento avançado do Linux.",
|
||||
"p2": "Os utilizadores menos experientes executam comandos através de menus estruturados, reduzindo a escrita manual no terminal. Os administradores experientes poupam passos em tarefas repetitivas: reforço de segurança após a instalação, passthrough de GPU, importação de VM OVF e rotação de snapshots ZFS.",
|
||||
"p3": "Proxmox VE é amplamente utilizado para:",
|
||||
"items": [
|
||||
"Virtualização de nível empresarial",
|
||||
"HomeLab e soluções de nuvem pessoal",
|
||||
"Servidores multimídia, automação e muito mais"
|
||||
]
|
||||
},
|
||||
"q2": {
|
||||
"question": "Como faço para instalar ProxMenux?",
|
||||
"p1Rich": "Siga o <installlink>guia de instalação</installlink>. Em resumo:",
|
||||
"stableInstall": "bash -c \"$(wget -qLO - https://raw.githubusercontent.com/MacRimi/ProxMenux/main/install_proxmenux.sh)\"",
|
||||
"p2": "Uma vez instalado, basta iniciar com:",
|
||||
"menuCmd": "menu"
|
||||
},
|
||||
"q3": {
|
||||
"question": "O ProxMenux é compatível com todas as versões do Proxmox?",
|
||||
"bodyRich": "<strong>Não — o ProxMenux requer Proxmox VE 8 ou posterior.</strong> O PVE 7 e as versões anteriores não são suportados. Se ainda usa o PVE 7, atualize primeiro para 8.x segundo o procedimento oficial do Proxmox. Depois, o ProxMenux pode tratar da passagem de 8 para 9 em <upgradelink>Utilitários → Atualizar PVE 8 para PVE 9</upgradelink>."
|
||||
},
|
||||
"q4": {
|
||||
"question": "Posso personalizar ProxMenux?",
|
||||
"p1Rich": "As atualizações podem substituir alterações locais aos scripts principais, pelo que deve evitar editar esses ficheiros diretamente. O que <em>pode</em> personalizar:",
|
||||
"items": [
|
||||
"O banner do console através da ferramenta <strong>FastFetch</strong> nas opções de Post-Install.",
|
||||
"Quais componentes opcionais são instalados (Monitor, Fail2Ban, Lynis...) — escolha durante a instalação ou através do menu relevante mais tarde."
|
||||
]
|
||||
},
|
||||
"q5": {
|
||||
"question": "Como faço para atualizar o ProxMenux?",
|
||||
"p1Rich": "Quando há uma nova versão, o ProxMenux deteta-a na próxima execução de <code>menu</code> e propõe a atualização. Se aceitar, os ficheiros e a configuração da ferramenta são substituídos na instalação existente, sem downloads manuais.",
|
||||
"p2Rich": "Os utilizadores da versão estável recebem atualizações estáveis; os da beta recebem atualizações beta. Quando é publicada uma versão estável, a beta avisa na próxima abertura do menu e propõe a mudança automática. Consulte o <betalink>programa beta</betalink>."
|
||||
},
|
||||
"q6": {
|
||||
"question": "Onde posso comunicar problemas ou sugerir funcionalidades?",
|
||||
"p1Rich": "Comunique erros em <issueslink>GitHub Issues</issueslink>. Inclua os passos para os reproduzir, a mensagem de erro e, quando relevante, a saída do Monitor obtida com <code>journalctl -u proxmenux-monitor -n 50</code>.",
|
||||
"p2Rich": "No caso de problemas de <strong>segurança</strong>, <strong>não publique os detalhes</strong>. Siga o procedimento de divulgação responsável no <coclink>código de conduta e boas práticas</coclink>."
|
||||
},
|
||||
"q7": {
|
||||
"question": "Posso contribuir para o ProxMenux?",
|
||||
"p1Rich": "<strong>Claro.</strong> O ProxMenux é um projeto colaborativo e de código aberto. Pode contribuir com código (Bash, Next.js/TypeScript e ferramentas de tradução em Python), testes, documentação, design ou ideias.",
|
||||
"item1Rich": "Discuta as ideias em <discusslink>GitHub Discussions</discusslink> antes de abrir um pedido de funcionalidade.",
|
||||
"item2Rich": "Antes de enviar uma pull request, leia o <coclink>código de conduta e boas práticas</coclink>.",
|
||||
"item3Rich": "Consulte a <contriblink>página de colaboradores</contriblink> para saber quem participa atualmente nos testes e revisões."
|
||||
},
|
||||
"q8": {
|
||||
"question": "ProxMenux modifica arquivos críticos do sistema?",
|
||||
"p1Rich": "<strong>A instalação do ProxMenux adiciona os seguintes componentes.</strong>",
|
||||
"item1Rich": "Dependências via apt: <code>dialog</code>, <code>curl</code>, <code>jq</code> e <code>git</code>. As traduções usam catálogos JSON pré-gerados; o instalador não adiciona ao anfitrião um ambiente virtual de tradução.",
|
||||
"item2Rich": "A árvore de scripts em <code>/usr/local/share/proxmenux/</code>.",
|
||||
"item3Rich": "O comando de arranque em <code>/usr/local/bin/menu</code>.",
|
||||
"item4Rich": "Opcional: o serviço systemd do Monitor, <code>proxmenux-monitor.service</code>.",
|
||||
"p2Rich": "O ProxMenux <em>não</em> altera a configuração principal do Proxmox, salvo se o pedir explicitamente num menu específico. Por exemplo, a reparação de rede edita <code>/etc/network/interfaces</code>, mas apenas após a sua confirmação e a criação de uma cópia de segurança."
|
||||
},
|
||||
"q9": {
|
||||
"question": "É seguro usar ProxMenux na produção?",
|
||||
"bodyRich": "<strong>Sim.</strong> Como o ProxMenux só altera os ficheiros principais do Proxmox quando solicitado explicitamente, pode ser usado em ambientes de produção. Como em qualquer automação, teste primeiro num ambiente controlado e tenha cópias de segurança antes de operações destrutivas: atualização do PVE 8 para 9, formatação de discos, eliminação de VM, entre outras."
|
||||
},
|
||||
"q10": {
|
||||
"question": "Como faço para desinstalar ProxMenux?",
|
||||
"p1Rich": "No ProxMenux: <strong>Definições → Desinstalar ProxMenux</strong>. A desinstalação remove os scripts, o comando de arranque e o serviço Monitor, além das dependências selecionadas, se assim escolher. Restaura <code>/root/.bashrc</code> e <code>/etc/motd</code> a partir das cópias criadas na instalação, caso existam.",
|
||||
"p2Rich": "Passo a passo completo: <uninstalllink>Desinstalar ProxMenux</uninstalllink>."
|
||||
},
|
||||
"q11": {
|
||||
"question": "VirusTotal sinaliza o URL de instalação — é seguro?",
|
||||
"p1Rich": "O resultado de 1/95 do motor <em>Chong Lua Dao</em>, comunicado na issue #162, foi identificado pelo responsável do projeto como um falso positivo. O instalador usa o padrão <code>curl | bash</code> e pode descarregar <code>jq</code> da sua versão oficial no GitHub. Este <em>comportamento</em> pode ativar análises heurísticas; esse relatório histórico não avalia todos os downloads futuros.",
|
||||
"p2Rich": "O ProxMenux é totalmente de código aberto e pode analisar o script de instalação linha a linha: <scriptlink>install_proxmenux.sh</scriptlink>. Mais contexto na <issuelink>issue #162</issuelink>."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Sobre o projeto | Documentação ProxMenux",
|
||||
"description": "Sobre o ProxMenux: objetivos do projeto, colaboradores, FAQ e Código de Conduta. Ferramenta de gerenciamento orientada por menus de código aberto para Proxmox VE 8+, construída e mantida pela MacRimi com uma pequena equipe de testadores e colaboradores.",
|
||||
"ogTitle": "Sobre o projeto | Documentação ProxMenux",
|
||||
"ogDescription": "Sobre ProxMenux — ferramenta de gestão orientada por menus de código aberto para Proxmox VE 8+."
|
||||
},
|
||||
"header": {
|
||||
"title": "Sobre",
|
||||
"description": "Informações do projeto, perguntas frequentes, colaboradores e código de conduta. O ProxMenux é uma ferramenta de gestão por menus, de código aberto, para Proxmox VE 8+, desenvolvida e mantida por MacRimi com a ajuda de uma pequena equipa de testes e colaboradores.",
|
||||
"section": "Sobre"
|
||||
},
|
||||
"callout": {
|
||||
"title": "Código aberto, baseado na comunidade",
|
||||
"body": "O ProxMenux é distribuído sob a licença GPL-3.0 e desenvolvido publicamente no GitHub. Cada script pode ser revisto e cada alteração rastreada. São bem-vindos relatos de erros, ideias, código e testes."
|
||||
},
|
||||
"section": {
|
||||
"heading": "Nesta secção",
|
||||
"options": [
|
||||
{
|
||||
"icon": "HelpCircle",
|
||||
"href": "/docs/about/faq",
|
||||
"title": "FAQ",
|
||||
"description": "Perguntas frequentes: o que é o ProxMenux, instalação, compatibilidade, personalização, atualizações, segurança, uso em produção e desinstalação."
|
||||
},
|
||||
{
|
||||
"icon": "Users",
|
||||
"href": "/docs/about/contributors",
|
||||
"title": "Colaboradores",
|
||||
"description": "Reconhecimento às pessoas que tornam o ProxMenux possível: quem testa, revê e desenvolve cada versão."
|
||||
},
|
||||
{
|
||||
"icon": "ScrollText",
|
||||
"href": "/docs/about/code-of-conduct",
|
||||
"title": "Código de Conduta",
|
||||
"description": "Valores do projeto, expectativas de responsabilidade de código e diretrizes de contribuição. Leitura necessária antes de abrir um PR ou relatório."
|
||||
}
|
||||
]
|
||||
},
|
||||
"involved": {
|
||||
"heading": "Participe",
|
||||
"intro": "Três lugares para se envolver com o projeto:",
|
||||
"cards": [
|
||||
{
|
||||
"href": "https://github.com/MacRimi/ProxMenux/issues/new",
|
||||
"title": "🐛 Comunicar um erro",
|
||||
"description": "GitHub Issues — inclua os registos e os passos para reproduzir o problema."
|
||||
},
|
||||
{
|
||||
"href": "https://github.com/MacRimi/ProxMenux/discussions",
|
||||
"title": "💡 Sugerir uma funcionalidade",
|
||||
"description": "GitHub Discussions — partilhe ideias antes de abrir um PR."
|
||||
},
|
||||
{
|
||||
"href": "https://github.com/MacRimi/ProxMenux/pulls",
|
||||
"title": "🔀 Enviar um PR",
|
||||
"description": "GitHub Pull Requests — leia primeiro o Código de Conduta."
|
||||
}
|
||||
]
|
||||
},
|
||||
"support": {
|
||||
"heading": "Apoiar o projecto",
|
||||
"introRich": "Se o ProxMenux lhe poupa tempo, a forma mais simples de o dar a conhecer é <starlink>atribuir uma ⭐ ao repositório no GitHub</starlink>. Se quiser ir mais longe:",
|
||||
"kofiLabel": "Apoio em Ko-fi",
|
||||
"kofiOutro": " — compra um café ao mantenedor e mantém o desenvolvimento."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Cópia de segurança e reinício das interfaces | Documentação ProxMenux",
|
||||
"description": "Snapshot manual, navegar e restaurar backups /etc/network/interfaces armazenados em /var/backups/proxmenux/. Inclui uma reinicialização do serviço de rede com confirmação e uma visão rápida da configuração ao vivo.",
|
||||
"ogTitle": "Cópia de segurança e reinício das interfaces | Documentação ProxMenux",
|
||||
"ogDescription": "Instantâneo e restauração da configuração de rede Proxmox; reinicie o serviço de rede com confirmação."
|
||||
},
|
||||
"header": {
|
||||
"title": "Cópia de segurança e reinício das interfaces",
|
||||
"description": "Quatro utilitários que giram em torno de /etc/network/interfaces: tirar um instantâneo manual, visualizar a configuração ao vivo, restaurar um backup anterior com visualização opcional, e reiniciar o serviço de rede com consentimento explícito. Mesmo diretório de backup usado pelos fluxos de reparo guiados.",
|
||||
"section": "Rede"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Gere o mesmo diretório de cópias de segurança usado pelas reparações guiadas (<code>/var/backups/proxmenux/</code>). Permite criar uma cópia extra antes de qualquer alteração manual, consultar todas as cópias existentes e repor qualquer uma delas — sempre com uma nova cópia do estado anterior ao restauro, criada automaticamente como segunda proteção."
|
||||
},
|
||||
"shared": {
|
||||
"heading": "O diretório de backup compartilhado",
|
||||
"intro": "Cada backup feito em qualquer lugar no menu Rede chega no mesmo lugar:",
|
||||
"outro": "Os nomes dos ficheiros contêm data e hora, são ordenados por data e nunca são substituídos. O diretório é criado na primeira utilização."
|
||||
},
|
||||
"show": {
|
||||
"heading": "Mostrar arquivo de configuração de rede",
|
||||
"body": "Imprime <code>/etc/network/interfaces</code> na íntegra para o terminal. Só para leitura. Útil como uma verificação de sanidade antes de fazer um backup ou depois de uma restauração — não há nenhuma ferramenta separada \"diff com backup anterior\", então olhar para o arquivo ao vivo é a maneira mais fácil de confirmar o que você tem."
|
||||
},
|
||||
"create": {
|
||||
"heading": "Criar backup de rede",
|
||||
"body": "Copia o <code>/etc/network/interfaces</code> atual para o diretório de backup com um timestamp fresco. É isso — sem análise, sem prompts, apenas um instantâneo.",
|
||||
"whenTitle": "Quando criar uma cópia de segurança manual",
|
||||
"whenBody": "Antes de editar <code>/etc/network/interfaces</code> à mão, instalar um pacote que possa alterar a pilha de rede (por exemplo NetworkManager ou Open vSwitch) ou fazer qualquer alteração de hardware. As reparações guiadas já criam uma cópia automaticamente — esta opção serve para as operações <em>manuais</em>."
|
||||
},
|
||||
"restore": {
|
||||
"heading": "Restaurar backup de rede",
|
||||
"intro": "Lista todas as cópias em <code>/var/backups/proxmenux/</code> da mais recente à mais antiga e guia um restauro com proteções:",
|
||||
"steps": [
|
||||
{
|
||||
"title": "1. Escolher uma cópia de segurança",
|
||||
"body": "Um menu lista cada backup pelo seu timestamp. Se não existirem backups, o fluxo sai com uma mensagem clara.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "2. Visualização opcional",
|
||||
"body": "Propõe abrir a cópia selecionada numa vista com deslocamento antes de confirmar o restauro. A opção predefinida é Sim — não ignore este passo num host remoto.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "3. Cópia de segurança antes do restauro",
|
||||
"body": "Antes de sobrepor <code>/etc/network/interfaces</code>, toma <strong>outro</strong> backup do estado atual. Restaurar um backup é em si uma ação destrutiva, então o novo instantâneo pré-restore permite que você volte se o backup escolhido acabar sendo o errado.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "4. Aplicar a restauração",
|
||||
"body": "Substitui <code>/etc/network/interfaces</code> pela cópia selecionada. A alteração do ficheiro está no disco; o estado atual do kernel ainda reflete a configuração anterior.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "5. Reinício opcional",
|
||||
"body": "Pergunta se deve executar o <code>systemctl restart networking</code> agora. Recusar para adiar a alteração para a próxima reinicialização.",
|
||||
"tone": "emerald"
|
||||
}
|
||||
],
|
||||
"autoBackupTitle": "O restauro cria automaticamente a sua própria cópia de segurança",
|
||||
"autoBackupBody": "Selecionar <em>Restaurar backup de rede</em> cria sempre uma nova cópia da configuração <em>atual</em> antes de a substituir. Se restaurar a cópia errada, o ficheiro mais recente em <code>/var/backups/proxmenux/</code> contém o estado anterior."
|
||||
},
|
||||
"restart": {
|
||||
"heading": "Reinicie o serviço de rede",
|
||||
"body": "Executa <code>systemctl restart networking</code> após uma confirmação sim/não. Relata o resultado com <code>msg_ok</code> / <code>msg_error</code>. A maioria dos fluxos neste menu oferece o seu próprio prompt de reinicialização no final; esta opção é para reiniciar após uma edição manual ou depois de recusar o reinício do fluxo antes.",
|
||||
"warnTitle": "Breve desconexão garantida; desconexão permanente possível",
|
||||
"warnBody": "Reiniciando <code>networking</code> derruba e reaplica cada interface declarada em <code>/etc/network/interfaces</code>. As sessões SSH hospedadas nessas interfaces caem. Se a nova configuração for inválida, a rede nunca voltará. Execute isto apenas quando:",
|
||||
"warnItems": [
|
||||
"Você tem o console / IPMI / iKVM pronto, <em> ou</em>",
|
||||
"Está fisicamente ao lado da máquina, <em>ou</em>",
|
||||
"Você acabou de voltar com sucesso para uma configuração conhecida-boa e quer aplicá-la."
|
||||
]
|
||||
},
|
||||
"manualRollback": {
|
||||
"heading": "Retroceder manualmente de uma consola",
|
||||
"intro": "Se você não conseguir alcançar o menu (sem SSH, a janela está a falhar, ...) mas pode chegar a uma consola, o rollback são dois comandos:",
|
||||
"outro": "É a <em>mesma</em> operação executada pelo menu, apenas escrita à mão. Se <code>networking</code> continuar sem iniciar, consulte <code>journalctl -u networking -b</code> para identificar o erro de sintaxe ou do controlador."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"noneTitle": "\"Nenhum backup encontrado\" na Restauração",
|
||||
"noneBody": "O diretório <code>/var/backups/proxmenux/</code> não existe ou não contém ficheiros <code>interfaces_backup_*</code>. Execute <em>Criar backup de rede</em> pelo menos uma vez ou faça uma reparação guiada, que cria uma cópia automaticamente. Confirme com <code>ls /var/backups/proxmenux/</code>.",
|
||||
"unreachTitle": "Reiniciar a rede tem sucesso, mas a máquina ainda não está acessível",
|
||||
"unreachBody": "A nova configuração está errada ou não atribui o seu IP de gestão. Reponha a configuração a partir da consola (ver acima). Depois use a <bridgeLink>análise de bridges</bridgeLink> e a <configLink>análise de configuração</configLink> para perceber o problema antes de voltar a aplicar.",
|
||||
"emptyTitle": "A antevisão da restauração mostra um arquivo vazio",
|
||||
"emptyBody": "O ficheiro de backup está vazio (0 bytes). Isto acontece se uma cópia falhar silenciosamente numa execução anterior. Escolha uma cópia mais antiga ou execute novamente <em>Criar backup de rede</em> agora, se a configuração atual funcionar."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Análise de ponte e reparo guiado",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — a razão mais comum pela qual um backup acaba aqui."
|
||||
},
|
||||
{
|
||||
"label": "Análise de configuração e limpeza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tailRich": " — escreve igualmente para o <code>/var/backups/proxmenux/</code> automaticamente."
|
||||
},
|
||||
{
|
||||
"label": "Diagnósticos",
|
||||
"href": "/docs/network/diagnostics",
|
||||
"tail": " — para verificar o estado atual após um restauro."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,132 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Análise de bridges e reparação guiada | Documentação ProxMenux",
|
||||
"description": "Deteta bridges vmbrX com portas físicas em falta ou inválidas, tipicamente após a reenumeração PCI. Apresenta-os com sugestões de comandos de shell e propõe uma reparação guiada em 5 passos com cópia de segurança obrigatória.",
|
||||
"ogTitle": "Análise de bridges e reparação guiada | Documentação ProxMenux",
|
||||
"ogDescription": "Verifique e repare portas de bridges Proxmox após alterações de hardware, com um procedimento guiado que permite reverter em segurança."
|
||||
},
|
||||
"header": {
|
||||
"title": "Análise de ponte e reparo guiado",
|
||||
"description": "Verifica cada bridge vmbrX declarado em /etc/network/interfaces e se as suas portas físicas existem. Caso faltem, propõe uma reparação passo a passo. A análise é só de leitura; a reparação exige confirmação, apresenta uma pré-visualização e cria uma cópia de segurança.",
|
||||
"section": "Rede"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Lê cada ponte em <code>/etc/network/interfaces</code>, olha para sua linha <code>bridge-ports</code> e verifica se cada porta declarada (por exemplo. <code>enp3s0</code>) realmente existe na máquina. Se falta uma porta, propõe um substituto e – com consentimento explícito – aplica a alteração com um <strong>backup, visualização, aplicação, verificação</strong>."
|
||||
},
|
||||
"when": {
|
||||
"heading": "Quando precisares disto",
|
||||
"intro": "Linux atribui nomes de interface previsíveis de topologia PCI e ordem de fenda. Vários eventos os embaralham e deixam o <code>/etc/network/interfaces</code> referindo-se a nomes que já não existem:",
|
||||
"items": [
|
||||
"Adicionar ou remover uma placa PCIe (placa de rede, GPU, HBA ou adaptador NVMe).",
|
||||
"Mudar uma placa existente para outro slot PCIe.",
|
||||
"BIOS / UEFI atualiza que re-enumeram dispositivos PCI.",
|
||||
"Migrando o disco de inicialização para hardware diferente."
|
||||
],
|
||||
"outro": "Após a próxima inicialização, a ponte tenta anexar a uma porta que já não existe, falha em aparecer, e o host perde sua rede. <link>Nomes de interface persistentes</link> impede que isso aconteça novamente — mas se você já estiver bloqueado, esta página é o caminho de recuperação."
|
||||
},
|
||||
"bigPicture": {
|
||||
"heading": "O quadro geral",
|
||||
"diagram1": {
|
||||
"arrowLabel": "passo 1",
|
||||
"nodes": {
|
||||
"sourceLabel": "/etc/network/interfaces",
|
||||
"sourceDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports enp3s0",
|
||||
"bridgeLabel": "Analisar (somente leitura)",
|
||||
"bridgeDetail": "ip link show enp3s0\n→ não existe",
|
||||
"targetLabel": "Relatório + sugestão",
|
||||
"targetDetail": "❌ enp3s0: NÃO ENCONTRADA\nSubstituir por: eno1\n(ainda sem alterações)"
|
||||
}
|
||||
},
|
||||
"diagram2": {
|
||||
"arrowLabel": "aplicar com backup",
|
||||
"nodes": {
|
||||
"sourceLabel": "Reparação guiada",
|
||||
"sourceDetail": "1. Cópia de Segurança\n2. Mostrar actual\n3. Antevisão das alterações\n4. Aplicar\n5. Verificar",
|
||||
"targetLabel": "/etc/network/interfaces (novo)",
|
||||
"targetDetail": "auto vmbr0\niface vmbr0 inet static\n bridge-ports eno1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"step1": {
|
||||
"heading": "Passo 1: análise (somente leitura)",
|
||||
"intro": "Ao selecionar <strong>Analisar configuração de bridges</strong>, a ferramenta para imediatamente se o host não usar a pilha clássica Debian/Proxmox. Caso contrário, verifica cada bridge e apresenta:",
|
||||
"items": [
|
||||
"Nome do bridge, estado atual (UP / DOWN) e IP atribuído.",
|
||||
"Cada porta declarada e se existe atualmente (<code>ip link show <port></code>).",
|
||||
"Para cada porta inválida: uma substituição proposta (a primeira interface física disponível) mais o comando exato <code>sed</code> para aplicá-lo manualmente.",
|
||||
"Bridges sem qualquer linha <code>bridge-ports</code> e entradas <code>auto</code> órfãs sem bloco <code>iface</code> correspondente."
|
||||
],
|
||||
"readonlyTitle": "Garantia apenas para leitura",
|
||||
"readonlyBody": "Até este ponto o script não executou um único comando modificando. Você pode deixar a análise aberta, copiar os comandos <code>sed</code> sugeridos e aplicá-los manualmente se preferir — ou aceitar o próximo prompt para inserir o reparo guiado."
|
||||
},
|
||||
"step2": {
|
||||
"heading": "Passo 2: reparação guiada (5 passos)",
|
||||
"intro": "Só se inicia se aceitar a proposta no fim da análise. Cada passo mostra o que vai acontecer e pede confirmação antes de continuar.",
|
||||
"steps": [
|
||||
{
|
||||
"title": "1. Cópia de segurança",
|
||||
"body": "Copia <code>/etc/network/interfaces</code> para <code>/var/backups/proxmenux/interfaces_backup_<TIMESTAMP></code>. O caminho exato de backup é mostrado antes da cópia e novamente depois, com o comando rollback.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "2. Rever a configuração actual",
|
||||
"body": "Abre o <code>/etc/network/interfaces</code> ao vivo numa janela de rolagem para que possa ver exactamente o que está prestes a ser alterado.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "3. Antever as alterações propostas",
|
||||
"body": "Lista exatamente os bridges afetados e as substituições de portas previstas. Se já não for necessária reparação porque a porta reapareceu entre as verificações, o processo termina com <em>«Não são necessárias alterações.»</em>",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "4. Aplicar alterações",
|
||||
"body": "Para cada ponte afetada, executa <code>sed -i \"/iface $bridge/,/bridge-ports/ s/bridge-ports.*/bridge-ports $new_ports/\"</code> contra <code>/etc/network/interfaces</code>. Se uma ponte não tiver nenhuma substituição válida disponível, a substituição é ignorada e relatada na etapa 5.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "5. Verificação",
|
||||
"body": "Lê novamente o ficheiro e confirma a existência da nova porta de cada bridge. Mostra o comando para reverter (<code>cp <backup> /etc/network/interfaces</code>). Por fim propõe <strong>Reiniciar a rede</strong> — aceite apenas se tiver acesso de reserva à consola.",
|
||||
"tone": "emerald"
|
||||
}
|
||||
],
|
||||
"restartTitle": "Reiniciar a rede ≠ anular sem risco",
|
||||
"restartBody": "A reparação é gravada no disco mesmo que não reinicie o serviço. <code>systemctl restart networking</code> aplica a alteração <em>agora</em> e pode interromper a sessão SSH se a nova porta estiver errada. Se recusar, a alteração entra na mesma em vigor no próximo arranque — confirme primeiro a configuração ou reverta com o comando apresentado."
|
||||
},
|
||||
"edits": {
|
||||
"heading": "O que é editado (exatamente)",
|
||||
"body": "Apenas a linha <code>bridge-ports</code> de cada bridge afetado. As outras diretivas (<code>address</code>, <code>netmask</code>, <code>gateway</code>, <code>bridge-stp</code>, …) ficam intactas. Neste procedimento o script não cria nem remove blocos <code>iface</code> — isso cabe à <link>Análise de configuração & limpeza</link>."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"unsupportedTitle": "A análise para com «Pilha de rede não suportada»",
|
||||
"unsupportedBody": "O host usa netplan, systemd-networkd ou NetworkManager. A ferramenta só suporta <code>/etc/network/interfaces</code>. Mude primeiro o host para a pilha clássica ou altere a configuração com as ferramentas nativas do gestor (por exemplo <code>netplan apply</code>).",
|
||||
"noSuggestTitle": "Nenhuma sugestão é impressa para uma porta inválida",
|
||||
"noSuggestBody": "O host tem zero interfaces físicas livres (tudo já está em outra ponte ou não existe). A análise remonta a sugerir <code>bridge-ports none</code> para que a ponte possa pelo menos subir sem um porto. Adicionar um NIC ou migrar portas entre pontes manualmente antes de repetir.",
|
||||
"stillDownTitle": "O reparo completa, mas a ponte ainda está em baixo",
|
||||
"stillDownBody": "<code>sed</code> atualizou o arquivo, mas <code>systemctl restart networking</code> foi recusado. Execute-o manualmente assim que a nova configuração for verificada, ou reinicie. Se o reinício foi aceito e a ponte ainda estiver baixa, execute <code>ip link show</code> para confirmar a nova porta existe, em seguida, verifique <code>journalctl -u networking</code> para o erro real (cabo desconectado, link não negociado, porto já um membro de outra ponte).",
|
||||
"lostSshTitle": "Perdi o acesso SSH logo após reiniciar a rede",
|
||||
"lostSshIntro": "Use console / IPMI / iKVM para chegar ao host. Restaurar o backup:",
|
||||
"lostSshOutro": "Em seguida, re-execute a análise do console para descobrir por que a sugestão não funcionou (normalmente: a porta de substituição não está realmente conectada)."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Nomes de interface persistentes",
|
||||
"href": "/docs/network/persistent-names",
|
||||
"tail": " — atribuir nomes aos endereços MAC para que este cenário deixe de acontecer."
|
||||
},
|
||||
{
|
||||
"label": "Análise de configuração e limpeza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tailRich": " — para os blocos <code>iface</code> órfãos (a outra metade do mesmo problema)."
|
||||
},
|
||||
{
|
||||
"label": "Cópia de segurança e reinício das interfaces",
|
||||
"href": "/docs/network/backup-restore",
|
||||
"tail": " — instantâneos manuais e o navegador de restauração."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Análise de configuração e limpeza guiada | Documentação ProxMenux",
|
||||
"description": "Deteta blocos iface em /etc/network/interfaces que referem placas de rede físicas já ausentes do host. Apresenta-os e propõe uma remoção guiada em 5 passos com cópia de segurança obrigatória e pré-visualização de cada bloco.",
|
||||
"ogTitle": "Análise de configuração e limpeza guiada | Documentação ProxMenux",
|
||||
"ogDescription": "Encontrar e remover blocos de interface órfão deixados para trás por mudanças de hardware, com visualização completa e rollback."
|
||||
},
|
||||
"header": {
|
||||
"title": "Análise de configuração e limpeza guiada",
|
||||
"description": "Examina cada bloco iface em /etc/network/interfaces e verifica se a placa de rede física correspondente ainda existe. Apresenta os blocos órfãos deixados por alterações de hardware e propõe uma remoção guiada com cópia de segurança, pré-visualização e confirmação de cada bloco.",
|
||||
"section": "Rede"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Identifica declarações <code>iface</code> cuja NIC de apoio não está mais presente no host (típico após a substituição ou remoção de uma placa de rede). Em seguida, oferece uma limpeza guiada que remove <em>apenas</em> os blocos órfãos, com um backup, uma visualização por seção e uma confirmação final explícita."
|
||||
},
|
||||
"differs": {
|
||||
"heading": "Como difere da análise da ponte",
|
||||
"headerAspect": "Aspecto",
|
||||
"headerBridge": "Análise da ponte",
|
||||
"headerConfig": "Análise de configuração",
|
||||
"rows": [
|
||||
{
|
||||
"aspect": "Olha para",
|
||||
"bridge": "Pontes (<code>vmbrX</code>) e sua linha <code>bridge-ports</code>",
|
||||
"config": "Cada bloco <code>iface</code>, excluindo loopback, bridges e bonds"
|
||||
},
|
||||
{
|
||||
"aspect": "Detecta",
|
||||
"bridge": "Bridges que referem uma porta inexistente",
|
||||
"config": "Blocos de interface independentes para NICs que não existem"
|
||||
},
|
||||
{
|
||||
"aspect": "Acção de reparação",
|
||||
"bridge": "Substitui o nome do porto em <code>bridge-ports</code>",
|
||||
"config": "Remove todo o bloco <code>iface</code>"
|
||||
},
|
||||
{
|
||||
"aspect": "Exclui",
|
||||
"bridge": "Nada — cada ponte é analisada",
|
||||
"config": "Bridges (<code>vmbrX</code>) e bonds (<code>bondX</code>) são sempre mantidos, pois são virtuais e a sua ausência durante o arranque pode ser normal"
|
||||
}
|
||||
],
|
||||
"outro": "Na prática, usam-se frequentemente ambas por esta ordem: primeiro a <strong>análise de configuração</strong> para remover blocos órfãos, depois a <link>análise de bridges</link> para reatribuir os bridges que dependiam da interface removida."
|
||||
},
|
||||
"step1": {
|
||||
"heading": "Passo 1: análise (somente leitura)",
|
||||
"intro": "Aborta imediatamente se a máquina não estiver na pilha clássica. Caso contrário, lista todas as interfaces não- loopback configuradas e reporta o seu estado:",
|
||||
"virtTitle": "As interfaces virtuais estão protegidas",
|
||||
"virtBody": "Bridges (<code>vmbrX</code>) e bonds (<code>bondX</code>) são estruturas virtuais. Podem legitimamente não existir no momento da inspeção, como um bridge ainda sem portas. A análise nunca propõe removê-los — apenas placas de rede físicas."
|
||||
},
|
||||
"step2": {
|
||||
"heading": "Passo 2: limpeza guiada (5 passos)",
|
||||
"intro": "Só se inicia se aceitar a proposta no fim da análise. Cada passo exige confirmação; cancelar em qualquer ponto termina sem escrever.",
|
||||
"steps": [
|
||||
{
|
||||
"title": "1. Cópia de segurança",
|
||||
"body": "Copia <code>/etc/network/interfaces</code> para <code>/var/backups/proxmenux/interfaces_backup_<TIMESTAMP></code>. Caminho mostrado antes e depois.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "2. Confirmar a lista de remoção",
|
||||
"body": "Lista exatamente os blocos de interfaces físicas a remover. Se as placas de rede reaparecerem entre a análise e a limpeza, por exemplo após voltar a inserir uma placa, o processo termina com <em>«Não é necessária limpeza.»</em>",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "3. Visualizar o( s) bloco( s) exato( s)",
|
||||
"body": "Abre uma vista com deslocamento de cada bloco <code>iface</code> que seria eliminado, exatamente como está no ficheiro. É a altura de identificar, por exemplo, um hook <code>up</code> que queira preservar.",
|
||||
"tone": "blue"
|
||||
},
|
||||
{
|
||||
"title": "4. Aplicar remoção",
|
||||
"body": "Para cada interface órfã, executa <code>sed -i \"/^iface $iface/,/^$/d\" /etc/network/interfaces</code>. Isso apaga da linha <code>iface</code> correspondente até a próxima linha em branco.",
|
||||
"tone": "amber"
|
||||
},
|
||||
{
|
||||
"title": "5. Verificação",
|
||||
"body": "Lê novamente o ficheiro, lista o que foi removido e verifica as interfaces restantes. Mostra o comando para reverter. <strong>Não</strong> reinicia a rede automaticamente — remover um bloco não usado pode ser aplicado em segurança no próximo reinício, evitando alterar o estado ativo.",
|
||||
"tone": "emerald"
|
||||
}
|
||||
],
|
||||
"noRestartTitle": "Não reinicia automaticamente a rede",
|
||||
"noRestartBody": "Ao contrário do reparo de ponte, o fluxo de limpeza não oferece para reiniciar o serviço. Remover um bloco de interface não utilizado não tem efeito imediato na configuração em execução, então uma reinicialização é desnecessária e seria um risco desnecessário de conectividade. A mudança produz efeito no próximo manual <code>systemctl restart networking</code> ou na próxima reinicialização."
|
||||
},
|
||||
"caveats": {
|
||||
"heading": "Advertências importantes",
|
||||
"boundaryTitle": "O limite do bloco é a primeira linha em branco",
|
||||
"boundaryBody": "O padrão <code>sed</code> elimina desde <code>iface <name></code> até à próxima linha vazia. Se <code>/etc/network/interfaces</code> não tiver linhas vazias entre blocos, algo raro mas possível após edição manual, o bloco seguinte também pode ser eliminado. Por isso, <strong>o passo 3 é obrigatório</strong>: reveja a pré-visualização antes de confirmar.",
|
||||
"tandemTitle": "Um bloco iface órfão usado por um bridge é detetado aqui, não na análise de bridges",
|
||||
"tandemBody": "Se <code>vmbr0</code> declarar <code>bridge-ports enp3s0</code> e <code>enp3s0</code> também tiver o seu bloco <code>iface enp3s0 inet manual</code>, remover <code>enp3s0</code> aqui deixa uma referência inválida em <code>vmbr0</code>. Após a limpeza, execute a <link>análise de bridges</link> para reatribuir ou remover a porta do bridge. Os dois procedimentos foram concebidos para uso conjunto."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"notFoundTitle": "A análise mostra o meu novo NIC como \"NÃO ENCONTRADO\"",
|
||||
"notFoundBody": "O kernel vê o dispositivo com um nome diferente do que está no ficheiro. Execute <code>ip link show</code> para obter o nome real. É precisamente um caso em que os <link>nomes persistentes das interfaces</link> evitariam o problema no futuro.",
|
||||
"tooMuchTitle": "A limpeza removeu demasiado, incluindo um bloco que queria manter",
|
||||
"tooMuchBody": "Restaurar a partir do backup impresso na etapa 5:",
|
||||
"tooMuchOutro": "Edite o arquivo manualmente para adicionar uma linha em branco clara entre os blocos antes de repetir a limpeza ou remover o bloco problemático manualmente.",
|
||||
"bridgeBreakTitle": "Uma ponte pára de funcionar após a limpeza",
|
||||
"bridgeBreakBody": "O bridge dependia de uma porta cujo bloco <code>iface</code> foi removido. Execute a <link>análise de bridges</link> e a sugestão associará o bridge a uma interface física existente."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Análise de ponte e reparo guiado",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — o acompanhamento natural após uma limpeza."
|
||||
},
|
||||
{
|
||||
"label": "Nomes de interface persistentes",
|
||||
"href": "/docs/network/persistent-names",
|
||||
"tail": " — impede a acumulação de blocos órfãos após cada mudança de hardware."
|
||||
},
|
||||
{
|
||||
"label": "Cópia de segurança e reinício das interfaces",
|
||||
"href": "/docs/network/backup-restore",
|
||||
"tail": " — instantâneos manuais e o navegador de restauração."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Diagnósticos | Documentação ProxMenux",
|
||||
"description": "Três diagnósticos pontuais só de leitura: Mostrar tabela de encaminhamento, Testar conectividade e Diagnósticos avançados. Apenas inspeção — nunca escreve em /etc/network/interfaces nem executa comandos de alteração, com uma exceção explícita que exige a sua aceitação: purgar o NetworkManager, caso seja detetado.",
|
||||
"ogTitle": "Diagnósticos | Documentação ProxMenux",
|
||||
"ogDescription": "Diagnósticos de rede somente leitura para o host Proxmox: roteamento, acessibilidade, estatísticas avançadas."
|
||||
},
|
||||
"header": {
|
||||
"title": "Diagnósticos",
|
||||
"description": "Três verificações pontuais só de leitura do estado atual da rede: tabela de encaminhamento, teste de conectividade e estatísticas avançadas. Nenhuma escreve em /etc/network/interfaces — são seguras a qualquer momento, incluindo por SSH. Para monitorização interativa em tempo real, consulte Ferramentas de monitorização em tempo real.",
|
||||
"section": "Rede"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Apresenta informações de encaminhamento, acessibilidade e estatísticas agregadas <strong>sem modificar nada</strong>. Use para confirmar que a rede funciona ou identificar IPs duplicados. Para observar o tráfego continuamente, consulte <monitoringLink>Ferramentas de monitorização em tempo real</monitoringLink>; para ver o ficheiro de configuração em bruto, consulte <backupLink>Cópia de segurança e reinício das interfaces</backupLink>."
|
||||
},
|
||||
"routing": {
|
||||
"heading": "Mostrar tabela de roteamento",
|
||||
"body": "Lista todas as rotas que o kernel usa atualmente (<code>ip route show</code>) e destaca o gateway padrão. Útil para confirmar que o tráfego para a internet sai através da interface esperada e que nenhuma rota restante está tendo precedência."
|
||||
},
|
||||
"connectivity": {
|
||||
"heading": "Testar conectividade",
|
||||
"intro": "Envia duas sondas ICMP para três alvos em sequência e reporta cada um. Em seguida, executa um <code>nslookup google.com</code> para verificar a resolução DNS independentemente do ICMP.",
|
||||
"headerTest": "Teste",
|
||||
"headerTarget": "Alvo",
|
||||
"headerConfirms": "O que confirma",
|
||||
"rows": [
|
||||
{
|
||||
"test": "DNS do Google",
|
||||
"target": "8.8.8.8",
|
||||
"confirms": "Alcance externo através de um conhecido IP anycast"
|
||||
},
|
||||
{
|
||||
"test": "Cloudflare DNS",
|
||||
"target": "1.1.1.1",
|
||||
"confirms": "Segunda opinião independente se o Google bloquear ICMP"
|
||||
},
|
||||
{
|
||||
"test": "Gateway",
|
||||
"target": "(rota padrão)",
|
||||
"confirms": "Conectividade L2 / L3 com o roteador local"
|
||||
},
|
||||
{
|
||||
"test": "Resolução DNS",
|
||||
"target": "google.com",
|
||||
"confirms": "O servidor DNS está acessível e responde"
|
||||
}
|
||||
],
|
||||
"readingTitle": "Lendo o resultado",
|
||||
"readingBody": "Se o teste do gateway passar mas os destinos DNS públicos falharem, tem conectividade local mas não tem Internet — verifique a ligação a montante do gateway. Se a resolução DNS falhar mas os pings para <code>8.8.8.8</code> tiverem sucesso, o problema está no resolvedor, não na rede: verifique <code>/etc/resolv.conf</code>."
|
||||
},
|
||||
"advanced": {
|
||||
"heading": "Diagnóstico Avançado",
|
||||
"intro": "Agrega estatísticas em toda a rede e executa uma bateria de verificações de questões comuns. Relata as contagens de conexão ativa, portas de escuta, interfaces totais e sinaliza dois anti- padrões explicitamente:",
|
||||
"items": [
|
||||
"<strong>NetworkManager em execução num host Proxmox.</strong> O NetworkManager e o <code>ifupdown</code> do Proxmox entram em conflito: ambos tentam gerir as interfaces, tornando os bridges instáveis ou impedindo a sua ativação. Se for detetado, a ferramenta pede confirmação interativa para o parar, desativar e purgar (é o <em>único</em> diagnóstico que pode modificar o sistema, e só após consentimento explícito).",
|
||||
"<strong>Endereços IP duplicados em diferentes interfaces.</strong> Duas interfaces com o mesmo IPv4 causam conectividade intermitente extremamente difícil de depurar de dentro do VM. Detectado através de <code>ip -4 addr show | sort | uniq -d</code>."
|
||||
],
|
||||
"nmTitle": "O prompt NetworkManager é a única ação modificadora aqui",
|
||||
"nmBody": "Todas as outras verificações dos diagnósticos avançados são só de leitura. A remoção do NetworkManager exige confirmação sim/não e executa <code>systemctl stop / disable</code> + <code>apt-get purge -y network-manager</code>. Se recusar, nada muda."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"gwTitle": "Testar conectividade indica uma falha do gateway, mas o host tem acesso à Internet",
|
||||
"gwBody": "Alguns routers não respondem a ICMP na interface interna mesmo quando encaminham corretamente o tráfego. Teste com <code>traceroute 8.8.8.8</code> numa consola: se o segundo salto for o seu ISP e o teste de DNS público tiver passado, o gateway está a funcionar apesar do ping falhado.",
|
||||
"dupTitle": "Diagnóstico avançado continua sinalizando IPs duplicados depois que eu removi um",
|
||||
"dupBody": "A verificação olha para o estado do kernel ao vivo, não para o arquivo de configuração. Executar <code>ip -4 addr show</code> para confirmar; se a duplicata ainda estiver presente, uma interface ainda está segurando-a. Use <code>ip addr del <IP>/<mask> dev <iface></code> para removê-lo do estado ao vivo, em seguida, edite <code>/etc/network/interfaces</code> se ele também é persistente."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Ferramentas de monitorização ao vivo",
|
||||
"href": "/docs/network/monitoring",
|
||||
"tail": " — lançadores interativos iftop / iptraf-ng / iperf3."
|
||||
},
|
||||
{
|
||||
"label": "Análise de ponte e reparo guiado",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — quando um vmbrX não tem a sua porta física."
|
||||
},
|
||||
{
|
||||
"label": "Análise de configuração e limpeza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tail": " — quando uma NIC antiga é ainda declarada, mas já não está presente."
|
||||
},
|
||||
{
|
||||
"label": "Cópia de segurança e reinício das interfaces",
|
||||
"href": "/docs/network/backup-restore",
|
||||
"tail": " — para criar uma cópia da configuração antes de qualquer alteração."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Gestão de rede Proxmox — Bridges, bonds, diagnóstico, reparação | ProxMenux",
|
||||
"description": "Diagnósticos só de leitura, análises seguidas de sugestões e reparações guiadas para a pilha de rede Debian / Proxmox (/etc/network/interfaces). Inspecione bridges e bonds, execute ferramentas de monitorização em tempo real, torne persistentes os nomes das interfaces, crie cópias de segurança e reinicie a rede em segurança — com cópias obrigatórias e pré-visualizações passo a passo.",
|
||||
"ogTitle": "Gestão de rede Proxmox — Bridges, bonds, diagnóstico, reparação",
|
||||
"ogDescription": "Diagnósticos, análise e reparos guiados para a pilha de rede Proxmox com backups obrigatórios e pré-visualizações passo a passo.",
|
||||
"twitterTitle": "Gestão de rede Proxmox | ProxMenux",
|
||||
"twitterDescription": "Bridges, bonds, diagnósticos e reparações guiadas para a pilha de rede Proxmox com cópias de segurança obrigatórias."
|
||||
},
|
||||
"header": {
|
||||
"title": "Gerenciamento de rede",
|
||||
"description": "Diagnósticos só de leitura, relatórios de análise com sugestões e reparações guiadas para a pilha de rede clássica Debian/Proxmox. Cada operação destrutiva cria primeiro uma cópia de segurança e mostra as alterações exatas antes de as aplicar.",
|
||||
"section": "Rede"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Para que serve este menu",
|
||||
"body": "Inspecione, diagnostique e, quando necessário, repare a configuração de rede do host Proxmox sem perder o acesso remoto. As ferramentas seguem um princípio: <strong>ler primeiro, propor e só depois aplicar com consentimento explícito e uma cópia de segurança</strong>. Não existe um botão «Corrigir tudo automaticamente»."
|
||||
},
|
||||
"openingMenu": {
|
||||
"heading": "Abrir o menu",
|
||||
"intro": "No menu principal do ProxMenux, selecione <strong>Rede</strong>. Verá o seguinte:",
|
||||
"imageAlt": "Menu de gerenciamento de rede com diagnósticos, monitoramento, análise, reparo, nomes persistentes e opções de backup"
|
||||
},
|
||||
"safety": {
|
||||
"heading": "O modelo de segurança",
|
||||
"body": "Editar a configuração de rede de um host Proxmox remoto é uma das formas mais fáceis de perder o acesso. O ProxMenux tem isso em conta em cada ação. As ferramentas dividem-se em três níveis de comportamento — escolha o cartão que corresponde ao seu objetivo:"
|
||||
},
|
||||
"tiers": {
|
||||
"readOnly": {
|
||||
"title": "Somente leitura",
|
||||
"body": "Inspecção pura. Não é possível modificar o sistema em nenhuma circunstância.",
|
||||
"items": [
|
||||
"Tabela de roteamento, testes de conectividade, estatísticas avançadas",
|
||||
"Monitorização do tráfego ao vivo (iftop, iptraf-ng)",
|
||||
"Teste de largura de banda (iperf3)"
|
||||
]
|
||||
},
|
||||
"analyze": {
|
||||
"title": "Analisar, então sugerir",
|
||||
"body": "Detecta problemas, imprime um relatório com comandos de shell propostos e pára. Você decide se deve entrar na reparação guiada depois.",
|
||||
"items": [
|
||||
"Análise de configuração da ponte",
|
||||
"Análise da configuração da rede"
|
||||
]
|
||||
},
|
||||
"apply": {
|
||||
"title": "Aplicar com backup",
|
||||
"body": "Modifica o sistema. Cria sempre primeiro uma cópia de segurança do ficheiro afetado com data e hora e mostra uma pré-visualização antes de escrever.",
|
||||
"items": [
|
||||
"Nomes de interface persistentes (ficheiros .link)",
|
||||
"Backup manual, restauração e reinício do serviço"
|
||||
]
|
||||
}
|
||||
},
|
||||
"classicTitle": "Apenas a pilha clássica",
|
||||
"classicBody": "Cada função de análise e reparo verifica o gerenciador de rede ativo antes de tocar em qualquer coisa. Se o host executar <strong>netplan</strong>, <strong>systemd-networkd</strong> ou <strong>NetworkManager</strong>, a ferramenta aborta imediatamente com uma mensagem clara — o menu só suporta a pilha Debian/Proxmox clássica no <code>/etc/network/interfaces</code>. Isto é intencional: editar um arquivo netplan com regras escritas para <code>ifupdown</code> iria silenciosamente corromper a configuração.",
|
||||
"backups": {
|
||||
"heading": "Para onde vão os backups",
|
||||
"intro": "Cada reparação guiada, restauro ou cópia de segurança manual grava uma cópia de <code>/etc/network/interfaces</code> com data e hora em <code>/var/backups/proxmenux/</code>:",
|
||||
"rollbackIntro": "Para repor manualmente a configuração anterior a partir de uma consola:"
|
||||
},
|
||||
"readOnlySection": {
|
||||
"heading": "Inspeção somente de leitura",
|
||||
"body": "O ponto de partida quando algo parece errado. Apenas inspeção — nunca escreve em <code>/etc/network/interfaces</code> nem executa comandos que alterem o sistema, com uma única exceção explícita que exige a sua aceitação: purgar o NetworkManager, caso seja detetado. Pode ser usado em segurança por SSH a qualquer momento.",
|
||||
"options": [
|
||||
{
|
||||
"title": "Diagnósticos",
|
||||
"description": "Três verificações pontuais só de leitura: Mostrar tabela de encaminhamento, Testar conectividade e Diagnósticos avançados. Apenas inspeção — nunca escreve no sistema."
|
||||
},
|
||||
{
|
||||
"title": "Ferramentas de monitorização ao vivo",
|
||||
"description": "Três lançadores interativos: iftop (largura de banda em tempo real por par host), iptraf-ng (monitor de tráfego multimodo) e iperf3 (teste de largura de banda, servidor / modo cliente)."
|
||||
}
|
||||
]
|
||||
},
|
||||
"analyzeSection": {
|
||||
"heading": "Analisar, então sugerir",
|
||||
"body": "Usadas quando uma inspeção ou uma falha real aponta para um problema de configuração. Cada ferramenta examina a parte relevante de <code>/etc/network/interfaces</code>, apresenta um relatório detalhado com o comando exato de shell que corrigiria cada problema e <strong>para</strong>. Se aceitar depois a reparação guiada opcional, é criada uma cópia de segurança antes de cada alteração, que também é pré-visualizada antes da escrita.",
|
||||
"options": [
|
||||
{
|
||||
"title": "Análise de ponte e reparo guiado",
|
||||
"description": "Deteta bridges vmbrX com portas em falta ou inválidas, algo típico após a reenumeração PCI. Mostra primeiro um relatório e só repara quando aceita o procedimento guiado de 5 passos."
|
||||
},
|
||||
{
|
||||
"title": "Análise de configuração e limpeza guiada",
|
||||
"description": "Encontra interfaces físicas declaradas em /etc/network/interfaces que já não existem (configurações órfãs deixadas por mudanças de hardware). Comunica-os e oferece uma remoção guiada."
|
||||
}
|
||||
]
|
||||
},
|
||||
"applySection": {
|
||||
"heading": "Aplicar com backup",
|
||||
"body": "Estas ferramentas escrevem no disco por natureza. Cada uma cria primeiro uma cópia de segurança do ficheiro afetado com data e hora, e as opções destrutivas, como restauro e reinício, exigem confirmação explícita sim/não. Os <em>nomes persistentes das interfaces</em> entram em vigor no próximo reinício, não de imediato, pelo que a sua configuração pode ser agendada em segurança mesmo num host remoto.",
|
||||
"options": [
|
||||
{
|
||||
"title": "Nomes de interface persistentes",
|
||||
"description": "Associa os nomes das interfaces (eno1, enp3s0, …) aos endereços MAC através de ficheiros .link do systemd. Os nomes mantêm-se após mudanças de slot PCI, atualizações do kernel e adição ou remoção de outras placas de rede."
|
||||
},
|
||||
{
|
||||
"title": "Cópia de segurança e reinício das interfaces",
|
||||
"description": "Instantâneo manual do /etc/network/interfaces, navegar e restaurar backups anteriores, visualizar a configuração ao vivo e reiniciar o serviço de rede quando necessário."
|
||||
}
|
||||
]
|
||||
},
|
||||
"consoleTitle": "Tenha acesso à consola preparado",
|
||||
"consoleSubTitle": "Antes de qualquer reparação em uma máquina remota",
|
||||
"consoleBody": "Se estiver ligado por SSH e tiver apenas um caminho de acesso ao host, prepare uma alternativa antes de alterar a rede: consola física / IPMI / iKVM ou outra máquina na mesma LAN. As reparações guiadas são seguras e oferecem sempre um comando para reverter as alterações, mas um bridge mal configurado ou uma ligação interrompida pode deixá-lo sem acesso até conseguir chegar à consola."
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Ferramentas de monitorização em tempo real | Documentação ProxMenux",
|
||||
"description": "Três lançadores interativos de monitoramento de rede: iftop (largura de banda em tempo real por par host), iptraf-ng (monitor de tráfego multimodo) e iperf3 (teste de largura de banda, servidor / modo cliente). Cada um é instalado na primeira utilização.",
|
||||
"ogTitle": "Ferramentas de monitorização em tempo real | Documentação ProxMenux",
|
||||
"ogDescription": "Monitoramento de rede interativo e testes de largura de banda para o host Proxmox: iftop, iptraf-ng, iperf3."
|
||||
},
|
||||
"header": {
|
||||
"title": "Ferramentas de monitorização ao vivo",
|
||||
"description": "Três ferramentas interativas para observar a rede em tempo real e medir a largura de banda: iftop, iptraf-ng e iperf3. Cada uma é instalada automaticamente através do apt na primeira utilização, corre em primeiro plano e termina com a tecla indicada. Não alteram a configuração de rede do host; o iperf3 gera tráfego de teste.",
|
||||
"section": "Rede"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Três ferramentas interativas de monitoramento, cada uma atrás de seu próprio menu. A primeira vez que você lança um, o pacote é instalado silenciosamente via <code>apt-get</code>. Lançamentos subsequentes começam instantaneamente. Nenhuma destas ferramentas modifica a configuração da rede host."
|
||||
},
|
||||
"when": {
|
||||
"heading": "Quando utilizar qual",
|
||||
"headerQuestion": "Pergunta",
|
||||
"headerUse": "Usar",
|
||||
"rows": [
|
||||
{
|
||||
"question": "Quem está saturando o link <em> agora</em>?",
|
||||
"use": "iftop"
|
||||
},
|
||||
{
|
||||
"question": "Qual é a distribuição por protocolo e que tamanhos de pacotes e fluxos TCP estão presentes?",
|
||||
"use": "iptraf-ng"
|
||||
},
|
||||
{
|
||||
"question": "Quanta largura de banda está disponível entre duas máquinas?",
|
||||
"use": "iperf3"
|
||||
}
|
||||
]
|
||||
},
|
||||
"iftop": {
|
||||
"heading": "uso de rede em tempo real (iftop)",
|
||||
"body": "Largura de banda em tempo real por par de hosts (origem ↔ destino) — como o <code>top</code> para o tráfego. Mostra os fluxos mais intensos no topo, com médias móveis de 2/10/40 segundos. A melhor ferramenta para responder a <em>«porque está a minha ligação de saída saturada?»</em>.",
|
||||
"exit": "<strong>Sair:</strong> prima <kbd>q</kbd>. O ProxMenux mostra um lembrete antes de iniciar.",
|
||||
"keysTitle": "Teclas úteis no iftop",
|
||||
"keysBody": "<kbd>n</kbd> alterna a consulta DNS, <kbd>p</kbd> mostra os números das portas, <kbd>P</kbd> pausa a visualização, <kbd>t</kbd> alterna a direção das linhas (enviado / recebido / ambos), <kbd>1</kbd>/<kbd>2</kbd>/<kbd>3</kbd> ordena pela média de 2 s / 10 s / 40 s. Lista completa em <code>man iftop</code>."
|
||||
},
|
||||
"iptraf": {
|
||||
"heading": "ferramenta de monitoramento de rede (iptraf-ng)",
|
||||
"intro": "Um monitor de tráfego com vários modos, controlado por menus. O iftop responde a <em>«quem»</em>, enquanto o iptraf-ng responde a <em>«o quê»</em>: contagens de bytes e pacotes por protocolo, acompanhamento do estado das ligações TCP, histogramas de tamanho dos pacotes e atividade LAN por estação.",
|
||||
"menuIntro": "No lançamento você recebe um menu de cinco opções:",
|
||||
"headerMode": "Modo",
|
||||
"headerUseFor": "Use-o para",
|
||||
"rows": [
|
||||
{
|
||||
"mode": "IP traffic monitor",
|
||||
"useFor": "Lista em tempo real de fluxos TCP / UDP / ICMP / outros protocolos IP, com contadores de bytes e estado da ligação"
|
||||
},
|
||||
{
|
||||
"mode": "General interface stats",
|
||||
"useFor": "Contagens agregadas de pacotes IPv4 / IPv6 / TCP / UDP / ICMP / não IP por placa de rede"
|
||||
},
|
||||
{
|
||||
"mode": "Detailed interface stats",
|
||||
"useFor": "O mesmo que acima, mas para uma interface, com tamanho de pacote e detalhe de taxa"
|
||||
},
|
||||
{
|
||||
"mode": "Statistical breakdowns",
|
||||
"useFor": "Histograma de distribuição do tamanho do pacote, por porta TCP / UDP"
|
||||
},
|
||||
{
|
||||
"mode": "LAN station monitor",
|
||||
"useFor": "Estatísticas de tráfego por MAC para o domínio de transmissão local"
|
||||
}
|
||||
],
|
||||
"exit": "<strong>Saída:</strong> pressione <kbd>x</kbd> de qualquer vista (ou <kbd>Q</kbd> do menu principal). O ProxMenux mostra uma janela de lembrete antes do lançamento.",
|
||||
"logTitle": "Guardar capturas num ficheiro",
|
||||
"logBody": "Cada modo oferece para registrar estatísticas capturadas para <code>/var/log/iptraf-ng/</code>. Útil se você precisar de um registro de um pico de tráfego — deixe-o em execução, faça log para arquivo, reveja o arquivo depois, em vez de tentar ler a tela ao vivo."
|
||||
},
|
||||
"iperf3": {
|
||||
"heading": "Teste de largura de banda (iperf3)",
|
||||
"intro1": "Mede o débito TCP real entre dois hosts. Ao contrário do iftop / iptraf-ng, que observam o tráfego existente, o iperf3 gera tráfego sintético para testar a ligação sob carga. Indispensável para perguntas como <em>«a minha ligação 10 GbE atinge realmente 10 GbE?»</em> ou <em>«o estrangulamento está na placa de rede, no switch ou no armazenamento?»</em>.",
|
||||
"intro2": "O iperf3 é uma <strong>ferramenta para dois hosts</strong>: um funciona como servidor, à escuta na porta TCP 5201, e o outro como cliente, que se liga, envia dados e mostra o débito. O ProxMenux pergunta qual o modo pretendido:",
|
||||
"headerMode": "Modo",
|
||||
"headerBehaviour": "Comportamento",
|
||||
"headerCli": "CLI equivalente",
|
||||
"rows": [
|
||||
{
|
||||
"mode": "Servidor",
|
||||
"behaviour": "Escuta em TCP 5201 e imprime resultados para cada teste de entrada. Para em Ctrl+C.",
|
||||
"cli": "iperf3 -s"
|
||||
},
|
||||
{
|
||||
"mode": "Cliente",
|
||||
"behaviour": "Pede o IP ou nome do servidor, liga-se, executa o teste predefinido de 10 segundos e mostra o relatório.",
|
||||
"cli": "iperf3 -c <target>"
|
||||
}
|
||||
],
|
||||
"workflowIntro": "Fluxo de trabalho típico para testar uma ligação 10 GbE entre duas máquinas Proxmox:",
|
||||
"workflow": [
|
||||
"No host A, abra o menu Rede → <em>Teste de largura de banda (iperf3)</em> → escolha <strong>Servidor</strong>.",
|
||||
"No host B, abra a mesma entrada de menu → escolha <strong>Cliente</strong> → introduza o IP do host A.",
|
||||
"Espere 10 segundos. Compare o débito apresentado com o máximo teórico da ligação."
|
||||
],
|
||||
"sample": "Exemplo de saída do cliente:",
|
||||
"flagsTitle": "Opções úteis para executar manualmente numa shell",
|
||||
"flagsBody": "<code>-t 60</code> teste mais longo (60s em vez de 10s padrão), <code>-P 4</code> 4 fluxos paralelos (satura mais rápido), <code>-R</code> direção reversa (servidor → cliente), <code>-u -b 100M</code> UDP teste em 100 Mbit/s (para medições de jitter / perda de pacotes), <code>-p 5202</code> usar uma porta diferente (testes múltiplos em paralelo). <code>man iperf3</code> para o conjunto completo.",
|
||||
"firewallTitle": "Abrir a porta de firewall no servidor",
|
||||
"firewallBody": "O servidor escuta por predefinição na porta TCP <strong>5201</strong>. Se o executar num host Proxmox com firewall restritiva, ao nível do datacenter ou do host, permita ligações TCP 5201 de entrada a partir do IP do cliente durante o teste e volte a fechar a porta no fim. O mesmo se aplica a <code>nftables</code> / <code>iptables</code> em hosts físicos."
|
||||
},
|
||||
"install": {
|
||||
"heading": "Primeiro lançamento instala o pacote",
|
||||
"body": "Todos os três lançadores verificam o binário e executam o <code>apt-get update -qq && apt-get install -y <pkg></code> se estiver em falta. A instalação é silenciosa: o menu pode aparecer congelado para 10–30 segundos na primeira vez. Lançamentos subsequentes começam instantaneamente."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"hangTitle": "A instalação fica bloqueada na primeira execução",
|
||||
"hangBody": "O host não tem Internet ou os repositórios apt estão inacessíveis. Cancele com <kbd>Ctrl</kbd>+<kbd>C</kbd>, execute <code>apt-get update</code> manualmente para ver o erro real (DNS, assinatura do repositório, proxy, …) e volte ao menu.",
|
||||
"refusedTitle": "Cliente iperf3: «unable to connect to server: Connection refused»",
|
||||
"refusedBody": "Ou o servidor não está em execução, ou seu firewall bloqueia TCP 5201. Confirme no servidor: <code>ss -tlnp | grep 5201</code> — deve mostrar iperf3 ouvindo. Se ouvir mas o cliente ainda falhar, verifique o caminho do firewall entre os dois hosts.",
|
||||
"slowTitle": "O iperf3 apresenta um débito muito inferior à velocidade esperada da ligação",
|
||||
"slowBody": "Causas comuns por ordem de probabilidade: (1) a CPU de um host limita o débito — tente <code>iperf3 -c <target> -P 4</code> para usar vários núcleos; (2) o percurso passa por uma ligação mais lenta, como um switch gigabit entre duas placas 10 GbE; (3) MTU diferentes — verifique <code>ip link show</code> nas duas pontas; (4) offloading da placa de rede desativado — consulte o script da comunidade <em>Disable NIC Offloading</em> se tiver uma placa Intel e1000e.",
|
||||
"noTrafficTitle": "iftop / iptraf-ng não mostram tráfego para uma máquina ocupada",
|
||||
"noTrafficBody": "A captura padrão está na primeira interface detectada. Especifique o direito explicitamente a partir do shell: <code>iftop -i vmbr0</code> ou <code>iptraf-ng -i vmbr0</code>. O lançador de menus usa o padrão; para interfaces não padrão, execute a partir de uma consola."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Diagnósticos",
|
||||
"href": "/docs/network/diagnostics",
|
||||
"tail": " — as verificações pontuais só de leitura (encaminhamento, conectividade e estatísticas avançadas)."
|
||||
},
|
||||
{
|
||||
"label": "Análise de ponte e reparo guiado",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tail": " — quando o controlo revela que uma interface ou ponte não está a fazer o que deveria."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Nomes de interface persistentes | Documentação ProxMenux",
|
||||
"description": "Associe os nomes das interfaces Proxmox (eno1, enp3s0, …) aos endereços MAC através de ficheiros .link do systemd para os manter após a reenumeração PCI, atualizações do kernel e adição ou remoção de outras placas de rede.",
|
||||
"ogTitle": "Nomes de interface persistentes | Documentação ProxMenux",
|
||||
"ogDescription": "Impeça que os nomes das interfaces Proxmox mudem quando altera o hardware. Usa ficheiros .link do systemd associados ao endereço MAC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Nomes de interface persistentes",
|
||||
"description": "Gera um ficheiro .link do systemd por placa de rede física para associar o nome atribuído pelo kernel ao endereço MAC da placa. Após a aplicação no próximo reinício, os nomes das interfaces mantêm-se estáveis ao adicionar, remover ou mudar placas PCIe de lugar.",
|
||||
"section": "Rede"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Para cada NIC físico no host, escreve um pequeno arquivo sob <code>/etc/systemd/network/10-<iface>.link</code> que diz: <em>\"o dispositivo com este MAC deve ser sempre chamado este nome\"</em>. systemd-udevd aplica a regra em cada inicialização, antes que <code>ifupdown</code> leia <code>/etc/network/interfaces</code>."
|
||||
},
|
||||
"problem": {
|
||||
"heading": "O problema que isto resolve",
|
||||
"intro": "O Linux deriva os nomes predefinidos das interfaces da topologia PCI — <code>eno1</code> = integrada na placa principal, <code>enp3s0</code> = placa no barramento PCI 3, slot 0, etc. O esquema de nomes é determinístico <em>para a mesma disposição de hardware</em>. Se a disposição mudar, os nomes mudam:",
|
||||
"items": [
|
||||
"Adicione um GPU na frente de um NIC existente → o número de barramento NIC pode mudar → alterações de nome.",
|
||||
"Mudar uma placa para outro slot PCIe → o nome muda.",
|
||||
"BIOS / UEFI atualização que re-enumera dispositivos → nomes podem mudar.",
|
||||
"Substituir uma placa avariada pelo mesmo modelo noutro slot → o nome muda."
|
||||
],
|
||||
"outro": "Após uma alteração destas, <code>/etc/network/interfaces</code> continua a referir o nome <em>antigo</em>; o bridge não se ativa e o host perde a rede. Configurar nomes persistentes impede que este cenário se repita."
|
||||
},
|
||||
"howWorks": {
|
||||
"heading": "Como funciona",
|
||||
"arrowLabel": "por NIC",
|
||||
"nodes": {
|
||||
"detectLabel": "Detetar placas de rede físicas",
|
||||
"detectDetail": "ls /sys/class/net/\nexcluir vmbr / bond /\ndocker / veth / wireguard …",
|
||||
"readLabel": "Ler cada MAC",
|
||||
"readDetail": "cat /sys/class/net/\n '<'iface'>'/address",
|
||||
"writeLabel": "Gravar o ficheiro .link",
|
||||
"writeDetail": "/etc/systemd/network/\n 10-'<'iface'>'.link"
|
||||
},
|
||||
"minimalIntro": "Cada arquivo gerado é intencionalmente mínimo:",
|
||||
"minimalOutro": "No arranque, o systemd-udevd identifica o dispositivo pelo MAC e atribui o nome pedido <em>antes</em> da intervenção de outros componentes (ifupdown, nomes predefinidos do kernel). O prefixo <code>10-</code> garante que estas regras carregam cedo, antes do ficheiro predefinido <code>99-default.link</code>."
|
||||
},
|
||||
"scope": {
|
||||
"heading": "O que é escrito, o que é ignorado",
|
||||
"headerType": "Tipo",
|
||||
"headerBehaviour": "Comportamento",
|
||||
"headerWhy": "Porquê?",
|
||||
"rows": [
|
||||
{
|
||||
"type": "Placa de rede integrada / PCIe",
|
||||
"behaviour": "Arquivo <code>.link</code> escrito",
|
||||
"why": "Apoiado por um dispositivo PCI real — o caso em que a ferramenta se destina"
|
||||
},
|
||||
{
|
||||
"type": "Wi-Fi (phy80211)",
|
||||
"behaviour": "Arquivo <code>.link</code> escrito",
|
||||
"why": "Tem um MAC real e beneficia da estabilidade do nome"
|
||||
},
|
||||
{
|
||||
"type": "Pontes (vmbrX)",
|
||||
"behaviour": "Ignorado",
|
||||
"why": "Virtual; o nome vem do <code>/etc/network/interfaces</code>"
|
||||
},
|
||||
{
|
||||
"type": "Bonds (bondX)",
|
||||
"behaviour": "Ignorado",
|
||||
"why": "Virtual; o nome do bond é definido pelo ifupdown"
|
||||
},
|
||||
{
|
||||
"type": "veth / docker0 / br-XXXX",
|
||||
"behaviour": "Ignorado",
|
||||
"why": "Criados a pedido pelo Docker / LXC — não são hardware persistente"
|
||||
},
|
||||
{
|
||||
"type": "tap / fwpr / fwln",
|
||||
"behaviour": "Ignorado",
|
||||
"why": "Criados a pedido pelo Proxmox para cada VM/CT"
|
||||
},
|
||||
{
|
||||
"type": "WireGuard / Cilium / Tailscale",
|
||||
"behaviour": "Ignorado",
|
||||
"why": "Interfaces de software gerenciadas por seus próprios daemons"
|
||||
}
|
||||
]
|
||||
},
|
||||
"safety": {
|
||||
"heading": "Proteção: são criadas cópias de segurança dos ficheiros .link anteriores",
|
||||
"intro": "Se <code>/etc/systemd/network/</code> já contiver ficheiros <code>.link</code> de uma execução anterior ou de outra ferramenta, são copiados para um diretório de segurança com data e hora antes de gerar os novos:",
|
||||
"outro": "Para voltar atrás: copie os arquivos de volta do diretório de backup e reinicie.",
|
||||
"rebootTitle": "Faz efeito na próxima reinicialização, não imediatamente",
|
||||
"rebootBody": "Alterações nos arquivos <code>.link</code> só se aplicam no arranque, quando o udev re-enumera dispositivos. A ferramenta informa que <em>\"Alterações serão aplicadas após reiniciar\"</em> por esta razão. Renomear uma interface ao vivo é arriscado e não tentado: um <code>vmbr0</code> ativo com membros teria que ser reconfigurado atomicamente, por isso a operação é adiada para a próxima inicialização limpa."
|
||||
},
|
||||
"afterReboot": {
|
||||
"heading": "Após a reinicialização",
|
||||
"intro": "Uma vez que os nomes são fixados, o fluxo de trabalho para futuras mudanças de hardware é simples:",
|
||||
"items": [
|
||||
"Desligue, altere o hardware (adicione uma placa, mude de slot, …) e ligue novamente.",
|
||||
"Cada NIC mantém seu nome anterior porque seu MAC corresponde a um arquivo <code>.link</code>.",
|
||||
"Se um NIC é substituído (MAC diferente), ele recebe um nome padrão do kernel (<code>enp<bus>s<slot></code>); execute novamente este menu para adicionar uma entrada <code>.link</code> para o MAC do novo cartão."
|
||||
]
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"emptyTitle": "\"Nenhuma interface física encontrada\" após executar a ferramenta",
|
||||
"emptyBody": "O kernel não vê interfaces baseadas em PCI / phy80211 no host. Confirme com <code>ls -l /sys/class/net/</code> — cada entrada deve ter uma ligação simbólica <code>device</code> (PCI) ou uma entrada <code>phy80211</code> (Wi-Fi). Se ambas faltarem numa placa de rede real, o controlador não está carregado.",
|
||||
"noChangeTitle": "Após a reinicialização, os nomes não mudaram como esperado",
|
||||
"noChangeBody": "Verifique se o arquivo está presente e bem formado: <code>cat /etc/systemd/network/10-<iface>.link</code>. Em seguida, verifique registros udev: <code>journalctl -u systemd-udevd -b | grep -i link</code>. Uma causa comum é um parâmetro antigo do kernel <code>net.ifnames=0</code> que desativa inteiramente a nomeação previsível — remova-a do <code>/etc/default/grub</code>, execute o <code>update-grub</code>, reinicie.",
|
||||
"undoTitle": "Quero anular os nomes persistentes",
|
||||
"undoBody": "Ou delete os arquivos <code>.link</code> (<code>rm /etc/systemd/network/10-*.link</code>) ou restaure do diretório de backup gerado na execução anterior. Reiniciar para aplicar."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Análise de ponte e reparo guiado",
|
||||
"href": "/docs/network/bridge-analysis",
|
||||
"tailRich": " — o caminho de recuperação quando os nomes <em>já</em> mudaram."
|
||||
},
|
||||
{
|
||||
"label": "Análise de configuração e limpeza guiada",
|
||||
"href": "/docs/network/config-analysis",
|
||||
"tail": " — para remover blocos órfãos deixados pelas mudanças de nomes."
|
||||
},
|
||||
{
|
||||
"label": "Diagnósticos",
|
||||
"href": "/docs/network/diagnostics",
|
||||
"tailRich": " — confirme os novos nomes com <em>Mostrar tabela de roteamento</em> após reiniciar."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,171 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Como é adaptada uma imagem OCI | ProxMenux",
|
||||
"description": "Do repositório da imagem e do respetivo ficheiro Compose a um modelo que pode ser revisto, um plano de implementação e um LXC nativo do Proxmox VE, sem Docker no seu interior."
|
||||
},
|
||||
"header": {
|
||||
"title": "Como é adaptada uma imagem OCI",
|
||||
"description": "Do repositório da imagem e do respetivo ficheiro Compose a um modelo que pode ser revisto, um plano de implementação e um LXC nativo, sem instalar Docker no seu interior.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "pipeline",
|
||||
"title": "O processo de adaptação",
|
||||
"blocks": [
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart LR\n A[\"{{repo}}\"] --> B[\"Compose + README\"]\n B --> C[\"{{converter}}\"]\n C --> D[\"{{template}}\"]\n D --> E{\"{{blockers}}\"}\n E -- \"{{no}}\" --> F[\"{{review}}\"]\n F --> D\n E -- \"{{yes}}\" --> G[\"{{plan}}\"]\n G --> H[\"pct create\"]\n H --> I[\"{{lxc}}\"]",
|
||||
"labels": {
|
||||
"repo": "Repositório da imagem",
|
||||
"converter": "Conversor",
|
||||
"template": "Modelo JSON",
|
||||
"blockers": "Sem impedimentos?",
|
||||
"no": "Não",
|
||||
"yes": "Sim",
|
||||
"review": "Revisão / overlay",
|
||||
"plan": "Plano de implementação",
|
||||
"lxc": "LXC nativo"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O conversor lê a imagem e o ficheiro Compose publicados pelo projeto e gera um modelo JSON. Se houver requisitos ainda não adaptados que impeçam a instalação, o modelo é revisto antes de ser publicado no catálogo. Um ficheiro de ajustes revistos, chamado overlay, resolve esses impedimentos. Só os modelos sem impedimentos pendentes são propostos para instalação."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "template",
|
||||
"title": "O que o modelo preserva",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Identidade da imagem",
|
||||
"body": "Repositório, tag de atualização contínua, arquitetura, digest resolvido e revisão de origem."
|
||||
},
|
||||
{
|
||||
"icon": "braces",
|
||||
"title": "Contrato do contentor",
|
||||
"body": "Entrypoint, Cmd, ambiente, utilizador, diretório de trabalho, sinal de paragem, portas e volumes."
|
||||
},
|
||||
{
|
||||
"icon": "layers",
|
||||
"title": "Adaptação ao Proxmox VE",
|
||||
"body": "Recursos, segurança, pontos de montagem, dispositivos, sysctls, verificações de estado e as adaptações necessárias em cada caso, com a respetiva justificação."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Compatibilidade",
|
||||
"body": "Chaves suportadas, requisitos por adaptar que impedem a instalação e estado de cada validação."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "sources",
|
||||
"title": "O OCI fornece o processo; o Compose fornece o ambiente",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Origem",
|
||||
"Exemplo",
|
||||
"Resultado nativo"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Metadados OCI",
|
||||
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>",
|
||||
"O Proxmox VE importa-os ao criar o CT"
|
||||
],
|
||||
[
|
||||
"Docker Compose",
|
||||
"<code>environment</code>, <code>volumes</code>, <code>devices</code>",
|
||||
"Entradas de ambiente LXC, <code>mpN</code> e <code>devN</code>"
|
||||
],
|
||||
[
|
||||
"Perfil do ProxMenux",
|
||||
"GPU, verificação de estado, credenciais",
|
||||
"Perguntas e adaptações revistas"
|
||||
],
|
||||
[
|
||||
"Utilizador",
|
||||
"VMID, armazenamento, rede",
|
||||
"O contrato da instância"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "install",
|
||||
"title": "O que acontece durante a instalação",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Resolver a referência",
|
||||
"body": "O registo é consultado, a arquitetura do host é selecionada e é fixado o digest exato para o qual aponta a tag de atualização contínua."
|
||||
},
|
||||
{
|
||||
"title": "Descarregar e verificar",
|
||||
"body": "O Skopeo descarrega a imagem como um arquivo OCI. Antes de criar qualquer recurso, cada camada é verificada através do respetivo digest e descomprimida. Se a descarga estiver danificada, é repetida uma vez antes de a instalação ser interrompida."
|
||||
},
|
||||
{
|
||||
"title": "Criar o sistema de ficheiros",
|
||||
"body": "O <code>pct create</code> cria o rootfs a partir do arquivo e preserva os metadados oficiais do processo da imagem."
|
||||
},
|
||||
{
|
||||
"title": "Ligar os recursos",
|
||||
"body": "São aplicados os volumes, a rede, o ambiente, os dispositivos e os perfis de segurança declarados."
|
||||
},
|
||||
{
|
||||
"title": "Consola",
|
||||
"body": "A saída da consola do contentor é guardada no host. A consola do Proxmox VE abre uma shell se a imagem incluir uma."
|
||||
},
|
||||
{
|
||||
"title": "Verificar",
|
||||
"body": "No primeiro arranque, aguarda-se que o contentor tenha um endereço e que o serviço responda. Em caso de falha, a instalação não é apresentada como concluída com sucesso."
|
||||
},
|
||||
{
|
||||
"title": "Registar a configuração",
|
||||
"body": "A configuração efetiva é guardada no contrato da instância utilizado nas atualizações e recriações."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "example",
|
||||
"title": "Exemplo: uma imagem com /config e /downloads",
|
||||
"intro": "Uma definição Compose habitual e a configuração do Proxmox VE que dela resulta. Os caminhos esperados pela aplicação não mudam.",
|
||||
"blocks": [
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Docker Compose",
|
||||
"code": "image: lscr.io/linuxserver/example:latest\nenvironment:\n - PUID=1000\n - PGID=1000\nvolumes:\n - config:/config\n - /srv/downloads:/downloads\nports:\n - 8080:8080"
|
||||
},
|
||||
{
|
||||
"title": "/etc/pve/lxc/VMID.conf (excerto)",
|
||||
"code": "entrypoint: /init\nmp0: local-lvm:vm-VMID-disk-1,mp=/config,backup=1,size=8G\nmp1: /srv/downloads,mp=/downloads\nnet0: name=eth0,bridge=vmbr0,ip=dhcp,type=veth\nlxc.environment.runtime: PUID=1000\nlxc.environment.runtime: PGID=1000"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O <code>mp0</code> é um segundo disco pertencente ao contentor, com o nome <code>vm-VMID-disk-N</code> no armazenamento selecionado. É montado em <code>/config</code> e, com <code>backup=1</code>, incluído na cópia de segurança do contentor. O <code>mp1</code> não cria um disco: monta o diretório do host <code>/srv/downloads</code> em <code>/downloads</code> dentro do LXC. A porta 8080 não é mapeada: o LXC tem um endereço próprio e o serviço responde nesse endereço."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,278 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar uma imagem fora do catálogo | ProxMenux",
|
||||
"description": "Adapte uma imagem OCI a partir de um ficheiro Compose, de um URL, de um comando docker run ou de uma referência de imagem e reveja o que o ProxMenux consegue reproduzir antes de a instalar."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar uma imagem fora do catálogo",
|
||||
"description": "A sua imagem é adaptada a partir do ficheiro Compose, de um comando docker run ou apenas da referência. O resultado é apresentado para revisão antes de criar qualquer LXC.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "O mesmo conversor e o mesmo instalador",
|
||||
"body": "A opção <strong>Instalar uma imagem fora do catálogo</strong> utiliza o mesmo conversor e instalador dos modelos do catálogo. A diferença é que o contrato é gerado nesse momento a partir da definição fornecida e validado antes de criar qualquer LXC."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "sources",
|
||||
"title": "Como é descrita a imagem",
|
||||
"intro": "O primeiro ecrã pergunta como é descrita a imagem. Quatro opções recebem uma definição a adaptar, uma quinta utiliza apenas o nome da imagem e outras três leem um oci-compose já escrito.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Opção",
|
||||
"O que é lido"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Colar o ficheiro Compose no terminal",
|
||||
"Cole o conteúdo YAML no terminal e termine com Ctrl+D."
|
||||
],
|
||||
[
|
||||
"Ler o ficheiro Compose deste host",
|
||||
"Um caminho no nó, <code>/root/docker-compose.yml</code> por predefinição. O ficheiro tem de existir e não ultrapassar 256 KiB."
|
||||
],
|
||||
[
|
||||
"Descarregar o ficheiro Compose de um endereço",
|
||||
"Um endereço <code>http://</code> ou <code>https://</code> que disponibilize o YAML em bruto. São descarregados no máximo 256 KiB."
|
||||
],
|
||||
[
|
||||
"Colar o comando docker run no terminal",
|
||||
"O comando publicado pelo projeto. São adaptadas as portas, o ambiente, os volumes, os dispositivos, as capabilities, o utilizador, a memória partilhada e as restantes opções suportadas."
|
||||
],
|
||||
[
|
||||
"Apenas a referência da imagem, sem ficheiro Compose",
|
||||
"Uma referência como <code>ghcr.io/user/application:latest</code>. O registo é consultado e os metadados OCI da imagem são preservados."
|
||||
],
|
||||
[
|
||||
"Colar um oci-compose no terminal",
|
||||
"Cole o JSON no terminal e termine com Ctrl+D. Não é convertido: é validado e instalado tal como está escrito."
|
||||
],
|
||||
[
|
||||
"Ler um oci-compose deste host",
|
||||
"Um ficheiro JSON no nó, <code>/root/oci-compose.json</code> por predefinição, com um máximo de 2 MiB."
|
||||
],
|
||||
[
|
||||
"Descarregar um oci-compose de um endereço",
|
||||
"Um endereço <code>http://</code> ou <code>https://</code> que disponibilize o ficheiro JSON. São descarregados no máximo 2 MiB."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/custom-source-menu.png",
|
||||
"alt": "Menu para escolher como descrever uma imagem fora do catálogo",
|
||||
"caption": "Formas de descrever uma imagem fora do catálogo."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "reference-only",
|
||||
"title": "O que fornece apenas a referência da imagem",
|
||||
"intro": "A imagem contém os metadados do seu processo, mas não todo o ambiente que um ficheiro Compose costuma acrescentar.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Lido da imagem",
|
||||
"Ausente da imagem",
|
||||
"Consequência"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"<code>Entrypoint</code>, <code>Cmd</code>, <code>User</code>, <code>WorkingDir</code> e o ambiente incorporado",
|
||||
"Variáveis presentes apenas na documentação",
|
||||
"São acrescentadas na instalação ou em Modificar"
|
||||
],
|
||||
[
|
||||
"Volumes declarados pela imagem",
|
||||
"Diretórios do host indicados apenas no ficheiro Compose",
|
||||
"Os caminhos adicionais são acrescentados antes da instalação"
|
||||
],
|
||||
[
|
||||
"Portas <code>EXPOSE</code>",
|
||||
"O URL, o protocolo ou a verificação funcional do serviço",
|
||||
"São confirmados a porta e o método de verificação do serviço"
|
||||
],
|
||||
[
|
||||
"Arquiteturas e digest no registo",
|
||||
"Dispositivos, privilégios ou dependências externas",
|
||||
"Não são ativados sem uma definição que os solicite"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "review",
|
||||
"title": "Rever antes de instalar",
|
||||
"intro": "Após adaptar a definição, o ProxMenux apresenta como a interpretou antes de perguntar o VMID, os recursos ou o armazenamento.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Analisar",
|
||||
"body": "São lidos os serviços, a imagem, as portas, os caminhos, o ambiente, os dispositivos, a segurança e a verificação de estado."
|
||||
},
|
||||
{
|
||||
"title": "Consultar o registo",
|
||||
"body": "A imagem tem de existir no registo e são apresentadas as arquiteturas publicadas. Um registo privado é consultado com a conta guardada para ele."
|
||||
},
|
||||
{
|
||||
"title": "Listar o que não é aplicado",
|
||||
"body": "São listados os labels, as redes Docker, as definições Swarm e outras chaves sem efeito num LXC."
|
||||
},
|
||||
{
|
||||
"title": "Bloquear opções sem equivalente seguro",
|
||||
"body": "As chaves sem equivalente seguro aparecem em <strong>Opções sem equivalente</strong> e impedem a continuação da instalação. Nenhuma é descartada sem aviso."
|
||||
},
|
||||
{
|
||||
"title": "Pedir segredos",
|
||||
"body": "As variáveis cujo nome indica uma palavra-passe, token ou chave são pedidas como dados sensíveis durante a instalação."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/custom-review.png",
|
||||
"alt": "Resumo da interpretação do ficheiro Compose pelo ProxMenux",
|
||||
"caption": "Resumo apresentado antes de o instalador perguntar o VMID e os recursos."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Após aceitar o resumo, segue-se o mesmo assistente do catálogo: nome, modo predefinido ou avançado, VMID, CPU, memória, rede, arranque com o nó, caminhos persistentes e adicionais, dispositivos compatíveis e resumo final."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "examples",
|
||||
"title": "Exemplos de entrada",
|
||||
"blocks": [
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Compose",
|
||||
"code": "services:\n app:\n image: ghcr.io/example/app:latest\n ports:\n - \"8080:8080\"\n volumes:\n - ./config:/config\n - /srv/media:/media\n environment:\n TZ: Europe/Madrid"
|
||||
},
|
||||
{
|
||||
"title": "docker run",
|
||||
"code": "docker run -d \\\n --name app \\\n -p 8080:8080 \\\n -e TZ=Europe/Madrid \\\n -v app-config:/config \\\n -v /srv/media:/media \\\n ghcr.io/example/app:latest"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "oci-compose",
|
||||
"title": "Um oci-compose escrito à mão",
|
||||
"intro": "Um oci-compose é o ficheiro JSON a partir do qual se instala uma aplicação. O catálogo guarda um por aplicação. O mesmo formato pode ser escrito à mão e instalado com esta opção.",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Num ficheiro escrito à mão, o autor define a imagem, as portas, as variáveis, os volumes e as perguntas da instalação. O ProxMenux completa o resto ao ler o ficheiro. O formato permite expressar o que o Compose não prevê: o texto de uma pergunta, uma palavra-passe gerada durante a instalação, um perfil de GPU, o proprietário de cada volume, a verificação do primeiro arranque ou as credenciais apresentadas no fim."
|
||||
},
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Verificar",
|
||||
"body": "Os ficheiros com erros não são instalados. Cada erro indica o campo afetado; se o JSON for inválido, são indicadas a linha e a coluna."
|
||||
},
|
||||
{
|
||||
"title": "Rever",
|
||||
"body": "Um ficheiro válido apresenta o que instala: imagem, endereço web, portas, caminhos persistentes, variáveis pedidas pelo instalador e ficheiros que serão escritos."
|
||||
},
|
||||
{
|
||||
"title": "Instalar",
|
||||
"body": "A instalação segue o mesmo processo das aplicações do catálogo, com definições predefinidas ou avançadas."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Um ficheiro que define os privilégios",
|
||||
"body": "Um oci-compose determina o que é montado no contentor e com que privilégios. A revisão mostra-o antes da instalação: instale apenas ficheiros de fontes de confiança."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O <readmeLink>README do motor OCI</readmeLink> descreve o formato bloco a bloco, com dois exemplos completos. O registo de uma instalação também pode ser lido desta forma: apenas é utilizado o modelo original, sem nenhuma das respostas dessa instalação."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "private-registries",
|
||||
"title": "Imagens em registos privados",
|
||||
"intro": "Uma imagem num registo privado, como um pacote privado do GitHub ou um repositório privado do Docker Hub, é consultada com uma conta guardada no ProxMenux.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "O registo recusa o acesso à imagem",
|
||||
"body": "Quando o registo indica que a imagem requer uma conta, a revisão propõe iniciar sessão nesse registo e consulta novamente a imagem."
|
||||
},
|
||||
{
|
||||
"title": "Iniciar sessão",
|
||||
"body": "Um utilizador e uma palavra-passe ou token com permissão para descarregar a imagem. O registo verifica-os e só são guardados se forem aceites."
|
||||
},
|
||||
{
|
||||
"title": "Instalar e manter atualizado",
|
||||
"body": "A conta é utilizada para descarregar a imagem na instalação e também nas atualizações, em Modificar, Recriar, no watchdog e na verificação de atualizações do Monitor, em qualquer nó do cluster."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "<strong>Contas de registos</strong>, no menu principal do OCI manager Apps, apresenta as contas guardadas por registo e utilizador, nunca os seus segredos. Cada conta permite verificar, descarregar ou instalar uma imagem, atualizar as credenciais ou removê-las."
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"GitHub (<code>ghcr.io</code>): o utilizador é a conta GitHub e a palavra-passe é um token de acesso pessoal com a permissão <code>read:packages</code>.",
|
||||
"Docker Hub (<code>docker.io</code>): o utilizador é a conta Docker Hub e a palavra-passe é um token de acesso com permissão de leitura.",
|
||||
"Outros registos, incluindo os que usam uma porta própria como <code>registry.example.com:5000</code>: o utilizador e a palavra-passe ou token fornecidos por esse registo."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Onde são guardadas as contas",
|
||||
"body": "Em <code>/etc/pve/priv/proxmenux/registry-auth.json</code>, legível apenas por root, na mesma pasta onde o Proxmox guarda as palavras-passe de armazenamento. <code>/etc/pve</code> é partilhado por todos os nós do cluster, pelo que uma conta adicionada num nó é utilizada em todos. A cópia do host inclui o ficheiro e a desinstalação do ProxMenux remove-o de todos os nós."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "limits",
|
||||
"title": "Definições que não são instaladas",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Um Dockerfile sem imagem publicada: primeiro é necessário construir a imagem e publicá-la num registo OCI.",
|
||||
"Um ficheiro Compose com vários serviços: é bloqueado porque esta opção instala um único serviço por contentor, mesmo que vários serviços utilizem a mesma imagem.",
|
||||
"<code>configs</code>, segredos externos ou formatos de dispositivo que não possam ser adaptados sem ambiguidade.",
|
||||
"Substituições de shell como <code>$(command)</code>: é necessário escrever diretamente o valor resultante.",
|
||||
"Opções <code>docker run</code> não reconhecidas e <code>--env-file</code>: utilize antes um ficheiro Compose com valores explícitos."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,392 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Dispositivos e aceleração ProxMenux",
|
||||
"description": "Como o OCI Manager Apps passa GPU, NVIDIA, Coral, USB, FUSE e outros dispositivos para um recipiente OCI como recursos Proxmox VE nativos validados."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dispositivos e aceleração",
|
||||
"description": "GPU, NVIDIA, Coral, USB, FUSE e dispositivos de bloco tornam-se os recursos de Proxmox VE nativos validados do recipiente.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "principle",
|
||||
"title": "O dispositivo de que a aplicação necessita, não a máquina inteira",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Um dispositivo solicitado pelo arquivo Compose ou pelo perfil da aplicação torna-se uma entrada de <code>devN</code> ou uma montagem LXC. Pedir um GPU, um dispositivo USB ou um Coral não torna o recipiente privilegiado."
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Inventário da máquina",
|
||||
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux",
|
||||
"detail": "fornecedor e\npermissões verificadas"
|
||||
},
|
||||
{
|
||||
"label": "LXC",
|
||||
"detail": "mesmo dispositivo\nGID efetivo"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "origin",
|
||||
"title": "De onde vem o pedido do dispositivo",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Origem",
|
||||
"O que é lido",
|
||||
"O que o instalador faz"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Docker Compose",
|
||||
"Pedidos de <code>devices</code>, <code>group_add</code>, <code>deploy.resources</code> e NVIDIA",
|
||||
"Cada requisito torna-se um pedido de dispositivo mostrado para revisão"
|
||||
],
|
||||
[
|
||||
"Perfil do catálogo",
|
||||
"O suporte que o aplicativo realmente tem para GPU, Coral, OpenCL, USB ou FUSE",
|
||||
"Apenas são oferecidas as opções validadas para essa imagem"
|
||||
],
|
||||
[
|
||||
"Metadados e documentação da imagem",
|
||||
"VA-API, Selkies, LinuxServer mods ou o tempo de execução NVIDIA",
|
||||
"As variáveis documentadas e preparação são adicionadas"
|
||||
],
|
||||
[
|
||||
"Seleção do usuário",
|
||||
"Apenas CPU, Intel/AMD, OpenCL, NVIDIA ou um dispositivo opcional",
|
||||
"A seleção é armazenada no contrato de instância"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Os dispositivos detectados não são anexados automaticamente",
|
||||
"body": "O host é inventariado, mas apenas dispositivos declarados pelo arquivo Compose ou por um perfil compatível são oferecidos e anexados. Um GPU, dongle USB ou Coral presente no host não é exposto a cada LXC."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "identify",
|
||||
"title": "Como o dispositivo da máquina é identificado",
|
||||
"intro": "Antes de o LXC ser modificado, o dispositivo é lido no host e corresponde ao perfil escolhido.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Tipo",
|
||||
"Identidade",
|
||||
"Validação"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Intel/AMD DRM",
|
||||
"<code>/dev/dri/renderD*</code> e <code>/sys/class/drm/NODE/device/vendor</code>",
|
||||
"Um dispositivo de caracteres com o fornecedor <code>0x8086</code> (Intel) ou <code>0x1002</code> (AMD)"
|
||||
],
|
||||
[
|
||||
"AMD OpenCL",
|
||||
"O nó de renderização, mais <code>/dev/kfd</code> quando o perfil precisa dele",
|
||||
"Existência, tipo, fornecedor, permissões e compatibilidade declarada"
|
||||
],
|
||||
[
|
||||
"AMD ROCm",
|
||||
"O nó de renderização, <code>/dev/kfd</code> e a geração que o controlador de computação relata em <code>/sys/class/kfd/kfd/topology/nodes/*/properties</code>",
|
||||
"Uma geração para a qual a imagem ROCm do aplicativo inclui kernels de computação — as GPUs RDNA2 citadas e as mais recentes — é oferecida sem adaptação. As outras GPUs dessas famílias, como Radeon 680M e 780M, são oferecidas como experimentais e nunca são a opção sugerida: o ROCm não as suporta oficialmente, o aplicativo as apresenta como a geração de sua família (<code>HSA_OVERRIDE_GFX_VERSION</code>) e o instalador pede confirmação antes de baixar a imagem maior. Uma GPU mais antiga, como a integrada de um Ryzen 5000U, não é oferecida e o Immich mantém o reconhecimento na CPU."
|
||||
],
|
||||
[
|
||||
"NVIDIA",
|
||||
"<code>nvidia-smi</code> e <code>nvidia-container-cli</code>",
|
||||
"GPU, UUID, PCI bus, versão driver, Toolkit, <code>/dev/nvidia*</code> nós, binários e bibliotecas"
|
||||
],
|
||||
[
|
||||
"Coral PCIe/M.2",
|
||||
"<code>/dev/apex_N</code> e sua ligação em <code>/sys/dev/char/MAJOR:MINOR</code>",
|
||||
"Nó de caracteres, major/menor, proprietário, GID e permissões"
|
||||
],
|
||||
[
|
||||
"USB e serial",
|
||||
"<code>/dev/ttyUSB*</code>, <code>/dev/ttyACM*</code> ou <code>/dev/bus/usb/BBB/DDD</code>",
|
||||
"Nó de caracteres; para USB também fornecedor, produto e série quando sysfs publica-los"
|
||||
],
|
||||
[
|
||||
"KVM, TUN, FUSE, vídeo e SCSI genérico",
|
||||
"<code>/dev/kvm</code>, <code>/dev/net/tun</code>, <code>/dev/fuse</code>, <code>/dev/videoN</code> ou <code>/dev/sgN</code>",
|
||||
"Caminho suportado, tipo de nó e permissões efetivas"
|
||||
],
|
||||
[
|
||||
"Unidade óptica",
|
||||
"<code>/dev/srN</code>",
|
||||
"Um dispositivo de bloco"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "install",
|
||||
"title": "O que acontece durante a instalação",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "O modelo oferece seus perfis",
|
||||
"body": "Por exemplo, CPU apenas, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL ou NVIDIA. As opções pertencem à imagem, não a um menu comum."
|
||||
},
|
||||
{
|
||||
"title": "Um perfil é escolhido",
|
||||
"body": "Ele define os nós do dispositivo, ambiente, mods ou tempo de execução que a aplicação precisa."
|
||||
},
|
||||
{
|
||||
"title": "É proposto um caminho",
|
||||
"body": "Para DRM, <code>/dev/dri/renderD128</code>, que pode ser alterado em um host com vários nós de renderização. Para USB ou serial, o nó específico é selecionado."
|
||||
},
|
||||
{
|
||||
"title": "Validação",
|
||||
"body": "Existência, tipo, fornecedor permitido, permissões e GID são verificados. Um desencontro impede a operação."
|
||||
},
|
||||
{
|
||||
"title": "O contrato está escrito",
|
||||
"body": "Caminho, modo, GID, acesso de escrita e perfil são gravados para atualizações e recriações."
|
||||
},
|
||||
{
|
||||
"title": "Anexar e testar",
|
||||
"body": "<code>pct set</code> adiciona a entrada <code>devN</code> e o acesso é então verificado dentro do LXC. As imagens LinuxServer também são verificadas como usuário <code>abc</code>."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "config",
|
||||
"title": "Como aparece na configuração LXC",
|
||||
"intro": "Valores ilustrativos: <code>dev0</code> e <code>dev1</code> são as atribuições de slots livres Proxmox VE, e <code>renderD128</code>, <code>apex_0</code> e o GID dependem do hardware do nó.",
|
||||
"blocks": [
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Intel/AMD VA-API",
|
||||
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "Coral PCIe/M.2",
|
||||
"code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "Um dispositivo USB específico",
|
||||
"code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0"
|
||||
},
|
||||
{
|
||||
"title": "AMD OpenCL",
|
||||
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O GID é lido com <code>stat</code> no host e escrito na entrada <code>devN</code>; os grupos <code>render</code> e <code>video</code> não são assumidos como tendo um número fixo. O dispositivo mantém o mesmo caminho <code>/dev</code> dentro do LXC, onde os próprios mecanismos da aplicação procuram por ele."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "profiles",
|
||||
"title": "Perfis que uma imagem pode oferecer",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Perfil",
|
||||
"Configuração resultante",
|
||||
"Oferecido quando"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Intel/AMD VA-API",
|
||||
"Nó de renderização <code>/dev/dri</code>",
|
||||
"O aplicativo suporta aceleração de vídeo"
|
||||
],
|
||||
[
|
||||
"OpenCL",
|
||||
"Nó de renderização, <code>/dev/kfd</code> quando necessário e o mod oficial",
|
||||
"A imagem ou perfil documenta- a"
|
||||
],
|
||||
[
|
||||
"NVIDIA",
|
||||
"Dispositivos de driver e bibliotecas da máquina",
|
||||
"O host tem um driver funcionando e o NVIDIA Container Toolkit"
|
||||
],
|
||||
[
|
||||
"Coral",
|
||||
"<code>/dev/apex_0</code> ou o barramento USB",
|
||||
"O perfil declara suporte ao Coral (Frigate)"
|
||||
],
|
||||
[
|
||||
"USB, série, FUSE",
|
||||
"Um único dispositivo, uma árvore validada ou uma funcionalidade LXC",
|
||||
"O contrato pede-o."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "nvidia",
|
||||
"title": "NVIDIA",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Requisito do nó: NVIDIA Container Toolkit",
|
||||
"body": "Um driver funcional em Proxmox VE não é suficiente para dar um NVIDIA GPU a uma imagem OCI. O OCI Manager Apps usa <code>nvidia-container-cli</code>, do NVIDIA Container Toolkit, para identificar os dispositivos e obter os binários e bibliotecas que correspondem ao driver carregado."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O <nvidiaLink>ProxMenux NVIDIA instalador</nvidiaLink> instala o NVIDIA Container Toolkit do repositório oficial NVIDIA juntamente com o driver. Ele verifica seus quatro pacotes, valida o <code>nvidia-container-cli</code> e registra o resultado na registro de alterações do <auditLink>Audit & Report</auditLink>."
|
||||
},
|
||||
{
|
||||
"p": "Estes dois comandos na máquina mostram se o driver e o Toolkit estão disponíveis:"
|
||||
},
|
||||
{
|
||||
"shell": {
|
||||
"code": "nvidia-smi -L\nnvidia-container-cli --version"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Em uma máquina onde o driver foi instalado por outros meios, o Toolkit é instalado a partir do repositório estável oficial:"
|
||||
},
|
||||
{
|
||||
"shell": {
|
||||
"code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O inventário que o OCI manager Apps usa é a saída de:"
|
||||
},
|
||||
{
|
||||
"shell": {
|
||||
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "A configuração do tempo de execução do Docker não está envolvida",
|
||||
"body": "Os contêineres são LXC nativos e não usam daemon Docker, portanto <code>nvidia-ctk runtime configure --runtime=docker</code> não faz parte do processo: o ProxMenux consulta <code>nvidia-container-cli</code> diretamente e configura os dispositivos e montagens LXC. Os comandos e as plataformas suportadas são mantidos no <toolkitLink>guia de instalação do NVIDIA Container Toolkit</toolkitLink>."
|
||||
}
|
||||
},
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "cpu",
|
||||
"title": "Inventário do driver",
|
||||
"body": "<code>nvidia-container-cli</code> lista os nós do dispositivo, binários, firmware e bibliotecas do driver instalado."
|
||||
},
|
||||
{
|
||||
"icon": "refresh",
|
||||
"title": "Nenhuma versão fixa",
|
||||
"body": "O modelo não nomeia arquivos de bibliotecas. O perfil é gerado a partir da máquina atual."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Montagens somente de leitura",
|
||||
"body": "As bibliotecas host são montadas somente para leitura em vez de serem copiadas para o recipiente."
|
||||
},
|
||||
{
|
||||
"icon": "hardDrive",
|
||||
"title": "Alterações do driver",
|
||||
"body": "Após uma mudança de driver, o inventário é gerado novamente antes do início dos LXCs afetados."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"code": {
|
||||
"title": "Resultado NVIDIA (simplificado)",
|
||||
"code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Passar apenas <code>/dev/nvidia0</code> não é suficiente. Os componentes de espaço de usuário do driver carregado são montados somente de leitura, e <code>nvidia-smi</code> então é executado dentro do LXC para comparar GPU, UUID, PCI bus e versão com o inventário host."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "usb",
|
||||
"title": "Coral USB, serial e USB",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Numeração USB pode mudar",
|
||||
"body": "Um caminho como o <code>/dev/bus/usb/003/004</code> pode mudar quando o dispositivo é reconectado ou a máquina reinicia. O perfil registra fornecedor, produto e série quando estão disponíveis, mas um novo endereço de barramento não é remapeado automaticamente."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Um periférico é dado pelo seu nó específico: <code>/dev/ttyUSB0</code>, <code>/dev/ttyACM0</code>, <code>/dev/apex_0</code> ou <code>/dev/bus/usb/BBB/DDD</code>. Não é aceite passar todo o <code>/dev</code>. O Coral é oferecido apenas para aplicações cujo perfil o declara."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "trees",
|
||||
"title": "Árvores de dispositivos e recursos LXC",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Pedido",
|
||||
"Configuração resultante",
|
||||
"Escopo"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"<code>/dev/dvb</code>, <code>/dev/snd</code> ou <code>/dev/bus/usb</code>",
|
||||
"Cada nó de caracteres da árvore recebe sua própria entrada <code>devN</code> com o modo host e GID",
|
||||
"Apenas a árvore solicitada, e não o resto do <code>/dev</code>"
|
||||
],
|
||||
[
|
||||
"<code>/dev/fuse</code>",
|
||||
"O nó e, quando o perfil precisa dele, o recurso <code>fuse=1</code>",
|
||||
"O FUSE sozinho não publica montagens para outros LXCs"
|
||||
],
|
||||
[
|
||||
"<code>/dev/net/tun</code>",
|
||||
"Uma entrada <code>devN</code> no mesmo caminho dentro do LXC",
|
||||
"A configuração VPN ou rede permanece na aplicação"
|
||||
],
|
||||
[
|
||||
"<code>/dev/kvm</code>",
|
||||
"Uma entrada <code>devN</code> validada",
|
||||
"Oferecido apenas quando o contrato o solicitar"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "security",
|
||||
"title": "Confirmações por nível de risco",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Dispositivos específicos, privilégio opcional, privilégio exigido, relaxamento AppArmor ou seccomp e acesso ao espaço de nomes PID do hospedeiro são tratados como casos separados, não sob uma etiqueta genérica privilegiada. Cada opção com risco é explicada e confirmada durante a instalação."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "OCI manager Apps | ProxMenux",
|
||||
"description": "Execute imagens OCI oficiais como contentores LXC nativos do Proxmox VE, com dados persistentes, acesso a dispositivos, aplicações com vários contentores e atualizações transacionais."
|
||||
},
|
||||
"header": {
|
||||
"title": "OCI manager Apps",
|
||||
"description": "As imagens OCI oficiais são executadas como contentores LXC nativos do Proxmox VE. A imagem continua a ser a publicada pelo respetivo responsável; o ProxMenux reproduz o ambiente que o Docker Compose teria criado à sua volta.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "model",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Uma imagem OCI, um LXC nativo",
|
||||
"body": "O Docker Engine não é executado dentro dos contentores. O Proxmox VE importa o sistema de ficheiros da imagem e os seus metadados OCI. A aplicação passa a ser o processo principal de um LXC nativo, gerido com as mesmas ferramentas dos restantes contentores do nó."
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Origem",
|
||||
"detail": "Imagem OCI\nCompose e documentação"
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux",
|
||||
"detail": "Contrato JSON\nvalidação e planeamento"
|
||||
},
|
||||
{
|
||||
"label": "Proxmox VE",
|
||||
"detail": "LXC nativo\nvolumes e dispositivos"
|
||||
}
|
||||
],
|
||||
"caption": "É utilizada a aplicação original; o seu ambiente é descrito de forma declarativa e reproduzido."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "where",
|
||||
"title": "Onde encontrar",
|
||||
"intro": "No nó Proxmox, como root, abra <strong>OCI manager Apps (Technology Preview)</strong> no menu principal do ProxMenux. O primeiro ecrã apresenta:",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"<strong>Pesquisar aplicações</strong>: pesquisar por nome em todo o catálogo.",
|
||||
"<strong>Todas as aplicações</strong>: apresentar o catálogo completo e o número de aplicações.",
|
||||
"<strong>Gerir aplicações OCI instaladas</strong>: atualizar, modificar, remover ou recuperar as aplicações já instaladas.",
|
||||
"<strong>Contas de registos</strong>: gerir as contas utilizadas para instalar e atualizar imagens de registos privados.",
|
||||
"<strong>Instalar uma imagem fora do catálogo</strong>: adaptar um ficheiro Compose, um comando <code>docker run</code> ou uma referência de imagem.",
|
||||
"As categorias do catálogo, cada uma com o respetivo número de aplicações."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/main-menu.png",
|
||||
"alt": "Ecrã principal do OCI manager Apps com pesquisa, catálogo completo, gestão de aplicações, imagens fora do catálogo e categorias.",
|
||||
"caption": "Ecrã principal do OCI manager Apps."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Ao selecionar uma aplicação, são apresentadas a descrição, a imagem utilizada e duas opções de instalação. <strong>Instalar com as definições predefinidas</strong> pergunta apenas o essencial: armazenamento, localização dos dados, endereço e arranque. <strong>Instalar com as definições avançadas</strong> percorre todas as decisões por ordem: VMID e recursos, armazenamento de cada caminho, bridge de rede e dispositivos."
|
||||
},
|
||||
{
|
||||
"p": "As aplicações efetivamente testadas apresentam <strong>Verificado</strong> nesta vista e um ✓ nas listas, quer o teste tenha sido realizado no laboratório do ProxMenux quer pela comunidade."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "beta",
|
||||
"title": "Por que mantém a designação Technology Preview",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "O OCI manager Apps mantém a designação <strong>Technology Preview</strong> que o Proxmox VE atribui aos contentores de aplicações criados a partir de imagens OCI, cujo suporte foi introduzido no Proxmox VE 9.1. A designação refere-se à tecnologia em que o OCI manager Apps se baseia, não ao motor do ProxMenux: o comportamento destes contentores ainda pode mudar entre versões do Proxmox VE. Será mantida até que o Proxmox VE considere esse suporte estável."
|
||||
},
|
||||
{
|
||||
"p": "O motor do OCI manager Apps é testado no laboratório do ProxMenux: instalação, atualização, modificação, recriação, cópia de segurança, restauro, migração e watchdog. Cada aplicação é verificada separadamente. As que foram efetivamente testadas apresentam <strong>Verificado</strong> e um ✓ nas listas."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "translation",
|
||||
"title": "Como o Docker descreve os requisitos e como o OCI manager Apps os concretiza",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Requisito",
|
||||
"Como é expresso no Docker",
|
||||
"Como é concretizado pelo OCI manager Apps"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Executar a aplicação",
|
||||
"<code>image</code>, <code>entrypoint</code>, <code>command</code>",
|
||||
"O rootfs OCI e o processo principal do LXC"
|
||||
],
|
||||
[
|
||||
"Preservar a configuração",
|
||||
"<code>volumes: /config</code>",
|
||||
"Um volume persistente <code>mpN</code> incluído na cópia de segurança ou um diretório do host."
|
||||
],
|
||||
[
|
||||
"Disponibilizar o serviço",
|
||||
"<code>ports</code>",
|
||||
"Um endereço próprio para o LXC e o URL de acesso ao serviço."
|
||||
],
|
||||
[
|
||||
"Utilizar hardware",
|
||||
"<code>devices</code>, <code>group_add</code>",
|
||||
"Entradas <code>devN</code> com o GID efetivo do host e um perfil validado."
|
||||
],
|
||||
[
|
||||
"Ligar as dependências",
|
||||
"<code>networks</code>, <code>depends_on</code>",
|
||||
"Uma bridge de rede privada, endereços fixos, ordem de arranque e verificações de estado."
|
||||
],
|
||||
[
|
||||
"Atualizar",
|
||||
"Descarregar com <code>pull</code> e recriar",
|
||||
"Um novo rootfs com o mesmo contrato de persistência."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "kept",
|
||||
"title": "O que é preservado e o que muda",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Preservado",
|
||||
"body": "A imagem oficial, os caminhos internos, o ambiente, o processo de arranque e a documentação de utilização."
|
||||
},
|
||||
{
|
||||
"icon": "boxes",
|
||||
"title": "Adaptado",
|
||||
"body": "O ambiente de execução: rede, persistência, dispositivos, permissões e dependências utilizam os mecanismos LXC nativos do Proxmox VE."
|
||||
},
|
||||
{
|
||||
"icon": "shield",
|
||||
"title": "Sem equivalente",
|
||||
"body": "Uma opção Compose sem equivalente seguro é identificada como impedimento à instalação. Os modelos com impedimentos não são propostos para instalação e as opções sensíveis exigem confirmação durante o assistente."
|
||||
},
|
||||
{
|
||||
"icon": "refresh",
|
||||
"title": "Registado",
|
||||
"body": "O digest da imagem, os recursos, os caminhos, a rede, os dispositivos e a pertença a uma stack são guardados no contrato da instância. As atualizações e recriações reproduzem esse contrato."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "pages",
|
||||
"title": "Páginas desta secção",
|
||||
"blocks": [
|
||||
{
|
||||
"next": {
|
||||
"items": [
|
||||
{
|
||||
"label": "Como é adaptada uma imagem OCI",
|
||||
"href": "/docs/oci-manager/architecture",
|
||||
"tail": "Da imagem e do respetivo ficheiro Compose a um LXC nativo."
|
||||
},
|
||||
{
|
||||
"label": "Instalar uma imagem fora do catálogo",
|
||||
"href": "/docs/oci-manager/custom-image",
|
||||
"tail": "Um ficheiro Compose, um comando docker run ou uma referência de imagem."
|
||||
},
|
||||
{
|
||||
"label": "Dados, caminhos e rede",
|
||||
"href": "/docs/oci-manager/storage-network",
|
||||
"tail": "Volumes do contentor, diretórios do host, montagens com rclone e endereços."
|
||||
},
|
||||
{
|
||||
"label": "Dispositivos e aceleração",
|
||||
"href": "/docs/oci-manager/hardware",
|
||||
"tail": "GPU, NVIDIA, Coral, USB e outros dispositivos."
|
||||
},
|
||||
{
|
||||
"label": "Aplicações com vários contentores",
|
||||
"href": "/docs/oci-manager/stacks",
|
||||
"tail": "Aplicação, base de dados e cache em LXC coordenados."
|
||||
},
|
||||
{
|
||||
"label": "Instalar, atualizar e modificar",
|
||||
"href": "/docs/oci-manager/lifecycle",
|
||||
"tail": "O contrato da instância e as respetivas operações."
|
||||
},
|
||||
{
|
||||
"label": "No ProxMenux Monitor",
|
||||
"href": "/docs/oci-manager/monitor",
|
||||
"tail": "Versões, atualizações, saída da consola e terminal."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,499 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar, atualizar e modificar | ProxMenux",
|
||||
"description": "O contrato de instância de um contentor OCI e as operações que o utilizam: atualização, modificação, remoção, recuperação de uma operação interrompida e recuperação após um restauro neste ou noutro host."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar, atualizar e modificar",
|
||||
"description": "Cada instância mantém um contrato reprodutível, permitindo substituir o seu rootfs sem perder a configuração ou os dados persistentes.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "contract",
|
||||
"title": "O contrato de instância",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Após a instalação, a configuração efetiva é guardada em <code>/usr/local/share/proxmenux/oci/instances/VMID/oci-compose.json</code>. Não é uma cópia do ficheiro Compose original: é o contrato reprodutível do LXC existente neste host."
|
||||
},
|
||||
{
|
||||
"code": {
|
||||
"code": "instances/\n└── 105/\n └── oci-compose.json\n ├── image and resolved digest\n ├── resources and network\n ├── environment (secrets protected)\n ├── container disks and host directories\n ├── hardware profile and devices\n ├── console log and terminal mode\n └── stack membership and lifecycle"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Uma cópia do contrato fica dentro do contentor, em <code>/.proxmenux/oci-record.json</code>, e só pode ser lida pelo utilizador root do contentor. Assim, uma cópia de segurança do contentor inclui sempre o contrato que estava em vigor nesse momento. Uma segunda cópia é mantida em <code>/etc/pve/priv/proxmenux/oci</code>, partilhado por todos os nós do cluster e legível apenas por root do host. Ambas são escritas após cada instalação, atualização e alteração."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "manage",
|
||||
"title": "Gerenciar aplicativos OCI instalados",
|
||||
"intro": "Esta opção da tela principal lista as instâncias registradas com sua aplicação e imagem. Cada um é verificado em relação ao seu contrato antes de qualquer ação; um CT que já não corresponde ao seu registro não é modificado nem excluído. A mesma atualização e o mesmo editor são oferecidos na aba Atualizações do <monitorLink>ProxMenux Monitor</monitorLink>.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Opção",
|
||||
"O que muda",
|
||||
"O que é guardado"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Atualizar a imagem com a configuração salva",
|
||||
"O rootfs é substituído pela imagem que o canal salvo publica hoje",
|
||||
"Contrato, discos de contêiner, diretórios de host, rede e dispositivos"
|
||||
],
|
||||
[
|
||||
"Modificar: editar recursos, rede, caminhos e GPU",
|
||||
"O editor abre com o contrato atual; o CT é reconstruído com as alterações",
|
||||
"Os dados dos discos de contentores e pastas da máquina"
|
||||
],
|
||||
[
|
||||
"Watchdog: reinicie o aplicativo quando ele falhar",
|
||||
"Se o aplicativo é iniciado novamente quando ele pára por conta própria. Nada é reconstruído.",
|
||||
"Toda a instalação; somente a escolha é salva no contrato"
|
||||
],
|
||||
[
|
||||
"Remover: eliminar a aplicação e os seus contentores",
|
||||
"O LXC, ou cada membro de uma pilha, e seus contratos são excluídos",
|
||||
"Directórios da máquina, com o seu conteúdo"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Para uma aplicação com vários contentores, o menu oferece <strong>Atualizar todos os contentores da aplicação</strong>, <strong>Modificar caminhos e dispositivos adicionais</strong>, <strong>Recriar todos os contentores com a configuração guardada</strong>, o watchdog e a remoção. Modificar adiciona ou remove caminhos e dispositivos adicionais do contentor da aplicação sem recriar nada e, no Immich, altera o componente que executa o reconhecimento. Recriar reconstrói cada contentor a partir da imagem com que foi instalado, sem procurar uma mais recente."
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/manage-menu.png",
|
||||
"alt": "Lista de aplicativos OCI instalados e as opções de atualização, modificação e remoção",
|
||||
"caption": "Gerencie aplicativos OCI instalados."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "update",
|
||||
"title": "Uma atualização transacional",
|
||||
"blocks": [
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "sequenceDiagram\n participant U as {{user}}\n participant P as ProxMenux\n participant R as {{registry}}\n participant X as Proxmox VE\n U->>P: {{update}}\n P->>R: {{resolve}}\n R-->>P: digest\n P->>P: {{verify}}\n P->>X: {{backup}}\n P->>X: {{import}}\n P->>X: {{reapply}}\n X-->>P: healthcheck\n alt {{healthy}}\n P-->>U: {{commit}}\n else {{failure}}\n P->>X: Rollback\n P-->>U: {{restored}}\n end",
|
||||
"labels": {
|
||||
"user": "Usuário",
|
||||
"registry": "Registo de OCI",
|
||||
"update": "Atualizar instância",
|
||||
"resolve": "Resolver a etiqueta",
|
||||
"verify": "Verificar o arquivo e executar as verificações prévias",
|
||||
"backup": "Pare e faça backup do CT",
|
||||
"import": "Importar o novo rootfs",
|
||||
"reapply": "Aplicar o contrato novamente",
|
||||
"healthy": "íntegro",
|
||||
"failure": "falha",
|
||||
"commit": "Contrato publicado com o novo digest",
|
||||
"restored": "A instância anterior foi restaurada"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Quando o registro ainda serve o digest instalado, nada é baixado e a instância não é tocada.",
|
||||
"A nova imagem é verificada camada a camada antes de parar o CT. Uma transferência que chega danificada é repetida uma segunda vez; uma imagem já em cache que não passa na verificação é transferida novamente.",
|
||||
"As definições alteradas no Proxmox VE após a instalação (memória, swap, núcleos, limite e prioridade da CPU, arranque com o nó) são mantidas e incluídas no novo contrato.",
|
||||
"A interface LAN adicionada pela suite Arr e pelas aplicações com vários contentores (<code>net1</code>) e a ordem de arranque (<code>startup</code>) são repostas sem alterações no novo contentor.",
|
||||
"Qualquer outra diferença entre o CT e o seu contrato interrompe a atualização antes de parar o CT."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Antes",
|
||||
"detail": "rootfs A\n/config mp0\nDirectório da máquina /media"
|
||||
},
|
||||
{
|
||||
"label": "Atualizar",
|
||||
"detail": "substitui apenas\no rootfs"
|
||||
},
|
||||
{
|
||||
"label": "Após",
|
||||
"detail": "rootfs B\n/config mp0\nDirectório da máquina /media"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Antes de parar seja o que for, a operação verifica o espaço necessário para a cópia de segurança: os dados utilizados nos volumes incluídos, mais uma margem. A cópia é guardada junto ao registo da aplicação, no disco de sistema do host. Se não houver espaço suficiente, o menu pede outro armazenamento do host que aceite cópias de segurança. A cópia é criada aí e eliminada no fim da operação. A escolha fica guardada para essa aplicação, incluindo as atualizações agendadas. Se nenhum armazenamento tiver espaço suficiente, a operação é recusada e a aplicação fica como estava. O espaço necessário para a nova imagem também é verificado antes da transferência."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "recovery",
|
||||
"title": "Recuperar uma operação interrompida",
|
||||
"intro": "Uma atualização e uma mudança usam uma transação persistente. Se o processo, o terminal ou o nó são interrompidos após a parada do CT, a operação não é tomada como terminada.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Marcador pendente",
|
||||
"body": "Ao abrir Gerir aplicações OCI instaladas, o estado guardado mostra que a substituição nunca chegou a ser publicada."
|
||||
},
|
||||
{
|
||||
"title": "Ver o estado",
|
||||
"body": "Mostra a fase atingida sem alterar contentores ou dados."
|
||||
},
|
||||
{
|
||||
"title": "Recuperar a instalação anterior",
|
||||
"body": "Restaura a cópia de segurança nativa verificada, criada antes da substituição, e o contrato anterior."
|
||||
},
|
||||
{
|
||||
"title": "Pilha como unidade",
|
||||
"body": "Para um aplicativo multi-contentor, cada membro é recuperado do mesmo ponto de transação, não apenas o selecionado."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Os diretórios da máquina estão fora do rollback",
|
||||
"body": "A cópia de segurança abrange o rootfs e os discos do contentor nela incluídos. Um diretório do host não é reposto no estado anterior, pois outros LXC podem utilizar os seus dados."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "watchdog",
|
||||
"title": "Watchdog: reiniciar uma aplicação que pára",
|
||||
"intro": "O Proxmox não tem uma política de reinício: quando termina o processo de um contentor de aplicação, o contentor fica parado. Com o watchdog ativo, uma aplicação que para por si própria é iniciada novamente. Para uma aplicação OCI, faz o que <code>restart: unless-stopped</code> faz num ficheiro Compose.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"O que acontece?",
|
||||
"Com o watchdog ativo"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"O aplicativo trava ou seu processo termina",
|
||||
"O contentor é iniciado novamente em segundos"
|
||||
],
|
||||
[
|
||||
"É parado ou desligado do Proxmox, do Monitor ou com <code>pct</code>",
|
||||
"Fica parado até alguém o iniciar"
|
||||
],
|
||||
[
|
||||
"Um backup, uma migração ou uma operação ProxMenux está trabalhando nele",
|
||||
"Nada é feito até que isso acabe."
|
||||
],
|
||||
[
|
||||
"Já estava parado quando o host arrancou",
|
||||
"Fica parado; isso é determinado por <strong>Iniciar com o Proxmox</strong>"
|
||||
],
|
||||
[
|
||||
"Ele continua parando logo após começar",
|
||||
"Uma aplicação que volta a parar segundos depois de arrancar, ou que não arranca, tem cinco tentativas de início, com intervalos de 30 segundos, 1, 2 e 5 minutos. Depois fica parada e é enviada uma notificação"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O instalador faz esta pergunta nos dois modos de instalação e propõe o valor declarado na receita da aplicação. Mais tarde, a opção pode ser alterada em <strong>Gerir aplicações OCI instaladas</strong> ou no interruptor <strong>Watchdog</strong> do contentor em <monitorLink>ProxMenux Monitor</monitorLink>; aplica-se a todos os contentores de uma aplicação com vários contentores. Um único serviço do host, <code>proxmenux-oci-watchdog.service</code>, vigia todas as aplicações que o pediram; a sua instalação aparece no separador Alterações de Audit & Report."
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "O que a máquina não pode dizer",
|
||||
"body": "O código de saída da aplicação não chega ao host, pelo que uma saída normal e uma falha são indistinguíveis e ambas provocam um reinício, como <code>always</code> e <code>unless-stopped</code> no Docker. Uma paragem pedida fora do Proxmox, com <code>lxc-stop</code> ou <code>systemctl</code>, não deixa uma tarefa de paragem e é interpretada como uma paragem espontânea."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "restore",
|
||||
"title": "Backup, restauração e outra máquina",
|
||||
"intro": "Uma cópia de segurança feita com vzdump ou Proxmox Backup Server inclui o contentor, os discos do contentor selecionados para a cópia e a cópia do seu contrato. O que a instalação guarda no host não faz parte dela. <strong>Gerir aplicações OCI instaladas</strong> deteta contentores restaurados num host sem o respetivo contrato, após uma nova instalação do Proxmox ou noutro host, e oferece o novo registo.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Restaurar os contentores no Proxmox",
|
||||
"body": "A partir do armazenamento de cópias de segurança, com o ID original ou qualquer ID livre. Uma aplicação com vários contentores precisa de todos eles."
|
||||
},
|
||||
{
|
||||
"title": "Abrir Gerenciar aplicativos OCI instalados",
|
||||
"body": "Os contentores restaurados são listados e é oferecida a recuperação. O botão <strong>Recuperar</strong> do separador Atualizações de <monitorLink>ProxMenux Monitor</monitorLink> abre a mesma recuperação."
|
||||
},
|
||||
{
|
||||
"title": "Verificar antes de mudar",
|
||||
"body": "A recuperação verifica se o host tem tudo o que cada aplicação precisa. Uma aplicação que não possa ser recuperada por completo fica como estava, com indicação do motivo."
|
||||
},
|
||||
{
|
||||
"title": "Registar e iniciar",
|
||||
"body": "O contrato está registrado neste host e o que a instalação manteve nele é escrito novamente. Iniciar as aplicações é uma pergunta separada, respondida com Não quando os recipientes originais ainda estão em execução em outro host."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/restore-offer.png",
|
||||
"alt": "Diálogo que lista os contentores restaurados e oferece a sua recuperação",
|
||||
"caption": "A recuperação oferecida quando Gerenciar aplicativos OCI instalados abre."
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"O que o host guardava",
|
||||
"Após a recuperação"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Contrato de instância",
|
||||
"Registado a partir da cópia no contentor, verificada face à configuração restaurada pelo Proxmox"
|
||||
],
|
||||
[
|
||||
"Rede privada de uma aplicação multi-contentor",
|
||||
"Criado novamente com a mesma ponte e sub-rede; os endereços fixos dos contentores não mudam"
|
||||
],
|
||||
[
|
||||
"Ordem de arranque de uma aplicação com vários contentores",
|
||||
"O hookscript de dependências e o seu contrato são instalados novamente; os snippets são ativados no armazenamento <code>local</code> quando nenhum armazenamento os aceita"
|
||||
],
|
||||
[
|
||||
"Sysctls de rede e ficheiro de monitorização da máquina",
|
||||
"Escrito novamente em <code>/etc/pve/proxmenux</code>"
|
||||
],
|
||||
[
|
||||
"Ambiente de execução NVIDIA",
|
||||
"O hook de um contentor sem privilégios é instalado novamente. Um contentor privilegiado recebe os ficheiros do controlador deste host em vez dos do host de origem"
|
||||
],
|
||||
[
|
||||
"Montagem Rclone",
|
||||
"O hookscript e os programas que publicam a montagem são escritos novamente, com as mesmas vistas na máquina"
|
||||
],
|
||||
[
|
||||
"Regra da firewall do host para um monitor do host",
|
||||
"É pedida novamente, para a porta web e a sub-rede da bridge neste host"
|
||||
],
|
||||
[
|
||||
"<code>lost+found</code> de cada disco restaurado",
|
||||
"É removido quando está vazio; um restauro cria-o e algumas aplicações não arrancam se estiver presente nos seus dados"
|
||||
],
|
||||
[
|
||||
"Discos restaurados em outro armazenamento",
|
||||
"O contrato é atualizado para o armazenamento em que eles estão agora"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Um recipiente restaurado com outro ID mantém sua aplicação. O contrato, seu log de console, seus sysctls de rede, o hookscript de uma montagem Rclone e a ordem de início de uma aplicação multi-contentor são registrados com os IDs que os contêineres têm neste host."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"O que impede uma recuperação",
|
||||
"O que fazer"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Falta um contentor de uma aplicação com vários contentores",
|
||||
"Restaure-o também; o aplicativo é recuperado inteiro"
|
||||
],
|
||||
[
|
||||
"A sub- rede privada já é usada nesta máquina",
|
||||
"A recuperação é cancelada e nada é alterado: os endereços dos contentores são fixados e não são movidos para outra subrede"
|
||||
],
|
||||
[
|
||||
"Não existe uma pasta da máquina",
|
||||
"Montar ou criar com os seus dados; uma cópia de segurança do contentor não inclui pastas da máquina"
|
||||
],
|
||||
[
|
||||
"Não existe um dispositivo nesta máquina",
|
||||
"Ligue-o ou remova-o do contentor no Proxmox"
|
||||
],
|
||||
[
|
||||
"Um aplicativo com NVIDIA em uma máquina sem o driver",
|
||||
"Instale o controlador NVIDIA e o Container Toolkit"
|
||||
],
|
||||
[
|
||||
"O backup foi feito antes da cópia do contrato existir",
|
||||
"O recipiente permanece como um LXC normal e não é oferecido novamente"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Um contentor que volta",
|
||||
"body": "Um contentor restaurado sobre si próprio a partir de uma cópia de segurança anterior, reposto num snapshot ou devolvido de outro nó transporta o contrato do estado em que se encontra. Se for selecionado para uma operação e o seu contrato diferir do deste host, a operação não começa e é oferecida a recuperação do contentor."
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/restore-result.png",
|
||||
"alt": "Resultado da recuperação com a rede privada, a ordem de início e os contentores registados",
|
||||
"caption": "Resultado de uma recuperação, passo a passo."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "remove",
|
||||
"title": "Removendo uma aplicação OCI",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Antes da confirmação é criado um resumo da configuração real: os contentores removidos, os dados eliminados com eles, a rede privada libertada e os diretórios do host mantidos. A confirmação tem <strong>Não</strong> como resposta predefinida, pois os dados dos discos eliminados não podem ser recuperados depois."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Recurso",
|
||||
"Ao remover",
|
||||
"Justificação"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"rootfs e discos de contentores",
|
||||
"Removido",
|
||||
"Pertencem apenas ao recipiente."
|
||||
],
|
||||
[
|
||||
"Pasta da máquina",
|
||||
"Mantido, com o seu conteúdo",
|
||||
"Outras aplicações podem utilizá-lo"
|
||||
],
|
||||
[
|
||||
"Ficheiros do contentor no host",
|
||||
"Removido",
|
||||
"O registo da consola, os parâmetros sysctl de rede, o hookscript da montagem Rclone e o registo no separador App do ProxMenux Monitor não servem outros contentores"
|
||||
],
|
||||
[
|
||||
"Ficheiros partilhados por várias instalações",
|
||||
"Excluído com a última instalação que os usa",
|
||||
"O arquivo host-monitor e o hookscript de dependência de aplicativos multi-contentor"
|
||||
],
|
||||
[
|
||||
"Contrato de instância",
|
||||
"Excluído após uma remoção bem- sucedida",
|
||||
"Nenhum CT está mais associado a ele"
|
||||
],
|
||||
[
|
||||
"Ponte privada de uma pilha",
|
||||
"Libertada com a pilha",
|
||||
"Não tem mais membros para conectar"
|
||||
],
|
||||
[
|
||||
"Rede partilhada pela suite Arr",
|
||||
"Libertada com a última aplicação da suite",
|
||||
"Cada aplicação da suite é independente e é removida por conta própria"
|
||||
],
|
||||
[
|
||||
"Um único membro de uma pilha",
|
||||
"Não removido isoladamente",
|
||||
"O aplicativo inteiro é removido, então nenhuma pilha fica incompleta"
|
||||
],
|
||||
[
|
||||
"Um recipiente em outro nó do cluster",
|
||||
"Não removido",
|
||||
"Seus arquivos de registro e host estão no nó onde foi instalado: ele é removido lá, depois de migrar de volta"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/remove-summary.png",
|
||||
"alt": "Resumo de remoção com os recipientes, dados e diretórios do host afetados",
|
||||
"caption": "O resumo de remoção, construído a partir da configuração real."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "archives",
|
||||
"title": "Imagens transferidas e espaço da máquina",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "O arquivo OCI é usado para criar o rootfs; o CT em execução não o lê. Após uma instalação ou atualização, são listados os arquivos transferidos nessa operação, com o respetivo tamanho, e é oferecida a sua eliminação. Eliminá-los liberta espaço sem afetar o contentor ou os seus dados."
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "As atualizações não precisam do arquivo",
|
||||
"body": "Sem o arquivo, uma atualização resolve o canal salvo e baixa o novo digest. Com ele, um arquivo é reutilizado apenas quando sua referência e integridade correspondem ao que é solicitado."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "registry",
|
||||
"title": "Registo e limpeza",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Ao abrir <strong>Gerir aplicações OCI instaladas</strong>, são primeiro removidos os restos de contentores que não existem em nenhum nó do cluster: o registo guardado como histórico após a eliminação na interface do Proxmox e os ficheiros do host deixados por uma remoção. Um registo com uma operação incompleta é mantido, pois a sua cópia de segurança ainda pode ser necessária. Os volumes e diretórios do host nunca são eliminados por dedução."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "cluster",
|
||||
"title": "Em um cluster: migração e alta disponibilidade",
|
||||
"intro": "Um contentor OCI é um LXC normal do Proxmox: pode ser migrado ou gerido por HA como os restantes, com as mesmas limitações. O que precisa para arrancar é guardado onde todos os nós do cluster o encontram.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Parte",
|
||||
"Em outro nó do cluster"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Registo da consola",
|
||||
"O contentor cria <code>/var/log/proxmenux/oci</code> antes de arrancar, no nó que o executa. Cada nó mantém o registo dos arranques que executou."
|
||||
],
|
||||
[
|
||||
"Sysctls de rede e monitor host",
|
||||
"Mantido em <code>/etc/pve/proxmenux</code>, que cada nó do cluster compartilha, então um contêiner migrado os encontra."
|
||||
],
|
||||
[
|
||||
"Discos de contentores",
|
||||
"O Proxmox move-os com o contentor. O HA precisa dos dados disponíveis no nó de destino, através de armazenamento partilhado ou de uma configuração de replicação suportada."
|
||||
],
|
||||
[
|
||||
"Directórios e dispositivos da máquina",
|
||||
"As mesmas regras que qualquer LXC: um diretório host deve existir no nó alvo e ser marcado como compartilhado, e um GPU, Coral ou NPU deve estar presente lá."
|
||||
],
|
||||
[
|
||||
"Registo ProxMenux",
|
||||
"O contrato permanece no nó onde a aplicação foi instalada, e todos os nós leem a cópia mantida em <code>/etc/pve/priv/proxmenux/oci</code>. Uma aplicação com um só contentor que migra é registada no nó de destino ao abrir <strong>Gerir aplicações OCI instaladas</strong> ou ao iniciar uma operação para ela. Uma aplicação com vários contentores é oferecida para recuperação nesse nó, pois a sua rede privada tem de ser criada aí."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Não para alta disponibilidade",
|
||||
"body": "Uma aplicação multi-contentor atinge seus membros através de uma ponte privada do nó onde foi instalado, então seus membros permanecem nesse nó. Um monitor host, como o Glances no modo host ou o Netdata, monitora o nó em que ele é executado; movendo-o monitoraria outro nó."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Um backup restaurado fora do cluster recebe os arquivos de <code>/etc/pve/proxmenux</code> que o recipiente usa quando o aplicativo é recuperado."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "channel",
|
||||
"title": "Uma etiqueta rolling não é uma atualização sem supervisão",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "O catálogo instala a etiqueta rolling publicada pelo responsável, mas o digest efetivo é resolvido e registado e só muda através de uma atualização explícita, com verificações prévias e rollback. O <monitorLink>ProxMenux Monitor</monitorLink> compara o digest instalado com o publicado pelo registo e apresenta um aviso e uma notificação quando há uma nova imagem disponível."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Contêineres OCI no ProxMenux Monitor | ProxMenux",
|
||||
"description": "O que o ProxMenux Monitor mostra para um container instalado pelo OCI Manager Apps: versões de aplicativos e imagens, novas imagens, saída do console e o terminal Proxmox VE."
|
||||
},
|
||||
"header": {
|
||||
"title": "No ProxMenux Monitor",
|
||||
"description": "Um recipiente instalado pelo OCI Manager Apps aparece em VMs & LXCs como qualquer outro LXC. Seu modal lê o registro de instalação: versões de aplicação e imagem, novas imagens, saída de console e terminal.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "O registro é a fonte",
|
||||
"body": "O OCI Manager Apps sabe o que ele instalou e de onde veio. O Monitor lê esse registro de instalação em vez de sondar o recipiente, por isso os dados são os mesmos se o recipiente está em execução ou parado."
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Página",
|
||||
"O que muda para um recipiente OCI"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Estado",
|
||||
"Um interruptor <strong>Watchdog</strong> em Iniciar no arranque: o aplicativo é iniciado novamente quando pára por conta própria"
|
||||
],
|
||||
[
|
||||
"Aplicativo",
|
||||
"O aplicativo é identificado a partir do registro, e as atualizações são monitoradas pela imagem"
|
||||
],
|
||||
[
|
||||
"Atualizações",
|
||||
"A imagem é atualizada ou a aplicação modificada, com o mesmo fluxo que o menu OCI"
|
||||
],
|
||||
[
|
||||
"Montagens",
|
||||
"Discos de contentores e pastas de máquinas, com a sua utilização"
|
||||
],
|
||||
[
|
||||
"Registros",
|
||||
"Apenas para recipientes OCI: a saída do console da aplicação"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "app",
|
||||
"title": "Aplicativo",
|
||||
"intro": "A aba <appLink>App</appLink> oferece o aplicativo instalado como uma detecção, com o nome, logotipo, porta e esquema do registro. Registrando-o abre o editor com o método <strong>Imagem OCI (instalada por ProxMenux)</strong>, que não precisa de configuração.",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "boxes",
|
||||
"title": "Aplicação",
|
||||
"body": "A versão da aplicação dentro da imagem, lida a partir da imagem em si: o seu ambiente ou a sua etiqueta <code>org.opencontainers.image.version</code>. É informativo."
|
||||
},
|
||||
{
|
||||
"icon": "archive",
|
||||
"title": "Imagem",
|
||||
"body": "A data de compilação e o digest da imagem instalada. A atualização é decidida aqui: o digest instalado é comparado com o que o registro publica hoje para a mesma tag."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Quando o registro publica um novo digest, o cartão mostra <strong>Nova imagem</strong> com sua data e digest, mesmo que a versão do aplicativo dentro não mudou: uma reconstrução em uma base atualizada é uma atualização.",
|
||||
"Quando os digests coincidem, o cartão mostra <strong>Versão</strong>.",
|
||||
"O cartão faz links para o repositório da imagem: seu projeto GitHub, ou sua página Docker Hub para uma imagem oficial.",
|
||||
"O link de acesso usa o endereço LAN do recipiente, também para o principal membro de um aplicativo multi-contentor, que tem um segundo endereço em sua rede privada.",
|
||||
"O botão <strong>Atualizar dados</strong> lê novamente o registro de instalação e o registro de imagens. Não são oferecidas opções para procurar ou registrar outro aplicativo: o contêiner contém exatamente o aplicativo de seu registro."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/monitor-app-tab.png",
|
||||
"alt": "Página de aplicação de um contentor OCI com a versão da aplicação, a imagem e o link do repositório",
|
||||
"caption": "Página da aplicação de um recipiente instalado pelo OCI Manager Apps."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "A verificação é executada uma vez por dia com as verificações de atualização do Monitor e o <strong>Atualizar dados</strong> a executa imediatamente. Uma nova imagem é enviada como uma notificação através dos canais configurados em <notificationsLink>Notificações</notificationsLink>. A atualização é aplicada na aba Atualizações."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "updates",
|
||||
"title": "Atualizações",
|
||||
"intro": "Para um contêiner instalado pelo OCI Manager Apps a aba Atualizações mostra o aplicativo com sua imagem instalada e, quando o registro publica uma, a nova imagem, no mesmo formato que qualquer outra aplicação. Os atualizadores de pacotes e aplicativos de um LXC comum não aparecem.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Botão",
|
||||
"O que abre"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Atualizar",
|
||||
"A atualização de <lifecycleLink>Gerenciar aplicativos OCI instalados</lifecycleLink> para este contêiner, no terminal do Monitor. Pode ser executada com ou sem uma nova imagem; sem imagem nova, nada muda. Em um aplicativo com vários contêineres, atualiza todos os membros."
|
||||
],
|
||||
[
|
||||
"Modificar",
|
||||
"O editor da aplicação (recursos, rede, caminhos e GPU). Em uma aplicação multi-contentor adiciona ou remove os caminhos e dispositivos extras do recipiente de aplicação e, em Immich, altera o que executa o reconhecimento."
|
||||
],
|
||||
[
|
||||
"Recuperar",
|
||||
"Substitui a atualização quando uma operação no recipiente foi interrompida e abre sua recuperação."
|
||||
],
|
||||
[
|
||||
"Recuperar (contêiner restaurado)",
|
||||
"Exibido para um contêiner restaurado de backup que não tem contrato neste host, em <strong>Aplicativo OCI restaurado</strong>. Abre a <lifecycleLink>recuperação</lifecycleLink> no terminal do Monitor; Atualizar e Modificar aparecem após o registro."
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Alterações externas, diretórios host e aplicativos multi-contentores são tratados como no menu OCI. Em uma aplicação multi-contentor, os botões e as opções aparecem apenas no recipiente principal; os outros membros mostram sua imagem, uma nota de que eles são atualizados do recipiente principal e um botão que a abre. Quando o terminal fecha, a imagem, o registro e as montagens são lidos novamente."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Opção",
|
||||
"Comportamento"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Manter o backup feito antes da atualização",
|
||||
"Cada atualização faz backup do recipiente para restaurá-lo se a atualização falhar. Com esta opção, o mesmo backup é mantido no armazenamento escolhido e aparece entre os backups do CT; em Proxmox Backup Server um backup é escrito antes da atualização."
|
||||
],
|
||||
[
|
||||
"Atualizações agendadas",
|
||||
"A imagem é atualizada no horário escolhido somente se o registro publicar uma nova, com a opção de esperar que ela tenha 1, 3, 7 ou 14 dias. Um contêiner com alterações feitas fora do ProxMenux é ignorado e reportado."
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "logs",
|
||||
"title": "Registros",
|
||||
"intro": "A guia Logs aparece apenas para recipientes instalados pelo OCI Manager Apps, entre Mounts e Backups. Ele mostra a saída padrão e erro do processo principal da imagem, a mesma saída <code>docker logs</code> mostra para um recipiente Docker.",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"A saída é mantida no host em <code>/var/log/proxmenux/oci/VMID.console.log</code> (modo 0600), desde o primeiro início e através de reinícios, para que possa ser lido com o recipiente parado.",
|
||||
"O arquivo é rodado em 10 MB, mantendo três cópias comprimidas (<code>/etc/logrotate.d/proxmenux-oci</code>).",
|
||||
"Cada início do recipiente é marcado na saída. A aba mostra a saída desde o último início por padrão; <strong>Histórico completo</strong> também mostra as anteriores.",
|
||||
"Quando o aplicativo é removido, sua saída é removida com ele.",
|
||||
"São exibidas as últimas 100, 500 ou 1000 linhas. Enquanto o contêiner está em execução, as novas linhas são acompanhadas ao vivo; rolar para cima pausa o acompanhamento e <strong>Acompanhar</strong> o retoma.",
|
||||
"Um filtro mostra apenas as linhas que contêm um texto, e <strong>Baixar</strong> salva as linhas carregadas.",
|
||||
"Os códigos de cores são removidos e uma linha que uma barra de progresso redesenha é mostrada em seu estado final.",
|
||||
"A aba lê o arquivo a cada abertura, sem usar uma cópia em cache."
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Credenciais de primeiro início",
|
||||
"body": "Imagens que imprimem uma senha gerada em seu primeiro início deixam-na nesta saída, como <code>docker logs</code> faz. O instalador lê-o de lá para o mostrar em seu resumo."
|
||||
}
|
||||
},
|
||||
{
|
||||
"figure": {
|
||||
"src": "/oci-manager/monitor-logs-tab.png",
|
||||
"alt": "Aba Logs com a saída do console de um contêiner OCI, seletor de linhas, filtro e botão de acompanhamento",
|
||||
"caption": "Saída do console de um recipiente OCI."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "terminal",
|
||||
"title": "Consola Proxmox VE",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Uma imagem OCI executa seu próprio processo como PID 1 e nenhum serviço de login, então o console padrão de um LXC abriria um terminal onde nada responde. Containers instalados pelo OCI Manager Apps são criados com <code>cmode: shell</code>: o console Proxmox VE abre uma shell com <code>lxc-attach</code>, o equivalente a <code>docker exec</code>, com a aplicação em execução intocada."
|
||||
},
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"O shell é o que <code>/etc/passwd</code> atribui ao root na imagem. Se root não tiver shell ou a imagem não incluir nenhum, o console padrão será mantido.",
|
||||
"O shell é root dentro do recipiente, sem senha. Quem pode abri-lo é decidido pela permissão <code>VM.Console</code> de Proxmox VE.",
|
||||
"O terminal do Monitor entra no recipiente com <code>pct enter</code>, que funciona da mesma forma."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "mounts",
|
||||
"title": "Montagens",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "A aba <mountsLink>Montagens</mountsLink> lista os discos do contêiner e seus diretórios do host. O uso de um disco em armazenamento de blocos, como LVM-thin, é lido do sistema de arquivos desse disco, montado apenas dentro do contêiner."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,404 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Aplicações multi-contêineres ProxMenux",
|
||||
"description": "Como o OCI Manager Apps transforma um aplicativo com seu banco de dados e cache em LXCs nativos coordenados: plano, rede privada, gancho de dependência, validação e atualizações transacionais."
|
||||
},
|
||||
"header": {
|
||||
"title": "Aplicações com vários contentores",
|
||||
"description": "Uma aplicação com seu banco de dados, cache e outros serviços torna-se vários LXCs nativos coordenados, instalados e atualizados como um.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Um aplicativo para o usuário, vários LXCs para Proxmox VE",
|
||||
"body": "Uma definição multi-contentor é uma entrada do catálogo. O instalador cria um LXC nativo por serviço e mantém suas dependências explícitas. Immich, Nextcloud, Paperless-ngx e Tandoor são instalados desta forma."
|
||||
}
|
||||
},
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart LR\n C[\"Docker Compose\"] --> O[\"{{plan}}\"]\n O --> A[\"{{app}}<br/>{{appNet}}\"]\n O --> D[\"{{db}}<br/>{{private}}\"]\n O --> R[\"{{cache}}<br/>{{private}}\"]\n V1[(\"config\")] --> A\n V2[(\"database\")] --> D\n V3[(\"cache\")] --> R\n D --> A\n R --> A",
|
||||
"labels": {
|
||||
"plan": "Plano de pilha",
|
||||
"app": "Aplicação LXC",
|
||||
"appNet": "LAN + privado",
|
||||
"db": "PostgreSQL LXC",
|
||||
"cache": "Valkey LXC",
|
||||
"private": "privado"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "plan",
|
||||
"title": "1. O plano, antes de existir qualquer recipiente",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Nenhum LXC é criado enquanto a definição Compose é interpretada. Um plano completo vem em primeiro lugar, com cada membro, imagem, VMID, rede, caminho, segredo, ordem e verificação de saúde. Se o plano não for consistente, a instalação não começa."
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Elemento do plano",
|
||||
"Conteúdo",
|
||||
"Verificado antes de criar qualquer coisa"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Membros",
|
||||
"Aplicação principal, banco de dados, cache, aprendizado de máquina e outras dependências",
|
||||
"VMIDs exclusivos, papéis conhecidos e exatamente um membro principal"
|
||||
],
|
||||
[
|
||||
"Imagens",
|
||||
"Referência rolling, arquitetura e digest resolvido de cada serviço",
|
||||
"Todos existem, suportam a arquitetura e passam pela verificação de integridade do OCI"
|
||||
],
|
||||
[
|
||||
"Rede",
|
||||
"Ponte privada, sub-rede, endereço fixo por serviço e acesso LAN para o membro principal",
|
||||
"Sem colisão com pontes ou subredes existentes e sem endereço repetido"
|
||||
],
|
||||
[
|
||||
"Persistência",
|
||||
"Discos de container, diretórios de host, proprietários e backup",
|
||||
"Nenhum caminho sobreposto, armazenamento disponível e permissões declaradas"
|
||||
],
|
||||
[
|
||||
"Segredos",
|
||||
"Senha do banco de dados, chaves do aplicativo e credenciais iniciais",
|
||||
"Gerado uma vez e dado apenas aos membros que os usam"
|
||||
],
|
||||
[
|
||||
"Ciclo de vida",
|
||||
"Ordem de início, ordem de parada e uma verificação de funcionamento por membro",
|
||||
"A aplicação principal começa por último e pára primeiro"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "create",
|
||||
"title": "2. Criação, membro por membro",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Reserve cada VMID",
|
||||
"body": "O inventário Proxmox VE e o registro de instância são verificados. Um CT existente não é adotado e um contrato que ainda pertence a outra instância não é reutilizado."
|
||||
},
|
||||
{
|
||||
"title": "Preparar cada imagem",
|
||||
"body": "Todas as imagens são resolvidas, baixadas e verificadas antes da criação do primeiro container."
|
||||
},
|
||||
{
|
||||
"title": "Criar cada rootfs",
|
||||
"body": "Os metadados oficiais do OCI são importados, e a identidade da instância ProxMenux e o papel de membro são adicionados."
|
||||
},
|
||||
{
|
||||
"title": "Rede privada",
|
||||
"body": "Uma ponte e uma sub-rede são criadas e cada membro recebe seu endereço fixo; apenas o membro principal também recebe a interface LAN."
|
||||
},
|
||||
{
|
||||
"title": "Persistência",
|
||||
"body": "Cada banco de dados e configuração obtém seu próprio disco de contêiner; somente os dados destinados a serem compartilhados usam diretórios de host."
|
||||
},
|
||||
{
|
||||
"title": "Ambiente",
|
||||
"body": "Endpoints internos, segredos compartilhados e variáveis de serviço são escritos. O aplicativo atinge suas dependências em seus endereços privados reservados."
|
||||
},
|
||||
{
|
||||
"title": "Registro",
|
||||
"body": "Cada membro registra sua configuração nativa, as mudanças rootfs que as atualizações têm que reproduzir e sua relação com a pilha."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "checks",
|
||||
"title": "3. Iniciar e verificar cada recipiente",
|
||||
"intro": "Um LXC criado não significa um serviço pronto. As dependências começam em ordem e cada um passa uma verificação específica para o seu serviço.",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Serviço",
|
||||
"Verificação",
|
||||
"O que mostra"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"PostgreSQL",
|
||||
"<code>pg_isready</code> no CT com o host, usuário e banco de dados esperados",
|
||||
"O servidor aceita conexões para o banco de dados configurado"
|
||||
],
|
||||
[
|
||||
"Redis / Valkey",
|
||||
"<code>redis-cli</code> ou <code>valkey-cli</code> <code>PING</code> contra o seu endereço privado",
|
||||
"O broker escuta e responde"
|
||||
],
|
||||
[
|
||||
"aprendizado de máquina Immich",
|
||||
"HTTP <code>GET /ping</code>, mais uma verificação do tempo de execução GPU selecionado",
|
||||
"O serviço responde e a aceleração solicitada não passou a usar a CPU"
|
||||
],
|
||||
[
|
||||
"Nextcloud",
|
||||
"<code>GET /status.php</code> com <code>installed=true</code>, <code>maintenance=false</code> e <code>needsDbUpgrade=false</code>",
|
||||
"A inicialização terminou sem migração pendente"
|
||||
],
|
||||
[
|
||||
"Paperless-ngx / Tandoor",
|
||||
"HTTP no endereço LAN e porto real do serviço",
|
||||
"O frontend e suas dependências servem a aplicação"
|
||||
],
|
||||
[
|
||||
"Aplicação principal",
|
||||
"O ponto final do seu modelo, por exemplo, <code>/api/server/ping</code> em Immich",
|
||||
"A pilha inteira funciona através da aplicação que usa as dependências"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Em execução não significa funcionando corretamente",
|
||||
"body": "O estado em execução apenas diz que o processo LXC existe. Quando o serviço oferece uma verificação melhor, é utilizado uma verificação exec ou HTTP com tempo limite. Se um membro para ou falha na verificação, a pilha não é declarada instalada."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "hook",
|
||||
"title": "4. O gancho de dependência",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "O gancho é definido apenas no recipiente principal de uma pilha dependente. Proxmox VE mantém o script como um trecho e o executa como o <code>hookscript</code> daquele CT. A receita da pilha não é escrita no script: ela vive em um contrato privado separado."
|
||||
},
|
||||
{
|
||||
"codeGrid": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Configuração principal do CT",
|
||||
"code": "hookscript: local:snippets/proxmenux-stack-dependencies.sh"
|
||||
},
|
||||
{
|
||||
"title": "Contrato privado (exemplo)",
|
||||
"code": "/etc/pve/priv/proxmenux-stack-VMID.json\n{\n \"schema\": 1,\n \"stack\": \"immich\",\n \"dependencies\": [\n {\"vmid\": 107, \"label\": \"PostgreSQL\", \"healthcheck\": {...}},\n {\"vmid\": 108, \"label\": \"Valkey\", \"healthcheck\": {...}},\n {\"vmid\": 106, \"label\": \"Machine Learning\", \"healthcheck\": {...}}\n ]\n}"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"snippet": {
|
||||
"summary": "Fonte completa de proxmenux-stack-dependencies.sh",
|
||||
"pathCode": "local:snippets/proxmenux-stack-dependencies.sh",
|
||||
"snippetCode": "stackDependencyHook"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O script é o mesmo para cada pilha. VMIDs, nomes, tipos de verificação e timeouts vêm do contrato privado <code>/etc/pve/priv/proxmenux-stack-VMID.json</code> de cada pilha."
|
||||
},
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "O Proxmox VE chama pre-start",
|
||||
"body": "Antes do início do CT principal, o gancho funciona com o seu VMID e a fase do ciclo de vida."
|
||||
},
|
||||
{
|
||||
"title": "Um bloqueio por pilha",
|
||||
"body": "<code>flock</code> em <code>/run/lock/proxmenux-stack-VMID.lock</code> impede duas sequências de início ao mesmo tempo."
|
||||
},
|
||||
{
|
||||
"title": "O contrato é lido e validado",
|
||||
"body": "São exigidos um esquema conhecido, dependências numéricas, rótulos, uma verificação exec, http ou running e um tempo limite positivo."
|
||||
},
|
||||
{
|
||||
"title": "Dependências em ordem",
|
||||
"body": "Cada CT deve existir; um parado é iniciado e um já em execução não é reiniciado."
|
||||
},
|
||||
{
|
||||
"title": "Esperar o serviço ficar pronto",
|
||||
"body": "A verificação é executada a cada dois segundos, e o CT também é confirmado para estar ainda em execução."
|
||||
},
|
||||
{
|
||||
"title": "O CT principal começa",
|
||||
"body": "Quando cada dependência está pronta, termina pré-inicial e o Proxmox VE inicia a aplicação."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "O gancho não para dependências",
|
||||
"body": "As fases pós-início, pré-parar e pós-parar não fazem nada. Parar o CT principal deixa PostgreSQL, Redis, Valkey ou aprendizado de máquina em execução. O gancho ordena o início; ele não transforma vários LXCs em um processo."
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Tipo",
|
||||
"Exemplo",
|
||||
"Início posterior"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Pilha dependente",
|
||||
"Immich, Nextcloud, aplicação com PostgreSQL",
|
||||
"O gancho do CT principal inicia as dependências e espera por eles"
|
||||
],
|
||||
[
|
||||
"Conjunto de aplicativos",
|
||||
"Conjunto de aplicações Arr",
|
||||
"Nenhum membro principal: cada LXC segue o seu próprio <code>onboot</code>"
|
||||
],
|
||||
[
|
||||
"Aplicação única",
|
||||
"Jellyfin",
|
||||
"Proxmox VE inicia esse LXC diretamente"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "stack-checks",
|
||||
"title": "5. Verifica a pilha como um todo",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Cada VMID existe, é único e mantém a identidade de instância esperada.",
|
||||
"Cada contrato pertence à mesma pilha, mantém seu papel e sua configuração nativa gravada.",
|
||||
"O membro principal é o último em <code>start_order</code> e o primeiro em <code>stop_order</code>.",
|
||||
"Nenhum membro, volume ou adaptação rootfs está faltando.",
|
||||
"O gancho aponta para o trecho oficial, seu conteúdo é inalterado e seu contrato corresponde à receita da pilha.",
|
||||
"As imagens e digests observados correspondem aos arquivos OCI preparados.",
|
||||
"Dispositivos, perfis GPU, montagens, segredos e endpoints ainda correspondem aos contratos.",
|
||||
"Após cada dependência passar, o ponto final da aplicação principal verifica a integração entre os membros."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "manage",
|
||||
"title": "Gerenciando uma pilha instalada",
|
||||
"intro": "Em <strong>Gerenciar aplicativos OCI instalados</strong>, qualquer membro leva à pilha inteira. O menu oferece <strong>Atualizar todos os contêineres do aplicativo</strong>, <strong>Modificar caminhos e dispositivos extras</strong>, <strong>Recriar todos os contêineres com a configuração salva</strong> e <strong>Remover: excluir o aplicativo e seus contêineres</strong>. Recriar reconstrói cada contêiner da imagem original pelo digest salvo, sem procurar uma mais nova, seguindo os mesmos passos de uma atualização. A opção aparece para pilhas que podem ser atualizadas.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Qualquer membro",
|
||||
"body": "O contrato dos membros nomeia o VMID principal e a lista completa de membros."
|
||||
},
|
||||
{
|
||||
"title": "A pilha é reprodutível",
|
||||
"body": "Identificações, contratos, gancho, adaptações e uma repetição coordenada para essa receita são validadas."
|
||||
},
|
||||
{
|
||||
"title": "Primeiro as imagens",
|
||||
"body": "O aplicativo não é parado até que cada digest tenha sido resolvido, baixado e verificado."
|
||||
},
|
||||
{
|
||||
"title": "Parar e fazer backup do conjunto",
|
||||
"body": "Os backups nativos verificados são feitos com a pilha parada, então a aplicação e os bancos de dados pertencem ao mesmo momento."
|
||||
},
|
||||
{
|
||||
"title": "Atualizar e verificar cada membro",
|
||||
"body": "Adaptação, rede, montagens, segredos e dispositivos são novamente aplicados antes do exame de saúde de cada membro."
|
||||
},
|
||||
{
|
||||
"title": "Publicar ou recuperar tudo",
|
||||
"body": "Os novos contratos só são publicados quando todos os membros passam. Se alguém falhar, cada membro é restaurado."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Modificar",
|
||||
"O que muda",
|
||||
"O que é guardado"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Caminhos e dispositivos adicionais",
|
||||
"Eles são adicionados ou removidos do recipiente de aplicação, que reinicia. Nada é reconstruído.",
|
||||
"Os dados da aplicação, da sua base de dados e dos outros contentores"
|
||||
],
|
||||
[
|
||||
"O que executa o reconhecimento (Immich)",
|
||||
"O recipiente de aprendizado de máquina leva a imagem e os dispositivos do CPU ou de um GPU do hospedeiro. Todo o aplicativo é parado e atualizado, como em uma atualização",
|
||||
"O cache do modelo, a biblioteca e o banco de dados. Se algo falhar, os recipientes anteriores e a escolha anterior são restaurados"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutWarning": {
|
||||
"title": "Uma pilha sem uma repetição coordenada não é atualizada",
|
||||
"body": "Se a preparação de uma pilha não puder ser reproduzida, a atualização é recusada antes de a pilha ser parada. A aplicação continua a correr como está."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "failure",
|
||||
"title": "6. Quando algo falha",
|
||||
"blocks": [
|
||||
{
|
||||
"p": "Durante uma instalação, um erro para e remove os contêineres incompletos que a operação criou, e a ponte privada se a operação criou. Uma pilha não é publicada como válida até que toda a sequência termine."
|
||||
},
|
||||
{
|
||||
"p": "Uma atualização é transacional: todas as imagens são preparadas primeiro, depois a pilha pára, cada membro é feito backup e o backup verificado, e só então é substituído cada rootfs. Os membros começam um a um com seu exame de saúde; se um falha, cada membro é restaurado a partir do mesmo conjunto de backups, de modo que o banco de dados eo aplicativo nunca pertencem a momentos diferentes."
|
||||
},
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart LR\n P[\"{{prepare}}\"] --> S[\"{{stop}}\"]\n S --> B[\"{{backup}}\"]\n B --> R[\"{{replace}}\"]\n R --> H{\"{{healthy}}\"}\n H -- \"{{yes}}\" --> C[\"{{commit}}\"]\n H -- \"{{no}}\" --> X[\"{{rollback}}\"]",
|
||||
"labels": {
|
||||
"prepare": "Preparar cada imagem",
|
||||
"stop": "Parar, membro principal primeiro",
|
||||
"backup": "Cópia de segurança verificada de cada CT",
|
||||
"replace": "Substituir rootfs",
|
||||
"healthy": "Todos funcionando corretamente?",
|
||||
"yes": "Sim",
|
||||
"no": "Não",
|
||||
"commit": "Publicar contratos",
|
||||
"rollback": "Restaurar cada membro"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "not-assumed",
|
||||
"title": "O que uma pilha não inclui",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Uma suíte instalada em um fluxo, como a suíte Arr, não é uma pilha dependente: seus recipientes não têm ordem de início entre eles.",
|
||||
"A rede privada não substitui a autenticação, TLS ou a configuração de cada aplicativo.",
|
||||
"O backup de um LXC não contém a ponte, o gancho ou os contratos do resto da pilha.",
|
||||
"Prowlarr, Sonarr ou Radarr não recebem indexadores, perfis ou provedores de ProxMenux."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,305 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Dados, caminhos e rede | ProxMenux",
|
||||
"description": "Como o OCI manager Apps preserva os dados de um contentor OCI: discos do contentor, diretórios do host, montagens com rclone, endereços e redes privadas."
|
||||
},
|
||||
"header": {
|
||||
"title": "Dados, caminhos e rede",
|
||||
"description": "O que fica no rootfs, o que é preservado quando este é substituído, como os dados são partilhados entre contentores e como cada um obtém o seu endereço.",
|
||||
"section": "OCI manager Apps"
|
||||
},
|
||||
"sections": [
|
||||
{
|
||||
"id": "intro",
|
||||
"blocks": [
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "A persistência é decidida antes de criar o LXC",
|
||||
"body": "Os volumes declarados pela imagem e pelo respetivo ficheiro Compose são lidos antes de criar o contentor. Cada caminho que deva ser preservado após uma atualização torna-se um ponto de montagem independente do rootfs. Assim, o rootfs contém apenas o que pertence à imagem e pode ser substituído."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "questions",
|
||||
"title": "O que o instalador pergunta",
|
||||
"intro": "O modelo fornece os caminhos necessários à aplicação. Cada um é colocado num disco do contentor ou num diretório do host, e podem ser acrescentados mais caminhos antes do resumo.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Caminhos necessários",
|
||||
"body": "São apresentados <code>/config</code>, <code>/data</code>, bibliotecas, descargas e todos os volumes declarados pela aplicação."
|
||||
},
|
||||
{
|
||||
"title": "Localização",
|
||||
"body": "Cada caminho é colocado num disco do contentor ou num diretório já existente no host."
|
||||
},
|
||||
{
|
||||
"title": "Armazenamento e tamanho",
|
||||
"body": "É criado um disco do contentor num armazenamento do Proxmox VE com o tamanho indicado. A instalação predefinida utiliza <code>local-lvm</code>; a avançada pergunta o armazenamento de cada caminho imediatamente antes do tamanho e propõe o do rootfs. O disco aparece como <code>vm-VMID-disk-N</code> e é associado como <code>mpN</code>."
|
||||
},
|
||||
{
|
||||
"title": "Diretório do host",
|
||||
"body": "O diretório do host é indicado pelo seu caminho. Se não existir, é criado e atribuído ao utilizador do host para o qual é mapeado o utilizador do contentor."
|
||||
},
|
||||
{
|
||||
"title": "Caminhos adicionais",
|
||||
"body": "Antes de instalar, podem ser acrescentados mais pares de caminho ou volume do host e caminho dentro do contentor."
|
||||
},
|
||||
{
|
||||
"title": "Resumo",
|
||||
"body": "O mapeamento completo é apresentado antes de criar o CT e guardado no contrato da instância."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "options",
|
||||
"title": "As duas localizações persistentes",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Propriedade",
|
||||
"Disco do contentor",
|
||||
"Diretório do host"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Na configuração",
|
||||
"<code>mpN: STORAGE:vm-VMID-disk-N,mp=/config,backup=1,size=16G</code>",
|
||||
"<code>mpN: /mnt/oci-shared/media,mp=/data/media</code>"
|
||||
],
|
||||
[
|
||||
"Cópia de segurança do contentor (vzdump)",
|
||||
"Incluído, com <code>backup=1</code>",
|
||||
"Não incluído"
|
||||
],
|
||||
[
|
||||
"Tamanho",
|
||||
"Fixo; aumenta-se redimensionando o ponto de montagem",
|
||||
"O espaço livre do sistema de ficheiros ou dataset do host"
|
||||
],
|
||||
[
|
||||
"Outros contentores",
|
||||
"Montado apenas pelo contentor a que pertence",
|
||||
"O mesmo diretório pode ser montado em vários contentores"
|
||||
],
|
||||
[
|
||||
"Snapshots e restauro",
|
||||
"Geridos pelo Proxmox VE juntamente com o CT",
|
||||
"Geridos no armazenamento do host"
|
||||
],
|
||||
[
|
||||
"Ao remover a aplicação",
|
||||
"Eliminado com o contentor",
|
||||
"Preservado com o seu conteúdo"
|
||||
],
|
||||
[
|
||||
"Ao mover o CT para outro nó",
|
||||
"É movido com o CT",
|
||||
"O mesmo caminho tem de existir no outro nó"
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O rootfs fica reservado para os binários e o conteúdo da imagem. Uma atualização ou recriação substitui-o sem tocar em nenhum dos dois tipos de ponto de montagem."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "example",
|
||||
"title": "Exemplo: um contentor com ambas as localizações",
|
||||
"blocks": [
|
||||
{
|
||||
"code": {
|
||||
"title": "Jellyfin instalado como CT 151 em local-lvm (excerto)",
|
||||
"code": "rootfs: local-lvm:vm-151-disk-0,size=8G\n# Container disk, part of the CT backup\nmp0: local-lvm:vm-151-disk-1,mp=/config,backup=1,size=16G\n\n# Host directory, outside the CT backup\nmp1: /mnt/oci-shared/media,mp=/data/media"
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Uma atualização ou recriação substitui apenas o rootfs: o <code>mp0</code> preserva utilizadores, bibliotecas e definições, e o <code>mp1</code> continua a apresentar os mesmos ficheiros multimédia. Restaurar a cópia do CT recupera <code>/config</code>; se necessário, o diretório multimédia é restaurado a partir da cópia de segurança do armazenamento do host."
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "Contrato",
|
||||
"detail": "/config"
|
||||
},
|
||||
{
|
||||
"label": "Localização",
|
||||
"detail": "Disco do contentor\nou diretório do host"
|
||||
},
|
||||
{
|
||||
"label": "LXC",
|
||||
"detail": "Sempre /config\npara a aplicação"
|
||||
}
|
||||
],
|
||||
"caption": "A aplicação vê o caminho declarado pela imagem; só muda o local onde é armazenado."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "shared",
|
||||
"title": "Um diretório do host, vários contentores",
|
||||
"blocks": [
|
||||
{
|
||||
"mermaid": {
|
||||
"chartCode": "flowchart TB\n H[\"{{host}}<br/>/mnt/oci-shared/media\"]\n H --> Q[\"qBittorrent<br/>/data\"]\n H --> J[\"Jellyfin<br/>/data\"]\n H --> R[\"Radarr / Sonarr<br/>/data\"]\n Q -. \"{{config}}\" .-> QV[(\"/config mpN\")]\n J -. \"{{config}}\" .-> JV[(\"/config mpN\")]\n R -. \"{{config}}\" .-> RV[(\"/config mpN\")]",
|
||||
"labels": {
|
||||
"host": "Diretório do host",
|
||||
"config": "Configuração própria"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "Cada contentor guarda a sua configuração no respetivo disco. A biblioteca ou as descargas ficam num único diretório do host, montado no mesmo caminho interno em todos os contentores. Assim, o caminho onde uma aplicação escreve é o mesmo de onde outra lê."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "rclone",
|
||||
"title": "Armazenamento na nuvem através da aplicação rclone",
|
||||
"intro": "Além da instalação, a ficha do rclone no catálogo permite <strong>Ativar uma montagem num contentor OCI de rclone existente</strong>. É montado um armazenamento remoto já criado e autorizado na interface web do rclone e disponibilizado no host. Outros contentores podem utilizá-lo como um diretório do host.",
|
||||
"blocks": [
|
||||
{
|
||||
"steps": {
|
||||
"items": [
|
||||
{
|
||||
"title": "Contentor e armazenamento remoto",
|
||||
"body": "O VMID do contentor de rclone, o nome exato do armazenamento remoto e, opcionalmente, um caminho dentro dele."
|
||||
},
|
||||
{
|
||||
"title": "Nome da montagem e cache",
|
||||
"body": "O nome da montagem e o modo de cache VFS: <code>off</code>, <code>minimal</code>, <code>writes</code> ou <code>full</code> (predefinido)."
|
||||
},
|
||||
{
|
||||
"title": "Vistas disponibilizadas",
|
||||
"body": "Uma raiz comum, <code>/mnt/oci-shared</code> por predefinição, contém uma vista de leitura e escrita em <code>/mnt/oci-shared/remotes/NAME</code> e uma vista só de leitura em <code>/mnt/oci-shared/remotes-ro/NAME</code>."
|
||||
},
|
||||
{
|
||||
"title": "Ativação",
|
||||
"body": "Após confirmação, o CT é parado, o seu comando de arranque e um hookscript do Proxmox VE são configurados e o CT é iniciado novamente. A operação aguarda até ambas as vistas estarem montadas no host."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"calloutInfo": {
|
||||
"title": "Se a montagem não for ativada",
|
||||
"body": "A configuração anterior do contentor é restaurada e este é iniciado novamente. Assim, se a ativação falhar, o rclone fica como estava."
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "network",
|
||||
"title": "Endereços e redes",
|
||||
"intro": "Uma aplicação com um só contentor precisa de um endereço. Uma aplicação com vários contentores também precisa de uma rede estável entre os seus membros.",
|
||||
"blocks": [
|
||||
{
|
||||
"cards": {
|
||||
"items": [
|
||||
{
|
||||
"icon": "network",
|
||||
"title": "Aplicação com um só contentor",
|
||||
"body": "Escolhe-se a bridge de rede e DHCP ou um endereço fixo em formato CIDR. O LXC tem um endereço próprio e o resumo apresenta os URL completos dos serviços."
|
||||
},
|
||||
{
|
||||
"icon": "waypoints",
|
||||
"title": "Aplicação com vários contentores",
|
||||
"body": "É encontrada uma sub-rede livre e criada uma bridge privada persistente. Cada membro — aplicação, base de dados e cache — recebe nela um endereço fixo."
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"flow": {
|
||||
"nodes": [
|
||||
{
|
||||
"label": "LAN",
|
||||
"detail": "Endereço acessível\napenas para o serviço principal"
|
||||
},
|
||||
{
|
||||
"label": "LXC principal",
|
||||
"detail": "Web / API\nLAN + rede privada"
|
||||
},
|
||||
{
|
||||
"label": "Rede privada",
|
||||
"detail": "PostgreSQL · Valkey · ML\nendereços fixos"
|
||||
}
|
||||
],
|
||||
"caption": "As dependências comunicam pela rede privada e não têm um endereço na LAN."
|
||||
}
|
||||
},
|
||||
{
|
||||
"p": "O contrato da stack guarda a bridge, a sub-rede, os endereços e as relações entre serviços. Ao atualizar a aplicação, a mesma topologia é reutilizada para todos os membros. O ProxMenux Monitor abre o contentor principal no seu endereço LAN, não no da rede privada."
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "ownership",
|
||||
"title": "Proprietários de ficheiros e diretórios",
|
||||
"blocks": [
|
||||
{
|
||||
"list": {
|
||||
"items": [
|
||||
"Os novos diretórios são criados com o UID e o GID para os quais é mapeado o LXC sem privilégios.",
|
||||
"O proprietário dos diretórios existentes não é alterado de forma recursiva.",
|
||||
"Sockets, ficheiros de sistema e caminhos sensíveis não são propostos como diretórios genéricos do host."
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "backup",
|
||||
"title": "O que contém uma cópia de segurança do contentor",
|
||||
"blocks": [
|
||||
{
|
||||
"table": {
|
||||
"headers": [
|
||||
"Elemento",
|
||||
"Na cópia vzdump do CT",
|
||||
"Onde é guardado"
|
||||
],
|
||||
"rows": [
|
||||
[
|
||||
"Rootfs OCI",
|
||||
"Sim",
|
||||
"Na cópia do CT; também pode ser reconstruído a partir da imagem e do contrato"
|
||||
],
|
||||
[
|
||||
"Disco do contentor com <code>backup=1</code>",
|
||||
"Sim",
|
||||
"A cópia do CT"
|
||||
],
|
||||
[
|
||||
"Diretório do host",
|
||||
"Não",
|
||||
"A cópia de segurança do armazenamento do host"
|
||||
],
|
||||
[
|
||||
"Contrato da instância",
|
||||
"Sim, a cópia guardada no CT",
|
||||
"<code>/.proxmenux/oci-record.json</code> dentro do CT; as cópias adicionais do host e do cluster são guardadas separadamente"
|
||||
],
|
||||
[
|
||||
"Aplicação com vários contentores",
|
||||
"Cada membro na sua própria cópia",
|
||||
"As cópias de todos os membros, mais o contrato da stack e a respetiva bridge no host"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Fail2Ban | Documentação do ProxMenux",
|
||||
"description": "Instalar Fail2Ban com três jails sintonizado para Proxmox (SSH agressivo, Proxmox UI 8006, ProxMenux Monitor 8008). Inclui o journald MaxLevelStore correção, serviços de log personalizados para confiabilidade, backend nftables/iptables detectado automaticamente e SSH MaxAuthTries endurecimento.",
|
||||
"ogTitle": "Fail2Ban | Documentação do ProxMenux",
|
||||
"ogDescription": "Proteção contra força bruta para SSH e interfaces web Proxmox, com correções do journald e do backend específicas para Proxmox."
|
||||
},
|
||||
"header": {
|
||||
"title": "Fail2Ban",
|
||||
"description": "Instala Fail2Ban para Proxmox: três jails (SSH agressivo, interface Proxmox em 8006, ProxMenux Monitor em 8008 e proxy inverso), correção do nível do journald para guardar eventos SSH, dois serviços que copiam o journal para ficheiros para contornar um problema do backend systemd, deteção do backend de firewall e reforço SSH com MaxAuthTries.",
|
||||
"section": "Segurança"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Instala Fail2Ban dos repositórios Debian e cria uma configuração Proxmox que protege de imediato SSH, interface web Proxmox e ProxMenux Monitor. Se detetar uma instalação existente, oferece um menu de gestão para reinstalar ou remover."
|
||||
},
|
||||
"firstLaunch": {
|
||||
"heading": "Janela de primeiro lançamento",
|
||||
"body": "Sem Fail2Ban instalado, o script resume num diálogo o que vai instalar e configurar. Cancelar termina sem alterações; confirmar inicia a instalação.",
|
||||
"imageAlt": "Confirmação de instalação do Fail2Ban com três jails, correção do journald e reforço SSH"
|
||||
},
|
||||
"jails": {
|
||||
"heading": "As três jails",
|
||||
"headerJail": "Jail",
|
||||
"headerProtects": "Protege",
|
||||
"headerRetries": "Tentativas / Janela",
|
||||
"headerBan": "Duração do bloqueio",
|
||||
"rows": [
|
||||
{
|
||||
"jail": "[sshd]",
|
||||
"protects": "SSH (modo aggressive — inclui ddos, mode, normal)",
|
||||
"retries": "2 / 60 min",
|
||||
"ban": "9 horas"
|
||||
},
|
||||
{
|
||||
"jail": "[proxmox]",
|
||||
"protects": "Interface web do Proxmox (porta 8006)",
|
||||
"retries": "3 / 10 min",
|
||||
"ban": "1 hora"
|
||||
},
|
||||
{
|
||||
"jail": "[proxmenux]",
|
||||
"protects": "ProxMenux Monitor (porta 8008 + proxy inverso http/https)",
|
||||
"retries": "3 / 10 min",
|
||||
"ban": "1 hora"
|
||||
}
|
||||
],
|
||||
"outro": "Defaults globais de <code>jail.local</code>: <code>ignoreip = 127.0.0.1/8 ::1</code>, <code>ignoreself = true</code>,<code> bantime = 86400</code> (fallback de 24h para prisões que não o sobrepõem), <code>maxretry = 2</code>, <code>findtime = 1800</code>."
|
||||
},
|
||||
"journald": {
|
||||
"heading": "Por que a correção journald é importante",
|
||||
"intro": "O Proxmox fornece <code>/etc/systemd/journald.conf</code> com <codeNw>MaxLevelStore=warning</codeNw>. O journald descarta as mensagens de nível <em>inferior</em> a warning antes de as guardar. SSH e PAM emitem falhas de autenticação nos níveis <em>info</em> / <em>notice</em>, pelo que:",
|
||||
"diagram": {
|
||||
"sshLabel": "SSH / PAM",
|
||||
"sshDetail": "falha de autenticação\n(nível info / notice)",
|
||||
"journaldLabel": "journald",
|
||||
"journaldDetail": "MaxLevelStore=warning\n→ evento descartado sem aviso",
|
||||
"fail2banLabel": "Fail2Ban",
|
||||
"fail2banDetail": "não vê nada\n→ nunca proíbe nada",
|
||||
"arrowLabel": "Proxmox por omissão"
|
||||
},
|
||||
"afterDiagram": "O instalador detecta isso e escreve um drop-in em <codeXs>/etc/systemd/journald.conf.d/proxmenux-loglevel.conf</codeXs> elevando tanto <code>MaxLevelStore</code> quanto <code>MaxLevelSyslog</code> para <code>info</code>:",
|
||||
"code": "[Journal]\nMaxLevelStore=info\nMaxLevelSyslog=info",
|
||||
"outro": "Em seguida, reinicia <code>systemd-journald</code>. O drop-in é removido ao desinstalar, restaurando o padrão original do Proxmox."
|
||||
},
|
||||
"loggers": {
|
||||
"heading": "Porquê dois serviços de registo personalizado",
|
||||
"intro1": "O Fail2Ban pode ler diretamente o journal do systemd (<code>backend = systemd</code>), mas no Proxmox este backend tem problemas conhecidos com processos worker de <code>pvedaemon</code>: os eventos de autenticação aparecem no journal mas nem sempre são detetados. O problema também afeta ocasionalmente <code>sshd</code>.",
|
||||
"intro2": "O ProxMenux cria dois pequenos serviços systemd que acompanham as unidades relevantes com <code>journalctl -f</code> e acrescentam cada linha a um ficheiro. O Fail2Ban lê esses ficheiros com o fiável <code>backend = auto</code> (modo ficheiro):",
|
||||
"headerService": "Serviço",
|
||||
"headerSource": "Unidade de origem",
|
||||
"headerOutput": "Ficheiro de saída",
|
||||
"rows": [
|
||||
{
|
||||
"service": "proxmox-auth-logger.service",
|
||||
"source": "pvedaemon.service",
|
||||
"output": "/var/log/proxmox-auth.log"
|
||||
},
|
||||
{
|
||||
"service": "ssh-auth-logger.service",
|
||||
"source": "ssh.service",
|
||||
"output": "/var/log/ssh-auth.log"
|
||||
}
|
||||
],
|
||||
"outro": "Ambos os serviços são declarados <code>PartOf=fail2ban.service</code> para que eles reiniciar com Fail2Ban e parar com ele. Modo 640 de propriedade do <code>root:adm</code> nos arquivos de log. O terceiro log usado pela cadeia <code>[proxmenux]</code> (<code>/var/log/proxmenux-auth.log</code>) é escrito diretamente pelo aplicativo ProxMenux Monitor Flask — nenhum serviço de registrador necessário para esse."
|
||||
},
|
||||
"backend": {
|
||||
"heading": "Deteção automática do backend de firewall",
|
||||
"intro": "O instalador sonda o host: se o <code>nft list ruleset</code> funcionar, ele escolhe o <code>nftables</code> como ação de ban. Caso contrário, volta para <code>iptables-multiport</code> / <code>iptables-allports</code>. A escolha é escrita em <code>jail.local</code>:",
|
||||
"code": "# nftables host\nbanaction = nftables\nbanaction_allports = nftables[type=allports]\n\n# iptables host (fallback)\nbanaction = iptables-multiport\nbanaction_allports = iptables-allports"
|
||||
},
|
||||
"hardening": {
|
||||
"heading": "Reforço SSH: MaxAuthTries",
|
||||
"intro": "O controlo Lynis <strong>SSH-7408</strong> recomenda <code>MaxAuthTries 3</code> em <code>sshd_config</code>. A jail SSH utiliza <code>maxretry = 2</code> para bloquear após falhas repetidas; MaxAuthTries limita as tentativas numa ligação. Este ajuste SSH acrescenta defesa em profundidade, mesmo quando Fail2Ban está parado para manutenção.",
|
||||
"installerIntro": "O instalador:",
|
||||
"items": [
|
||||
"Lê o valor atual do <code>MaxAuthTries</code> (ou padrão para 6 se ausente).",
|
||||
"Guarda-o em <code>/usr/local/share/proxmenux/sshd_maxauthtries_backup</code>.",
|
||||
"Edita <code>sshd_config</code> diretamente: substitui a linha existente, remove o comentário da linha comentada ou acrescenta uma nova.",
|
||||
"Recarrega o <code>sshd</code> (recarregar, não reiniciar, para manter as sessões existentes vivas)."
|
||||
],
|
||||
"outro": "Na desinstalação, o valor original salvo é restaurado e <code>sshd</code> é recarregado novamente."
|
||||
},
|
||||
"manage": {
|
||||
"heading": "Gerenciar uma instalação existente",
|
||||
"intro": "Se o Fail2Ban já estiver instalado quando você abrir o menu, o script detecta-o e mostra um menu de gerenciamento em vez de repetir o instalador:",
|
||||
"headerAction": "Ação",
|
||||
"headerWhat": "O que ele faz",
|
||||
"rows": [
|
||||
{
|
||||
"action": "Reinstalar",
|
||||
"what": "Repete a instalação completa e reescreve todas as jails com os valores atuais do ProxMenux. Utilize quando uma atualização alterar as recomendações."
|
||||
},
|
||||
{
|
||||
"action": "Remover",
|
||||
"what": "Para fail2ban e os dois serviços de registro, limpa o pacote apt, remove todos os jail / arquivos de filtro, exclui o drop-in journald (restaurando o padrão do Proxmox) e restaura o SSH original MaxAuthTries."
|
||||
}
|
||||
]
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verifica se está a funcionar.",
|
||||
"intro": "Após a instalação, comandos úteis da máquina:",
|
||||
"code": "# Service status and version\nsystemctl status fail2ban\nfail2ban-client --version\n\n# All active jails\nfail2ban-client status\n\n# Detail on one jail\nfail2ban-client status sshd\nfail2ban-client status proxmox\nfail2ban-client status proxmenux\n\n# Currently banned IPs in a jail\nfail2ban-client status sshd | grep \"Banned IP\"\n\n# Manually unban an IP (use this if you ban yourself)\nfail2ban-client unban 192.0.2.10\n\n# Tail the auth logs Fail2Ban watches\ntail -f /var/log/ssh-auth.log\ntail -f /var/log/proxmox-auth.log\ntail -f /var/log/fail2ban.log"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"neverBansTitle": "O Fail2Ban é executado mas nunca proíbe nada",
|
||||
"neverBansBody": "Verifique se <code>tail -f /var/log/ssh-auth.log</code> recebe uma entrada após uma tentativa SSH com palavra-passe errada a partir de outra máquina. Caso contrário, consulte <code>systemctl status ssh-auth-logger.service</code>. Se o serviço estiver ativo, veja os eventos recentes com <code>journalctl -u ssh.service -n 50 --no-pager -p info</code> e confirme que o complemento journald permite o nível <em>info</em>.",
|
||||
"monitorEmptyTitle": "A jail ProxMenux Monitor não tem entradas mesmo após inícios de sessão falhados",
|
||||
"monitorEmptyBody": "O <code>[proxmenux]</code> jail lê <code>/var/log/proxmenux-auth.log</code>, que é escrito pelo aplicativo ProxMenux Monitor Flask — não por um criador de logs journald. Se você não executar o Monitor, o arquivo permanecerá vazio e o jail nunca será acionado. Isso é esperado; a configuração jail é inofensiva. Se você executar o Monitor e o log estiver vazio, verifique a configuração de registro do Flask.",
|
||||
"selfBanTitle": "Eu bani-me.",
|
||||
"selfBanIntro": "A partir de uma consola / IPMI / iKVM (ou de outro IP autorizado):",
|
||||
"selfBanCode": "fail2ban-client unban '<'YOUR_IP'>'\n\n# To prevent it next time, edit /etc/fail2ban/jail.local and add your IP:\nignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 203.0.113.42\n\n# Then reload\nfail2ban-client reload",
|
||||
"aptFailTitle": "O apt-get falha: ''Unable to locate package fail2ban''",
|
||||
"aptFailBody": "O host está faltando o Debian repos (comum nas instalações do 'barebones' Proxmox). O instalador detecta isso e escreve <code>/etc/apt/sources.list.d/debian.sources</code> com o codinome certo (<code>bookworm</code> / <code>trixie</code>) antes de tentar novamente. Se ainda falhar, verifique <code>/etc/os-release</code> para <code>VERSION_CODENAME</code> e confirme que o URL do repo está acessível.",
|
||||
"lockoutTitle": "SSH me bloqueia depois de instalar",
|
||||
"lockoutBody": "O instalador define <code>MaxAuthTries=3</code>. Se seu gerenciador de senhas / agente repetir várias chaves, você pode exceder isso em uma única tentativa de conexão. Limite as chaves oferecidas: <code>ssh -o IdentitiesOnly=yes -i ~/.ssh/specific_key user@host</code>. Ou aumentar temporariamente o <code>MaxAuthTries</code> em <code>sshd_config</code> enquanto você depura."
|
||||
},
|
||||
"files": {
|
||||
"heading": "Ficheiros gravados",
|
||||
"code": "/etc/fail2ban/jail.local # global defaults + [sshd]\n/etc/fail2ban/jail.d/proxmox.conf # [proxmox]\n/etc/fail2ban/jail.d/proxmenux.conf # [proxmenux]\n/etc/fail2ban/filter.d/proxmox.conf # auth-failure regex for pvedaemon\n/etc/fail2ban/filter.d/proxmenux.conf # auth-failure regex for Monitor\n/etc/systemd/system/proxmox-auth-logger.service # journal → file (pvedaemon)\n/etc/systemd/system/ssh-auth-logger.service # journal → file (sshd)\n/etc/systemd/journald.conf.d/proxmenux-loglevel.conf # MaxLevelStore=info\n/etc/ssh/sshd_config # MaxAuthTries=3 (in-place edit)\n/var/log/proxmox-auth.log # written by logger service\n/var/log/ssh-auth.log # written by logger service\n/var/log/proxmenux-auth.log # written by Monitor Flask app\n/usr/local/share/proxmenux/sshd_maxauthtries_backup # for restore on uninstall"
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"monitorLabel": "ProxMenux Monitor → Guia de segurança",
|
||||
"monitorTail": " — instalação pelo painel, estado das jails em direto, IPs bloqueados e ajuste de tentativas e duração do bloqueio por jail no navegador.",
|
||||
"lynisLabel": "Lynis",
|
||||
"lynisTail": " — execute uma auditoria antes e depois para confirmar que o controlo SSH-7408 é cumprido.",
|
||||
"securityLabel": "Visão geral da segurança",
|
||||
"securityTail": " — voltar ao panorama da secção."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Segurança do Proxmox — Fail2Ban e auditoria de reforço com Lynis | ProxMenux",
|
||||
"description": "Duas ferramentas de segurança para Proxmox VE: Fail2Ban (prevenção de intrusões para SSH, interface web do Proxmox e ProxMenux Monitor) e Lynis (auditoria de segurança e reforço do sistema, instalado a partir do repositório original no GitHub).",
|
||||
"ogTitle": "Segurança do Proxmox — Fail2Ban e auditoria de reforço com Lynis",
|
||||
"ogDescription": "Fail2Ban e Lynis para Proxmox VE: prevenção de intrusões e auditoria de reforço, instalados e geridos pelo ProxMenux.",
|
||||
"twitterTitle": "Segurança do Proxmox | ProxMenux",
|
||||
"twitterDescription": "Fail2Ban e Lynis para Proxmox VE: prevenção de intrusões e auditoria de reforço."
|
||||
},
|
||||
"header": {
|
||||
"title": "Segurança",
|
||||
"description": "Duas ferramentas complementares para Proxmox VE: defesa ativa (Fail2Ban bloqueia IPs que atacam SSH ou interfaces web) e auditoria local (Lynis procura falhas de reforço e dá uma pontuação de 0 a 100). Cada ferramenta tem o seu menu de instalação e gestão, com deteção de instalações existentes antes de agir.",
|
||||
"section": "Segurança"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Defesa ativa e auditoria local",
|
||||
"body": "Respondem a perguntas diferentes. <strong>Fail2Ban</strong> responde a <em>«Estamos a ser atacados agora?»</em> observando os registos de autenticação e bloqueando os IPs responsáveis. <strong>Lynis</strong> responde a <em>«Qual é o nível de reforço deste anfitrião?»</em> através de uma auditoria pontual com recomendações concretas. Utilize ambos: Lynis indica o que melhorar e Fail2Ban reage aos ataques em curso."
|
||||
},
|
||||
"opening": {
|
||||
"heading": "Abrir o menu",
|
||||
"body": "No menu principal do ProxMenux selecione <strong>Segurança</strong>. Verá o seguinte:",
|
||||
"imageAlt": "Menu de segurança com opções Fail2Ban e Lynis"
|
||||
},
|
||||
"pick": {
|
||||
"heading": "Escolha sua ferramenta",
|
||||
"body": "As duas ferramentas de segurança são independentes — instale uma, ambas ou nenhuma. Cada carta abaixo salta para a seção que explica a ferramenta em detalhes."
|
||||
},
|
||||
"cards": {
|
||||
"fail2ban": {
|
||||
"title": "Fail2Ban",
|
||||
"body": "Prevenção ativa de intrusões. Observa os registos de autenticação SSH e web e bloqueia IPs após falhas repetidas.",
|
||||
"bullets": [
|
||||
"Três jails: SSH, interface Proxmox (8006), ProxMenux Monitor (8008)",
|
||||
"Corrige as predefinições do journald no Proxmox que bloqueiam os registos de autenticação",
|
||||
"Detecta automaticamente nftables / iptables",
|
||||
"Endurecimento de SSH: MaxAuthTries=3 (recomendação Lynis)"
|
||||
]
|
||||
},
|
||||
"lynis": {
|
||||
"title": "Lynis",
|
||||
"body": "Auditor local de segurança. Analisa o anfitrião e apresenta uma pontuação de reforço e sugestões concretas de correção.",
|
||||
"bullets": [
|
||||
"Instalado a partir do repositório original da CISOfy no GitHub (versão mais recente)",
|
||||
"Pontuação de reforço 0–100 e lista de avisos e sugestões",
|
||||
"Auditoria e atualização através do menu",
|
||||
"Concebido apenas para leitura: nunca altera o sistema"
|
||||
]
|
||||
}
|
||||
},
|
||||
"workflowTip": {
|
||||
"title": "Fluxo de trabalho que utiliza ambos",
|
||||
"body": "Execute primeiro Lynis para conhecer a pontuação inicial e as principais recomendações. Aplique as correções desejadas. Depois instale Fail2Ban: implementa automaticamente a proteção SSH contra força bruta e ajusta <code>MaxAuthTries</code> em <code>sshd_config</code> para cumprir o controlo SSH-7408. Execute Lynis novamente para verificar a melhoria."
|
||||
},
|
||||
"fail2banSection": {
|
||||
"heading": "Fail2Ban",
|
||||
"body": "O ProxMenux instala Fail2Ban com uma configuração específica para Proxmox. Além da jail SSH padrão, protege a interface web Proxmox e o ProxMenux Monitor. Contorna dois problemas específicos: uma predefinição do journald que descarta eventos de autenticação e um problema do backend systemd que impede a leitura fiável de certas fontes do registo. A página detalhada explica a instalação, as três jails, a correção do journald, o reforço SSH e a resolução de problemas.",
|
||||
"optionTitle": "Fail2Ban — instalar e gerenciar",
|
||||
"optionDescription": "Três jails pré-configuradas (sshd agressivo, interface Proxmox em 8006, ProxMenux Monitor em 8008 e proxy inverso), deteção de nftables/iptables, correção do journald e reforço SSH com MaxAuthTries."
|
||||
},
|
||||
"lynisSection": {
|
||||
"heading": "Lynis",
|
||||
"body": "O ProxMenux clona Lynis de <code>github.com/CISOfy/lynis</code> para <code>/opt/lynis</code> e disponibiliza-o como <code>/usr/local/bin/lynis</code>. Evita o pacote Debian porque está várias versões principais atrás do projeto original. A página detalhada explica instalação, auditoria, atualização, desinstalação, leitura do relatório e ações sobre os resultados.",
|
||||
"optionTitle": "Lynis — instalar, auditar e gerenciar",
|
||||
"optionDescription": "Instala a versão mais recente do Lynis a partir do repositório oficial CISOfy no GitHub (em vez do pacote Debian mais antigo), executa auditorias com pontuação de reforço e atualiza através de git pull."
|
||||
},
|
||||
"componentStatus": {
|
||||
"heading": "Estado do componente",
|
||||
"body": "Ambos os instaladores registram seu estado em <code>/usr/local/share/proxmenux/components_status.json</code> na categoria <code>security</code>. ProxMenux usa este arquivo para decidir se deve mostrar a instalação ou o menu de gerenciamento em sequências, e os mesmos dados alimentam os painéis no ProxMenux Monitor quando presente."
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Lynis | Documentação do ProxMenux",
|
||||
"description": "Instale a versão mais recente do Lynis do repositório oficial CISOfy no GitHub, execute uma auditoria com pontuação de reforço de 0 a 100 e atualize através de git pull. Auditor apenas de leitura: não altera o sistema.",
|
||||
"ogTitle": "Lynis | Documentação do ProxMenux",
|
||||
"ogDescription": "Instale e execute Lynis no Proxmox VE. Instalação do repositório original GitHub, auditoria e atualização."
|
||||
},
|
||||
"header": {
|
||||
"title": "Lynis",
|
||||
"description": "Clona a versão mais recente do Lynis do repositório oficial CISOfy no GitHub, disponibiliza-a como /usr/local/bin/lynis e oferece auditoria, atualização, reinstalação e desinstalação no menu. O auditor apenas lê e apresenta resultados sem alterar o sistema.",
|
||||
"section": "Segurança"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que isto faz",
|
||||
"body": "Instala Lynis, o auditor de segurança de código aberto da CISOfy, do repositório GitHub em <code>/opt/lynis</code> e cria um lançador em <code>/usr/local/bin/lynis</code> para o disponibilizar no <code>PATH</code>. Se detetar uma instalação existente, apresenta um menu de auditoria, atualização, reinstalação ou remoção."
|
||||
},
|
||||
"manageMenu": {
|
||||
"heading": "Menu de gestão (após a instalação)",
|
||||
"intro": "Uma vez instalado o Lynis, cada invocação subsequente abre o menu de gerenciamento em vez de repetir o instalador. A partir daqui você inicia uma auditoria, atualização via git pull, reinstalar ou desinstalar:",
|
||||
"imageAlt": "Menu de gerenciamento do Lynis com as opções de auditoria, atualização, reinstalação e remoção"
|
||||
},
|
||||
"whyUpstream": {
|
||||
"heading": "Porquê o repositório oficial GitHub em vez de apt",
|
||||
"intro": "O Debian distribui Lynis através de apt, mas o pacote costuma estar várias versões principais atrás do projeto original. Novos controlos, correções de novos vetores de ataque e recomendações melhoradas chegam primeiro ao GitHub. Lynis é um script shell autónomo, sem compilação nem dependências de instalação além de <code>git</code>; clonar o repositório é o método recomendado pela CISOfy.",
|
||||
"headerSource": "Origem",
|
||||
"headerPath": "Install path",
|
||||
"headerUpdate": "Método de atualização",
|
||||
"headerFresh": "Atualidade da versão",
|
||||
"rows": [
|
||||
{
|
||||
"sourceRich": "<strong>ProxMenux (este programa)</strong>",
|
||||
"path": "/opt/lynis/",
|
||||
"update": "git pull (no menu)",
|
||||
"fresh": "Versão mais recente do projeto original"
|
||||
},
|
||||
{
|
||||
"sourceRich": "<strong>Debian apt</strong>",
|
||||
"path": "/usr/bin/lynis",
|
||||
"update": "apt upgrade",
|
||||
"fresh": "Muitas vezes meses / anos atrás"
|
||||
}
|
||||
]
|
||||
},
|
||||
"install": {
|
||||
"heading": "Como funciona a instalação",
|
||||
"node1Label": "github.com/CISOfy/lynis",
|
||||
"node1Detail": "git clone\n(instale git primeiro, se faltar)",
|
||||
"node2Label": "/opt/lynis/",
|
||||
"node2Detail": "repositório completo\nincluindo o script ./lynis",
|
||||
"node3Label": "/usr/local/bin/lynis",
|
||||
"node3Detail": "lançador:\ncd /opt/lynis && ./lynis $@",
|
||||
"outro": "O lançador é necessário: Lynis precisa de ser executado no próprio diretório porque utiliza caminhos relativos para plugins e perfis. O lançador esconde esse detalhe e permite que <code>lynis audit system</code> funcione a partir de qualquer diretório."
|
||||
},
|
||||
"detection": {
|
||||
"heading": "Caminhos de detecção",
|
||||
"intro": "Antes de mostrar o menu, o script verifica três locais para decidir se Lynis já está presente:",
|
||||
"items": [
|
||||
"<code>/usr/local/bin/lynis</code> — invólucro instalado por ProxMenux",
|
||||
"<code>/opt/lynis/lynis</code> — caminho direto (caso o invólucro tenha sido removido)",
|
||||
"<code>/usr/bin/lynis</code> — versão apt-instalada, se o usuário a instalou dessa forma anteriormente"
|
||||
],
|
||||
"outro": "Se encontrar um destes caminhos, abre o menu de gestão. O script <strong>não</strong> desinstala Lynis instalado por apt; remove apenas o que gere em <code>/opt/lynis</code> e o respetivo lançador."
|
||||
},
|
||||
"audit": {
|
||||
"heading": "Executar uma auditoria",
|
||||
"intro": "No menu de gestão escolha <strong>Executar auditoria de segurança agora</strong>. Equivale a executar:",
|
||||
"code": "lynis audit system --no-colors",
|
||||
"outro": "A auditoria demora de 30 segundos a alguns minutos conforme a dimensão do anfitrião. A saída aparece diretamente no terminal, sem animação de espera. Lynis organiza os controlos por categoria e marca cada teste como <ok>[ OK ]</ok>, <warn>[ WARNING ]</warn> ou <sugg>[ SUGGESTION ]</sugg>. O resumo final apresenta os números principais:",
|
||||
"summary": "================================================================================\n\n Lynis security scan details:\n\n Hardening index : 76 [############ ]\n Tests performed : 247\n Plugins enabled : 0\n\n Components:\n - Firewall [V]\n - Malware scanner [X]\n\n Lynis modules:\n - Compliance status [?]\n - Security audit [V]\n - Vulnerability scan [V]\n\n================================================================================"
|
||||
},
|
||||
"report": {
|
||||
"heading": "Ler o relatório",
|
||||
"intro": "As duas seções importantes são <strong>Avisos</strong> (coisas que você deve corrigir em breve) e <strong>Sugestão</strong> (recomendações para melhorar o endurecimento). Cada item carrega um ID de controle como <code>SSH-7408</code> — útil ao pesquisar os documentos Lynis para a lógica e a correção.",
|
||||
"headerMarker": "Marcador",
|
||||
"headerMeaning": "Significado",
|
||||
"headerAction": "Ação",
|
||||
"rows": [
|
||||
{
|
||||
"markerRich": "<strong>OK</strong>",
|
||||
"meaning": "Passado o teste",
|
||||
"action": "Nada."
|
||||
},
|
||||
{
|
||||
"markerRich": "<strong>WARNING</strong>",
|
||||
"meaning": "Problema real, correção recomendada",
|
||||
"action": "Leia a descrição do controle, planeje uma correção"
|
||||
},
|
||||
{
|
||||
"markerRich": "<strong>SUGGESTION</strong>",
|
||||
"meaning": "Melhoria do endurecimento disponível",
|
||||
"action": "Aplicar se se encaixa no seu modelo de ameaça"
|
||||
}
|
||||
],
|
||||
"outro": "Relatório completo e dados legíveis por máquina são escritos para <code>/var/log/lynis.log</code> e <code>/var/log/lynis-report.dat</code> pelo próprio Lynis."
|
||||
},
|
||||
"pairFail2ban": {
|
||||
"title": "Combinar com Fail2Ban",
|
||||
"body": "SSH-7408 (MaxAuthTries) é uma das advertências mais comuns. Instalar o <link>Fail2Ban</link> da ProxMenux o limpa automaticamente porque o instalador configura o <code>MaxAuthTries=3</code> como parte da sua etapa de endurecimento do SSH. Corra Lynis novamente depois para confirmar que o aviso se foi."
|
||||
},
|
||||
"update": {
|
||||
"heading": "Actualizar o Lynis",
|
||||
"body": "No menu, <strong>Atualizar Lynis para a versão mais recente</strong> executa <code>git pull --quiet</code> em <code>/opt/lynis</code>. Se o diretório existir mas não for uma cópia de trabalho Git, por exemplo após copiar ficheiros manualmente, o script reinstala por completo."
|
||||
},
|
||||
"reinstall": {
|
||||
"heading": "Reinstalar / desinstalar",
|
||||
"headerAction": "Ação",
|
||||
"headerWhat": "O que ele faz",
|
||||
"rows": [
|
||||
{
|
||||
"actionRich": "<strong>Reinstalar</strong>",
|
||||
"whatRich": "Remove <code>/opt/lynis</code>, clona novamente do GitHub e recria o lançador. Utilize se a cópia local estiver danificada."
|
||||
},
|
||||
{
|
||||
"actionRich": "<strong>Remover</strong>",
|
||||
"whatRich": "Exclui <code>/opt/lynis</code> e <code>/usr/local/bin/lynis</code>. Os logs em <code>/var/log/lynis*</code> são mantidos (são histórico de auditoria). Um Lynis apt-instalado em <code>/usr/bin/lynis</code> é deixado intocado."
|
||||
}
|
||||
]
|
||||
},
|
||||
"cli": {
|
||||
"heading": "Opções CLI úteis",
|
||||
"intro": "Uma vez instalado, Lynis pode ser invocado diretamente de uma shell com opções extras não expostas pelo menu:",
|
||||
"code": "lynis show version # version + build date\nlynis show commands # list every available command\nlynis show details TEST-ID # explain a specific control\nlynis audit system --quick # skip slow tests (e.g. malware scan)\nlynis audit system --pentest # treat host as untrusted (more aggressive)\nlynis update info # check if a newer Lynis is available\n\n# Filter the report log for just the warnings\ngrep \"Warning\" /var/log/lynis.log\n\n# Same, for suggestions only\ngrep \"Suggestion\" /var/log/lynis.log"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Resolução de Problemas",
|
||||
"cloneTitle": "git clone falha durante a instalação",
|
||||
"cloneBody": "O host precisa de acesso à rede e DNS para alcançar <code>github.com</code>. A partir de um console: <code>curl -sI https://github.com</code> e <code>git ls-remote https://github.com/CISOfy/lynis.git</code> irá revelar o erro real (DNS, TLS, proxy, URL repo). Se for necessário um proxy, defina <code>https_proxy</code> no ambiente antes de executar novamente o menu.",
|
||||
"notFoundTitle": "lynis: comando não encontrado após a instalação",
|
||||
"notFoundIntro": "O lançador <code>/usr/local/bin/lynis</code> não foi criado ou foi removido. A solução mais rápida é reinstalar a partir do menu. Correção manual:",
|
||||
"notFoundCode": "cat > /usr/local/bin/lynis <<'EOF'\n#!/bin/bash\ncd /opt/lynis && ./lynis \"$@\"\nEOF\nchmod +x /usr/local/bin/lynis",
|
||||
"sshTitle": "A auditoria mostra \"Warning: Test SSH-7408 — MaxAuthTries set incorrectly\"",
|
||||
"sshIntro": "O servidor SSH permite demasiadas tentativas de autenticação por ligação. Instale o <link>Fail2Ban</link> do ProxMenux (que define o <code>MaxAuthTries=3</code> automaticamente) ou edite o <code>/etc/ssh/sshd_config</code> à mão:",
|
||||
"sshCode": "sed -i 's/^#?MaxAuthTries.*/MaxAuthTries 3/' /etc/ssh/sshd_config\nsystemctl reload sshd",
|
||||
"scoreTitle": "A pontuação caiu após uma atualização do Proxmox",
|
||||
"scoreBody": "Executar <code>lynis update info</code> primeiro — uma atualização Lynis pode ter adicionado novos controles que sinalizam a configuração existente. Atualizar Lynis do menu, reauditar e abordar as novas descobertas."
|
||||
},
|
||||
"files": {
|
||||
"heading": "Ficheiros gravados",
|
||||
"code": "/opt/lynis/ # full Lynis git checkout\n/usr/local/bin/lynis # wrapper script (cd + exec)\n/var/log/lynis.log # human-readable audit log (Lynis itself)\n/var/log/lynis-report.dat # machine-readable report (Lynis itself)"
|
||||
},
|
||||
"sample": {
|
||||
"heading": "Relatório de exemplo",
|
||||
"intro": "O ProxMenux Monitor gera um PDF de várias páginas para cada execução do Lynis no <link>separador Segurança</link>. A primeira página resume a pontuação de reforço, informações do sistema e estado da segurança. As seguintes explicam cada aviso, ordenam sugestões por impacto e incluem o inventário de pacotes utilizado na auditoria.",
|
||||
"imageAlt": "Primeira página do Lynis Security Audit Report PDF — resumo executivo com índice de endurecimento 71/100, bloco de informações do sistema e visão geral da postura de segurança com firewall, scanner de malware e contagem de pacotes instalados",
|
||||
"captionPrefix": "Primeira página de um relatório de amostra. O PDF completo (",
|
||||
"captionLink": "amostra",
|
||||
"captionSuffix": ") continua com advertências detalhadas, sugestões e a lista de pacotes instalados.",
|
||||
"cli": "No lado CLI os mesmos dados estão em <code>/var/log/lynis-report.dat</code> (arquivo plano legível por máquina) e <code>/var/log/lynis.log</code> (o log de execução legível por humanos). O PDF é gerado sob demanda pelo ProxMenux Monitor — executar o <code>lynis</code> a partir da linha de comando não produz um."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"href": "/docs/monitor/dashboard/security",
|
||||
"label": "ProxMenux Monitor → Guia de segurança",
|
||||
"tail": " — executar a auditoria, procurar relatórios históricos e baixar o PDF diretamente do painel."
|
||||
},
|
||||
{
|
||||
"href": "/docs/security/fail2ban",
|
||||
"label": "Fail2Ban",
|
||||
"tailRich": " — implementa a proteção SSH à força bruta que Lynis recomenda."
|
||||
},
|
||||
{
|
||||
"href": "/docs/security",
|
||||
"label": "Visão geral da segurança",
|
||||
"tail": " — voltar ao panorama da secção."
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "HTTPS para ProxMenux Monitor — certificado do anfitrião Proxmox ou caminhos personalizados | ProxMenux",
|
||||
"description": "Disponibilize o ProxMenux Monitor por HTTPS com o certificado do anfitrião Proxmox (detetado automaticamente, incluindo Let’s Encrypt instalado pelo ACME do Proxmox) ou um certificado personalizado em qualquer caminho do disco.",
|
||||
"ogTitle": "HTTPS para ProxMenux Monitor — Host Proxmox ou certificado personalizado",
|
||||
"ogDescription": "Habilite o HTTPS na porta 8008 com o certificado de host Proxmox ou qualquer par personalizado .pem / .key."
|
||||
},
|
||||
"header": {
|
||||
"title": "HTTPS para ProxMenux Monitor",
|
||||
"description": "Ative HTTPS para o Monitor na porta 8008 com o certificado do anfitrião Proxmox detetado automaticamente ou um certificado personalizado no disco. A opção Proxmox prefere o certificado ACME, se existir, e reutiliza Let’s Encrypt gerido pelo Proxmox sem outra tarefa de renovação.",
|
||||
"section": "Segurança"
|
||||
},
|
||||
"intro": {
|
||||
"title": "O que esta página cobre",
|
||||
"body": "Como mudar o Monitor de HTTP para HTTPS no painel Configurações → Painel de segurança, o que cada fonte de certificado realmente aponta no disco, como a opção Proxmox se comporta quando o host tem um certificado Let's Encrypt, e como definir caminhos personalizados se você gerenciar certs fora do Proxmox."
|
||||
},
|
||||
"wheresetting": {
|
||||
"heading": "Onde se encontra a configuração",
|
||||
"body": "Abra o Monitor e vá a <strong>Configurações → Segurança → HTTPS / SSL</strong>. O painel mostra HTTP ou HTTPS e, se HTTPS ainda estiver desativado, as fontes de certificados detetadas.",
|
||||
"imageAlt": "Configurações → Segurança → Painel HTTPS / SSL no Monitor mostrando o estado HTTPS-off, o certificado Proxmox auto-detectado (sujeito, emissor, expiração) e a opção Use Custom Certificate",
|
||||
"caption": "Painel Configurações → Segurança → HTTPS / SSL antes da ativação. O Monitor mostra o certificado utilizado pelo Proxmox e permite escolhê-lo com um clique."
|
||||
},
|
||||
"twoways": {
|
||||
"heading": "Duas maneiras de ativar o HTTPS",
|
||||
"proxmox": {
|
||||
"title": "Usar certificado Proxmox",
|
||||
"summary": "Um clique: o Monitor reutiliza o certificado apresentado pelo Proxmox VE na porta 8006.",
|
||||
"items": [
|
||||
"Detetado automaticamente, sem introduzir caminhos",
|
||||
"Prefere o certificado ACME, se existir; caso contrário usa o certificado autoassinado predefinido",
|
||||
"O Proxmox renova; o Monitor valida e carrega o certificado na próxima nova ligação TLS"
|
||||
]
|
||||
},
|
||||
"custom": {
|
||||
"title": "Usar certificado personalizado",
|
||||
"summaryRich": "Aponte o monitor em um par <code>.pem</code> / <code>.key</code> em qualquer lugar no disco.",
|
||||
"items": [
|
||||
"Apenas caminhos absolutos (o processo Monitor deve ser capaz de ler ambos)",
|
||||
"Útil para certificados de <code>certbot</code>, <code>acme.sh</code> ou certificados wildcard",
|
||||
"A renovação fica a seu cargo: reinicie o Monitor quando os ficheiros mudarem"
|
||||
]
|
||||
}
|
||||
},
|
||||
"proxmoxCert": {
|
||||
"heading": "Certificado Proxmox — o que ele realmente aponta",
|
||||
"intro": "Proxmox VE mantém dois pares de certificados em <code>/etc/pve/local/</code>:",
|
||||
"table": {
|
||||
"headers": {
|
||||
"file": "Arquivo",
|
||||
"origin": "Origem",
|
||||
"when": "Quando o Monitor o usa"
|
||||
},
|
||||
"rows": [
|
||||
{
|
||||
"fileRich": "<code>pveproxy-ssl.pem</code><br /><code>pveproxy-ssl.key</code>",
|
||||
"originRich": "Certificado personalizado carregado através da UI Proxmox — incluindo o certificado Let's Encrypt emitido sob <em>Datacenter → Node → Certificados → ACME</em>.",
|
||||
"when": "Preferido quando ambos os ficheiros existem; o Monitor utiliza o certificado apresentado pelo Proxmox."
|
||||
},
|
||||
{
|
||||
"fileRich": "<code>pve-ssl.pem</code><br /><code>pve-ssl.key</code>",
|
||||
"originRich": "Certificado autoassinado gerado no momento da instalação pelo Proxmox PKI.",
|
||||
"whenRich": "Alternativa quando não existe <code>pveproxy-ssl.pem</code>."
|
||||
}
|
||||
]
|
||||
},
|
||||
"callout": {
|
||||
"title": "A mesma prioridade que o próprio Proxmox",
|
||||
"bodyRich": "<code>pveproxy</code> aplica a mesma seleção. Com a opção Proxmox, o Monitor utiliza o certificado apresentado pela interface Proxmox em 8006, sem cópias nem processo de renovação separado."
|
||||
}
|
||||
},
|
||||
"letsencrypt": {
|
||||
"heading": "Obtendo um certificado Let's Encrypt via Proxmox ACME",
|
||||
"intro": "O Proxmox VE inclui o seu cliente ACME. <em>«Order Certificate Now»</em> guarda o resultado em <code>/etc/pve/local/pveproxy-ssl.pem</code>, que o Monitor lê. Os cinco passos seguintes resumem o <extlink1>guia oficial do Proxmox</extlink1> nos comandos necessários.",
|
||||
"prereqs": {
|
||||
"title": "Pré-requisitos",
|
||||
"items": [
|
||||
"O nó tem um verdadeiro nome DNS (não apenas um IP) apontando para ele.",
|
||||
"<strong>Ou</strong> porta 80 acessível a partir da Internet (validação HTTP-01, a mais simples), <strong>ou</strong> fornecedor DNS com credenciais API (DNS-01, funciona atrás de NAT e suporta certificados wildcard).",
|
||||
"Um endereço de email para a conta ACME."
|
||||
]
|
||||
},
|
||||
"step1": {
|
||||
"heading": "Etapa 1 — Registo da conta ACME",
|
||||
"introRich": "Substitua o email pelo seu. O nome da conta <code>default</code> é apenas um rótulo — você pode usar qualquer string.",
|
||||
"code": "pvenode acme account register default you@example.com",
|
||||
"afterRich": "A Proxmox pede que você aceite os termos de serviço Let's Encrypt. Depois disso, a conta é persistida em <code>/etc/pve/priv/acme/</code> e a guia ACME na GUI irá mostrá-la."
|
||||
},
|
||||
"step2": {
|
||||
"heading": "Passo 2 — Escolha um tipo de desafio",
|
||||
"http01Rich": "<strong>HTTP-01</strong> é o mais fácil: é embutido, sem plugin extra. O Let's Encrypt conecta-se ao <code>http://<your-host>/.well-known/acme-challenge/...</code> na porta 80, então a porta 80 deve estar aberta da internet pública ao seu nó — normalmente uma porta para frente no seu roteador.",
|
||||
"dns01Rich": "<strong>DNS-01</strong> funciona sem expor o porto 80 (bom para homelabs atrás do CG-NAT) e é a única opção para certificados wildcard. Você adiciona um plugin DNS uma vez com o token API do seu provedor. Exemplo Cloudflare:",
|
||||
"code": "pvenode acme plugin add dns cf \\\n --api cloudflare \\\n --data CF_Token=YOUR_CLOUDFLARE_API_TOKEN",
|
||||
"outroRich": "Para outros fornecedores (Gandi, OVH, AWS Route 53, etc.), consulte <code>pvenode acme plugin add dns --help</code>. O Proxmox inclui <extlink2>todos os plugins DNS do acme.sh</extlink2>."
|
||||
},
|
||||
"step3": {
|
||||
"heading": "Passo 3 — Ligar o domínio ao seu nó",
|
||||
"http01Rich": "Para o HTTP-01 (usa o plug- in incorporado do <code>standalone</code>):",
|
||||
"code1": "pvenode config set --acme domains=host.example.com,account=default",
|
||||
"dns01": "Para DNS-01 com o plugin Cloudflare do Passo 2:",
|
||||
"code2": "pvenode config set --acmedomain0 domain=host.example.com,plugin=cf\npvenode config set --acme account=default",
|
||||
"wildcardRich": "Wildcard? Adicionar <code>domain=*.example.com</code> em uma entrada separada <code>--acmedomainN</code>. Wildcards requerem DNS-01."
|
||||
},
|
||||
"step4": {
|
||||
"heading": "Passo 4 — Ordenar o certificado",
|
||||
"code": "pvenode acme cert order",
|
||||
"afterRich": "A primeira execução normalmente leva 30–60 segundos enquanto o desafio se propaga. No sucesso Proxmox escreve <code>/etc/pve/local/pveproxy-ssl.pem</code> + <code>.key</code>, reinicia <code>pveproxy</code>, e um cron de renovação é agendado automaticamente (Let's Encrypt certs são válidos 90 dias; Proxmox renova em 60)."
|
||||
},
|
||||
"step5": {
|
||||
"heading": "Etapa 5 — Verificar o emitente",
|
||||
"code": "openssl x509 -in /etc/pve/local/pveproxy-ssl.pem -noout -issuer",
|
||||
"afterRich": "Deve imprimir um emissor começando com <code>O = Let's Encrypt</code>. Se em vez disso ele lê <code>CN = Proxmox Virtual Environment</code> a ordem falhou e o arquivo ainda é o certificado PVE auto-assinado — re-executar <code>pvenode acme cert order --debug 1</code> para ver porquê."
|
||||
},
|
||||
"gui": {
|
||||
"title": "Preferes a GUI? Os mesmos cinco passos",
|
||||
"bodyRich": "<em>Datacenter → ACME</em> regista a conta; <em>Datacenter → ACME → Plugins</em> adiciona o plugin DNS; <em>Node → Certificates → ACME</em> associa o domínio; <em>Order Certificates Now</em> executa o passo 4. Os comandos anteriores são úteis para scripts e sistemas sem interface gráfica."
|
||||
}
|
||||
},
|
||||
"switchToHttps": {
|
||||
"heading": "Mudar o monitor para HTTPS",
|
||||
"bodyRich": "Quando <code>/etc/pve/local/pveproxy-ssl.pem</code> estiver assinado por Let's Encrypt, abra <strong>Configurações → Segurança → HTTPS / SSL</strong>, confirme que o emissor é <em>Let's Encrypt</em> e não a CA local Proxmox, e clique em <strong>Usar certificado Proxmox</strong>. O Monitor reinicia e o próximo carregamento utiliza HTTPS em 8008 com uma cadeia de confiança pública. As renovações ACME seguintes são validadas e selecionadas na próxima nova ligação TLS, sem consultas periódicas nem reinício por renovação. <strong>Atualizar certificado</strong> continua disponível em Segurança para diagnóstico e recuperação."
|
||||
},
|
||||
"custom": {
|
||||
"heading": "Certificado personalizado — quando usá-lo",
|
||||
"intro": "Clique em <strong>Usar certificado personalizado</strong> e introduza dois caminhos absolutos:",
|
||||
"items": [
|
||||
"<strong>Certificado</strong> — cadeia completa em PEM (<code>.pem</code> ou <code>.crt</code>).",
|
||||
"<strong>Chave privada</strong>: chave correspondente em PEM (<code>.key</code>)."
|
||||
],
|
||||
"outro": "Ambos os arquivos são lidos pelo processo Monitor na inicialização. Certifique-se de que eles permanecem legíveis pelo usuário que a unidade systemd executa como (root por padrão). Locais comuns quando o ACME é administrado fora do Proxmox:",
|
||||
"code": "# certbot\n/etc/letsencrypt/live/<your-host>/fullchain.pem\n/etc/letsencrypt/live/<your-host>/privkey.pem\n\n# acme.sh\n~/.acme.sh/<your-host>_ecc/fullchain.cer\n~/.acme.sh/<your-host>_ecc/<your-host>.key",
|
||||
"symlinkCallout": {
|
||||
"title": "Alvos do Symlink vs. arquivos",
|
||||
"bodyRich": "<code>certbot</code> armazena os arquivos reais em <code>/etc/letsencrypt/archive/</code> e o caminho <code>live/</code> é um link simbólico. Aponte o Monitor no link simbólico <code>live/</code>, não no arquivo <code>archive/</code> — dessa forma cada ciclo de renovação simplesmente reescreve o alvo do link simbólico e o Monitor capta o novo certificado no próximo início do serviço."
|
||||
}
|
||||
},
|
||||
"afterHttps": {
|
||||
"heading": "Após activar o HTTPS",
|
||||
"bodyRich": "Salvar a mudança escreve <code>/etc/proxmenux/ssl_config.json</code> e ativa um reinício da unidade <code>proxmenux-monitor</code> systemd. A guia do navegador perderá sua conexão atual — recarregue-a no <code>https://<host>:8008/</code>. A primeira carga com um certificado Let's Encrypt não deve mostrar nenhum aviso; com o certificado auto-assinado Proxmox o navegador exigirá uma exceção, a mesma que para porta 8006.",
|
||||
"reverse": {
|
||||
"heading": "Proxies inversos e webhooks",
|
||||
"bodyRich": "Quando o Monitor muda para HTTPS, as URLs Proxmox VE webhook registradas para notificações também passam de <code>http://</code> para <code>https://</code> automaticamente. Entradas webhook existentes são reescritas da próxima vez que uma regra de notificação for salva ou redetectada, então nenhuma edição manual da configuração de notificação Proxmox é necessária."
|
||||
}
|
||||
},
|
||||
"trustCa": {
|
||||
"heading": "Confiar na CA autoassinada do Proxmox",
|
||||
"intro1Rich": "Para manter o certificado Proxmox predefinido sem ACME, importe a CA raiz do cluster para o repositório de confiança do sistema ou do navegador. O Monitor deteta <code>/etc/pve/local/pve-ssl.pem</code> como certificado de recurso. O cliente passa a confiar no emissor; o URL tem ainda de corresponder a um nome do certificado.",
|
||||
"intro2Rich": "O arquivo CA vive em <code>/etc/pve/pve-root-ca.pem</code> em cada nó. Em um cluster, o caminho está no sistema de arquivos <code>pmxcfs</code> compartilhado, então todos os nós compartilham a mesma raiz, e uma única importação cobre todo o datacenter. Copie para a sua máquina:",
|
||||
"code": "scp root@<your-host>:/etc/pve/pve-root-ca.pem ./pve-root-ca.pem",
|
||||
"thenImport": "Depois importa-o do lado do cliente:",
|
||||
"items": [
|
||||
"<strong>Linux (todo o sistema):</strong> execute <code>sudo cp pve-root-ca.pem /usr/local/share/ca-certificates/pve-root-ca.crt</code> e depois <code>sudo update-ca-certificates</code>. Os navegadores que utilizam o repositório de certificados do sistema (Chromium, Edge) reconhecem a CA após reiniciar; Firefox usa um repositório próprio e requer a importação manual abaixo.",
|
||||
"<strong>macOS:</strong> abra o ficheiro <code>.pem</code> com duplo clique no Acesso a Porta-chaves, adicione-o ao porta-chaves <em>Sistema</em> e defina <em>Confiança → Confiar sempre</em>.",
|
||||
"<strong>Windows:</strong> clique com o botão direito no ficheiro → <em>Instalar certificado</em> → coloque-o em <em>Autoridades de certificação de raiz fidedigna</em>.",
|
||||
"<strong>Firefox (qualquer SO):</strong> <em>Configurações → Privacidade e segurança → Certificados → Ver certificados → Autoridades → Importar</em>; selecione <em>Confiar nesta CA para identificar sites</em>."
|
||||
],
|
||||
"standalone": {
|
||||
"title": "Nós autônomos fora de um cluster",
|
||||
"bodyRich": "Cada host Proxmox não-aglomerado tem seu próprio <code>pve-root-ca.pem</code>. Se você gerenciar vários hosts autônomos, repita a cópia/importação para cada um, ou junte-os a um cluster para que eles compartilhem uma única raiz."
|
||||
}
|
||||
},
|
||||
"disable": {
|
||||
"heading": "Desactivando o HTTPS",
|
||||
"bodyRich": "Clique em <strong>Desativar HTTPS</strong> no mesmo painel. O Monitor reinicia com HTTP sem cifragem, útil se um certificado personalizado ilegível impedir o arranque. Não existe outro passo de desinstalação e os ficheiros de certificados não são alterados.",
|
||||
"stateCallout": {
|
||||
"title": "Onde é guardado o estado",
|
||||
"bodyRich": "<code>/etc/proxmenux/ssl_config.json</code> armazena os caminhos do certificado ativo e a fonte (<code>none</code>, <code>proxmox</code>, <code>custom</code>). Excluir o arquivo é equivalente a desativar o HTTPS — no início seguinte o Monitor cai para o HTTP."
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user