Reconstruindo a Infraestrutura Após uma Falha Grave¶
Apesar de todos os nossos esforços de manutenção preventiva e redundância (como o pool ZFS /data em RAID 1), falhas de hardware catastróficas podem ocorrer. O cenário mais impactante seria a falha do seu SSD NVMe principal, que hospeda o sistema operacional Proxmox VE e os discos virtuais das suas máquinas virtuais. Outros cenários podem incluir corrupção irreparável do sistema operacional do host Proxmox ou um desastre físico que afete o servidor.
Este guia descreve como reconstruir a infraestrutura do zero com o que a Estratégia de Backup garante:
- O pool ZFS
/data, intacto nos HDDs ou restaurado do restic (disco externo ou nuvem). Ele traz as configurações das aplicações, os arquivos e os dumps diários de todos os bancos emdocker-volumes/<app>/db-dumps/(Immich:photos/backups/). - O repositório
homeserverno GitHub, com ovault.ymlcriptografado. - As senhas do Ansible Vault e do restic, guardadas fora do servidor.
As VMs não são restauradas de imagem: são recriadas pelo vm-deploy.yml e configuradas pelos playbooks. Os bancos, que viviam no disco local das VMs, voltam pelos dumps.
A Importância dos Backups Off-Site
Se a falha grave afetar todos os discos do servidor (inclusive os HDDs do pool /data), o repositório do restic na nuvem será a única forma de recuperar fotos, arquivos, notas e bancos. Confira de vez em quando os testes de restauração da página de backup.
Cenário de Exemplo Considerado¶
Vamos focar no cenário onde o SSD NVMe principal do seu servidor Proxmox falhou completamente, mas seus HDDs do pool ZFS /data (que contêm os backups das VMs e, idealmente, os dados dos containers ou backups deles) estão intactos e podem ser reutilizados. Se os HDDs do pool /data também falharem, o processo será similar, mas a etapa de restauração dos dados dos datasets ZFS dependerá inteiramente dos seus backups off-site.
Passos Detalhados para Reconstrução da Infraestrutura¶
Siga estes passos metodicamente:
-
Preparar Novo Hardware ou Substituir Componente Defeituoso:
- Se o SSD NVMe falhou, substitua-o por um novo SSD NVMe de capacidade igual ou superior.
- Verifique todas as conexões de hardware (cabos SATA para os HDDs do pool ZFS, RAM, CPU, etc.) para garantir que estão firmes.
-
Instalar o Proxmox VE Base no Novo SSD:
- Siga rigorosamente os passos da Seção 2.1: Instalação do Proxmox VE no Servidor Físico para instalar uma cópia limpa do Proxmox VE no novo SSD NVMe.
- Configuração de Rede do Host: Durante a instalação, configure a rede do novo host Proxmox com o mesmo endereço IP estático que o servidor Proxmox antigo usava (e.g.,
192.168.15.10). Isso simplificará enormemente a restauração das configurações Ansible e a conectividade. - Senha Root: Você pode usar a mesma senha
rootque usava antes (se lembrar e estiver no seu Ansible Vault) ou definir uma nova. Se definir uma nova, lembre-se de atualizar a variávelproxmox_api_passwordno seu Ansible Vault posteriormente.
-
Importar o Pool ZFS
/dataExistente (se os HDDs sobreviveram): Se os HDDs que compunham seu pool/dataestão intactos e foram reconectados ao novo sistema:- No shell do novo host Proxmox (como
root), tente listar pools ZFS que podem ser importados: Se o seu pooldataaparecer na lista, ele está pronto para ser importado. - Importe o pool
data: - Verifique o status do pool importado:
O estado deve ser
ONLINE, e seus datasets (docker-volumes,media,backups, etc.) devem agora estar acessíveis nos seus pontos de montagem usuais (e.g.,/data/docker-volumes). - Se os HDDs do pool
/dataforam perdidos e você precisa restaurar do backup:- Crie um novo pool ZFS
datae os datasets seguindo a Seção 2.2 (mesmos nomes e cotas). - Instale o restic (
apt install restic). O host novo ainda não tem os arquivos de/etc/restic: na máquina de controle,ansible-vault view inventories/home/group_vars/all/vault.ymlmostrarestic_senhaerestic_repositorios; no host, exporteRESTIC_REPOSITORY,RESTIC_PASSWORDe, para a nuvem,AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY(ou rode osetup-proxmox-host.yml, que grava tudo). Use o disco externo, se ele sobreviveu, ou a nuvem, e restaure cada dataset derestic_datasetscomo em Um dataset inteiro. A mídia não está no backup: as *arr baixam de novo o que estiver na biblioteca. - Este é o passo mais demorado (da nuvem, pode levar dias). Comece por
docker-volumes, que é pequeno e destrava o resto.
- Crie um novo pool ZFS
- No shell do novo host Proxmox (como
-
Recriar as VMs:
- Com a máquina de controle pronta (passo 5), rode
playbooks/vm-deploy.yml: ele recria acore-services-vme aai-desktop-vmcom os mesmos IDs, IPs e o passthrough da GPU (seção 3). As VMs ganham discos novos; os bancos voltam pelos dumps no passo 7. - O
/etc/pve/qemu-server/no backup do restic (/etcdo host) mostra a definição exata das VMs antigas, se precisar comparar.
- Com a máquina de controle pronta (passo 5), rode
-
Preparar sua Máquina de Controle Ansible e o Repositório:
- Se sua máquina de controle Ansible original foi perdida ou não está configurada, prepare uma nova seguindo a Seção 1.1: Instalação do Ambiente de Controle (
scripts/bootstrap.sh). - Clone seu repositório
homeserverdo seu serviço Git remoto (GitHub, GitLab, etc.) para sua máquina de controle. - Certifique-se de que você tem acesso à sua senha do Ansible Vault.
- Se sua máquina de controle Ansible original foi perdida ou não está configurada, prepare uma nova seguindo a Seção 1.1: Instalação do Ambiente de Controle (
-
Executar os Playbooks Ansible para Reconfigurar a Infraestrutura: Este é o passo onde a mágica da Infraestrutura como Código acontece!
- Preparar o Novo Host Proxmox para ser Gerenciado pelo Ansible:
- No shell do novo host Proxmox (como
root), crie o usuário Ansible dedicado ({{ proxmox_ansible_user_on_host }}e.g.,proxmox_ansible_user). - Adicione-o ao grupo
sudoe configureNOPASSWDparasudo(conforme detalhado na Seção 2.3: Ações Manuais Prévias). - Na sua máquina de controle Ansible, copie sua chave SSH pública (
~/.ssh/id_ed25519_homelab.pub) para este novo usuário no host Proxmox usandossh-copy-id. - Teste a conexão SSH e a capacidade de
sudosem senha.
- No shell do novo host Proxmox (como
- Executar o Playbook
full-deploy.yml(ou o scriptrestore.sh): Na raiz do repositório, na máquina de controle Ansible (orestore.shentra sozinho emserver/ansible):O playbookbash server/scripts/restore.sh # Este script executa o full-deploy.yml e lida com a senha do vault # OU, se preferir executar diretamente: # cd server/ansible && ansible-playbook -i inventories/home/hosts.ini playbooks/full-deploy.yml --ask-vault-passfull-deploy.ymlnão executa ovm-deploy.yml(rode-o antes, no passo 4). Ele irá:- Executar
setup-proxmox-host.yml: Reconfigurar o host Proxmox (NFS server, firewall, pacotes, Alloy, etc.) para o estado definido. - Executar
setup-base-ubuntu.yml: Reconfigurar a base das VMs (NFS client, UFW, Alloy, Docker, Portainer nacore-services-vm). - Executar
setup-core-networking.yml: Re-deployar as configurações e containers para Traefik, Cloudflared e Authelia. - Executar os playbooks
setup-<stack>-volumes.yml(produtividade/automação, n8n, monitoramento, mídia, fotos, nuvem, IA, notas, Langfuse e agentes): Garantir que os diretórios NFS para as stacks Docker estejam com as permissões corretas e que os arquivos.envsejam recriados nas VMs.
- Executar
- Preparar o Novo Host Proxmox para ser Gerenciado pelo Ansible:
-
Implantar (ou Verificar) as Stacks Docker via Portainer:
- Acesse sua instância Portainer (em
https://portainer.seudominio.com). - Se os dados do volume
docker-volumes/portainer/dataforam restaurados com o pool ZFS, suas configurações de stacks, endpoints e usuários do Portainer podem já estar lá.- Navegue para "Stacks". Se suas stacks estiverem listadas, você pode precisar "Update the stack" para algumas delas (sem mudar o compose, apenas para forçar o Portainer a reconciliar com o estado atual do Docker e carregar os
.envrecriados).
- Navegue para "Stacks". Se suas stacks estiverem listadas, você pode precisar "Update the stack" para algumas delas (sem mudar o compose, apenas para forçar o Portainer a reconciliar com o estado atual do Docker e carregar os
- Se você está recriando as stacks do zero no Portainer (ou se a config do Portainer foi perdida):
Para cada stack do Portainer (na
core-services-vm:apps,media,photos,cloudeagents; naai-desktop-vm:notes,langfuseeai, nesta ordem; acorejá foi implantada pelosetup-core-networking.yml):- Vá para "Stacks" -> "+ Add stack".
- Cole o conteúdo do arquivo
docker-compose.ymlda respectiva stack. - Em Env (Advanced mode), cole o
.envque o Ansible recriou na VM (/opt/portainer_stack_envs/<stack>.env; como). Ele já traz os segredos do vault. - Clique em "Deploy the stack".
- Dados das Aplicações: Como o conteúdo do dataset
/data/docker-volumes(e outros como/data/media) foi restaurado (seja pela importação do pool ZFS original ou de um backup off-site), suas aplicações Docker, ao serem reiniciadas com seus volumes corretamente mapeados, devem encontrar seus dados e configurações anteriores.- Bancos de dados: as VMs novas nascem com os bancos vazios em
/opt/local-data. Para cada um (Authelia, Grafana, Nextcloud, LiteLLM), pare o container da aplicação, restaure o dump mais recente no container do banco e suba a aplicação de novo (Bancos de dados). O Immich restaura o dele pela própria tela de restauração, a partir dephotos/backups/. Faça o Authelia primeiro: sem ele, ninguém entra nos outros.
- Bancos de dados: as VMs novas nascem com os bancos vazios em
- Acesse sua instância Portainer (em
-
Testar Tudo Exaustivamente:
- Verifique o acesso a cada serviço web via seu subdomínio Cloudflare.
- Teste a autenticação com Authelia.
- Verifique a funcionalidade de cada aplicação (Nextcloud, Jellyfin, Home Assistant, Grafana, etc.).
- Confirme que os dados estão presentes e corretos.
- Verifique os logs de todos os componentes (Proxmox, VMs, containers) por quaisquer novos erros.
Este processo de reconstrução, embora possa parecer complexo, é significativamente mais gerenciável e menos propenso a erros do que uma reconstrução totalmente manual, graças à sua Infraestrutura como Código com Ansible e a uma estratégia de backup bem definida. A chave é ter backups confiáveis e um repositório Ansible atualizado.