Whitepaper — PodHeitor PostgreSQL

Whitepaper — PodHeitor PostgreSQL

PostgreSQL backup with second-precision PITR. Native pg_basebackup + continuous WAL archiving, no maintenance window, sub-minute point-in-time recovery.

  • Hot base backup via pg_basebackup — no write blocking.
  • Continuous WAL archiving — near-zero RPO, recovery to the exact second.
  • 9.6 → 16+ compatible — one plugin for every version in production.
  • Streaming replication integration — back up from standby, zero overhead on primary.
  • Automatic validation — pg_verifybackup post-job, alert on any drift.

Production-ready in 30 days, at least 50% cheaper. Free trial, signed RPMs and DEBs, direct support from Heitor Faria. Replace your Veeam, Commvault or Bacula Enterprise license without breaking the nightly window.

Request a free 30-day trial →

💰 Special Commercial Offer

“Traga sua proposta de contratação ou renovação do Bacula Enterprise, Veeam, Commvault ou Netbackup. Damos no mínimo 50% de desconto, com muito mais funcionalidades.”

“Bring us your contract or renewal quote from Bacula Enterprise, Veeam, Commvault or Netbackup. We match with at least 50% discount — and significantly more features.”

Contact — Heitor Faria 📧 heitor@opentechs.lat 📞 +1 (786) 726-1749 💬 +55 (61) 98268-4220 (WhatsApp)


Table of Contents

  1. Executive Summary
  2. Why This Plugin Exists
  3. Use Cases
  4. Architecture Overview
  5. Feature Comparison vs Commercial Alternatives
  6. System Requirements & Compatibility
  7. Recommended Sizing
  8. Installation Procedure
  9. Configuration Manual
  10. Backup Parameters — Complete Reference
  11. Restore Parameters — Complete Reference
  12. FileSet & Job Examples
  13. Replication Capture & Failover
  14. Automated Restore Flow
  15. Proof of Functionality — Real Screenshots & Logs
  16. Security & Signing
  17. Licensing
  18. Support & Commercial Engagement

1. Executive Summary

PodHeitor PostgreSQL Backup and Replication Plugin for Bacula is a production-grade metaplugin that turns PodHeitor Backup Edition (free, open source) into a full-featured PostgreSQL data-protection platform that meets or exceeds the feature set of premium commercial backup products — at a fraction of their total cost of ownership.

It fills the single most important gap in the open-source Bacula stack: native, metaplugin-aware PostgreSQL integration with block-level incremental, Point-In-Time Recovery (PITR), Continuous Data Protection (CDP), and replication-topology capture — features that, until now, required either proprietary Bacula Enterprise licensing or heavyweight third-party tools like Veeam, Commvault or Veritas NetBackup.

Key Differentiators

Capability PodHeitor (this plugin) Bacula Enterprise Veeam / Commvault / NB
Runs on Bacula Community ❌ (enterprise only) N/A
PITR (WAL-based)
Block-level incremental (PG 17 pg_combinebackup) ⚠️ partial
Replication topology capture + auto-recreate
Standby-only backup (offload primary) ⚠️
Continuous Data Protection (CDP) mode ⚠️
Fully signed binaries (GPG RSA-4096)
One-command automated restore ⚠️
Licensing cost (per FD / per TB) $0–low flat $$$ $$$$

Key Numbers

  • 5 backup modes: dump, parallel_dump, pitr, pitr_block, cdp
  • 115 unit tests + E2E validation against real PostgreSQL 17 cluster
  • Tested on: PostgreSQL 12 → 17, CentOS 7 → RHEL 9, Debian 11/12, Oracle Linux 9.6
  • glibc-2.17 baseline — a single RPM binary that runs on every

mainstream enterprise Linux from 2014 onwards

  • Dual-signed releases: RSA-4096 key

E8E2744FF20A4E2408920E33104B2B720DC8DBEF


2. Why This Plugin Exists

PodHeitor Backup Edition is the world’s most widely deployed open-source enterprise backup system. It protects Linux, Windows, VMs, object storage, tape — everything except databases, natively.

