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.
💰 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
- Executive Summary
- Why This Plugin Exists
- Use Cases
- Architecture Overview
- Feature Comparison vs Commercial Alternatives
- System Requirements & Compatibility
- Recommended Sizing
- Installation Procedure
- Configuration Manual
- Backup Parameters — Complete Reference
- Restore Parameters — Complete Reference
- FileSet & Job Examples
- Replication Capture & Failover
- Automated Restore Flow
- Proof of Functionality — Real Screenshots & Logs
- Security & Signing
- Licensing
- 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:
- Pay for Bacula Enterprise — starts in the tens of thousands
of USD per year for a medium estate.
- Roll their own — fragile scripts, no PITR,
no Accurate mode, no streaming from the File Daemon.
- 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(orlogicalif you use logical replication)archive_mode = onnot required — the plugin usespg_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:
- Role & LSN —
pg_is_in_recovery()+pg_current_wal_lsn()/
pg_last_wal_replay_lsn() via CASE SQL.
- Physical slots —
pg_replication_slotswith slot name,
plugin, type, restart_lsn, confirmed_flush_lsn.
- Logical subscriptions —
pg_subscriptionJOINed with
pg_database to dedupe across databases (pg_subscription is a shared catalog — a subtle bug other tools get wrong).
- Standby signaling —
standby.signalfile 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
- Restore primary with
recovery_target_action=promoteand
recreate_replication_slots=true — slots come back.
- Restore each standby with
restore_as_standby=trueand
primary_conninfo pointing at the new primary.
- 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.puband
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?
- 💬 WhatsApp: +1 (786) 726-1749
- ✉️ Email: heitor@opentechs.lat
- 🩺 Free assessment — 30 min with Heitor Faria
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:
Português (Portuguese (Brazil))
English
Español (Spanish)