Backup agentless para Proxmox VE. KVM e LXC via API nativa — incremental real, CBT por dirty bitmap, restauração granular de arquivo, restore para cluster diferente.
- Incremental real com dirty bitmap — só envia blocos alterados, sem replicar o disco inteiro.
- Sem agente dentro da VM — captura via PVE API, integração QGA para application-consistent.
- Restore granular de arquivo sem subir a VM inteira — monte o snapshot, copie o que precisa.
- Cross-cluster restore — recupere para nó PVE diferente, opcionalmente diferente Storage backend.
- Snapshots ZFS / Ceph / LVM-thin coordenados — application-consistent quando disponível, crash-consistent garantido.
Comece em 30 dias, no mínimo 50% mais barato. Trial gratuito, RPMs e DEBs assinados, suporte direto com Heitor Faria. Substitua sua licença Veeam, Commvault ou Bacula Enterprise sem quebrar a janela noturna.
Solicitar trial gratuito de 30 dias →
Sumário
- Resumo Executivo
- Introdução
- Casos de Uso
- Arquitetura Técnica
- Referência Detalhada de Funcionalidades
- Procedimento de Instalação
- Guia de Dimensionamento e Configuração
- Matriz de Compatibilidade
- Referência de Parâmetros
- Exemplos de Configuração
- Modelo de Segurança
- Comparativo Competitivo
- Análise de TCO e ROI
- Roadmap
- Conclusão
- Aviso Legal e Contato
- Apêndice
1. Resumo Executivo
Organizações que utilizam Proxmox VE como plataforma de virtualização historicamente enfrentam uma lacuna significativa na proteção de dados em nível empresarial: ou aceitam as limitações do PBS (Proxmox Backup Server) nativo — sem integração com os frameworks corporativos de backup existentes — ou pagam preços premium por soluções independentes de hypervisor que trazem altos custos de licenciamento, arquiteturas complexas e dependência de fornecedor.
O PodHeitor Proxmox Backup, Replication and Conversion Plugin for Bacula elimina essa lacuna de forma decisiva. Trata-se de um plugin com licença comercial e validado em produção que integra nativamente a proteção de máquinas virtuais Proxmox VE ao PodHeitor Backup, um dos mecanismos de backup open-source mais amplamente implantados no mundo. O resultado é uma plataforma de backup unificada que combina o maduro agendamento de jobs, catálogo e gerenciamento de retenção do Bacula com proteção de VMs crash-consistent e application-consistent, backups incrementais-forever usando dirty bitmaps QEMU (CBT), replicação para recuperação de desastres entre nós, restauração instantânea via overlay NBD e migração entre hypervisors do VMware vSphere e Microsoft Hyper-V para Proxmox.
O plugin foi validado em ambiente de produção executando mais de 1.290 jobs — todos concluídos com status Terminated OK — em dois nós Proxmox VE 8.4 executando no Debian 12, coordenados por um PodHeitor Backup Director no Oracle Linux 9.6. O agendamento foi testado sob carga em intervalos de cinco minutos, e o caminho completo de replicação DR com fixação de fingerprint TLS foi confirmado como operacional.
Para executivos e lideranças de TI, as propostas de valor estratégico são:
- Redução de custos: Elimine ferramentas duplicadas. Uma única implantação Bacula cobre servidores físicos, VMs, bancos de dados e, agora, VMs Proxmox.
- Redução de riscos: Replicação DR validada para um nó PVE secundário com provisionamento automatizado de VMs e transporte seguro por TLS.
- Agilidade: A conversão entre hypervisors viabiliza a migração de workloads VMware e Hyper-V para Proxmox sem ferramentas de migração caras de terceiros.
- Conformidade regulatória: Backups application-consistent (quiesce/freeze via QEMU agent), registro de auditoria completo pelo catálogo Bacula e políticas de retenção configuráveis.
- Sem proliferação de daemons adicionais: O agendamento é tratado inteiramente pelo agendador nativo Bacula — nenhum cron job, agente ou serviço adicional.
2. Introdução
2.1 O Problema
Ambientes de TI corporativos que adotaram Proxmox VE como plataforma primária ou secundária de hypervisor enfrentam um desafio recorrente: integração da proteção de dados. A maioria das estratégias corporativas de backup é padronizada em torno de um único framework — comumente Bacula, Veeam ou Commvault — e estender esse framework para cobrir VMs Proxmox normalmente exige uma das seguintes concessões:
- Executar o Proxmox Backup Server (PBS) como sistema paralelo — aceitável para ambientes pequenos, mas introduz um plano de gerenciamento completamente separado, lógica de retenção e fluxo de relatórios que não se integra ao catálogo corporativo de backup.
- Instalar um agente de backup em nível de arquivo dentro de cada VM — anula o propósito do backup em nível de hypervisor, ignora o quiescing pré-snapshot, exige licenciamento por VM e não permite restauração bare-metal ou instantânea.
- Adquirir uma solução empresarial independente de hypervisor — Veeam, Commvault ou Veritas adicionam custos significativos de licenciamento, podem não suportar Proxmox oficialmente e introduzem proliferação de agentes e arquitetura complexa.
- Usar o plugin Proxmox do Bacula Enterprise — disponível, mas restrito à linha comercial do Bacula Enterprise, que cobra custos de licenciamento por front-end ou por TB que se tornam desfavoráveis para implantações Proxmox de médio porte.
2.2 A Solução
O PodHeitor Proxmox Plugin entrega um plugin nativo Bacula que é executado como uma biblioteca compartilhada carregada pelo Bacula File Daemon em cada nó Proxmox VE. Um binário backend de alto desempenho em Rust comunica-se diretamente com a API REST do Proxmox, sockets do QEMU Monitor Protocol (QMP) e interfaces de Network Block Device (NBD) — habilitando backups completos, incrementais e diferenciais de VMs com crash consistency e application consistency opcional.
Como o plugin implementa a API padrão de plugins do Bacula, ele herda todo o ecossistema Bacula:
- Agendamento de jobs, janelas e calendários
- Políticas de retenção e gerenciamento de volumes
- Arquivos bootstrap e restauração baseada em catálogo
- Relatórios e alertas em nível de Director
- Suporte a múltiplos Storage Daemons
- Backends de armazenamento em nuvem (S3, Azure, GCS) via configurações existentes do Bacula SD
2.3 Mercado-Alvo
O plugin é projetado para:
- Empresas de médio e grande porte que executam Proxmox VE 8.x como plataforma primária de virtualização em conjunto com PodHeitor Backup
- Provedores de serviços e MSPs que gerenciam múltiplos ambientes de clientes no Proxmox
- Organizações migrando do VMware ou Hyper-V para Proxmox que precisam de uma ferramenta unificada de migração e backup
- Organizações que já executam Bacula Enterprise ou Community e desejam estender a cobertura para nós Proxmox sem adotar uma plataforma adicional
3. Casos de Uso
3.1 Backup de Toda a Frota de VMs com Estratégia Incremental-Forever
Cenário: Uma empresa de médio porte executa 80 VMs em dois nós Proxmox VE. A equipe de backup deve atingir um RPO de 24 horas e um RTO de 4 horas, com retenção de 90 dias. O orçamento de armazenamento é limitado.
Solução: O plugin é configurado com backup_type=full para jobs semanais de domingo e backup_type=incremental para jobs noturnos. Na primeira execução, um backup completo em nível de imagem captura todos os extents de disco das VMs via NBD. Nas execuções subsequentes, apenas os extents modificados rastreados pelos bitmaps CBT do QEMU são enviados ao Bacula Storage Daemon, reduzindo as janelas de backup de horas para minutos.
Fluxo:
[Sunday 23:00]
Bacula Director triggers FileSet "Proxmox-All-VMs" with backup_type=full
-> Plugin enumerates all VMs on PVE node via REST API
-> For each VM: create consistent snapshot (quiesce=yes via QEMU agent)
-> Open NBD export for each disk
-> Stream all extents to SD -> write to volume
-> Remove snapshot, record CBT bitmap ID in catalog
[Mon-Sat 23:00]
backup_type=incremental
-> Plugin reads CBT bitmap delta since last backup
-> Only dirty extents streamed -> 5-20x smaller backup window
-> Full restore path reconstructed from base + delta chain
Resultado: Backup completo semanal (~escala de TB), incrementais em menos de 30 minutos por noite. Retenção de 90 dias via gerenciamento de pools e volumes Bacula. RTO atendido pelo assistente de restauração baseado em catálogo.
3.2 Replicação para Recuperação de Desastres em Site Secundário
Cenário: Uma empresa de serviços financeiros exige um site secundário que espelhe VMs críticas do cluster PVE primário. O site secundário deve ser capaz de inicializar as VMs de forma independente em até 15 minutos após uma falha no site primário.
Solução: O modo de replicação DR usa uma arquitetura receiver/sender. O nó PVE secundário executa o plugin em mode=receiver, aguardando conexões na porta TCP 9190. O nó primário executa mode=seed (sender), que transmite os dados de disco das VMs por um canal criptografado TLS com autenticação PSK. O receiver provisiona automaticamente a VM alvo no cluster PVE secundário.
Fluxo:
Primary PVE (192.168.15.129) Secondary PVE (192.168.15.102)
mode=seed mode=receiver
vm=127 dr_port=9190
dr_host=192.168.15.102 target_vmid=127
dr_port=9190 storage=local-lvm
|
| TCP:9190 (PSK/TLS encrypted)
+------------------------------------------------->
Auto provision VM 127
Write disk extents
Register in PVE inventory
Resultado: A VM 127 fica disponível no nó PVE secundário em minutos. Em caso de failover, a equipe de operações inicializa a VM 127 no nó de DR. Nenhuma cópia ou importação manual de disco é necessária.
3.3 Restauração Instantânea para Conformidade Rápida com SLA
Cenário: Uma VM de banco de dados de produção falha às 09h15. O backup das 02h00 existe no Bacula Storage Daemon. O SLA do negócio exige restauração do serviço em até 30 minutos.
Solução: O modo de Restauração Instantânea (IR) inicializa a VM diretamente do backup via overlay NBD montado no nó Proxmox. A VM fica ativa em 2 a 5 minutos. Em segundo plano, o plugin migra os discos da VM do overlay NBD para o armazenamento alvo final, de forma transparente e sem interrupção do serviço.
Fluxo:
[09:15] VM failure detected
[09:17] Operator initiates IR restore job
[09:19] Plugin mounts NBD overlay from backup volume on SD
PVE boots VM from NBD overlay -> VM is live (read/write via overlay)
[09:20] VM available to users -- SLA met
[09:20-10:00] Background migration: disk pages copied from NBD overlay
to target_storage=local-lvm
[10:00] Migration complete. VM detached from NBD overlay.
Fully sovereign on local storage.
Resultado: SLA de 30 minutos cumprido às 09h20 — 8 minutos após a detecção da falha.
3.4 Migração entre Hypervisors — VMware para Proxmox
Cenário: Uma empresa está encerrando um contrato de licença perpétua VMware após os aumentos de preço da aquisição pela Broadcom. Eles precisam migrar 40 VMs do vSphere 7 para Proxmox VE 8 com tempo de inatividade mínimo e sem adquirir ferramentas de migração adicionais.
Solução: O plugin inclui um pipeline de conversão validado do formato VMware VMDK para os formatos nativos Proxmox qcow2 ou raw. Os discos VMDK são exportados do vSphere e o plugin realiza a tradução de formato, normalização da geometria de disco e mapeamento da configuração da VM para o formato .conf do Proxmox.
Fluxo:
vSphere 7 Datastore (NFS)
VMDK disks + .vmx config
|
| Direct file access / SCP
v
PodHeitor Backend Conversion Engine
+-- Parse .vmx -> generate Proxmox VM .conf
+-- Convert VMDK -> qcow2 (via internal format pipeline)
+-- Import disk images into PVE storage
+-- Register VM in PVE inventory with converted configuration
|
v
Proxmox VE 8 -- VM ready to boot
Resultado: 40 VMs migradas durante uma janela de manutenção de fim de semana. Zero custos adicionais de licenciamento de ferramentas de migração.
3.5 Backup Application-Consistent para Bancos de Dados
Cenário: Um cluster de banco de dados PostgreSQL é executado dentro de uma VM Proxmox. A equipe de DBA exige backups application-consistent — logs WAL checkpointed e o sistema de arquivos quiesced antes do snapshot — para garantir restauração limpa sem falhas de replay.
Solução: O parâmetro quiesce=yes instrui o plugin a invocar o comando guest-fsfreeze-freeze do QEMU Guest Agent antes de criar o snapshot Proxmox e guest-fsfreeze-thaw após. Isso garante que todas as escritas de sistema de arquivos em andamento sejam confirmadas antes da criação do snapshot.
Fluxo:
Plugin -> QMP socket -> QEMU Agent: guest-fsfreeze-freeze
Wait: all FS buffers flushed, PostgreSQL checkpoint issued
Plugin -> PVE REST API: POST /nodes/{node}/qemu/{vmid}/snapshot
Snapshot created at consistent state
Plugin -> QMP socket -> QEMU Agent: guest-fsfreeze-thaw
VM continues normal operation
Plugin -> NBD: open disk export from snapshot
Stream data to Bacula SD
Resultado: O PostgreSQL é restaurado a partir do backup sem necessidade de replay de WAL. Os testes de restauração confirmam inicialização limpa do banco de dados diretamente a partir da imagem de backup.
3.6 Ambiente MSP Multi-Tenant Automatizado
Cenário: Um provedor de serviços gerenciados hospeda VMs para 30 clientes em um cluster Proxmox compartilhado. Cada cliente tem janelas de backup, requisitos de retenção e destinos de DR diferentes.
Solução: A arquitetura nativa multi-client do Bacula se encaixa naturalmente. Cada grupo de cliente é um Client Bacula separado apontando para um nó PVE dedicado, com FileSets, Schedules, Pools e Storage Daemons independentes. O parâmetro vm= do plugin aceita intervalos de VMID ou padrões de nome, habilitando jobs de backup com escopo por cliente sem modificar nenhuma configuração global.
Resultado: 30 streams de backup independentes, gerenciados a partir de um único Bacula Director, com relatórios, retenção e DR por cliente — tudo sem licenciamento de agente por cliente.
4. Arquitetura Técnica
4.1 Visão Geral dos Componentes
+---------------------------------------------------------------------+
| Bacula Director (RHEL/OL 9.6) |
| +--------------+ +--------------+ +--------------------------+ |
| | Scheduler | | Catalog | | Job/Pool/Volume Mgmt | |
| | (native) | | (PostgreSQL) | | | |
| +--------------+ +--------------+ +--------------------------+ |
+----------------------------+----------------------------------------+
| Bacula Protocol (TCP 9102)
v
+---------------------------------------------------------------------+
| Bacula File Daemon (Proxmox VE Node, Debian 12) |
| +----------------------------------------------------------------+ |
| | podheitor-proxmox-fd.so (plugin FD) | |
| | Loaded by bacula-fd at startup | |
| | Implements: Bacula plugin API (backup/restore/events) | |
| +----------------------------+-----------------------------------+ |
+--------------------------------+------------------------------------+
| Internal Protocol (stdin/stdout pipe)
v
+---------------------------------------------------------------------+
| podheitor-proxmox-backend (Rust binary, high performance) |
| |
| +--------------+ +--------------+ +---------------------------+ |
| | PVE REST | | QMP Client | | NBD Client | |
| | API Client | | (Unix sock) | | (TCP 10809) | |
| | HTTPS:8006 | | QEMU Guest | | Disk extent stream | |
| | TLS pinned | | Agent cmds | | CBT dirty bitmaps | |
| +--------------+ +--------------+ +---------------------------+ |
| |
| +---------------------------------------------------------------+ |
| | DR Transport Engine | |
| | TCP:9190 -- PSK/TLS encrypted | |
| | Receiver: auto VM provisioning + disk write | |
| | Sender: disk delta stream + handshake | |
| +---------------------------------------------------------------+ |
+---------------------------------------------------------------------+
| |
| HTTPS:8006 (TLS pinned) | QMP Unix socket
v v
Proxmox VE REST API QEMU Monitor (per-VM)
- VM lifecycle mgmt - guest-fsfreeze-freeze/thaw
- Snapshot create/delete - disk info queries
- Storage management - bitmap management
- Node enumeration
4.2 O Plugin FD (podheitor-proxmox-fd.so)
A biblioteca compartilhada é carregada pelo Bacula File Daemon no nó Proxmox VE. Suas responsabilidades são:
- Registrar o plugin no FD no momento do carregamento
- Analisar a string
Plugin =do FileSet e extrair os parâmetros chave-valor - Iniciar o processo backend em Rust com os parâmetros de job
- Encaminhar eventos de backup/restauração Bacula para o backend
- Fazer proxy de blocos de dados entre o stream de dados do FD e a saída do backend
Esse design modular significa que a lógica de alto desempenho está inteiramente no binário backend em Rust, que pode ser atualizado e testado independentemente do FD.
4.3 O Backend Rust (podheitor-proxmox-backend)
O binário backend — construído em Rust com memory-safety nativa e sem pausas de GC — é o motor principal, estruturado em torno de cinco subsistemas primários:
| Subsistema | Responsabilidade |
|---|---|
| PVE API Client | Cliente HTTPS autenticado para a API REST do Proxmox. Gerencia ciclo de vida de tokens, fixação de fingerprint TLS, enumeração de VMs, gerenciamento de snapshots e consultas de armazenamento. |
| QMP Client | Cliente de socket de domínio Unix para o QEMU Monitor Protocol. Emite comandos guest-fsfreeze-freeze/thaw, query-block e gerenciamento de bitmaps. |
| NBD Engine | Cliente TCP para o protocolo Network Block Device (TCP 10809). Gerencia negociação de conexão, consultas de extents (para CBT) e streaming de dados de bloco bruto. |
| DR Transport | Protocolo TCP personalizado na porta 9190. TLS baseado em PSK ou certificado. Implementa os papéis de receiver e sender. |
| Conversion Engine | Parser e conversor de VMDK/OVF e VHDX. Gera arquivos .conf nativos do Proxmox e traduz formatos de disco para qcow2 ou raw. |
4.4 Fluxo de Dados: Backup Incremental
Backend reads CBT bitmap from QEMU (via QMP/NBD bitmap query)
|
v Dirty extent list (offset, length pairs)
Backend opens NBD export for snapshot disk
|
v For each dirty extent:
Read block from NBD -> compress (LZ4/zstd) -> write to Bacula data stream
|
v Bacula data stream
Plugin FD forwards to Bacula SD over network
|
v
SD writes to configured Volume (disk/tape/cloud)
|
v
Director updates catalog: job ID, file entries, bitmap checkpoint ID
4.5 Fluxo de Dados: Replicação DR
Sender Node (primary PVE) Receiver Node (DR PVE)
-------------------------- ----------------------
Backend (mode=seed) Backend (mode=receiver)
| |
| 1. TLS handshake (PSK/cert) | Listening on :9190
+------------------------------------->|
| | 2. Validate auth token/cert
| 3. VM metadata (config, disk list) |
+------------------------------------->|
| | 4. Provision VM in PVE inventory
| 5. Disk data stream (extents) |
+------------------------------------->|
| | 6. Write extents to storage
| 7. Completion + bitmap checkpoint |
+------------------------------------->|
| | 8. Finalize VM, mark ready
5. Referência Detalhada de Funcionalidades
5.1 Backup de VM — Completo, Incremental, Diferencial
O plugin suporta três níveis de backup alinhados com o modelo de tipo de job do Bacula:
Completo: Todos os extents de disco de todas as VMs selecionadas são transmitidos do nó PVE para o Bacula Storage Daemon. Um snapshot consistente é criado no lado PVE antes da leitura, garantindo crash consistency. Se quiesce=yes, o QEMU guest agent é invocado para congelar os sistemas de arquivos antes da criação do snapshot.
Incremental: Após um backup completo, os dirty bitmaps CBT (Changed Block Tracking) do QEMU registram quais extents de disco de 64KB foram gravados desde o último backup. O plugin consulta esses extents de bitmap via NBD e transmite apenas os blocos modificados. Isso pode reduzir o volume de dados de backup em 90 a 98% para cargas de trabalho típicas.
Diferencial: Semelhante ao incremental, mas o ponto de referência do bitmap é sempre o último backup completo, e não o último job. Isso simplifica as cadeias de restauração (completo + um diferencial) ao custo de backups diferenciais ligeiramente maiores em comparação com os incrementais.
5.2 Replicação DR de VM — Replicação entre Nós
O subsistema de replicação DR é projetado para recuperação de desastres sem ferramentas adicionais. Ele exige:
- Um segundo nó Proxmox VE (site de DR)
- Conectividade de rede na porta TCP 9190 entre os nós
- O plugin instalado em ambos os nós
O provisionamento automático de VM no receiver significa que os operadores não precisam criar manualmente a VM alvo — o plugin cria a configuração da VM, aloca armazenamento e registra a VM no inventário Proxmox automaticamente. As execuções de replicação subsequentes transmitem apenas os extents modificados.
5.3 Conversão entre Hypervisors
Caminhos de conversão validados:
| Origem | Destino | Status |
|---|---|---|
| VMware vSphere (VMDK) | Proxmox VE (qcow2/raw) | Validado em produção |
| Microsoft Hyper-V (VHDX) | Proxmox VE (qcow2/raw) | Validado em produção |
| Proxmox VE (qcow2) | Proxmox VE (raw) | Nativo |
O motor de conversão realiza tradução de formato de disco, mapeamento de configuração de VM, normalização de driver de armazenamento e geração do arquivo .conf Proxmox pós-conversão.
5.4 Segurança TLS — Fixação de Fingerprint SHA-256
O plugin comunica-se com a API Proxmox via HTTPS:8006. Em vez de exigir uma implantação PKI completa ou desabilitar a verificação TLS, o plugin implementa fixação de fingerprint SHA-256: o operador fornece o hash SHA-256 conhecido do certificado TLS do nó Proxmox no parâmetro pve_fingerprint. O backend valida esse fingerprint em cada conexão, prevenindo ataques MITM mesmo com certificados autoassinados.
5.5 Restauração Instantânea (IR) — Boot via Overlay NBD
A Restauração Instantânea elimina a espera pela restauração completa do disco ao montar o volume de backup como uma exportação NBD diretamente acessível pelo nó PVE. O Proxmox inicializa a VM usando esse disco respaldado por NBD imediatamente. Uma camada de overlay captura novas escritas, para que a VM possa operar normalmente durante a migração em segundo plano.
A migração em segundo plano copia os extents de disco do overlay NBD para o target_storage final de forma transparente. Após a conclusão da migração, a VM é totalmente desconectada do volume de backup. O backup original é preservado sem modificações.
5.6 Quiesce/Freeze — Backups Application-Consistent
Quando quiesce=yes (padrão), o plugin emite guest-fsfreeze-freeze para o QEMU guest agent instalado na VM antes de criar o snapshot Proxmox. Após a criação do snapshot (tipicamente em menos de 1 segundo), guest-fsfreeze-thaw é emitido e a VM retoma a operação normal. A janela total de congelamento é tipicamente de 200 a 800ms, imperceptível para os usuários finais.
Se o guest agent não estiver em execução ou não estiver instalado, o plugin recorre à criação de snapshot crash-consistent e registra um aviso.
5.7 Suporte a Múltiplos Formatos de Disco
| Formato | Leitura | Escrita | Observações |
|---|---|---|---|
| qcow2 | Sim | Sim | Formato nativo Proxmox, suporta bitmaps CBT |
| raw | Sim | Sim | Máximo desempenho, sem overhead de formato |
| vmdk | Sim | Sim (conversão) | Para fluxos de trabalho de importação/exportação VMware |
5.8 Automação de Agendamento
Nenhum daemon adicional, entradas cron ou agendadores externos são necessários. O plugin aproveita integralmente o agendador nativo Bacula. O ambiente de validação em produção foi testado em intervalos de agendamento de 5 minutos com todos os jobs concluídos com sucesso, demonstrando a adequação do plugin para requisitos de alta frequência e RPO curto.
6. Procedimento de Instalação
6.1 Pré-requisitos
Antes de instalar, verifique:
- PodHeitor Backup+ está instalado e operacional (Director, SD, FD)
- O Bacula File Daemon está em execução no nó Proxmox VE de destino
- Proxmox VE 8.0+ está em execução no Debian 11+
- O usuário da API Proxmox possui as permissões adequadas (veja a Seção 6.3)
- A porta TCP 9102 (FD) está aberta entre o Director e o nó PVE
- A porta TCP 9190 está aberta entre nós PVE (se usar replicação de DR)
6.2 Instalando o Plugin no Nó PVE
Passo 1: Implantar os arquivos binários
# On the PVE node (Debian 12)
mkdir -p /usr/lib/bacula/plugins
# Copy the compiled shared library and backend binary
cp podheitor-proxmox-fd.so /usr/lib/bacula/plugins/
cp podheitor-proxmox-backend /usr/lib/bacula/plugins/
# Set ownership and permissions
chown root:bacula /usr/lib/bacula/plugins/podheitor-proxmox-fd.so
chown root:bacula /usr/lib/bacula/plugins/podheitor-proxmox-backend
chmod 750 /usr/lib/bacula/plugins/podheitor-proxmox-fd.so
chmod 750 /usr/lib/bacula/plugins/podheitor-proxmox-backend
Passo 2: Configurar o Bacula File Daemon para carregar o plugin
Edite /etc/bacula/bacula-fd.conf no nó PVE:
FileDaemon {
Name = proxmox-pve1-fd
FDport = 9102
WorkingDirectory = /var/lib/bacula
Pid Directory = /run/bacula
Plugin Directory = /usr/lib/bacula/plugins
Maximum Concurrent Jobs = 10
}
Passo 3: Reiniciar o Bacula File Daemon
systemctl restart bacula-fd
systemctl status bacula-fd
Passo 4: Verificar se o plugin foi carregado
journalctl -u bacula-fd | grep -i podheitor
# Expected: "Loaded plugin: podheitor-proxmox-fd.so"
6.3 Configuração do Usuário da API Proxmox
# On the PVE node
pveum user add bacula@pam --comment "Bacula backup user"
pveum passwd bacula@pam
# Required roles
pveum aclmod / -user bacula@pam -role PVEAuditor
pveum aclmod /vms -user bacula@pam -role PVEVMAdmin
pveum aclmod /storage -user bacula@pam -role PVEDatastoreAdmin
6.4 Obter o Fingerprint TLS
openssl x509 -in /etc/pve/pve-ssl.pem -noout -fingerprint -sha256 |
sed 's/SHA256 Fingerprint=//'
Anote este valor para o parâmetro pve_fingerprint em seus FileSets.
6.5 Configuração do Director
Client {
Name = proxmox-pve1-fd
Address = 192.168.15.129
FDPort = 9102
Catalog = MyCatalog
Password = "your-fd-password"
File Retention = 90 days
Job Retention = 90 days
AutoPrune = yes
}
6.6 Verificar Conectividade
bconsole
*status client=proxmox-pve1-fd
# Expected: Connected, version info, and plugin list
6.7 Configuração do Receptor de DR (Opcional)
No nó PVE secundário (site de DR), execute os mesmos passos de instalação (6.1–6.4). Nenhuma configuração adicional é necessária no receptor — o plugin inicia no modo receptor quando mode=receiver é especificado no FileSet.
# From primary PVE node to DR PVE node
nc -zv 192.168.15.102 9190
7. Guia de Dimensionamento e Configuração
7.1 Dimensionamento de Componentes
Bacula Director
| Nível | CPU | RAM | Armazenamento (Catálogo) | Observações |
|---|---|---|---|---|
| Mínimo | 4 vCPU | 8 GB | 500 GB | Até 50 VMs, retenção de 30 dias |
| Recomendado | 8 vCPU | 16 GB | 2 TB | Até 500 VMs, retenção de 90 dias |
| Grande Escala | 16 vCPU | 32 GB | 10 TB+ | 1000+ VMs, retenção de 1 ano |
Bacula Storage Daemon
| Nível | CPU | RAM | Throughput de Disco | Observações |
|---|---|---|---|---|
| Mínimo | 4 vCPU | 8 GB | 500 MB/s | <10 streams de backup simultâneos |
| Recomendado | 8 vCPU | 32 GB | 2+ GB/s | Até 50 streams simultâneos |
| Grande Escala | 16+ vCPU | 64 GB | 10+ GB/s | 100+ streams simultâneos |
Bacula File Daemon (no Nó PVE)
| Nível | CPU | RAM | Observações |
|---|---|---|---|
| Mínimo | 2 vCPU | 4 GB | Compartilhado com a sobrecarga do PVE |
| Recomendado | 4 vCPU | 8 GB | Permite backups de VMs em paralelo |
Rede
| Cenário | Mínimo | Recomendado |
|---|---|---|
| Backup local (PVE para SD na mesma rede) | 1 Gbps | 10 Gbps |
| Replicação de DR (entre sites) | 100 Mbps | 1 Gbps |
| Replicação de DR via WAN | 10 Mbps (com compressão) | 100 Mbps |
7.2 Ajuste de Desempenho
Backups de VMs simultâneos: Defina Maximum Concurrent Jobs na configuração do FD. Cada backup de VM simultâneo utiliza aproximadamente 200–500 MB de RAM no backend para armazenamento em buffer.
Compressão: Ative a compressão no Bacula SD (Compression = LZ4 nas Opções do FileSet) para cargas de trabalho limitadas por CPU onde o throughput de disco é o gargalo.
Intervalo incremental: Para VMs muito ativas (altas taxas de gravação), intervalos incrementais mais curtos (por hora) produzem deltas menores por Job e backups mais rápidos.
8. Matriz de Compatibilidade
8.1 Versões de Componentes Validadas
| Componente | Versão Mínima | Versão Testada | Status de Validação |
|---|---|---|---|
| PodHeitor Backup | 15.0.0 | 15.0.3 | Validado em produção |
| Proxmox VE | 8.0 | 8.4.18 | Validado em produção |
| Debian (host PVE) | 11 (Bullseye) | 12 (Bookworm) | Validado em produção |
| RHEL / Oracle Linux (Director) | 8 | 9.6 | Validado em produção |
| Ubuntu (Director/SD) | 22.04 LTS | 24.04 LTS | Compatível (testado pela comunidade) |
| PostgreSQL (Catálogo) | 13 | 14+ | Validado em produção |
| QEMU (via PVE) | 8.0 | 9.2 | Validado |
| Linux Kernel (host PVE) | 6.1 | 6.8 | Validado |
8.2 Compatibilidade com Hipervisor de Origem (Conversão)
| Hipervisor de Origem | Versão de Origem | Status |
|---|---|---|
| VMware vSphere | 6.7, 7.0, 8.0 | Validado em produção |
| VMware Workstation | 16, 17 | Compatível |
| Microsoft Hyper-V | 2019, 2022 | Validado em produção |
| KVM / libvirt | Qualquer | Nativo (qcow2/raw) |
| VirtualBox | 7.0 | Compatível (exportação VMDK) |
8.3 Compatibilidade com Backend de Armazenamento (PVE)
| Tipo de Armazenamento Proxmox | Backup | Restauração | Recuperação Instantânea | Observações |
|---|---|---|---|---|
| local-lvm (LVM-thin) | Sim | Sim | Sim | Recomendado para produção |
| local (diretório) | Sim | Sim | Sim | Formato qcow2 |
| NFS | Sim | Sim | Limitado | Desempenho de IR pode variar |
| Ceph RBD | Sim | Sim | Sim | Thin-provisioning nativo |
| ZFS | Sim | Sim | Sim | Amigável a snapshots |
9. Referência de Parâmetros
9.1 Parâmetros de Conexão PVE
| Parâmetro | Aliases | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
pve_host |
pvehost, host |
— | Sim | Endereço IP ou hostname do nó PVE |
pve_user |
pveuser, user |
root@pam |
Não | Nome de usuário da API PVE (formato usuário@realm) |
pve_password |
pvepassword, password |
— | Sim | Senha para o usuário da API PVE |
pve_port |
pveport, port |
8006 |
Não | Porta HTTPS para a API REST do PVE |
pve_realm |
pverealm, realm |
pam |
Não | Realm de autenticação (pam, pve, ldap) |
pve_fingerprint |
pvefingerprint, fingerprint |
— | Recomendado | Fingerprint SHA-256 do certificado TLS do PVE |
pve_insecure |
pveinsecure |
no |
Não | Defina como yes para desabilitar a verificação do certificado TLS (não recomendado) |
9.2 Parâmetros de Seleção de VM
| Parâmetro | Aliases | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
vm |
— | * |
Não | VMID, nome da VM ou padrão curinga. * seleciona todas as VMs no nó |
exclude |
— | (nenhum) | Não | Lista de VMIDs separados por vírgula para excluir do backup |
node |
— | (hostname) | Não | Direcionar para um nó específico do cluster PVE pelo nome |
9.3 Parâmetros de Backup
| Parâmetro | Aliases | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
mode |
— | backup |
Não | Modo de operação: backup, receiver, seed, incremental |
backup_type |
— | full |
Não | Nível de backup: full, incremental, differential |
quiesce |
— | yes |
Não | Emitir guest-fsfreeze antes do snapshot para consistência da aplicação |
include_config |
— | yes |
Não | Incluir o arquivo de configuração da VM no backup |
include_firewall |
— | yes |
Não | Incluir as regras de firewall do PVE no backup |
storage |
storageid |
bacula-store |
Não | ID de armazenamento PVE onde os snapshots são mantidos temporariamente |
9.4 Parâmetros NBD
| Parâmetro | Aliases | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
nbd_host |
nbdhost |
auto |
Não | Hostname para o servidor NBD. auto utiliza o endereço do nó PVE |
nbd_port |
nbdport |
10809 |
Não | Porta TCP para o servidor NBD |
9.5 Parâmetros de DR / Replicação (conjunto completo v1.1.0)
| Parâmetro | Aliases | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
mode |
— | backup |
Sim (para DR) | bitmap-push / seed (origem) / receiver (DR) / daemon / failover-pre / failover-exec / failback-pre / failback-exec / reprotect / replication-status |
dr_host |
drhost |
— | Sim (origem) | IP/hostname do nó PVE receptor de DR |
dr_port |
drport |
9100 + (vmid % 900) |
Não | Porta TCP para o transporte DR. O padrão é derivado por VMID (ex.: 9203 para VMID 103) |
target_vmid |
targetvmid, dr_vmid |
— | Sim (origem) | VMID a ser usado no site de DR para a réplica |
target_storage |
targetstorage, dr_storage |
local-lvm |
Não | Pool de armazenamento PVE no DR para volumes de réplica |
dr_auth_token |
drauthtoken, dr_token |
— | Não* | Segredo compartilhado para transporte DR em modo PSK |
dr_auth_cert |
drauthcert, dr_cert |
— | Não* | Caminho do certificado PEM para transporte DR em mutual-TLS (ativa o modo TLS) |
dr_auth_key |
drauthkey, dr_key |
— | Não* | Caminho da chave privada PEM para mutual-TLS |
dr_ca_cert |
drcacert |
(usa dr_auth_cert como fallback) |
Não | Bundle de certificado CA usado para verificar o par |
max_restore_points |
maxrestorepoints |
3 |
Não | Número máximo de snapshots de restore-point retidos no DR (os mais antigos são removidos automaticamente) |
state_dir |
statedir |
/var/lib/bacula |
Não | Diretório para os arquivos repl-state-*.json / dr-vm-state-*.json por VM |
bitmap_granularity |
bitmapgranularity |
65536 (64 KiB) |
Não | Granularidade do dirty-bitmap do QEMU em bytes (potência de 2) |
cycle_interval |
cycleinterval |
300 (s) |
Não | Modo daemon: segundos entre ciclos |
throttle_bps |
throttlebps, throttle |
0 (desligado) |
Não | Limite de largura de banda para o transporte DR, em bytes/segundo |
verify_sample_blocks |
verifysampleblocks |
0 (desligado) |
Não | v1.1.0: blocos aleatórios de 64 KiB para comparação por hash por ciclo |
* dr_auth_token XOR (dr_auth_cert+dr_auth_key) — escolha um modo de autenticação.
9.6 Parâmetros de Restauração
| Parâmetro | Aliases | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
restore_path |
restorepath |
— | Não | Caminho local para extração da imagem de disco na restauração |
new_vm_name |
newvmname |
— | Não | Nome para a VM restaurada (substitui o nome original) |
target_storage |
targetstorage |
— | Não | ID de armazenamento PVE para os discos da VM restaurada |
overwrite_vmid |
overwritevmid |
— | Não | VMID a ser sobrescrito na restauração (destrutivo; use com cautela) |
start_vm |
startvm, power_on |
no |
Não | Ligar a VM automaticamente após a conclusão da restauração |
9.7 Parâmetros de Recuperação Instantânea
| Parâmetro | Aliases | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
ir_nbd_port |
irnbdport |
auto |
Não | Porta NBD para exportação do disco de IR |
ir_overlay_storage |
iroverlaystorage |
— | Não | Armazenamento PVE para o overlay de gravação durante a sessão de IR |
ir_timeout |
irtimeout |
3600 |
Não | Timeout da sessão de IR em segundos antes da migração forçada |
ir_auto_migrate |
irautomigrate |
no |
Não | Iniciar automaticamente a migração em segundo plano após o boot da VM |
10. Exemplos de Configuração
10.1 FileSet — Backup Completo de Todas as VMs
FileSet {
Name = "Proxmox-All-VMs-Full"
Include {
Options {
signature = MD5
Compression = LZ4
}
Plugin = "podheitor-proxmox:
pve_host=192.168.15.129
pve_user=root@pam
pve_password=yourpassword
pve_fingerprint=D0:C6:19:10:DA:59:68:39:E2:4E:C4:7D:2E:A9:FB:F1:75:E3:51:12:12:D6:3C:5F:51:4B:2B:21:6C:48:DC:9E
vm=*
backup_type=full
quiesce=yes
include_config=yes
include_firewall=yes
storage=local-lvm"
}
}
10.2 FileSet — Backup Incremental
FileSet {
Name = "Proxmox-All-VMs-Incremental"
Include {
Options {
signature = MD5
Compression = LZ4
}
Plugin = "podheitor-proxmox:
pve_host=192.168.15.129
pve_user=root@pam
pve_password=yourpassword
pve_fingerprint=D0:C6:19:10:DA:59:68:39:E2:4E:C4:7D:2E:A9:FB:F1:75:E3:51:12:12:D6:3C:5F:51:4B:2B:21:6C:48:DC:9E
vm=*
backup_type=incremental
quiesce=yes
storage=local-lvm"
}
}
10.3 FileSet — Remetente de Replicação DR
FileSet {
Name = "Proxmox-Replicate-VM127-to-pve2"
Include {
Options { signature = MD5 }
Plugin = "podheitor-proxmox:
pve_host=192.168.15.129
pve_user=root@pam
pve_password=yourpassword
pve_fingerprint=D0:C6:19:10:DA:59:68:39:E2:4E:C4:7D:2E:A9:FB:F1:75:E3:51:12:12:D6:3C:5F:51:4B:2B:21:6C:48:DC:9E
vm=127
mode=seed
dr_host=192.168.15.102
dr_port=9190
target_vmid=127
nbd_port=10809
storage=local-lvm"
}
}
10.4 FileSet — Receptor DR
FileSet {
Name = "Proxmox-DR-Receiver-pve2-VM127"
Include {
Options { signature = MD5 }
Plugin = "podheitor-proxmox:
mode=receiver
pve_host=192.168.15.102
pve_user=root@pam
pve_password=yourpassword
pve_fingerprint=16:A0:9C:94:BF:22:99:8E:29:38:DD:3C:D7:62:04:AC:20:A4:02:48:A0:2A:C7:3D:17:34:81:B4:9A:CC:C8:A2
dr_port=9190
storage=local-lvm
target_vmid=127"
}
}
10.5 Exemplo Completo de Job, Schedule e Pool
Schedule {
Name = "ProxmoxWeeklySchedule"
Run = Full sun at 23:00
Run = Incremental mon-sat at 23:00
}
Job {
Name = "Proxmox-PVE1-Backup"
Type = Backup
Client = proxmox-pve1-fd
FileSet = "Proxmox-All-VMs-Full"
Schedule = "ProxmoxWeeklySchedule"
Storage = File-Storage
Pool = Proxmox-Pool
Messages = Standard
Priority = 10
Maximum Concurrent Jobs = 5
}
Pool {
Name = Proxmox-Pool
Pool Type = Backup
Recycle = yes
AutoPrune = yes
Volume Retention = 90 days
Label Format = "Proxmox-Vol-"
Maximum Volume Bytes = 100G
}
10.6 Job de Recuperação Instantânea
Job {
Name = "Proxmox-InstantRestore-VM127"
Type = Restore
Client = proxmox-pve1-fd
FileSet = "Proxmox-All-VMs-Full"
Storage = File-Storage
Pool = Proxmox-Pool
Messages = Standard
Where = /
Plugin Options = "
ir_nbd_port=10810
ir_overlay_storage=local
ir_timeout=7200
ir_auto_migrate=yes
target_storage=local-lvm
start_vm=yes"
}
11. Modelo de Segurança
11.1 Modelo de Ameaças
O plugin endereça quatro vetores de ameaça primários na infraestrutura de backup:
- Man-in-the-Middle na API PVE: Mitigado por fixação (pinning) de fingerprint de certificado SHA-256
- Acesso não autorizado ao backup: Mitigado pela autenticação do Bacula Director e validação de senha do FD
- Interceptação do transporte DR: Mitigado por PSK ou TLS mútuo no canal de transporte DR
- Exposição de credenciais: Mitigado pelo catálogo criptografado do Bacula e permissões restritas de arquivos
11.2 Fixação de Fingerprint TLS
Ao contrário da validação tradicional de certificados baseada em CA, a fixação de fingerprint verifica os bytes exatos do certificado do servidor de destino. Isso é particularmente adequado para implantações Proxmox onde certificados autoassinados são o padrão e o conjunto de servidores confiáveis é conhecido e estático.
Obtendo o fingerprint:
# Opção 1: Via OpenSSL no nó PVE
openssl x509 -in /etc/pve/pve-ssl.pem -noout -fingerprint -sha256
# Opção 2: Via interface web do PVE
# Dashboard -> Node -> Certificates -> Fingerprint (SHA-256)
11.3 Segurança do Transporte DR
Modo PSK (dr_auth_token): Autenticação HMAC em nível de sessão usando o token compartilhado. Recomendado para replicação entre sites no mesmo datacenter ou protegidos por VPN.
Modo TLS com Certificado (dr_auth_cert + dr_auth_key): TLS mútuo completo. Obrigatório para segmentos de rede não confiáveis (internet pública, interconexões cross-site em colocation).
11.4 Boas Práticas de Gerenciamento de Credenciais
- Armazene senhas PVE no armazenamento criptografado de credenciais do Bacula ou use injeção por variável de ambiente
- Use usuários de API dedicados com privilégios mínimos necessários (consulte a Seção 6.3) em vez de
root@pam - Rotacione tokens de autenticação DR em intervalos regulares (trimestral é o recomendado)
- Restrinja as permissões do diretório
/usr/lib/bacula/plugins/pararoot:bacula750 - Audite os logs do Bacula Director para tentativas de restauração não autorizadas
11.5 Recomendações de Segmentação de Rede
+-------------------+ TCP:9102 +--------------------+
| Bacula Director +---------------->+ PVE Node FD |
| (management net) | | (hypervisor net) |
+-------------------+ +--------------------+
| TCP:9190
v
+--------------------+
| DR PVE Node FD |
| (DR site net) |
+--------------------+
Firewall rules required:
Director -> PVE FD: TCP 9102 inbound
PVE FD -> Bacula SD: TCP 9103 outbound
PVE Primary -> PVE DR: TCP 9190 outbound
PVE DR: TCP 9190 inbound (from primary only)
12. Comparação Competitiva
12.1 Tabela Comparativa de Funcionalidades
| Funcionalidade | Plugin PodHeitor | Veeam B&R | Commvault | Bacula Enterprise |
|---|---|---|---|---|
| Backup Proxmox VE | Nativo | Limitado (v12 beta) | Somente via agente | Nativo |
| CBT incremental | QEMU dirty bitmaps | VMware CBT | CBT | QEMU dirty bitmaps |
| Consistência de aplicação | QEMU agent (fsfreeze) | VSS/VMware tools | VSS | QEMU agent |
| Recuperação Instantânea | Overlay NBD | Instant VM Recovery | Live Recovery | Sim |
| Replicação DR | Integrada | Jobs de replicação | Sim | Limitado |
| Migração VMware para Proxmox | Validado | Não suportado | Não suportado | Não suportado |
| Migração Hyper-V para Proxmox | Validado | Não suportado | Não suportado | Não suportado |
| Fixação de fingerprint TLS | Sim | PKI completa obrigatória | PKI completa obrigatória | Sim |
| Integração com Bacula | Plugin nativo | Produto separado | Produto separado | Nativo |
| Sem daemons adicionais | Sim | Não | Não | Sim |
| Binário nativo Linux | Sim (Rust, binário nativo) | Windows primário | Misto | Sim |
12.2 Licenciamento e Modelo de Custos
| Solução | Modelo de Licenciamento | VMs Proxmox | Custo de Entrada |
|---|---|---|---|
| Plugin PodHeitor | Taxa fixa comercial por nó | Ilimitado por nó | Entre em contato para preços |
| Veeam B&R | Por socket de workload ou por VM | Cobrado por VM | Custo elevado por VM |
| Commvault | Por TB ou por core | Por agente ou por TB | Complexo, custo elevado |
| Bacula Enterprise | Por front-end + módulos | Módulo licenciado | Assinatura anual |
| Proxmox PBS | Gratuito / código aberto | Ilimitado | US$ 0 (sem integração com Bacula) |
12.3 Simplicidade de Arquitetura
| Solução | Novos Componentes Necessários | Servidor Dedicado | Cross-Hypervisor |
|---|---|---|---|
| Plugin PodHeitor | Apenas .so + binário de backend | Não | VMware + Hyper-V validados |
| Veeam | Servidor VBR + VMs Proxy | Sim (Windows) | Suporte limitado a Proxmox |
| Commvault | CommServe + MediaAgent + Agentes | Sim | Sim (licenciamento complexo) |
| Bacula Enterprise | FD Enterprise + módulo de plugin | Director (existente) | Limitado |
Diferencial-chave: O plugin PodHeitor não requer nenhuma nova infraestrutura. Se o PodHeitor Backup já estiver implantado, adicionar proteção Proxmox é uma cópia de arquivo e uma alteração de configuração.
12.4 Evidência em Laboratório — v1.1.0 (2026-04-24)
A seguir estão trechos reais de log capturados durante a execução do gate de pré-GA (transcrição completa em docs/GATE_REPORT_2026-04-24.md). Não são sintéticos — o JobId 3448 do localhost-dir é um Job real do Bacula Director no Director com Oracle Linux 9.6 em 192.168.15.105.
Seed de uma VM de 100 GB, origem → DR
2026-04-24 00:26:43 INFO Starting seed cycle for VM 103
2026-04-24 00:26:43 INFO Connecting to DR receiver at 192.168.15.102:9203
2026-04-24 00:26:43 INFO PSK encryption established (client)
2026-04-24 00:26:47 INFO NBD export size: 107374182400 bytes (102400 MB)
2026-04-24 00:26:51 INFO Seed progress: 0.2% (256 MB) chunk 64/25600 — 3.7s
…
2026-04-24 02:00:24 INFO Seed complete for VM 103: 1 disks, 102400.00 MB in 5623.5s
No lado DR simultaneamente:
2026-04-23 18:26:41 INFO Provisioning replica VM 203 (source VM 103)
2026-04-23 18:26:41 INFO Created VM 203 on node pve2
2026-04-23 18:26:42 INFO Allocated disk: local-lvm:vm-203-disk-0 for VM 203
2026-04-23 18:26:47 INFO Receiving full disk seed for scsi0: 107374182400 bytes
2026-04-23 19:59:42 INFO Full disk done for scsi0: 107374182400 bytes written
Verificação de integridade amostral em um incremental
2026-04-24 07:42:12 INFO Integrity verify OK for scsi0: 10 blocks, all match
2026-04-24 07:42:15 INFO Incremental complete for VM 103: 1 disks, 160 regions, 281.06 MB in 155.9s
Quinze ciclos consecutivos produziram 150 comparações de blocos amostrados, zero divergências (tabela completa em docs/GATE_REPORT_2026-04-24.md).
Ciclo de replicação com TLS mútuo
2026-04-24 08:00:39 INFO TLS (mutual-cert) handshake with 192.168.15.102
2026-04-24 08:00:52 INFO Integrity verify OK for scsi0: 10 blocks, all match
2026-04-24 08:00:55 INFO Incremental complete for VM 103: 1 disks, 28 regions, 3.31 MB in 15.5s
Failover planejado (inicialização da réplica no DR)
2026-04-24 01:42:51 INFO PVE POST https://127.0.0.1:8006/api2/json/nodes/pve2/qemu/203/status/start
2026-04-24 01:42:51 INFO Failover: started VM 203 on DR site
Job acionado pelo Bacula Director — saída real do bconsole
JobId: 3448
Job: Proxmox-Replicate-VM103-Incremental.2026-04-24_08.16.31_02
Backup Level: Full (upgraded from Incremental)
Client: "proxmoxlab-fd" 15.0.3 x86_64-pc-linux-gnu-bacula,debian,12.0
FileSet: "Proxmox-Replicate-VM103"
Non-fatal FD errors: 0
SD Errors: 0
FD termination status: OK
SD termination status: OK
Termination: Backup OK
Instalação turnkey via .deb em nó DR Debian 13 PVE 9
$ apt-get install ./podheitor-proxmox-plugin_1.1.0_amd64.deb
Setting up podheitor-proxmox-plugin (1.0.0-1) ...
$ systemctl enable --now podheitor-receiver@103.service
Created symlink '/etc/systemd/system/multi-user.target.wants/podheitor-receiver@103.service'
→ '/etc/systemd/system/podheitor-receiver@.service'.
$ ss -tlnp | grep 9203
LISTEN 0 128 0.0.0.0:9203 users:(("podheitor-proxm",pid=204793,fd=4))
Emissor JSON do dashboard — saída real
{
"generated_at": "2026-04-24T08:45:12+00:00",
"source_vms": {
"103": {
"source_vmid": 103, "target_vmid": 203,
"source_host": "proxmoxlab", "target_host": "192.168.15.102",
"seeded": true, "total_cycles": 17,
"rpo_actual_seconds": 132,
"last_cycle": {
"cycle_type": "incremental",
"bytes_sent": 1638400, "regions_sent": 8,
"duration_secs": 29.1, "success": true
}
}
},
"dr_vms": {
"103": {
"source_vmid": 103, "local_vmid": 203,
"provisioned": true,
"disks": [{"device":"scsi0","path":"/dev/pve/vm-203-disk-0",
"size_bytes":107374182400,"seeded":true}],
"restore_point_count": 7
}
}
}
13. Análise de TCO e ROI
13.1 Cenário: Ambiente Proxmox com 100 VMs, TCO em 3 Anos
Premissa de base: A organização já executa o PodHeitor Backup para backup de arquivos e bancos de dados.
Opção A: Plugin PodHeitor para Proxmox
| Item de Custo | Ano 1 | Ano 2 | Ano 3 |
|---|---|---|---|
| Licença do plugin (por nó, 2 nós) | Entre em contato | Renovação | Renovação |
| Infraestrutura adicional | US$ 0 | US$ 0 | US$ 0 |
| Treinamento (equipe familiarizada com Bacula) | Mínimo | US$ 0 | US$ 0 |
Opção B: Veeam Backup & Replication (Enterprise Plus)
| Item de Custo | Observações |
|---|---|
| Licença por VM (100 VMs) | Cobrado anualmente, escala com o número de VMs |
| Servidor Proxy Veeam (Windows) | Hardware + licença de SO obrigatórios |
| Treinamento de equipe | Nova plataforma, novo console de gerenciamento |
| Manutenção e suporte | Contrato anual obrigatório |
Opção C: Apenas Proxmox Backup Server
| Item de Custo | Observações |
|---|---|
| Licença PBS | US$ 0 |
| Lacuna em relatórios de conformidade | Custo de risco: sem catálogo de auditoria unificado |
| Lacuna em capacidades DR | Custo de risco: sem orquestração DR empresarial |
13.2 Fatores de ROI
Redução da janela de backup: Backups incrementais com CBT reduzem o volume de dados de backup em 90-98%, diminuindo a largura de banda de rede, a carga de I/O de armazenamento e a duração da janela de backup.
Redução do tempo de restauração: A Recuperação Instantânea elimina a lacuna de RTO. Uma restauração tradicional de 4 horas torna-se uma operação de boot via NBD de 5 minutos.
Eliminação de custos de migração: A conversão cross-hypervisor do VMware ou Hyper-V elimina a necessidade de ferramentas dedicadas de migração, que são licenciadas separadamente nos produtos concorrentes.
Economia com consolidação: Eliminar uma implantação paralela de PBS e usar o Bacula como catálogo único de backup reduz a sobrecarga administrativa, simplifica os relatórios de conformidade e elimina a alocação de armazenamento duplicada.
Estimativa de break-even: Em um ambiente típico de 50 VMs migrando do Veeam, o custo da licença do plugin geralmente é recuperado em 3-6 meses de taxas de renovação do Veeam economizadas.
14. Roadmap
Versão 1.1.0 — Lançada (GA, 2026-04-24) ✅
| Funcionalidade | Status |
|---|---|
| Replicação estilo Veeam (seed + incremental via bitmap-push) | ✅ |
| Verificação de integridade amostral (FNV-1a-64) entre origem e DR | ✅ |
TLS mútuo (rustls + certificados PEM + WebPkiClientVerifier) |
✅ |
| Daemon receptor DR standalone (template systemd, sem bacula-fd no DR) | ✅ |
Escalonamento de receptor multi-VM (uma instância por VMID via @.service) |
✅ |
Failover planejado (failover-exec) + failback (failback-pre) |
✅ |
Emissor JSON de dashboard (--mode=replication-status --vm=*) |
✅ |
Pacotes turnkey .deb + .rpm |
✅ |
Versão 1.1.1 — Planejada (refinamentos de curto prazo)
| Funcionalidade | Descrição | Prioridade |
|---|---|---|
Helper mkcerts.sh |
Gerador one-shot de CA X.509 v3 + certs DR + source | Alta |
| Streams de backup criptografados | AES-256 ponta-a-ponta no nível do plugin (caminho de backup) | Alta |
| Limitação de largura de banda | Limites por job e por nó para o transporte bitmap-push | Alta |
| Relatórios CBT aprimorados | Estatísticas de blocos alterados por VM no catálogo Bacula | Média |
| API REST para orquestração | API HTTP para acionar backups sem bconsole | Média |
Versão 1.2 — Planejada
| Funcionalidade | Descrição | Prioridade |
|---|---|---|
| Suporte multi-cluster | FileSet único direcionando múltiplos clusters PVE | Alta |
| Containers Proxmox (LXC) | Backup e replicação de containers LXC | Alta |
| Restauração direta para S3 compatível | Restaurar diretamente do S3/MinIO sem roteamento pelo SD | Média |
| Scripts pre/post backup | Scripts de hook por VM executados antes e após o backup | Média |
Verificação de integridade de disco completo (mode=verify-full) |
Auditoria periódica de hash do disco inteiro | Média |
Versão 2.0 — Futuro
| Funcionalidade | Descrição | Prioridade |
|---|---|---|
| Proteção Contínua de Dados (CDP) | Replicação quase em tempo real via journal de bloco QEMU | Alta |
| Integração com web Bacularis | Painéis nativos do Bacularis para status do plugin | Alta |
| VMs HA em Cluster Proxmox | VMs HA acompanhadas de forma transparente entre nós durante o backup | Média |
| Backup de PV Kubernetes | Proteção de PersistentVolumes em Kubernetes hospedado no Proxmox | Média |
| Importação Azure/AWS | Upload direto de imagens de VM convertidas para plataformas cloud | Baixa |
15. Conclusão
O Plugin PodHeitor para Backup, Replicação e Conversão Proxmox para o Bacula representa uma solução madura e validada em produção para um desafio empresarial real e urgente: estender uma estratégia unificada de backup ao Proxmox VE sem adotar plataformas adicionais, incorrer em custos de licenciamento por VM desproporcionais ou abrir mão de capacidades de DR e consistência de aplicação.
Com mais de 1.290 jobs de produção concluídos com sucesso, suporte a backups incrementais eternos via QEMU dirty bitmaps, replicação DR com segurança TLS e provisionamento automático de VMs, recuperação instantânea via overlay NBD e conversão cross-hypervisor validada do VMware e Hyper-V — este plugin entrega proteção de dados de nível empresarial a uma fração do custo das soluções concorrentes.
Organizações que já executam o PodHeitor Backup obtêm proteção completa de VMs Proxmox implantando dois arquivos binários e atualizando a configuração do Director. Não há novos servidores para provisionar, nenhum novo console de gerenciamento para aprender e nenhuma cobrança por VM para orçar.
Chamada para Ação
Pronto para avaliar o Plugin PodHeitor para Proxmox em seu ambiente?
Entre em contato com Heitor Faria para discutir seu ambiente específico, obter uma licença de prova de conceito ou agendar uma demonstração técnica:
| Canal | Contato |
|---|---|
| heitor@opentechs.lat | |
| Telefone (EUA) | +1 786 726-1749 |
| WhatsApp (BR) | +55 61 98268-4220 |
Engajamentos de prova de conceito estão disponíveis para oportunidades empresariais qualificadas. Validação de arquitetura de referência, suporte à instalação e desenvolvimento de funcionalidades personalizadas podem ser contratados comercialmente.
Licenciamento
PodHeitor Proxmox Backup Plugin é software proprietário, distribuído por assinatura. Para condições comerciais, demonstração técnica ou diagnóstico gratuito de 30 minutos, fale com a equipe pelos canais abaixo.
Pronto para avaliar?
- 💬 WhatsApp: +1 (786) 726-1749
- ✉️ Email: heitor@opentechs.lat
- 🩺 Diagnóstico gratuito — 30 min com Heitor Faria
16. Aviso Legal e Contato
OFERTA ESPECIAL — TRAGA SUA PROPOSTA DE RENOVAÇÃO
Você está avaliando ou renovando atualmente um contrato para Bacula Enterprise, Veeam, Commvault ou Netbackup?
Traga sua proposta e garantimos um desconto mínimo de 50% — com funcionalidades significativamente superiores.
O Plugin PodHeitor para Proxmox oferece backup nativo de VMs Proxmox, replicação DR, recuperação instantânea e migração cross-hypervisor em um único produto, integrado nativamente ao PodHeitor Backup — a uma fração do custo dos fornecedores legados de backup empresarial.
Contato:
| Autor | Heitor Faria |
| Empresa | PodHeitor / OpenTechs |
| heitor@opentechs.lat | |
| Telefone (EUA) | +1 786 726-1749 |
| WhatsApp (Brasil) | +55 61 98268-4220 |
Aviso Legal:
Copyright 2026 Heitor Faria — Todos os Direitos Reservados.
Este whitepaper e o produto descrito são protegidos por direitos autorais. A reprodução, redistribuição ou divulgação deste documento ou de qualquer parte dele sem autorização por escrito de Heitor Faria é proibida.
O produto aqui descrito é licenciado comercialmente. Os direitos de avaliação, desenvolvimento e redistribuição são regidos pelo contrato de licença comercial aplicável. O uso não autorizado, engenharia reversa ou redistribuição de binários do plugin são proibidos.
Todas as marcas registradas mencionadas neste documento (Proxmox, Bacula, VMware, Veeam, Commvault, Veritas, Red Hat, Oracle, Debian, Microsoft Hyper-V) são propriedade de seus respectivos donos. Sua menção não implica qualquer afiliação ou endosso.
17. Apêndice
A. Glossário
| Termo | Definição |
|---|---|
| Bacula | Programa de backup, restauração e verificação empresarial de código aberto, composto pelos componentes Director, Storage Daemon, File Daemon e Console. |
| Bacula Director | Componente central de gerenciamento que dirige as operações de backup e restauração, mantém o catálogo e executa o agendador. |
| Bacula File Daemon (FD) | Agente instalado no lado do cliente no sistema cujo backup está sendo feito. Para backups Proxmox, instalado no host hipervisor PVE. |
| Bacula Storage Daemon (SD) | Componente responsável por ler e gravar dados de backup em volumes de armazenamento. |
| Plugin API do Bacula | Interface de plugin de biblioteca compartilhada do Bacula, permitindo que código de terceiros estenda a funcionalidade do File Daemon. |
| CBT (Changed Block Tracking) | Mecanismo pelo qual o QEMU rastreia quais extensões de disco foram escritas desde o último backup, viabilizando a transferência incremental de dados. |
| Canal de comunicação interno | Canal de comunicação interno entre o plugin FD e o processo backend, usado para controle de jobs e transferência de dados. |
| PVE (Proxmox VE) | Proxmox Virtual Environment — plataforma hipervisora de código aberto baseada em KVM e LXC, com API de gerenciamento integrada. |
| QEMU | Emulador e virtualizador de máquinas de código aberto. O Proxmox VE usa QEMU/KVM para execução de VMs. |
| QMP (QEMU Monitor Protocol) | Protocolo baseado em JSON sobre um socket de domínio Unix para controlar e consultar uma instância QEMU em execução. |
| NBD (Network Block Device) | Protocolo para exportar dispositivos de bloco via TCP, usado pelo plugin para ler dados de disco de VM a partir de snapshots QEMU. |
| CBT Dirty Bitmap | Estrutura de dados por disco do QEMU que registra quais extensões alinhadas a 64KB foram modificadas desde o último checkpoint de backup. |
| Quiesce / Freeze | O processo de pausar as escritas do sistema de arquivos em uma VM antes da criação do snapshot, para garantir a consistência dos dados. |
| QEMU Guest Agent | Daemon instalado dentro da VM que responde a comandos QMP do hipervisor, viabilizando fsfreeze/thaw para backups consistentes com a aplicação. |
| Fingerprint Pinning | Técnica de segurança TLS em que o hash SHA-256 esperado do certificado de um servidor é fixado, prevenindo MITM mesmo com certificados autoassinados. |
| PSK (Pre-Shared Key) | Método de autenticação em que um segredo compartilhado é configurado em ambas as partes comunicantes, usado para autenticação do transporte DR. |
| Recuperação Instantânea (IR) | Técnica para inicializar uma VM diretamente a partir de seu volume de backup via overlay NBD, alcançando RTO quase zero antes da migração completa para o armazenamento local. |
| RPO (Recovery Point Objective) | Perda máxima de dados aceitável medida em tempo. Um RPO menor exige backups mais frequentes. |
| RTO (Recovery Time Objective) | Tempo máximo aceitável para restaurar o serviço após uma falha. A Recuperação Instantânea reduz drasticamente o RTO. |
| TCO (Total Cost of Ownership) | Custo total de uma solução ao longo de sua vida útil, incluindo licenciamento, infraestrutura, treinamento e sobrecarga operacional. |
| DR (Disaster Recovery) | Políticas e procedimentos para recuperar a infraestrutura de TI após uma falha grave ou desastre. |
| VMDK | Formato de disco de máquina virtual VMware. Usado pelo vSphere e Workstation como formato nativo de disco de VM. |
| VHDX | Formato Virtual Hard Disk Extended usado pelo Microsoft Hyper-V. |
| qcow2 | QEMU Copy-On-Write versão 2 — formato nativo de disco do Proxmox VE com suporte a snapshots, criptografia e compressão. |
| LVM-thin | Provisionamento thin do Logical Volume Manager — usado pelo armazenamento local-lvm do Proxmox para alocação eficiente de disco de VM. |
| Bacularis | Interface de gerenciamento web para o Bacula, oferecendo GUI para gerenciamento de jobs, navegação no catálogo e relatórios. |
| PBS (Proxmox Backup Server) | Produto de servidor de backup dedicado da Proxmox, otimizado para PVE mas sem integração em frameworks externos de backup. |
B. Diagrama de Arquitetura de Referência (Ambiente de Produção)
Production Environment (Validated April 2026)
Network: 192.168.15.0/24
+--------------------------------------------------------------+
| Bacula Director + Storage Daemon |
| Oracle Linux 9.6 / RHEL 9.6 |
| PostgreSQL 14+ (Catalog) |
| PodHeitor Backup |
+------------------------+-------------------------------------+
| TCP:9102 / TCP:9103
+-------------+-------------+
v v
+----------------------+ +----------------------+
| proxmoxlab | | pve2 |
| Proxmox VE 8.4.18 | | Proxmox VE 8.4.18 |
| Debian 12 (amd64) | | Debian 12 (amd64) |
| IP: 192.168.15.129 | | IP: 192.168.15.102 |
| Bacula FD | | Bacula FD |
| podheitor plugin | | podheitor plugin |
| (mode=seed) | | (mode=receiver) |
+----------------------+ +----------------------+
| TCP:9190 (PSK/TLS) ^
+-----------------------------------+
Jobs executed: 1290+ (all T = Terminated OK)
Schedule tested: 5-minute interval
DR replication: validated with TLS fingerprint pinning
C. Perguntas Frequentes
P: O plugin consegue fazer backup de VMs desligadas? R: Sim. VMs desligadas são copiadas diretamente de suas imagens de disco sem necessidade de criação de snapshot. O quiesce é automaticamente ignorado para VMs desligadas.
P: O que acontece se o QEMU guest agent não estiver instalado na VM? R: O plugin recorre ao backup crash-consistent (snapshot sem freeze). Um aviso é registrado em log. O backup é concluído com sucesso; a consistência de aplicação não é garantida, mas a consistência de crash é mantida.
P: Posso usar este plugin com o Bacula Enterprise? R: O plugin implementa a API padrão de plugins do Bacula e é compatível tanto com o PodHeitor Backup quanto com o Bacula Enterprise FD nas versões 15.0.0 e posteriores.
P: Quantas VMs podem ser copiadas simultaneamente? R: A concorrência é limitada pelo Maximum Concurrent Jobs no File Daemon e pelos recursos disponíveis do sistema no nó PVE. Testado com até 10 backups simultâneos de VMs em um nó PVE de 32 cores sem degradação de desempenho.
P: Os dados de backup são criptografados em repouso? R: A criptografia em repouso é tratada pela configuração de criptografia de volumes do Bacula Storage Daemon, que é independente deste plugin. O plugin integra-se de forma transparente com qualquer criptografia de SD configurada.
P: Posso restaurar para um nó PVE diferente do nó de origem do backup? R: Sim. Use os parâmetros target_storage e new_vm_name para restaurar em qualquer nó PVE onde o FD do plugin esteja instalado.
P: Este plugin suporta operações de cluster Proxmox (migração ao vivo durante o backup)? R: Atualmente, o plugin tem como alvo um nó específico. O backup ciente de cluster, acompanhando VMs entre nós, está no roadmap da Versão 2.0.
D. Referências
- Documentação da API REST do Proxmox VE: https://pve.proxmox.com/pve-docs/api-viewer/
- Referência do QEMU Monitor Protocol (QMP): https://qemu-project.gitlab.io/qemu/interop/qemu-qmp-ref.html
- Especificação do Protocolo NBD: https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md
- Referência da API de Plugin Bacula: https://www.bacula.org/bacula-web/developers-guide/plugin-api
- Documentação do PodHeitor Backup: https://www.bacula.org/documentation/
- QEMU Changed Block Tracking (CBT): https://qemu-project.gitlab.io/qemu/interop/bitmaps.html
- Notas de Versão do Proxmox VE 8.4: https://pve.proxmox.com/wiki/Roadmap
Fim do Whitepaper
Copyright 2026 Heitor Faria — Todos os Direitos Reservados heitor@opentechs.lat | +1 786 726-1749 | +55 61 98268-4220 (WhatsApp)
Disponível em:
Português
English (Inglês)
Español (Espanhol)