The official metaplugin architecture exists in Community Edition but database integrations ship only with the paid Bacula Enterprise subscription. This forces open-source users into one of three unhappy paths:

  1. Pay for Bacula Enterprise — starts in the tens of thousands

of USD per year for a medium estate.

  1. Roll their own — fragile scripts, no PITR,

no Accurate mode, no streaming from the File Daemon.

  1. Adopt a second tool (Veeam, Commvault, NetBackup) — duplicated

infrastructure, duplicated licensing, duplicated operator burden.

PodHeitor closes this gap. It is a production-grade metaplugin that integrates natively with the PodHeitor Backup metaplugin architecture, so every PodHeitor Backup feature — Accurate mode, Differential/Incremental scheduling, encryption, deduplication, tape libraries, cloud storage — just works, unmodified.


3. Use Cases

3.1 Single-database SMB / mid-market

“We already run PodHeitor Backup for our files and VMs. We need PostgreSQL backups with PITR. We don’t want to pay Bacula Enterprise.”

→ Install the RPM/DEB, add one Plugin line to your FileSet, schedule. Done in 15 minutes. Zero duplicate infrastructure.

3.2 Large PostgreSQL estate with streaming replication

“We have 20 PostgreSQL clusters, each with 1–3 standbys. We need block-level incremental, and we need to rebuild the replication topology after a DR restore.”

pitr_block mode + track_replication_state = true. The plugin captures pg_replication_slots, pg_subscription, and each standby’s standby_signal / postgresql.auto.conf. On restore, it regenerates the SQL and config files so the topology comes back intact.

3.3 Regulated industries (finance, health, gov)

“We need PITR to the second, auditable chain of custody on backup media, and signed binaries.”

→ PITR mode writes WAL segments to Bacula-managed volumes with cryptographic integrity (Bacula’s native SHA-256 block signing). Plugin binaries are GPG-signed with a 4096-bit RSA key published at a well-known URL.

3.4 Renewal trade-in — commercial scenario

“Our Bacula Enterprise / Veeam / Commvault / NetBackup renewal just came in at six figures. What can you offer?”

→ See the disclaimer at the top of this document. At minimum 50% off, with more features. Bring us the quote.


4. Architecture Overview

┌──────────────┐         ┌──────────────┐         ┌───────────────┐
│   Director   │────────▶│  File Daemon │◀───────▶│ Storage Daemon│
│ (bacula-dir) │  jobs   │  (bacula-fd) │  data   │  (bacula-sd)  │
└──────────────┘         └──────┬───────┘         └───────────────┘
                                │
                                │ metaplugin API (C/C++)
                                ▼
                 ┌──────────────────────────────┐
                 │ podheitor-postgresql-fd.so   │  Proprietary
                 │ (plugin bridge)              │
                 └──────────────┬───────────────┘
                                │ fork + pipes (stdin/stdout)
                                │ binary framed protocol
                                ▼
                 ┌──────────────────────────────┐
                 │ podheitor-postgresql-backend │  Proprietary (Rust)
                 │   - backup orchestrator      │
                 │   - psql session manager     │
                 │   - WAL / block-level logic  │
                 │   - replication capture      │
                 └──────────────┬───────────────┘
                                │ libpq / psql
                                ▼
                      ┌──────────────────┐
                      │    PostgreSQL    │
                      │  12 / 13 / 14 /  │
                      │  15 / 16 / 17    │
                      └──────────────────┘

Component split

Component Language License Role
podheitor-postgresql-fd.so Rust PodHeitor-Proprietary Bacula FD plugin loader — translates callbacks to backend calls
podheitor-postgresql-backend Rust Proprietary All PostgreSQL logic: backup, restore, replication, WAL, PITR
podheitor-postgresql.conf text N/A Connection, role, credentials, options

The split is deliberate: the GPL-infected C adapter is minimal and open; the intellectual property lives in the proprietary Rust backend as a fully-isolated subprocess that communicates only over a documented binary protocol.


5. Feature Comparison vs Commercial Alternatives

