mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
Merge pull request #486 from jcastro/docs/review-oci-manager
docs: review OCI manager documentation in all seven translations
This commit is contained in:
@@ -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"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user