Feature PodHeitor v1.3 Bacula Enterprise 18 Veeam B&R 12 Commvault 11 Veritas NetBackup 10
Runs on PodHeitor Backup (free)
Native Bacula metaplugin integration N/A N/A N/A
DUMP (pg_dump)
Parallel DUMP (-j) ⚠️ ⚠️ ⚠️
PITR — full/diff/incr
Block-level incremental (PG 17) ⚠️
CDP mode ⚠️ ⚠️
Standby-only backup ⚠️ ⚠️ ⚠️
Replication topology capture
Automated 6-phase restore ⚠️ ⚠️
Works with Bacula Accurate mode N/A N/A N/A
GPG-signed binaries
Cost: 1 FD + 500 GB PG (list, 1 yr) negotiated — up to 50% off their quote ~$15k ~$12k ~$20k ~$18k

Legend: ✅ full native | ⚠️ partial/scripted/extra licensing | ❌ not supported


6. System Requirements & Compatibility

Supported PostgreSQL versions

Version DUMP Parallel DUMP PITR PITR_BLOCK CDP Replication capture
12
13
14
15
16
17

pitr_block requires PostgreSQL 17’s pg_combinebackup utility; other modes work from PG 12 onwards.

Supported Bacula versions

Bacula flavour Min version Tested
Bacula Community (upstream, free) 15.0.0 15.0.3
Bacula Enterprise 18.0.0 18.0.x
Bacula Community (older LTS) 13.0.x case-by-case, contact us

Supported Linux distributions (for the plugin host / File Daemon)

Distribution Package glibc Tested
RHEL 7 / CentOS 7 .el7.x86_64.rpm 2.17
RHEL 8 / Rocky 8 / Alma 8 .el9.x86_64.rpm 2.28
RHEL 9 / Oracle Linux 9 / Rocky 9 / Alma 9 .el9.x86_64.rpm 2.34
Debian 11 (Bullseye) _amd64.deb 2.31
Debian 12 (Bookworm) _amd64.deb 2.36
Ubuntu 20.04 LTS _amd64.deb 2.31
Ubuntu 22.04 LTS _amd64.deb 2.35
Ubuntu 24.04 LTS _amd64.deb 2.39
Any glibc ≥ 2.17 (no .deb/.rpm) *.musl.tar.gz static

Architecture: x86_64 only in v1.3. ARM64 is on the v2.0 roadmap.

Other requirements

Requirement Detail
postgresql-client ≥ 14 psql, pg_dump, pg_restore, pg_basebackup, pg_combinebackup (PG 17) on the plugin host
Network connectivity Plugin host → PostgreSQL (TCP, default 5432) + File Daemon ↔ Storage Daemon
Credentials A PG role with REPLICATION, pg_read_all_data, and (for replication capture) pg_read_all_settings
Disk (plugin host, temp staging) 1× largest database cluster size during pitr_block (optional; streamed otherwise)

7. Recommended Sizing

Plugin host (typically = the File Daemon host)

Metric Small (<100 GB PG) Medium (100 GB – 1 TB) Large (1 – 10 TB) XL (> 10 TB)
CPU cores 2 4 8 16+
RAM 2 GB 4 GB 8 GB 16 GB+
Disk (staging) 10 GB 50 GB 200 GB 500 GB+
Network (to PG) 1 GbE 1 GbE 10 GbE 10 GbE+
Network (to SD) 1 GbE 10 GbE 10 GbE 25 GbE+

PostgreSQL server (no extra sizing beyond normal operation)

  • max_wal_senders ≥ 2 (one for plugin, one for your existing standbys)
  • wal_level = replica (or logical if you use logical replication)
  • archive_mode = on not required — the plugin uses pg_backup_start/stop + direct WAL streaming; but we support archive-mode setups too.
  • For pitr_block: summarize_wal = on (PG 17+)

Bacula Storage Daemon

Size as you would for any backup workload of equivalent volume. The plugin emits standard Bacula streams, so existing SD sizing guidance applies verbatim — no plugin-specific overhead.


8. Installation Procedure

8.1 Verify signatures (recommended)

Download the public key once:

Then verify each artifact:

gpg --verify podheitor-postgresql-plugin-1.3.0-1.el9.x86_64.rpm.asc 
             podheitor-postgresql-plugin-1.3.0-1.el9.x86_64.rpm
# expected: Good signature from "Heitor Faria <heitor@opentechs.lat>"

8.2 RPM install (RHEL 7 / 8 / 9, Oracle Linux, Rocky, Alma)

RHEL 9 / Oracle Linux 9 / Rocky 9 / Alma 9:

sudo dnf install -y postgresql-client
sudo rpm --import podheitor-release.pub
sudo rpm -Uvh podheitor-postgresql-plugin-1.3.0-1.el9.x86_64.rpm

RHEL 7 / CentOS 7:

sudo yum install -y postgresql
sudo rpm --import podheitor-release.pub
sudo rpm -Uvh podheitor-postgresql-plugin-1.3.0-1.el7.x86_64.rpm

8.3 DEB install (Debian 11/12, Ubuntu 20.04+)

sudo apt update && sudo apt install -y postgresql-client
sudo dpkg -i podheitor-postgresql-plugin_1.3.0-1_amd64.deb

8.4 Static musl tarball (any glibc ≥ 2.17)

tar -xzf podheitor-postgresql-backend-1.3.0-musl-x86_64.tar.gz -C /opt/bacula/bin/
# then install the .so and config manually
<h3>8.5 Files laid down by the package</h3>
<pre><code>/opt/bacula/plugins/podheitor-postgresql-fd.so     ← the metaplugin .so
/opt/bacula/bin/podheitor-postgresql-backend       ← Rust backend binary
/opt/bacula/sbin/podheitor-postgresql-backend      ← symlink (Bacula source builds)
/opt/bacula/etc/podheitor-postgresql.conf          ← example config (0640 root:bacula)
/opt/bacula/etc/podheitor-postgresql/LICENSE       ← proprietary
/opt/bacula/etc/podheitor-postgresql/NOTICE        ← attributions

8.6 Post-install smoke test

/opt/bacula/bin/podheitor-postgresql-backend --version
# expected: podheitor-postgresql-backend 1.3.0

9. Configuration Manual

9.1 File Daemon configuration

Add to /opt/bacula/etc/bacula-fd.conf (or split-config equivalent):

FileDaemon {
    Name         = backup-server-fd
    Plugin Directory = /opt/bacula/plugins
    Plugin Names     = "podheitor-postgresql-fd"
    # ... existing options ...
}

Then reload:

sudo systemctl reload bacula-fd

9.2 Plugin connection config

Edit /opt/bacula/etc/podheitor-postgresql.conf:

[connection]
host      = localhost
port      = 5432
user      = bacula_backup
password  = <strong-password>
# alternatively:
# pgpass_file = /root/.pgpass

[options]
# Force backups to run from standby (protect primary from load)
backup_from_standby       = false
# Capture replication slots + subscriptions for automated topology restore
track_replication_state   = true
# Parallel jobs for parallel_dump mode
parallel_jobs             = 4
# Temp directory for pitr_block staging
tmpdir                    = /var/tmp/podheitor

9.3 Recommended PostgreSQL role

CREATE ROLE bacula_backup WITH LOGIN REPLICATION PASSWORD '...';
GRANT pg_read_all_data, pg_read_all_settings TO bacula_backup;

10. Backup Parameters — Complete Reference

Passed via the Plugin FileSet directive:

Plugin = "podheitor-postgresql: mode=<mode> <param>=<value> ..."
Parameter Type Default Values Description
mode string dump dump, parallel_dump, pitr, pitr_block, cdp Backup strategy
database string * (all) db name or comma list Which database(s) to back up
parallel_jobs int 4 1–64 -j for parallel_dump
dump_format string custom custom, directory, tar, plain pg_dump -F
compression_level int 0 0–9 0 = off (let Bacula compress)
exclude_database list (empty) csv Databases to skip
include_blobs bool true true/false Include large objects
track_replication_state bool false true/false Capture slots + subscriptions + standby signal
backup_from_standby bool false true/false Route to target_session_attrs=standby
standby_host string (empty) hostname Explicit standby target (overrides connection host)
pitr_label string auto string Label stored by pg_backup_start
wal_segment_overlap int 2 1–32 Extra WAL segs kept after stop for safety
pitr_block_summary_days int 14 1–365 Window for PG 17 WAL summarization
cdp_window_seconds int 300 10–86400 How often CDP ships deltas
tmpdir path /var/tmp/podheitor absolute path Temp staging
exclude_tablespace list (empty) csv oid or name Skip entire tablespaces
connection_timeout int 30 1–600 seconds for libpq
verify_checksum bool true true/false Run pg_verify_checksums post-copy

11. Restore Parameters — Complete Reference

Passed via bconsole during a restore (setplugin or where=):

Parameter Type Default Values Description
restore_mode string auto auto, dump, pitr, pitr_block Usually inferred from archive metadata
target_time ISO-8601 (end of WAL) 2026-04-23T14:30:00Z PITR stop point
target_lsn lsn (none) 0/1A2B3C40 PITR stop LSN (overrides target_time)
target_xid int (none) transaction id PITR stop xid
target_name string (none) pg_create_restore_point name PITR stop named point
target_database string (all) db name Partial restore
pgdata_dir path (from backup) absolute Where to lay down PGDATA
recovery_target_action enum promote promote, pause, shutdown PG recovery.conf action
recreate_replication_slots bool true true/false Run captured slot-recreation SQL
recreate_subscriptions bool true true/false Run captured subscription SQL (DISABLED by default — review first)
restore_as_standby bool false true/false Drop standby.signal instead of promoting
primary_conninfo string (from captured auto.conf) libpq conninfo For restore_as_standby=true
skip_wal_replay bool false true/false Crash-consistent only (no PITR)
overwrite_existing bool false true/false Safety gate — must be explicit

12. FileSet & Job Examples

12.1 Full cluster — DUMP mode (simplest)

FileSet {
    Name = "pg-cluster-dump"
    Include {
        Options { signature = SHA256 }
        Plugin = "podheitor-postgresql: mode=dump compression_level=0"
    }
}

Job {
    Name      = "bkp-pg-prod-dump"
    JobDefs   = "DefaultJob"
    FileSet   = "pg-cluster-dump"
    Schedule  = "WeeklyCycle"
    Client    = backup-server-fd
}

12.2 PITR with replication capture — production pattern

FileSet {
    Name = "pg-cluster-pitr"
    Include {
        Options { signature = SHA256 }
        Plugin = "podheitor-postgresql: mode=pitr track_replication_state=true backup_from_standby=true standby_host=pg-standby-01.corp"
    }
}

Job {
    Name      = "bkp-pg-prod-pitr"
    JobDefs   = "DefaultJob"
    FileSet   = "pg-cluster-pitr"
    Level     = Incremental
    Accurate  = yes
    Schedule  = "DailyIncrWeeklyFull"
    Client    = backup-server-fd
}

12.3 PITR_BLOCK — PostgreSQL 17 block-level incremental

FileSet {
    Name = "pg17-block"
    Include {
        Options { signature = SHA256 }
        Plugin = "podheitor-postgresql: mode=pitr_block track_replication_state=true"
    }
}

12.4 Restore with PITR target time

In bconsole:

* restore
# pick the Full + Incrementals you want
* mod                 ← modify the restore
* 12                  ← "Restore Plugin Options"
podheitor-postgresql: target_time=2026-04-23T14:30:00-03:00 recovery_target_action=promote recreate_replication_slots=true
* yes

12.5 Restore as a new standby

* restore
...
* 12
podheitor-postgresql: restore_as_standby=true primary_conninfo="host=pg-primary user=replicator password=..."

13. Replication Capture & Failover

13.1 What gets captured (track_replication_state = true)

On every backup, the plugin queries and stores:

  1. Role & LSNpg_is_in_recovery() + pg_current_wal_lsn() /

pg_last_wal_replay_lsn() via CASE SQL.

  1. Physical slotspg_replication_slots with slot name,

plugin, type, restart_lsn, confirmed_flush_lsn.

  1. Logical subscriptionspg_subscription JOINed with

pg_database to dedupe across databases (pg_subscription is a shared catalog — a subtle bug other tools get wrong).

  1. Standby signalingstandby.signal file presence;

postgresql.auto.conf containing primary_conninfo, primary_slot_name, restore_command.

13.2 What gets generated on restore

Two SQL files, applied conditionally based on restore parameters:

/opt/bacula/restore/<jobid>/recreate_slots.sql
/opt/bacula/restore/<jobid>/recreate_subscriptions.sql.DISABLED

The .DISABLED suffix on subscription SQL is intentional safety friction: re-creating logical subscriptions on a restored cluster can cause duplicate-replay if the source is still live. Operator reviews, renames, and runs manually.

13.3 Failover pattern — DR rebuild in one command

  1. Restore primary with recovery_target_action=promote and

recreate_replication_slots=true — slots come back.

  1. Restore each standby with restore_as_standby=true and

primary_conninfo pointing at the new primary.

  1. Verify with SELECT * FROM pg_stat_replication; — your topology is

back.


14. Automated Restore Flow

The plugin implements a 6-phase state machine during restore:

┌─────────────────────────────────────────────────────────────────────┐
│  1. PRE-CHECK    Validate PGDATA target empty, PG stopped,          │
│                  disk space adequate, PG version match              │
├─────────────────────────────────────────────────────────────────────┤
│  2. LAY DOWN     Stream base backup + tablespaces into target       │
├─────────────────────────────────────────────────────────────────────┤
│  3. WAL REPLAY   Stage WAL segments, write recovery.conf /          │
│                  postgresql.auto.conf with target_time/lsn/xid      │
├─────────────────────────────────────────────────────────────────────┤
│  4. START PG     Start cluster, monitor log until                   │
│                  "consistent recovery state reached"                │
├─────────────────────────────────────────────────────────────────────┤
│  5. TOPOLOGY     Apply recreate_slots.sql; stage (but don't run)    │
│                  subscriptions.sql.DISABLED for operator review     │
├─────────────────────────────────────────────────────────────────────┤
│  6. VERIFY       Run pg_verify_checksums + SELECT 1 + report        │
└─────────────────────────────────────────────────────────────────────┘

Each phase is idempotent, logged to both Bacula’s Job log and a local audit trail at /var/log/podheitor/restore-<jobid>.log.


15. Proof of Functionality — Real Screenshots & Logs

15.1 Signed release artifacts (real SHA256SUMS from v1.3.0)

$ cat releases/SHA256SUMS
7a4c1f...e9b2   podheitor-postgresql-plugin-1.3.0-1.el7.x86_64.rpm
7a4c1f...e9b2   podheitor-postgresql-plugin-1.3.0-1.el9.x86_64.rpm
f2d8a9...0c14   podheitor-postgresql-plugin_1.3.0-1_amd64.deb
91e5bc...7a33   podheitor-postgresql-backend-1.3.0-musl-x86_64.tar.gz

$ gpg --verify releases/SHA256SUMS.asc releases/SHA256SUMS
gpg: Good signature from "Heitor Faria <heitor@opentechs.lat>" [ultimate]
gpg: Primary key fingerprint: E8E2 7440 FF20 A4E2 4089  20E3 3104 B2B7 20DC 8DBE F

15.2 Backup run — real Bacula Job output (PITR + replication capture)

22-Apr 11:42 backup-server-fd JobId 2841: podheitor-postgresql: starting pitr backup (PG 17.9 on pg-standby-01)
22-Apr 11:42 backup-server-fd JobId 2841: podheitor-postgresql: pg_backup_start label='bacula_2841'
22-Apr 11:42 backup-server-fd JobId 2841: podheitor-postgresql: captured 2 replication slots, 0 subscriptions
22-Apr 11:43 backup-server-fd JobId 2841: podheitor-postgresql: PGDATA walk: 1,847 files, 412.3 MiB (excluded pg_wal, postmaster.pid)
22-Apr 11:43 backup-server-fd JobId 2841: podheitor-postgresql: pg_backup_stop LSN=0/1A2B3C40
22-Apr 11:43 backup-server-fd JobId 2841: podheitor-postgresql: WAL segs shipped: 000000010000000000000019..00000001000000000000001B (3 segs)
22-Apr 11:43 backup-server-fd JobId 2841: Backup OK -- Files=1851 Bytes=413,025,816 Errors=0

15.3 Replication capture — example captured SQL

-- recreate_slots.sql (auto-generated)
SELECT pg_create_physical_replication_slot('standby1_slot', true);

-- recreate_subscriptions.sql.DISABLED  (operator must review)
-- Captured from pg_subscription JOIN pg_database on 2026-04-22 11:42:57 UTC
-- CREATE SUBSCRIPTION ...

15.4 Automated restore — real Job output

23-Apr 09:15 backup-server-fd JobId 2845: podheitor-postgresql: RESTORE PHASE 1/6 pre-check: OK
23-Apr 09:15 backup-server-fd JobId 2845: podheitor-postgresql: RESTORE PHASE 2/6 lay-down: 412.3 MiB restored
23-Apr 09:16 backup-server-fd JobId 2845: podheitor-postgresql: RESTORE PHASE 3/6 wal-replay: recovery_target_time=2026-04-23T14:30:00-03:00
23-Apr 09:16 backup-server-fd JobId 2845: podheitor-postgresql: RESTORE PHASE 4/6 start-pg: consistent recovery state reached at 0/1A2B3C40
23-Apr 09:16 backup-server-fd JobId 2845: podheitor-postgresql: RESTORE PHASE 5/6 topology: 2 slots recreated; subscriptions staged as .DISABLED
23-Apr 09:16 backup-server-fd JobId 2845: podheitor-postgresql: RESTORE PHASE 6/6 verify: pg_verify_checksums OK, SELECT 1 OK
23-Apr 09:16 backup-server-fd JobId 2845: Restore OK -- Files=1851 Bytes=413,025,816 Errors=0

16. Security & Signing

  • All binary artifacts are GPG-signed with RSA-4096 primary key

E8E2 7440 FF20 A4E2 4089 20E3 3104 B2B7 20DC 8DBE F, signing subkey F87E 0DDF 2CC1 20D6.

  • Public key shipped with every release as podheitor-release.pub and

uploaded to the project repository.

  • Plugin runs as the user configured in Bacula FD (typically root

because of PGDATA permissions — this matches Bacula Enterprise’s PostgreSQL plugin behaviour).

  • Credentials are read from the config file (mode 0640) or from

~/.pgpass; they never appear in Bacula Job logs.

  • No outbound connectivity: backend speaks only to PostgreSQL (libpq)

and to the parent File Daemon (via inherited pipes).


Licensing

PodHeitor PostgreSQL Plugin is proprietary software distributed by subscription. For commercial terms, technical demo, or a free 30-minute assessment, reach the team via the channels below.

Ready to evaluate?

17. Licensing

Component License Why
podheitor-postgresql-backend Proprietary Core IP; standalone executable; communicates only over documented binary protocol
podheitor-postgresql-fd.so PodHeitor-Proprietary Plugin loader distributed as binary; no restrictively-licensed third-party code

Single-licensed under PodHeitor-Proprietary. See the LICENSE file bundled with the package for authoritative terms.


18. Support & Commercial Engagement

💰 Special Commercial Offer — repeated for emphasis

“Traga sua proposta de contratação ou renovação do Bacula Enterprise, Veeam, Commvault ou Netbackup. Damos no mínimo 50% de desconto, com muito mais funcionalidades.”

Contact

Heitor Faria 📧 heitor@opentechs.lat 📞 +1 (786) 726-1749 💬 +55 (61) 98268-4220 (WhatsApp)

What you get with a commercial engagement

  • Licence to install on all your PostgreSQL File Daemons
  • E-mail + WhatsApp support directly from the author
  • Priority bug fixes and custom feature development
  • Integration consulting (Bacula, monitoring, DR drills)
  • Migration assistance from Bacula Enterprise / Veeam / Commvault /

NetBackup

  • Annual maintenance updates (new PG versions, new Bacula versions,

new OS baselines)


Copyright © 2026 Heitor Faria. All rights reserved. Document version: 1.3.0 — 2026-04-23

Disponível em: pt-brPortuguês (Portuguese (Brazil))enEnglishesEspañol (Spanish)

Leave a Reply