This is the multi-page printable view of this section. .
Pigsty Docs v4.5
- 1: Get Started
- 2: Deployment
- 3: Concepts
- 3.1: Architecture
- 3.1.1: Nodes
- 3.1.2: Infrastructure
- 3.1.3: PGSQL Arch
- 3.2: ER Model
- 3.2.1: E-R Model of Infra Cluster
- 3.2.2: E-R Model of PostgreSQL Cluster
- 3.2.3: E-R Model of Etcd Cluster
- 3.2.4: MINIO Cluster Model
- 3.2.5: E-R Model of Redis Cluster
- 3.3: Infra as Code
- 3.3.1: Inventory
- 3.3.2: Configure
- 3.3.3: Parameters
- 3.3.4: Conf Templates
- 3.3.5: Use CMDB as Config Inventory
- 3.4: High Availability
- 3.4.1: RPO Trade-offs
- 3.4.2: Failure Model
- 3.4.2.1: Model of Patroni Passive Failure
- 3.4.2.2: Model of Patroni Active Failure
- 3.4.2.3: Network Partition
- 3.4.3: RTO Trade-offs
- 3.4.4: Service Access
- 3.5: Point-in-Time Recovery — A Time Machine for PostgreSQL
- 3.5.1: How PITR Works
- 3.5.2: PITR Architecture
- 3.5.3: PITR Tradeoffs
- 3.5.4: Declarative Recovery
- 3.5.5: PITR Scenarios
- 3.6: Monitoring System
- 3.7: Security and Compliance
- 3.7.1: Security Model
- 3.7.2: Authentication
- 3.7.3: Access Control
- 3.7.4: Encrypted Communication
- 3.7.5: Data Security
- 3.7.6: Compliance
- 3.1: Architecture
- 4: About
- 4.1: Features
- 4.2: History
- 4.3: News & Events
- 4.4: Roadmap
- 4.5: Join the Community
- 4.6: Privacy Policy
- 4.7: License
- 4.8: Sponsor Us
- 4.9: User Cases
- 4.10: Subscription
- 4.11: FAQ
- 4.12: Release Note
- 4.13: Comparison
- 4.13.1: Cost Reference
- 4.13.2: Open-Source Impact
- 5: References
- 5.1: Supported Linux
- 5.2: Modules
- 5.3: File Hierarchy
- 5.4: Parameters
- 5.5: Playbooks
- 5.6: Port List
- 6: Applications
- 6.1: Enterprise Self-Hosted Supabase
- 6.2: Odoo: Self-Hosted Open Source ERP
- 6.3: Dify: AI Workflow Platform
- 6.4: InsForge: AI Backend-as-a-Service
- 6.5: Hindsight: AI Long-Term Memory
- 6.6: FerretDB: MongoDB Protocol
- 6.7: Teable: AI No-Code Database
- 6.8: Gitea: Self-Hosted Git Service
- 6.9: NocoDB: Open-Source Airtable
- 6.10: Mattermost: Open-Source Team Collaboration
- 6.11: Wiki.js: OSS Wiki Software
- 6.12: Maybe: Self-Hosted Personal Finance
- 6.13: Immich: Self-Hosted Photo and Video Library
- 6.14: Kong: API Gateway
- 6.15: Metabase: BI Analytics Tool
- 6.16: Registry: Container Image Cache
- 6.17: JumpServer: Open-Source Bastion Host
- 6.18: ByteBase: Schema Migration
- 6.19: pgAdmin: PostgreSQL GUI
- 6.20: PGWeb: Browser-based PostgreSQL Client
- 6.21: PostgREST: Auto-Generated API
- 6.22: Electric: PostgreSQL Sync Engine
- 6.23: Jupyter: Notebooks and Data Analysis
- 6.24: PGLOG: PostgreSQL Log Analysis Application
- 6.25: NOAA ISD Global Weather Station Historical Data Query
- 6.26: WHO COVID-19 Pandemic Dashboard
- 6.27: StackOverflow Global Developer Survey
- 6.28: DB-Engines Database Popularity Trend Analysis
- 6.29: AWS & Aliyun Server Pricing
- 7: Configuration Templates
- 7.1: meta
- 7.2: rich
- 7.3: slim
- 7.4: fat
- 7.5: infra
- 7.6: vibe
- 7.7: docker
- 7.8: pgsql
- 7.9: pg19
- 7.10: mssql
- 7.11: polar
- 7.12: ivory
- 7.13: agens
- 7.14: pgedge
- 7.15: mysql
- 7.16: pgtde
- 7.17: oriole
- 7.18: PostgreSQL Mongo Mode
- 7.19: ha/simu
- 7.20: ha/octo
- 7.21: ha/full
- 7.22: ha/safe
- 7.23: ha/trio
- 7.24: ha/dual
- 7.25: ha/citus
- 7.26: supabase
- 7.27: app/odoo
- 7.28: app/dify
- 7.29: app/electric
- 7.30: app/maybe
- 7.31: app/teable
- 7.32: app/mattermost
- 7.33: app/registry
- 7.34: app/insforge
- 7.35: app/hindsight
- 7.36: app/immich
- 7.37: app/jumpserver
- 7.38: demo/bare
- 7.39: demo/el
- 7.40: demo/debian
- 7.41: demo/demo
- 7.42: demo/kernel
- 7.43: demo/minio
- 7.44: demo/redis
- 7.45: demo/kafka
- 7.46: demo/mysql
- 7.47: build/oss
- 7.48: build/dev
- 7.49: demo/remote
- 7.50: demo/saas
- 7.51: demo/wool
- 8: Linux Repository
- 8.1: PGDG Repo
- 8.2: GPG Key
- 8.3: INFRA Repo
- 8.3.1: Package List
- 8.3.2: Release Log
- 8.4: PGSQL Repo
- 8.4.1: DNF Changelog
- 8.4.2: APT Changelog
- 9: Operations SOP Index
- 10: Module: PGSQL
- 10.1: Configuration
- 10.1.1: Cluster / Instance
- 10.1.2: Kernel Version
- 10.1.3: Package Alias
- 10.1.4: User/Role
- 10.1.5: Database
- 10.1.6: HBA Rules
- 10.1.7: Access Control
- 10.1.8: Parameters
- 10.2: Service/Access
- 10.3: PostgreSQL Security
- 10.4: Administration
- 10.4.1: Managing PostgreSQL Clusters
- 10.4.2: Managing PostgreSQL Users
- 10.4.3: Managing PostgreSQL Databases
- 10.4.4: Patroni HA Management
- 10.4.5: Managing PostgreSQL HBA Rules
- 10.4.6: Pgbouncer Connection Pooling
- 10.4.7: Managing PostgreSQL Component Services
- 10.4.8: Manage PostgreSQL Cron Jobs
- 10.4.9: Managing PostgreSQL Extensions
- 10.4.10: Upgrading PostgreSQL Major/Minor Versions
- 10.5: Backup & Restore
- 10.5.1: Backup Mechanism
- 10.5.2: Backup Policy
- 10.5.3: Backup Repository
- 10.5.4: Admin Commands
- 10.5.5: Restore Operations
- 10.5.6: Clone a PG Cluster
- 10.6: Data Migration
- 10.7: Tutorials
- 10.7.1: Troubleshooting
- 10.7.2: Manual PITR Drill
- 10.7.3: Enabling HugePage for PostgreSQL
- 10.7.4: Clone and Side-Restore a PostgreSQL Instance
- 10.7.5: Accidental Deletion
- 10.7.6: HA Drill: Handling 2-of-3 Node Failure
- 10.7.7: Bind a L2 VIP to PostgreSQL Primary with VIP-Manager
- 10.7.8: Deploy HA Citus Cluster
- 10.8: Monitoring
- 10.9: Dashboard
- 10.9.1: Overview
- 10.9.1.1: PGSQL Overview
- 10.9.1.2: PGSQL Alert
- 10.9.1.3: PGSQL Shard
- 10.9.2: Cluster
- 10.9.2.1: PGSQL Cluster
- 10.9.2.2: PGRDS Cluster
- 10.9.2.3: PGSQL Activity
- 10.9.2.4: PGSQL Replication
- 10.9.2.5: PGSQL Service
- 10.9.2.6: PGSQL Databases
- 10.9.2.7: PGSQL Patroni
- 10.9.2.8: PGSQL PITR
- 10.9.3: Instance
- 10.9.3.1: PGSQL Instance
- 10.9.3.2: PGRDS Instance
- 10.9.3.3: PGCAT Instance
- 10.9.3.4: PGSQL Persist
- 10.9.3.5: PGSQL Proxy
- 10.9.3.6: PGSQL Pgbouncer
- 10.9.3.7: PGSQL Session
- 10.9.3.8: PGSQL Xacts
- 10.9.3.9: PGSQL Exporter
- 10.9.4: Database
- 10.9.4.1: PGSQL Database
- 10.9.4.2: PGCAT Database
- 10.9.4.3: PGSQL Tables
- 10.9.4.4: PGSQL Table
- 10.9.4.5: PGCAT Table
- 10.9.4.6: PGSQL Query
- 10.9.4.7: PGCAT Query
- 10.9.4.8: PGCAT Locks
- 10.9.4.9: PGCAT Schema
- 10.9.1: Overview
- 10.10: Metrics
- 10.11: Parameters
- 10.12: Playbook
- 10.13: Extensions
- 10.13.1: Quick Start
- 10.13.2: Introduction
- 10.13.3: Packages
- 10.13.4: Download
- 10.13.5: Install
- 10.13.6: Config
- 10.13.7: Create
- 10.13.8: Update
- 10.13.9: Remove
- 10.13.10: Default Extensions
- 10.13.11: Repository
- 10.14: Param Templates
- 10.14.1: Parameter Optimization Policy
- 10.14.2: OLTP Template
- 10.14.3: OLAP Template
- 10.14.4: CRIT Template
- 10.14.5: TINY Template
- 10.15: PG Kernels
- 10.15.1: PostgreSQL
- 10.15.2: Supabase
- 10.15.3: Babelfish
- 10.15.4: Percona
- 10.15.5: openHalo
- 10.15.6: OrioleDB
- 10.15.7: Cloudberry
- 10.15.8: AgensGraph
- 10.15.9: pgEdge
- 10.15.10: DocumentDB
- 10.15.11: Citus
- 10.15.12: IvorySQL
- 10.15.13: PolarDB PG
- 10.15.14: PolarDB Oracle
- 10.15.15: PostgresML
- 10.15.16: Greenplum
- 10.15.17: Neon
- 10.16: FAQ
- 10.17: Misc
- 10.17.1: Service / Access
- 10.17.2: Access Control
- 10.17.3: User / Role
- 10.17.4: Database
- 10.17.5: Authentication / HBA
- 10.1: Configuration
- 11: Module: INFRA
- 11.1: Configuration
- 11.2: Parameters
- 11.3: Playbook
- 11.4: Monitoring
- 11.5: Metrics
- 11.6: FAQ
- 11.7: Administration
- 11.7.1: Nginx Management
- 11.7.2: Software Repository
- 11.7.3: Domain Management
- 11.7.4: Module Management
- 11.7.5: CA and Certificates
- 11.7.6: Grafana High Availability: Using PostgreSQL Backend
- 12: Module: NODE
- 12.1: Configuration
- 12.2: Parameters
- 12.3: Playbook
- 12.4: Administration
- 12.5: Monitoring
- 12.6: Metrics
- 12.7: FAQ
- 13: Module: ETCD
- 13.1: Configuration
- 13.2: Parameters
- 13.3: Administration
- 13.4: Playbook
- 13.5: Monitoring
- 13.6: Metrics
- 13.7: FAQ
- 14: Module: MINIO
- 14.1: Usage
- 14.2: Configuration
- 14.3: Parameters
- 14.4: Playbook
- 14.5: Administration
- 14.6: Monitoring and Alerting
- 14.7: Metrics
- 14.8: FAQ
- 15: Module: REDIS
- 15.1: Configuration
- 15.2: Parameters
- 15.3: Playbook
- 15.4: Administration
- 15.5: Monitoring
- 15.6: Metrics
- 15.7: FAQ
- 16: Module: DOCKER
- 16.1: Usage
- 16.2: Parameters
- 16.3: Playbooks
- 16.4: Metrics
- 16.5: FAQ
- 17: Module: JUICE
- 17.1: Configuration
- 17.2: Parameters
- 17.3: Playbook
- 17.4: Administration
- 17.5: Monitoring
- 17.6: FAQ
- 18: Module: VIBE
- 18.1: Configuration
- 18.2: Parameters
- 18.3: Playbook
- 18.4: Administration
- 18.5: Monitoring
- 18.6: FAQ
- 19: Module: KAFKA
- 19.1: Quick Start
- 19.2: Configuration
- 19.3: Parameters
- 19.4: Administration
- 19.5: Playbook
- 19.6: Monitoring
- 19.7: Metrics
- 19.8: FAQ
- 20: Module: MYSQL
- 20.1: Configuration
- 20.2: Parameters
- 20.3: Administration
- 20.4: Playbook
- 20.5: Monitoring
- 20.6: Metrics
- 20.7: FAQ
- 21: Module: PILOT
- 21.1: Module: DuckDB
- 21.2: Module: TigerBeetle
- 21.3: Module: Kubernetes
- 21.4: Module: Consul
- 21.1: Module: DuckDB
- 22: PIG 1.8 Documentation
- 22.1: Getting Started
- 22.2: Introduction
- 22.3: Installation
- 22.4: Release
- 22.5: pig
- 22.6: pig repo
- 22.7: pig ext
- 22.8: pig build
- 22.9: pig sty
- 22.10: pig inventory
- 22.11: pig postgres
- 22.12: pig patroni
- 22.13: pig pgbackrest
- 22.14: pig pitr
- 23: Piglet Runtime: AI Runtime Sandbox
- 24: Patroni 4.1.4 Documentation
- 24.1: Introduction
- 24.2: Installation
- 24.3: Patroni configuration
- 24.3.1: Dynamic Configuration Settings
- 24.3.2: YAML Configuration Settings
- 24.3.3: Environment Configuration Settings
- 24.4: Patroni REST API
- 24.5: patronictl
- 24.6: Replica imaging and bootstrap
- 24.7: Replication modes
- 24.8: Standby cluster
- 24.9: Watchdog support
- 24.10: Pause/Resume mode for the cluster
- 24.11: DCS Failsafe Mode
- 24.12: Using Patroni with Kubernetes
- 24.13: Citus support
- 24.14: Convert a Standalone to a Patroni Cluster
- 24.15: Integration with other tools
- 24.16: Security Considerations
- 24.17: HA multi datacenter
- 24.18: FAQ
- 24.19: Release notes
- 24.20: Contributing guidelines
- 25: pgBouncer 1.25 Documentation
- 25.1: Features
- 25.2: Configuration: pgbouncer.ini
- 25.3: Usage: pgbouncer command
- 25.4: PgBouncer compilation and installation
- 25.5: Source Releases Download
- 25.6: Changelog
- 25.7: Community
- 25.8: Frequently Asked Questions
- 26: pgBackRest 2.59 Documentation
- 26.1: News
- 26.2: User Guide (Debian/Ubuntu)
- 26.3: User Guide (RHEL)
- 26.4: Command Reference
- 26.4.1: Annotate Command (annotate)
- 26.4.2: Archive Get Command (archive-get)
- 26.4.3: Archive Push Command (archive-push)
- 26.4.4: Backup Command (backup)
- 26.4.5: Check Command (check)
- 26.4.6: Expire Command (expire)
- 26.4.7: Help Command (help)
- 26.4.8: Info Command (info)
- 26.4.9: Repository Get Command (repo-get)
- 26.4.10: Repository List Command (repo-ls)
- 26.4.11: Restore Command (restore)
- 26.4.12: Server Command (server)
- 26.4.13: Server Ping Command (server-ping)
- 26.4.14: Stanza Create Command (stanza-create)
- 26.4.15: Stanza Delete Command (stanza-delete)
- 26.4.16: Stanza Upgrade Command (stanza-upgrade)
- 26.4.17: Start Command (start)
- 26.4.18: Stop Command (stop)
- 26.4.19: Verify Command (verify)
- 26.4.20: Version Command (version)
- 26.5: Configuration Reference
- 26.6: Release Notes
- 26.7: Frequently Asked Questions
- 26.8: Project Metrics
- 27: PG Exporter 1.4 Documentation
- 27.1: Getting Started
- 27.2: Installation
- 27.3: Configuration
- 27.4: API Reference
- 27.5: Deployment
- 27.6: Release Notes
“PostgreSQL In Great STYle”: Postgres, Infras, Graphics, Service, Toolbox, it’s all Yours.
—— Battery-Included, Local-First PostgreSQL Distribution as a Free & Open-Source RDS Alternative
Free & Open Source Local First Production Ready
GitHub | Demo | Blog | Discuss | Discord | DeepWiki | Roadmap | Chinese Docs
Press ⌘ with K on macOS, or Ctrl with K, to open local search and the command palette from anywhere.
Getting Started
Learn the project, understand the concepts, get hands-on on a single node, then go to production — four steps to master Pigsty:
Understand Pigsty’s architecture and design philosophy: high availability, backup & recovery, security and compliance.
Architecture Cluster Model Monitoring IaC HA PITR Service Access Security
Spin up a single-node Pigsty on your laptop or cloud server, and access database services and the web UI.
Plan, prepare, and roll out multi-node, high-availability Pigsty deployments in production environments.
Get Started: Prepare a node with a fresh Linux installation, and run as a user with passwordless ssh and sudo privileges:
Download, Configure and Deploy — Pigsty completes installation in minutes! You can add more nodes and database clusters later.
Next, explore the Web UI, access PostgreSQL services on port 5432, and Grafana dashboards on port 3000 (username / password: admin / pigsty).
You can also wrap PostgreSQL kernel flavors as RDS services: Citus, WiltonDB, IvorySQL, OpenHalo, Percona, OrioleDB, PolarDB, and Supabase.
Modules
Pigsty is composed of modules. Among them, PGSQL / INFRA / NODE / ETCD (the PINE stack) are required for self-hosting PostgreSQL RDS services:
Self-healing HA PostgreSQL clusters: HA, PITR, IaC, ACL, and monitoring included, with massive extension support out of the box.
Configuration Administration Backup & PITR Services Kernels Parameters
Nginx, local software repo, DNS, NTP, and the VictoriaMetrics & Grafana observability stack.
Manage host nodes into the desired state: node monitoring, log collection, VIP, and HAProxy load balancing.
Reliable distributed consensus storage (DCS), providing cluster metadata for PostgreSQL high availability.
There are also optional modules that work well alongside PostgreSQL, bringing extra value to your data infrastructure:
S3-compatible object storage, an optional centralized repository for database backups.
High-performance in-memory data structure server with standalone, cluster, and sentinel modes.
Container runtime for launching containerized, stateless software and application templates.
JuiceFS distributed file system with PostgreSQL as the metadata engine, providing shared POSIX storage.
AI coding sandbox: Code-Server, JupyterLab, Claude Code, and Codex CLI.
Apache Kafka 4.x dynamic KRaft message queue clusters with security and monitoring included.
Native MySQL 8.4 LTS as a standalone instance or a three-node InnoDB Cluster.
Experimental module family: Kubernetes, DuckDB, TigerBeetle, and more for early adopters.
Reference
Comprehensive references, the extension catalog, ready-to-use templates, and companion tool manuals:
Detailed reference lists: operating systems, file hierarchy, ports, metrics, and product comparisons.
Linux Support Modules File Hierarchy Ports Comparison Cost Reference SOP
A catalog of 576 packaged PostgreSQL ecosystem extensions: metadata, docs, downloads, and support matrix.
Ready-to-use cluster configuration templates, plus containerized software and application templates.
Manuals for the companion tools Pigsty builds upon: packaging, HA, connection pooling, backup, and monitoring.
1 - Get Started
Pigsty uses a scalable architecture design, suitable for both large-scale production environments and single-node development/demo environments. This guide focuses on the latter.
If you intend to learn about Pigsty, you can start with the Quick Start single-node deployment. A Linux virtual machine with 1C/2G is sufficient to run Pigsty.
You can use a Linux MiniPC, free/discounted virtual machines provided by cloud providers, Windows WSL, or create a virtual machine on your own laptop for Pigsty deployment. Pigsty provides out-of-the-box Vagrant templates and Terraform templates to help you provision Linux VMs with one click locally or in the cloud.
The single-node version of Pigsty includes all core features: 576 PG extensions, self-contained Grafana/Victoria monitoring, IaC provisioning capabilities, and local PITR point-in-time recovery. If you have external object storage (for PostgreSQL PITR backup), then for scenarios like demos, personal websites, and small services, even a single-node environment can provide a certain degree of data persistence guarantee. However, single-node cannot achieve High Availability—automatic failover requires at least 3 nodes.
If you want to install Pigsty in an environment without internet connection, please refer to the Offline Install mode. If you only need the PostgreSQL database itself, please refer to the Slim Install mode. If you are ready to start serious multi-node production deployment, please refer to the Deployment Guide.
Quick Start
Prepare a node with compatible Linux system, and execute as an admin user with passwordless ssh and sudo privileges:
Yes, it’s that simple. You can use pre-configured templates to bring up Pigsty with one click without understanding any details.
Next, you can explore the Graphical User Interface, access PostgreSQL database services; or perform configuration customization and execute playbooks to deploy more clusters.
1.1 - Single-Node Installation
This is the Pigsty single-node install guide Single Node. For multi-node HA production deployment, refer to the Deployment docs.
Pigsty single-node installation consists of three steps: Install, Configure, and Deploy.
Summary
Prepare a node with compatible OS, and run as an admin user with nopass ssh and sudo:
This command runs the install script, downloads and extracts Pigsty source to your home directory and installs dependencies. Then complete Configure and Deploy:
Enter the Source Directory
Generate the Inventory
Skip this step if you already have a prepared pigsty.yml.
Run the Deployment Playbook
After installation, access the Web UI via IP/domain + port 80/443 through Nginx,
and access the default PostgreSQL service via port 5432.
The complete process takes 3–10 minutes depending on server specs/network. Offline installation speeds this up significantly; for monitoring-free setups, use Slim Install for even faster deployment.
Video Example: Online Single-Node Installation (Debian 13, x86_64)
Prepare
Installing Pigsty involves some preparation work. Here’s a checklist.
For single-node installations, many constraints can be relaxed—typically you only need to know your IP address. If you don’t have a static IP, use 127.0.0.1.
| Item | Requirement | Item | Requirement |
|---|---|---|---|
| Node | 1-node, at least 1C2G, no upper limit | Disk | /data mount point, xfs recommended |
| OS | Linux x86_64 / aarch64, EL/Debian/Ubuntu | Network | Static IPv4; single-node without fixed IP can use 127.0.0.1 |
| SSH | nopass SSH login via public key | SUDO | sudo privilege, preferably with nopass option |
Typically, you only need to focus on your local IP address—as an exception, for single-node deployment, use 127.0.0.1 if no static IP available.
Install
Use the following commands to auto-install Pigsty source to ~/pigsty (recommended). Deployment dependencies (Ansible) are installed automatically.
If you prefer not to run a remote script, you can manually download or clone the source. When using git, always checkout a specific version before use.
For manual download/clone installations, run the bootstrap script to install Ansible and other dependencies. You can also install them yourself.
Configure
In Pigsty, deployment blueprints are defined by the inventory, the pigsty.yml configuration file. You can customize through declarative configuration.
Pigsty provides the configure script as an optional configuration wizard,
which generates an inventory with good defaults based on your environment and input:
The generated config file is at ~/pigsty/pigsty.yml by default. Review and customize as needed before installation.
Many configuration templates are available for reference. You can skip the wizard and directly edit pigsty.yml:
The output below is from v4.5.0. If you install another version, the first line reports that version.
Common configure Arguments
-i | --ip,The primary private IP of the current host, used to replace the
10.10.10.10placeholder in the inventory.-c | --conf,A configuration template name relative to
conf/, without the.ymlsuffix.-v | --version,PostgreSQL major version
14through19; PG19 is Beta, so use the dedicatedpg19template.-r | --region, ,Upstream repository region for faster downloads:
default,china, oreurope.-n | --non-interactive, ,Use command-line arguments for the primary IP and skip the interactive wizard.
-x | --proxy, ,Use current environment variables to configure
proxy_env.
If your machine has multiple IPs bound, use -i|--ip <ipaddr> to explicitly specify the primary IP, or provide it in the interactive prompt.
The script replaces the placeholder 10.10.10.10 with your node’s primary IPv4 address. Choose a static IP; do not use public IPs.
We strongly recommend modifying default passwords and credentials in the config file before installation. See Security Recommendations for details.
Deploy
Pigsty’s deploy.yml playbook applies the blueprint from Configure to target nodes.
When you see pgsql init done, PLAY RECAP and similar output at the end, installation is complete!
Upstream repos used by Pigsty (like Linux/PGDG repos) can sometimes enter a broken state due to improper updates, causing deployment failures (this has happened multiple times)! You can wait for upstream fixes or use pre-made offline packages to solve this.
Warning: Running deploy.yml again on an existing deployment may restart services and overwrite configurations!
Interface
After single-node installation, you typically have four modules installed on the current node:
PGSQL, INFRA, NODE, and ETCD.
The INFRA module provides a graphical management interface, accessible via Nginx on ports 80/443.
The PGSQL module provides a PostgreSQL database server, listening on 5432, also accessible via Pgbouncer/HAProxy proxies.
More
Use the current node as a base to deploy and monitor more clusters: add cluster definitions to the inventory and run:
Most modules require the NODE module installed first. See available modules for details:
1.2 - Docker Deployment
Pigsty is designed for native Linux, but can also run in Linux containers with systemd. If you don’t have native Linux (e.g., macOS or Windows), use Docker to spin up a local single-node Pigsty for testing.
Quick Start
Enter the docker/ dir in Pigsty source and launch with one command:
After deployment, access services:
| Service | URL / Command | Credentials |
|---|---|---|
| SSH | ssh root@localhost -p 2222 | Password: pigsty |
| Web Portal | http://localhost:8080 | - |
| Grafana | http://localhost:8080/ui | admin / grafana_admin_password |
| PostgreSQL | psql 'postgres://dbuser_dba:<pg_admin_password>@localhost:5432/postgres' | pg_admin_password |
make launch runs ./configure -g internally to generate random passwords. You can check them with:
Web Portal and PostgreSQL are only available after Deployment (./deploy.yml) completes.
Prepare
Docker deployment requires:
| Item | Requirement | Item | Requirement |
|---|---|---|---|
| Docker | Docker 20.10+ (Desktop or CE) | CPU | At least 1 core |
| RAM | At least 2GB | Disk | At least 20GB free |
Ensure default host ports (2222/8080/8443/5432) are available, or edit .env first.
- Quick Pigsty experience on macOS/Windows without native Linux
- Learning and testing Pigsty features, dev and debug
- Quick local PostgreSQL dev environment
- Production: Container perf and stability inferior to native Linux
- HA Clusters: Docker single-node mode can’t achieve multi-node HA
- Large Scale: Use native Linux VMs or physical machines
Image
Pigsty provides an out-of-the-box Docker image on Docker Hub.
| Image | Pull | Size | Contents |
|---|---|---|---|
pgsty/pigsty | ~500MB | 1.3GB | Debian 13 + systemd + SSH + pig + Ansible |
- Supports both amd64 (x86_64) and arm64 (Apple Silicon, AWS Graviton)
- Image tags follow Pigsty versions.
latestandv4.5.0both point at the current release; pin the version tag for reproducible builds. - Pre-configured with docker template, ready to run
./deploy.yml
Built on Debian 13 (Trixie), pre-installed with pig CLI and Ansible, Pigsty source already initialized.
Launch
Pigsty provides out-of-the-box Docker support in the docker/ source directory.
Simplest way is make launch, which auto-completes: start container, generate config, and deploy:
Or step by step for inspection at each stage:
To build locally instead of pulling from Docker Hub:
Config
Customize image version and port mappings via .env:
Port Mapping:
| Env Var | Default | Container | Description |
|---|---|---|---|
PIGSTY_VERSION | v4.5.0 | - | Current main source default; verify the remote tag separately |
PIGSTY_SSH_PORT | 2222 | 22 | SSH access port |
PIGSTY_HTTP_PORT | 8080 | 80 | Nginx HTTP port |
PIGSTY_HTTPS_PORT | 8443 | 443 | Nginx HTTPS port |
PIGSTY_PG_PORT | 5432 | 5432 | PostgreSQL port |
Override via env vars if defaults are occupied:
Commands
Pigsty Docker provides Makefile commands for container and image management.
Docker Compose
Recommended way to run:
Container Access
Image Build
Image Management
Cleanup
The current Makefile no longer provides a countdown prompt. After removing the container, make purge runs rm -rf -- ./data directly. Verify the current directory and target data first, and back it up when necessary.
Manual Run
If you prefer docker run over Docker Compose:
Or use Makefile’s make run:
How It Works
Pigsty Docker image is based on Debian 13 (Trixie) with systemd as init.
Service management inside container stays consistent with native Linux via systemctl.
Key features:
- systemd support: Full systemd for proper service management
- SSH access: Pre-configured SSH, root password is
pigsty - Privileged mode: Requires
--privilegedfor systemd - Data persistence: Via
/datavolume mount - Pre-installed: pig CLI + Ansible, Pigsty source initialized
Image build executes these init steps:
Running ./configure with -c docker applies the Docker-optimized config template:
- Uses
127.0.0.1as default IP - Tuned for container environment
FAQ
Container won’t start
Ensure Docker is properly installed with sufficient resources. On Docker Desktop, allocate at least 2GB RAM. Check for port conflicts on 2222, 8080, 8443, 5432.
Can’t access services
Web Portal and PostgreSQL only available after deployment. Ensure ./deploy.yml finished successfully.
Use make status to check service status.
Port conflicts
Override via .env or env vars:
Data persistence
Container data mounted to ./data. To wipe and start fresh:
macOS performance
On macOS with Docker Desktop, performance is worse than native Linux due to virtualization overhead. Expected—Docker deployment is for dev/testing. For production, use native Linux installation.
More
- Docker Hub: https://hub.docker.com/r/pgsty/pigsty
- Source Directory: https://github.com/pgsty/pigsty/tree/main/docker
- Quick Start: Native Linux Installation
- Offline Installation: Offline
- Production Deployment: Deployment Guide
1.3 - Web Interface
After single-node installation, you’ll have the INFRA module installed on the current node, which includes an out-of-the-box Nginx web server.
The default server configuration provides a WebUI graphical interface for displaying monitoring dashboards and unified proxy access to other component web interfaces.
Access
You can access this graphical interface by entering the deployment node’s IP address in your browser. By default, Nginx serves on standard ports 80/443.
| Direct IP Access | Domain (HTTP) | Domain (HTTPS) | Demo |
|---|---|---|---|
http://10.10.10.10 | http://i.pigsty | https://i.pigsty | https://demo.pigsty.io |
Monitoring
To access Pigsty’s monitoring system dashboards (Grafana), visit the /ui endpoint on the server.
| Direct IP Access | Domain (HTTP) | Domain (HTTPS) | Demo |
|---|---|---|---|
http://10.10.10.10/ui | http://i.pigsty/ui | https://i.pigsty/ui | https://demo.pigsty.io/ui |
If your service is exposed to Internet or office network, we recommend accessing via domain names and enabling HTTPS encryption—only minimal configuration is needed.
Endpoints
By default, Nginx exposes the following endpoints via different paths on the default server at ports 80/443:
| Endpoint | Component | Native Port | Description | Public Demo |
|---|---|---|---|---|
/ | Nginx | 80/443 | Homepage, local repo, file service | demo.pigsty.io |
/ui/ | Grafana | 3000 | Grafana dashboard portal | demo.pigsty.io/ui/ |
/vmetrics/ | VictoriaMetrics | 8428 | Time series database Web UI | demo.pigsty.io/vmetrics/ |
/vlogs/ | VictoriaLogs | 9428 | Log database Web UI | demo.pigsty.io/vlogs/ |
/vtraces/ | VictoriaTraces | 10428 | Distributed tracing Web UI | demo.pigsty.io/vtraces/ |
/vmalert/ | VMAlert | 8880 | Alert rule management | demo.pigsty.io/vmalert/ |
/alertmgr/ | AlertManager | 9059 | Alert management Web UI | demo.pigsty.io/alertmgr/ |
/blackbox/ | Blackbox | 9115 | Blackbox exporter | |
/haproxy/* | HAProxy | 9101 | Load balancer admin Web UI | |
/pev | PEV2 | 80 | PostgreSQL execution plan visualizer | demo.pigsty.io/pev |
/nginx | Nginx | 80 | Nginx status page (for metrics) |
Domain Access
If you have your own domain name, you can point it to Pigsty server’s IP address to access various services via domain.
If you want to enable HTTPS, you should modify the home server configuration in the infra_portal parameter:
You can run make cert command after deployment to apply for a free Let’s Encrypt certificate for the domain.
If you don’t define the certbot field, Pigsty will use the local CA to issue a self-signed HTTPS certificate by default.
In this case, you must first trust Pigsty’s self-signed CA to access normally in your browser.
You can also mount local directories and other upstream services to Nginx. For more management details, refer to INFRA Management - Nginx.
1.4 - Getting Started with PostgreSQL
PostgreSQL (abbreviated as PG) is the world’s most advanced and popular open-source relational database. Use it to store and retrieve multi-modal data.
This guide is for developers with basic Linux CLI experience but not very familiar with PostgreSQL, helping you quickly get started with PG in Pigsty.
We assume you’re a personal user deploying in the default single-node mode. For prod multi-node HA cluster access, refer to Prod Service Access.
Basics
In the default single-node installation template, you’ll create a PostgreSQL database cluster named pg-meta on the current node, with only one primary instance.
PostgreSQL listens on port 5432, and the cluster has a preset database meta available for use.
After installation, exit the current admin user ssh session and re-login to refresh environment variables.
Then simply type pp and press Enter to access the database cluster via the psql CLI tool (p is the shortcut for the pig CLI):
You can also switch to the postgres OS user and execute psql directly to connect to the default postgres admin database.
Connecting to Database
To access a PostgreSQL database, use a CLI tool or graphical client and fill in the PostgreSQL connection string:
Some drivers and tools may require you to fill in these parameters separately. The following five are typically required:
| Parameter | Description | Example Value | Notes |
|---|---|---|---|
host | Database server address | 10.10.10.10 | Replace with your node IP or domain; can omit for localhost |
port | Port number | 5432 | PG default port, can be omitted |
username | Username | dbuser_dba | Pigsty default database admin |
password | Password | DBUser.DBA | Pigsty default admin password (change this!) |
dbname | Database name | meta | Default template database name |
For personal use, you can directly use the Pigsty default database superuser dbuser_dba for connection and management. The dbuser_dba has full database privileges.
By default, if you specified the configure -g parameter when configuring Pigsty, the password will be randomly generated and saved in ~/pigsty/pigsty.yml:
Default Accounts
Pigsty’s default single-node template presets the following database users, ready to use out of the box:
| Username | Password | Role | Purpose |
|---|---|---|---|
dbuser_dba | DBUser.DBA | Superuser | Database admin (change this!) |
dbuser_meta | DBUser.Meta | Business admin | App R/W (change this!) |
dbuser_view | DBUser.Viewer | Read-only user | Data viewing (change this!) |
For example, you can connect to the meta database in the pg-meta cluster using three different connection strings with three different users:
Note: These default passwords are automatically replaced with random strong passwords when using configure -g. Remember to replace the IP address and password with actual values.
Using CLI Tools
psql is the official PostgreSQL CLI client tool, powerful and the first choice for DBAs and developers.
On a server with Pigsty deployed, you can directly use psql to connect to the local database:
After successful connection, you’ll see a prompt like this:
Common psql Commands
After entering psql, you can execute SQL statements or use meta-commands starting with \:
| Command | Description | Command | Description |
|---|---|---|---|
Ctrl+C | Interrupt query | Ctrl+D | Exit psql |
\? | Show all meta commands | \h | Show SQL command help |
\l | List all databases | \c dbname | Switch to database |
\d table | View table structure | \d+ table | View table details |
\du | List all users/roles | \dx | List installed extensions |
\dn | List all schemas | \dt | List all tables |
Executing SQL
In psql, directly enter SQL statements ending with semicolon ;:
Using Graphical Clients
If you prefer graphical interfaces, here are some popular PostgreSQL clients:
Grafana
Pigsty’s INFRA module includes Grafana with a pre-configured PostgreSQL data source (Meta).
You can directly query the database using SQL from the Grafana Explore panel through the browser graphical interface, no additional client tools needed.
Grafana’s default username is admin, and the password can be found in the grafana_admin_password field in the inventory (default pigsty).
DataGrip
DataGrip is a professional database IDE from JetBrains, with powerful features. IntelliJ IDEA’s built-in Database Console can also connect to PostgreSQL in a similar way.
DBeaver
DBeaver is a free open-source universal database tool supporting almost all major databases. It’s a cross-platform desktop client.
pgAdmin
pgAdmin is the official PostgreSQL-specific GUI tool from PGDG, available through browser or as a desktop client.
Pigsty provides a configuration template for one-click pgAdmin service deployment using Docker in Software Template: pgAdmin.
Viewing Monitoring Dashboards
Pigsty provides many PostgreSQL monitoring dashboards, covering everything from cluster overview to single-table analysis.
We recommend starting with PGSQL Overview. Many elements in the dashboards are clickable, allowing you to drill down layer by layer to view details of each cluster, instance, database, and even internal database objects like tables, indexes, and functions.
Trying Extensions
One of PostgreSQL’s most powerful features is its extension ecosystem. Extensions can add new data types, functions, index methods, and more to the database.
Pigsty provides 576 extensions covering 16 major categories including time-series, geographic, vector, and full-text search, installable with one click.
Start with three commonly used extensions, then install more extensions such as timescaledb as needed.
postgis: Geographic information system for processing maps and location data (installed by default)pgvector: Vector database supporting AI embedding vector similarity search (installed by default)timescaledb: Time-series database for efficient storage and querying of time-series data (optional install)
Next Steps
Congratulations on completing the PostgreSQL basics! Next, you can start configuring and customizing your database.
1.5 - Customize Pigsty with Configuration
Besides using the configuration wizard to auto-generate configs, you can write Pigsty config files from scratch. This tutorial guides you through building a complex inventory step by step.
If you define NODE, INFRA, ETCD, MINIO, and PGSQL in the inventory upfront, deploy.yml can deploy this core path in one run—but it hides the details. Optional modules such as Docker, Redis, Kafka, native MySQL, JUICE, and VIBE require their own playbooks.
This doc breaks down all modules and playbooks, showing how to incrementally build from a simple config to a complete deployment.
Minimal Configuration
The simplest valid config only defines the admin_ip variable—the IP address of the node where Pigsty is installed (admin node):
This config deploys nothing, but running ./deploy.yml generates a self-signed CA in files/pki/ca for issuing certificates.
For convenience, you can also set region to specify which region’s software mirrors to use (default, china, europe).
Add Nodes
Pigsty’s NODE module manages cluster nodes. Any IP address in the inventory will be managed by Pigsty with the NODE module installed.
We added two global parameters:
node_repo_modules specifies repos to add;
region specifies which region’s mirrors to use.
These parameters enable the node to use correct repositories and install required packages. The NODE module offers many customization options: node names, DNS, repos, packages, NTP, kernel params, tuning templates, monitoring, log collection, etc. Even without changes, the defaults are sufficient.
Run deploy.yml or more precisely node.yml to bring the defined node under Pigsty management.
Add Infrastructure
A full-featured RDS cloud database service needs infrastructure support: monitoring (metrics/log collection, alerting, visualization), NTP, DNS, and other foundational services.
Define a special group infra to deploy the INFRA module:
We also assigned an identity parameter: infra_seq to distinguish nodes in multi-node HA INFRA deployments.
Run infra.yml to install INFRA **](/docs/infra/) and [**NODE modules on 10.10.10.10:
NODE module is implicitly defined as long as an IP exists. NODE is idempotent—re-running has no side effects.
After completion, you’ll have complete observability infrastructure and node monitoring, but PostgreSQL database service is not yet deployed.
If your goal is just to set up this monitoring system (Grafana + Victoria), you’re done! The infra template is designed for this.
Everything in Pigsty is modular: you can deploy only monitoring infra without databases;
or vice versa—run HA PostgreSQL clusters without infra—Slim Install.
Deploy Database Cluster
To provide PostgreSQL service, install the PGSQL` module and its dependency ETCD—just two lines of config:
We added two new groups: etcd and pg-meta, defining a single-node etcd cluster and a single-node PostgreSQL cluster.
Use ./deploy.yml to converge the defined modules in the core path again, or deploy incrementally:
PGSQL depends on ETCD for HA consensus, so install ETCD first. After completion, you have a working PostgreSQL service!
We used node.yml, infra.yml, etcd.yml, and pgsql.yml to deploy all four core modules on a single machine.
Define Databases and Users
In Pigsty, you can customize PostgreSQL cluster internals like databases and users through the inventory:
pg_users: Defines a new userdbuser_metawith passwordDBUser.Metapg_databases: Defines a new databasemetawith Pigsty CMDB schema (optional) andvectorextension
Pigsty offers rich customization parameters covering all aspects of databases and users.
If you define these parameters upfront, they’re automatically created during ./pgsql.yml execution.
For existing clusters, you can incrementally create or modify users and databases:
Configure PG Version and Extensions
You can install different major versions of PostgreSQL, and up to 576 extensions. Let’s remove the current default PG 18 and install PG 16:
We can customize parameters to install and enable common extensions by default: timescaledb, postgis, and pgvector:
pg_extensions: Installtimescaledb,postgis,pgvectorextensions.pg_libs: Configure loadingtimescaledb,pg_stat_statements,auto_explaindynamic libraries.pg_databases: Create and enablevector,postgis,timescaledbextensions for themetadatabase.
Add More Nodes
Add more nodes to the deployment, bring them under Pigsty management, deploy monitoring, configure repos, install software…
Deploy HA PostgreSQL Cluster
Now deploy a new database cluster pg-test on the three newly added nodes, using a three-node HA architecture:
Deploy Redis Cluster
Pigsty provides optional Redis support as a caching service in front of PostgreSQL:
Redis HA requires cluster mode or sentinel mode. See Redis Configuration.
Deploy Silo Object Storage
Pigsty’s MINIO module currently deploys Silo S3-compatible object storage, which can serve as a PostgreSQL backup repository. The module, inventory group, and playbooks retain the compatible minio name.
Serious production Silo deployments typically require at least 4 nodes with 4 disks each (4N/16D).
Deploy Docker Module
If you want to use containers to run tools for managing PG or software using PostgreSQL, install the DOCKER module:
Use pre-made application templates to launch common software tools with one click, such as the GUI tool for PG management: Pgadmin:
You can even self-host enterprise-grade Supabase with Pigsty, using external HA PostgreSQL clusters as the foundation and running stateless components in containers.
1.6 - Run Playbooks with Ansible
Pigsty uses Ansible to manage clusters, a very popular large-scale/batch/automation ops tool in the SRE community.
Ansible can use declarative approach for server configuration management. All module deployments are implemented through a series of idempotent Ansible playbooks.
For example, in single-node deployment, you’ll use the deploy.yml playbook. Pigsty has more built-in playbooks, you can choose to use as needed.
Understanding Ansible basics helps with better use of Pigsty, but this is not required, especially for single-node deployment.
Deploy Playbook
Pigsty provides a “one-stop” deploy playbook deploy.yml for the core path: CA/software repository, NODE, INFRA, ETCD, PGSQL, and MINIO when enabled in the inventory. Optional modules such as Redis, Kafka, and native MySQL require their own module playbooks even when defined in the inventory.
| Playbook | Command | Group | infra | [nodes] | etcd | minio | [pgsql] |
|---|---|---|---|---|---|---|---|
infra.yml | ./infra.yml | -l infra | ✓ | ✓ | |||
node.yml | ./node.yml | ✓ | ✓ | ✓ | ✓ | ||
etcd.yml | ./etcd.yml | -l etcd | ✓ | ||||
minio.yml | ./minio.yml | -l minio | ✓ | ||||
pgsql.yml | ./pgsql.yml | ✓ |
This is the simplest deployment method. You can also follow instructions in Customization Guide to incrementally complete deployment of all modules and nodes step by step.
Install Ansible
When using the Pigsty installation script or the bootstrap phase of offline installation, Pigsty will automatically install ansible and its dependencies for you.
If you want to manually install Ansible, refer to the following instructions. The minimum supported Ansible version is 2.9.
Please note that EL10 EPEL repo doesn’t yet provide a complete Ansible package. Pigsty PGSQL EL10 repo supplements this.
Ansible is also available on macOS. You can use Homebrew to install Ansible on Mac, and use it as an admin node to manage remote cloud servers. This is convenient for single-node Pigsty deployment on cloud VPS, but not recommended in prod envs.
Execute Playbook
Ansible playbooks are executable YAML files containing a series of task definitions to execute.
Running playbooks requires the ansible-playbook executable in your environment variable PATH.
Running ./node.yml playbook is essentially executing the ansible-playbook node.yml command.
You can use some parameters to fine-tune playbook execution. The following 4 parameters are essential for effective Ansible use:
| Purpose | Parameter | Description |
|---|---|---|
| Target | -l|--limit <pattern> | Limit execution to specific groups/hosts/patterns |
| Tasks | -t|--tags <tags> | Only run tasks with specific tags |
| Params | -e|--extra-vars <vars> | Extra command-line parameters |
| Config | -i|--inventory <path> | Use a specific inventory file |
Limit Hosts
Playbook execution targets can be limited with -l|--limit <selector>.
This is convenient when running playbooks on specific hosts/nodes or groups/clusters.
Here are some host limit examples:
See all details in Ansible documentation: Patterns: targeting hosts and groups
Missing this value can be dangerous—most playbooks execute on all hosts. Use with caution.
Limit Tasks
Execution tasks can be controlled with -t|--tags <tags>.
If specified, only tasks with the given tags will execute instead of the entire playbook.
To run multiple tasks, specify multiple tags separated by commas -t tag1,tag2:
Extra Vars
You can override config parameters at runtime using CLI arguments, which have highest priority.
Extra command-line parameters are passed via -e|--extra-vars KEY=VALUE, usable multiple times:
For complex parameters, use JSON strings to pass multiple complex parameters at once:
Specify Inventory
The default config file is pigsty.yml in the Pigsty home directory.
You can use -i <path> to specify a different inventory file path.
To permanently change the default config file, modify the inventory parameter in ansible.cfg.
Convenience Scripts
Pigsty provides a series of convenience scripts to simplify common operations. These scripts are in the bin/ directory:
These scripts are simple wrappers around Ansible playbooks, making common operations more convenient.
Playbook List
Below are the built-in playbooks in Pigsty. You can also easily add your own playbooks, or customize and modify playbook implementation logic as needed.
| Module | Playbook | Function |
|---|---|---|
| INFRA | deploy.yml | One-click deploy Pigsty on current node |
| INFRA | infra.yml | Initialize Pigsty infrastructure on infra nodes |
| INFRA | infra-rm.yml | Remove infrastructure components from infra nodes |
| INFRA | cache.yml | Create offline packages from target node |
| INFRA | cert.yml | Issue certificates using Pigsty self-signed CA |
| NODE | node.yml | Initialize node, adjust to desired state |
| NODE | node-rm.yml | Remove node from Pigsty |
| PGSQL | pgsql.yml | Initialize HA PostgreSQL cluster or add replica |
| PGSQL | pgsql-rm.yml | Remove PostgreSQL cluster or replica |
| PGSQL | pgsql-db.yml | Add new business database to existing cluster |
| PGSQL | pgsql-user.yml | Add new business user to existing cluster |
| PGSQL | pgsql-pitr.yml | Perform point-in-time recovery on cluster |
| PGSQL | pgsql-monitor.yml | Monitor remote PostgreSQL with local exporter |
| PGSQL | pgsql-migration.yml | Generate migration manual and scripts |
| PGSQL | slim.yml | Install Pigsty with minimal components |
| REDIS | redis.yml | Initialize Redis cluster/node/instance |
| REDIS | redis-rm.yml | Remove Redis cluster/node/instance |
| ETCD | etcd.yml | Initialize ETCD cluster or add new member |
| ETCD | etcd-rm.yml | Remove ETCD cluster/data or shrink member |
| MINIO | minio.yml | Initialize a Silo object-storage cluster |
| MINIO | minio-rm.yml | Remove Silo, its configuration, and optional data |
| DOCKER | docker.yml | Install Docker on nodes |
| DOCKER | app.yml | Install applications using Docker Compose |
| JUICE | juice.yml | Install and configure JuiceFS |
| VIBE | vibe.yml | Install the Vibe coding environment |
| KAFKA | kafka.yml | Create or converge a Kafka dynamic KRaft cluster |
| KAFKA | kafka-rm.yml | Remove a Kafka cluster or member |
| MYSQL (Pilot) | mysql.yml | Deploy native MySQL 8.4 standalone or three-node clusters |
| MYSQL (Pilot) | mysql-rm.yml | Stop and retire native MySQL while retaining local state |
1.7 - Offline Installation
Pigsty installs from Internet upstream by default, but some envs are isolated from the Internet. To address this, Pigsty supports offline installation using offline packages. Think of them as Linux-native Docker images.
Overview
Offline packages bundle all required RPM/DEB packages and dependencies; they are snapshots of the local APT/YUM repo after a normal installation.
In serious prod deployments, we strongly recommend using offline packages. They ensure all future nodes have consistent software versions with the existing env, and avoid online installation failures caused by upstream changes (quite common!), guaranteeing you can run it independently forever.
- Easy delivery in Internet-isolated envs.
- Pre-download all packages in one pass to speed up installation.
- No need to worry about upstream dependency breakage causing install failures.
- If you have multiple nodes, all packages only need to be downloaded once, saving bandwidth.
- Use local repo to ensure all nodes have consistent software versions for unified version management.
- Offline packages are made for specific OS minor versions, typically cannot be used across versions.
- It’s a snapshot at the time of creation, may not include the latest updates and OS security patches.
- Offline packages are typically about 1GB, while online installation downloads on-demand, saving space.
Offline Packages
v4.5.0 publishes a dual-architecture offline package for every one of the seven recommended OS versions, fourteen artifacts in total, and all of them are downloadable from GitHub:
| Linux Distribution | System Code | Minor Version | Package |
|---|---|---|---|
| RockyLinux 9 x86_64 | el9.x86_64 | 9.8 | pigsty-pkg-v4.5.0.el9.x86_64.tgz |
| RockyLinux 9 aarch64 | el9.aarch64 | 9.8 | pigsty-pkg-v4.5.0.el9.aarch64.tgz |
| RockyLinux 10 x86_64 | el10.x86_64 | 10.2 | pigsty-pkg-v4.5.0.el10.x86_64.tgz |
| RockyLinux 10 aarch64 | el10.aarch64 | 10.2 | pigsty-pkg-v4.5.0.el10.aarch64.tgz |
| Debian 12 x86_64 | d12.x86_64 | 12.15 | pigsty-pkg-v4.5.0.d12.x86_64.tgz |
| Debian 12 aarch64 | d12.aarch64 | 12.15 | pigsty-pkg-v4.5.0.d12.aarch64.tgz |
| Debian 13 x86_64 | d13.x86_64 | 13.6 | pigsty-pkg-v4.5.0.d13.x86_64.tgz |
| Debian 13 aarch64 | d13.aarch64 | 13.6 | pigsty-pkg-v4.5.0.d13.aarch64.tgz |
| Ubuntu 26.04 x86_64 | u26.x86_64 | 26.04.0 | pigsty-pkg-v4.5.0.u26.x86_64.tgz |
| Ubuntu 26.04 aarch64 | u26.aarch64 | 26.04.0 | pigsty-pkg-v4.5.0.u26.aarch64.tgz |
| Ubuntu 24.04 x86_64 | u24.x86_64 | 24.04.4 | pigsty-pkg-v4.5.0.u24.x86_64.tgz |
| Ubuntu 24.04 aarch64 | u24.aarch64 | 24.04.4 | pigsty-pkg-v4.5.0.u24.aarch64.tgz |
| Ubuntu 22.04 x86_64 | u22.x86_64 | 22.04.5 | pigsty-pkg-v4.5.0.u22.x86_64.tgz |
| Ubuntu 22.04 aarch64 | u22.aarch64 | 22.04.5 | pigsty-pkg-v4.5.0.u22.aarch64.tgz |
Download them from the GitHub release page, which also carries a checksums manifest and a detached PGP signature (.asc) for each artifact. The MD5 checksums for all v4.5.0 offline packages are:
When OS minor versions don’t match, it may work or may fail—we don’t recommend taking the risk.
The v4.5.0 artifacts above were built on EL 9.8/10.2, Debian 12.15/13.6, and Ubuntu 22.04.5/24.04.4/26.04.0.
Cross-minor installation may fail due to OpenSSL/system library differences.
Use online installation on matching OS versions to build your own offline package, or contact us for custom packages.
Using Offline Packages
Offline installation steps:
- Download Pigsty offline package, place it at
/tmp/pkg.tgz - Download Pigsty source package, extract and enter directory (assume extracted to home:
cd ~/pigsty) ./bootstrap, it will extract the package and configure using local repo (and installansiblefrom it offline)./configure -g -c rich, you can directly use therichtemplate configured for offline installation, or configure yourself- Run
./deploy.ymlas usual to install the core path from the local repository; other optional modules still require their own playbooks
If you encounter “No package nginx available” errors during offline installation, it usually means a previous installation attempt failed. Delete the /www/pigsty directory and re-run the deployment.
If you want to use the already extracted and configured offline package in your own config, modify and ensure these settings:
repo_enabled: Set totrue, will build local software repo (explicitly disabled in most templates)node_repo_modules: Set tolocal, then all nodes in the env will install from the local software repo- In most templates, this is explicitly set to:
node,infra,pgsql, i.e., install directly from these upstream repos. - Setting it to
localwill use the local software repo to install all packages, fastest, no interference from other repos. - If you want to use both local and upstream repos, you can add other repo module names too, e.g.,
local,node,infra,pgsql
- In most templates, this is explicitly set to:
The first parameter, if enabled, Pigsty will create a local software repo. The second parameter, if contains local, then all nodes in the env will use this local software repo.
If it only contains local, then it becomes the sole repo for all nodes. If you still want to install other packages from other upstream repos, you can add other repo module names too, e.g., local,node,infra,pgsql.
Hybrid Installation Mode
If your environment has Internet access, there’s a hybrid approach that combines the advantages of offline and online installation. You can use the offline package as a base, and supplement missing packages online.
For example, suppose you run RockyLinux 9.6 while the v4.5.0 package was built for RockyLinux 9.8.
You can use the el9 offline package (though made for 9.8), then execute make repo-build before formal installation to re-download missing packages for 9.6.
Pigsty will download the required increments from upstream repos.
Making Offline Packages
If your OS isn’t in the default list, you can make your own offline package with the built-in cache.yml playbook:
- Find a node running the exact same OS version with Internet access
- Use the
richtemplate for an online installation (./configure -c rich), and confirm that the target INFRA node has generated its local repository at/www/pigsty; if not, run./infra.yml -t repoagainst that node first - Run
cd ~/pigsty; ./cache.yml -l <infra-host>to select one INFRA node that already has a local repository, build the package there, and fetch it - By default, the artifact is
~/pigsty/dist/${version}/pigsty-pkg-${version}.${os}.${arch}.tgz; copy it to the offline environment (ftp, scp, USB, etc.), then unpack it withbootstrap
Current cache.yml defaults can be overridden with extra variables:
| Parameter | Default | Description |
|---|---|---|
cache_pkg_name | pigsty-pkg-${version}.${os}.${arch}.tgz | Offline package filename template |
cache_pkg_dir | dist/${version} | Output directory on the admin node |
cache_repo | pigsty | Local repository to package on the target node; separate multiple repositories with commas |
We offer paid services providing tested, pre-made offline packages for specific Linux major.minor versions (¥200).
Bootstrap
Pigsty relies on ansible to execute playbooks; this script is responsible for ensuring ansible is correctly installed in various ways.
Usually, you need to run this script in two cases:
- You didn’t install Pigsty via the installation script, but by downloading or
git cloneof the source package, so ansible isn’t installed. - You’re preparing to install Pigsty via offline packages and need to use this script to install ansible from the offline package.
The bootstrap script will automatically detect if the offline package exists (-p to specify, default is /tmp/pkg.tgz).
If it exists, it will extract and use it, then install ansible from it.
If the offline package doesn’t exist, it will try to install ansible from the Internet. If that still fails, you’re on your own!
The bootloader will by default move away existing repo configurations to ensure only required repos are enabled.
You can find them in /etc/yum.repos.d/backup (EL) or /etc/apt/backup (Debian / Ubuntu).
If you want to keep existing repo configurations during bootstrap, use the -k|--keep parameter.
1.8 - Slim Installation
If you only want HA PostgreSQL database cluster itself without monitoring, infra, etc., consider Slim Installation.
Slim installation has no INFRA module, no monitoring, no local repo—just ETCD and PGSQL and partial NODE functionality.
- Only needing PostgreSQL database itself, no observability infra required.
- Extremely resource-constrained envs unwilling to bear infra overhead (~0.2 vCPU / 500MB on single node).
- Already having external monitoring system, wanting to use your own unified monitoring framework.
- Not needing the Grafana visualization dashboard component.
- No INFRA module, cannot use WebUI and local software repo features.
- Offline Install is limited to single-node mode; multi-node slim install can only be done online.
Overview
To use slim installation, you need to:
- Use the
slim.ymlslim install config template (configure -c slim) - Run the
slim.ymlplaybook instead of the defaultdeploy.yml
Description
Slim installation only installs/configures these components:
| Component | Required | Description |
|---|---|---|
patroni | ⚠️ Required | Bootstrap HA PostgreSQL cluster |
etcd | ⚠️ Required | Meta database dependency (DCS) for Patroni |
pgbouncer | ✔️ Optional | PostgreSQL connection pooler |
vip-manager | ✔️ Optional | L2 VIP binding to PostgreSQL cluster primary |
haproxy | ✔️ Optional | Auto-routing services via Patroni health checks |
chronyd | ✔️ Optional | Time synchronization with NTP server |
tuned | ✔️ Optional | Node tuning template and kernel parameter management |
You can disable all optional components via configuration, keeping only the required patroni and etcd.
Because there’s no INFRA module’s Nginx providing local repo service, offline installation only works in single-node mode.
Configuration
Slim installation config file example: conf/slim.yml:
Deployment
Slim installation uses the slim.yml playbook instead of deploy.yml:
HA Cluster
Slim installation can also deploy HA clusters—just add more nodes to the etcd and pg-meta groups. A three-node deployment example:
| ID | NODE | PGSQL | INFRA | ETCD |
|---|---|---|---|---|
| 1 | 10.10.10.10 | pg-meta-1 | No INFRA module | etcd-1 |
| 2 | 10.10.10.11 | pg-meta-2 | No INFRA module | etcd-2 |
| 3 | 10.10.10.12 | pg-meta-3 | No INFRA module | etcd-3 |
1.9 - Security Recommendations
The default configuration targets local demonstrations and development or testing on a trusted intranet. If other hosts can reach the deployment, complete at least three checks: credentials, network boundaries, and critical files.
Production environments should also review the Security Model, Compliance, and Security Considerations.
Passwords
Pigsty default credentials are public in the source code and documentation and must not be used directly in production.
The configuration wizard can randomize built-in parameters and example credentials that it recognizes:
configure -g does not replace:
- the pgBackRest
cipher_pass; - Silo users and selected example passwords in
ha/safe; - database, object-storage, or application credentials added by the user.
After generation, inspect pigsty.yml and replace every uncovered credential. The wizard prints generated passwords to the terminal, so protect terminal history and automation logs as sensitive data.
See the Default Credentials Checklist for the complete scope.
Firewall
node_firewall_mode defaults to zone. It trusts the intranet defined by node_firewall_intranet and restricts ports exposed to public networks.
| Port | Service | Public by Default |
|---|---|---|
22 | SSH | Yes |
80 | Nginx HTTP | Yes |
443 | Nginx HTTPS | Yes |
5432 | PostgreSQL | Not in the base default; exposed additionally by the demo pigsty.yml |
Production deployments should normally remove 5432 from the demo configuration. If applications need direct database access, restrict source addresses in the cloud security group, host firewall, and HBA.
Also verify that the intranet definition matches the actual trust boundary. The default RFC 1918 ranges may be too broad; office networks, container networks, and other tenant networks should not become trusted automatically.
Files
The following files and directories contain highly sensitive information:
pigsty.yml: system and application credentials, node definitions, and service configuration;files/pki/ca/ca.key: local CA private key;- the administration user’s SSH private key, used to access managed nodes;
files/pki/misc/*.key: client-certificate private keys;/pg/tmp/pg-user-*.sql: SQL containing plaintext passwords generated during user creation.
Restrict access to the admin node and configuration repository. Do not commit complete inventories or private keys to public repositories. Maintain controlled backups of the CA private key and required configuration.
Related Documentation
- Security and Compliance: security chapter entry point
- Authentication: HBA, passwords, and client certificates
- Encrypted Communication: CA, TLS, and server verification
- Production Security Considerations: complete launch checklist
2 - Deployment
Unlike Getting Started, production Pigsty deployments require more Architecture Planning and Preparation.
This chapter helps you understand the complete deployment process and provides best practices for production environments.
Before deploying to production, we recommend testing in Pigsty’s Sandbox to fully understand the workflow. Use Vagrant to create a local 4-node sandbox, or leverage Terraform to provision larger simulation environments in the cloud.
For production, you typically need at least three nodes for high availability. You should understand Pigsty’s core Concepts and common administration procedures, including Configuration, Ansible Playbooks, and Security Hardening for enterprise compliance.
2.1 - Install Pigsty for Production
This is the Pigsty production multi-node deployment guide. For single-node Demo/Dev setups, see Getting Started.
Summary
Prepare nodes with SSH access following your architecture plan,
install a compatible Linux OS, then execute with an admin user having passwordless ssh and sudo:
This runs the install script, downloading and extracting Pigsty source to your home directory with dependencies installed. Complete configuration and deployment to finish.
Before running deploy.yml for deployment, review and edit the configuration inventory: pigsty.yml.
After installation, access the WebUI via IP/domain + ports 80/443,
and PostgreSQL service via port 5432.
Full installation takes 3-10 minutes depending on specs/network. Offline installation significantly speeds this up; slim installation further accelerates when monitoring isn’t needed.
Video Example: 20-node Production Simulation (Ubuntu 24.04 x86_64)
Prepare
Production Pigsty deployment involves preparation work. Here’s the complete checklist:
| Item | Requirement | Item | Requirement |
|---|---|---|---|
| Node | At least 1C2G, no upper limit | Plan | Multiple homogeneous nodes: 2/3/4 or more |
| Disk | /data as default mount point | FS | xfs recommended; ext4/zfs as needed |
| VIP | L2 VIP, optional (unavailable in cloud) | Network | Static IPv4, single-node can use 127.0.0.1 |
| CA | Self-signed CA or specify existing certs | Domain | Local/public domain, optional, default i.pigsty |
| Kernel | Linux x86_64 / aarch64 | Linux | el8, el9, el10, d12, d13, u22, u24, u26 |
| Locale | C.UTF-8 or C | Firewall | Ports: 80/443/22/5432 (optional) |
| User | Avoid root and postgres | Sudo | sudo privilege, preferably with nopass |
| SSH | Passwordless SSH via public key | Accessible | ssh <ip|alias> sudo ls no error |
Install
Use the following to automatically install the Pigsty source package to ~/pigsty (recommended). Deployment dependencies (Ansible) are auto-installed.
If you prefer not to run remote scripts, manually download or clone the source. When using git, always checkout a specific version before use:
For manual download/clone, additionally run bootstrap to manually install Ansible and other dependencies, or install them yourself:
Configure
In Pigsty, deployment details are defined by the configuration inventory—the pigsty.yml config file. Customize through declarative configuration.
Pigsty provides configure as an optional configuration wizard,
generating a configuration inventory with good defaults based on your environment:
The generated config defaults to ~/pigsty/pigsty.yml. Review and customize before installation.
Many configuration templates are available for reference. You can skip the wizard and directly edit pigsty.yml:
The wizard only replaces the current node’s IP (use -s to skip replacement). For multi-node deployments, replace other node IPs manually.
Also customize the config as needed—modify default passwords, add nodes, etc.
Common configure parameters:
| Parameter | Description |
|---|---|
-c|--conf | Specify config template relative to conf/, without .yml suffix |
-v|--version | PostgreSQL major version 14 through 19; PG19 is currently Beta |
-r|--region | Upstream repo region for faster downloads: default|china|europe |
-n|--non-interactive | Use CLI params for primary IP, skip interactive wizard |
-x|--proxy | Configure proxy_env from current environment variables |
If your machine has multiple IPs, explicitly specify one with -i|--ip <ipaddr> or provide it interactively.
The script replaces IP placeholder 10.10.10.10 with the current node’s primary IPv4. Use a static IP; never use public IPs.
Generated config is at ~/pigsty/pigsty.yml. Review and modify before installation.
Change default passwords and credentials before installation. See Security Recommendations.
Deploy
Pigsty’s deploy.yml playbook applies the configuration blueprint to all target nodes.
When output ends with pgsql init done, PLAY RECAP, etc., installation is complete!
Upstream repos (Linux/PGDG) may break due to improper updates, causing deployment failures (quite common)! For serious production deployments, we strongly recommend using verified offline packages for offline installation.
Warning: Running deploy.yml again on an initialized environment may restart services and overwrite configs. Be careful!
Interface
Assuming the 4-node deployment template, your Pigsty environment should have a structure like:
| ID | NODE | PGSQL | INFRA | ETCD |
|---|---|---|---|---|
| 1 | 10.10.10.10 | pg-meta-1 | infra-1 | etcd-1 |
| 2 | 10.10.10.11 | pg-test-1 | - | - |
| 3 | 10.10.10.12 | pg-test-2 | - | - |
| 4 | 10.10.10.13 | pg-test-3 | - | - |
The INFRA module provides a graphical management interface via browser, accessible through Nginx’s 80/443 ports.
The PGSQL module provides a PostgreSQL database server on port 5432, also accessible via Pgbouncer/HAProxy proxies.
For production multi-node HA PostgreSQL clusters, use service access for automatic traffic routing.
More
After installation, explore the WebUI and access PostgreSQL service via port 5432.
Deploy and monitor more clusters—add definitions to the configuration inventory and run:
Most modules require the NODE module first. See available modules:
2.2 - Prepare Resources for Serious Deployment
Pigsty runs on nodes (physical machines or VMs). This document covers the planning and preparation required for deployment.
Node
Pigsty currently runs on Linux kernel with x86_64 / aarch64 architecture.
A “node” refers to an SSH accessible resource that provides a bare Linux OS environment.
It can be a physical machine, virtual machine, or a systemd-enabled container equipped with systemd, sudo, and sshd.
Deploying Pigsty requires at least 1 node. You can prepare more and deploy everything in one pass via playbooks, or add nodes later.
The minimum spec requirement is 1C1G, but at least 1C2G is recommended. Higher is better—no upper limit. Parameters are auto-tuned based on available resources.
The number of nodes you need depends on your requirements. See Architecture Planning for details. Although a single-node deployment with external backup provides reasonable recovery guarantees, we recommend multiple nodes for production. A functioning HA setup requires at least 3 nodes; 2 nodes provide Semi-HA.
Disk
Pigsty uses /data as the default data directory. If you have a dedicated data disk, mount it there.
Use /data1, /data2, /dataN for additional disk drives.
To use a different data directory, configure these parameters:
| Name | Description | Default |
|---|---|---|
node_data | Node main data directory | /data |
pg_fs_main | PG main data directory | /data/postgres |
pg_fs_backup | PG backup directory | /data/backups |
etcd_data | ETCD data directory | /data/etcd |
infra_data | Infra data directory | /data/infra |
nginx_data | Nginx data directory | /data/nginx |
minio_data | Silo data directory | /data/minio |
redis_fs_main | Redis data directory | /data/redis |
kafka_data | Kafka data directory | /data/kafka |
The native MySQL 8.4 pilot module does not currently expose a data-directory parameter and always uses /var/lib/mysql.
Filesystem
You can use any supported Linux filesystem for data disks. For production, we recommend xfs.
xfs is a Linux standard with excellent performance and CoW capabilities for instant large database cluster cloning. Multi-drive Silo deployments require xfs.
ext4 is another viable option with a richer data recovery tool ecosystem, but lacks CoW.
zfs provides RAID and snapshot features but with significant performance overhead and requires separate installation.
Choose among these three based on your needs. Avoid NFS for database services.
Pigsty assumes /data is owned by root:root with 755 permissions.
Admins can assign ownership for first-level directories; each application runs with a dedicated user in its subdirectory.
See FHS for the directory structure reference.
Network
Pigsty defaults to online installation mode, requiring outbound Internet access. Offline installation eliminates the Internet requirement.
Internally, Pigsty requires a static network. Assign a fixed IPv4 address to each node.
The IP address serves as the node’s unique identifier—the primary IP bound to the main network interface for internal communications.
For single-node deployment without a fixed IP, use the loopback address 127.0.0.1 as a workaround.
Using public IP addresses as node identifiers can cause security and connectivity issues. Always use internal IP addresses.
VIP
Pigsty supports optional L2 VIP for NODE clusters (keepalived) and PGSQL clusters (vip-manager).
To use L2 VIP, you must explicitly assign an L2 VIP address for each node/database cluster. This is straightforward on your own hardware but may be challenging in public cloud environments.
To use optional Node VIP and PG VIP features, ensure all nodes are on the same L2 network.
CA
Pigsty generates a self-signed CA infrastructure for each deployment, issuing all encryption certificates.
If you have an existing enterprise CA or self-signed CA, you can use it to issue the certificates Pigsty requires.
Domain
Pigsty uses a local static domain i.pigsty by default for WebUI access. This is optional—IP addresses work too.
For production, domain names are recommended to enable HTTPS and encrypted data transmission. Domains also allow multiple services on the same port, differentiated by domain name.
For Internet-facing deployments, use public DNS providers (Cloudflare, AWS Route53, etc.) to manage resolution. Point your domain to the Pigsty node’s public IP address. For LAN/office network deployments, use internal DNS servers with the node’s internal IP address.
For local-only access, add the following to /etc/hosts on machines accessing the Pigsty WebUI:
Linux
Pigsty runs on Linux. It currently targets 16 platform combinations: eight distribution major versions across two architectures. See the Compatible OS List.
We recommend Rocky Linux 9.8 / 10.2, Debian 12.15 / 13.6, or Ubuntu 22.04.5 / 24.04.4 / 26.04.0 as default options.
On macOS and Windows, use VM software or Docker systemd images to run Pigsty.
We strongly recommend a fresh OS installation. If your server already runs Nginx, PostgreSQL, or similar services, consider deploying on new nodes.
For multi-node deployments, ensure all nodes use the same Linux distribution, architecture, and version. Heterogeneous deployments may work but are unsupported and may cause unpredictable issues.
Locale
We recommend setting en_US as the primary OS language, or at minimum ensuring this locale is available, so PostgreSQL logs are in English.
Some distributions (e.g., Debian) may not provide the en_US locale by default. Enable it with:
For PostgreSQL, we strongly recommend using the built-in C.UTF-8 collation (PG 17+) as the default.
The configuration wizard automatically sets C.UTF-8 as the collation when PG version and OS support are detected.
Ansible
Pigsty uses Ansible to control all managed nodes from the admin node. See Installing Ansible for details.
Pigsty installs Ansible on Infra nodes by default, making them usable as admin nodes (or backup admin nodes). For single-node deployment, the installation node serves as both the admin node running Ansible and the INFRA node hosting infrastructure.
Pigsty
You can install the current default Pigsty source with:
To install a specific version, use the -s <version> parameter:
To install the latest beta version:
For developers or the latest development version, clone the repository directly:
If your environment lacks Internet access, download the source tarball from GitHub Releases or the Pigsty repository:
2.3 - Planning Architecture and Nodes
Pigsty uses a modular architecture. You can combine modules like building blocks and express your intent through declarative configuration.
Common Patterns
Here are common deployment patterns for reference. Customize based on your requirements:
| Pattern | INFRA | ETCD | PGSQL | MINIO | Description |
|---|---|---|---|---|---|
Single-node (meta) | 1 | 1 | 1 | Single-node deployment default | |
Slim deploy (slim) | 1 | 1 | Database only, no monitoring infra | ||
Infra-only (infra) | 1 | Monitoring infrastructure only | |||
Rich deploy (rich) | 1 | 1 | 1 | 1 | Single-node + object storage + local repo with all extensions |
| Multi-node Pattern | INFRA | ETCD | PGSQL | MINIO | Description |
|---|---|---|---|---|---|
Two-node (dual) | 1 | 1 | 2 | Semi-HA, tolerates specific node failure | |
Three-node (trio) | 3 | 3 | 3 | Standard HA, tolerates any one failure | |
Four-node (full) | 1 | 1 | 1+3 | Demo setup, single INFRA/ETCD | |
Production (simu) | 2 | 3 | n | n | 2 INFRA, 3 ETCD |
| Large-scale (custom) | 3 | 5 | n | n | 3 INFRA, 5 ETCD |
Your architecture choice depends on reliability requirements and available resources. Serious production deployments require at least 3 nodes for HA configuration. With only 2 nodes, use Semi-HA configuration.
We offer Architecture Consulting Services to help plan your Pigsty configuration.
Trade-offs
- Pigsty monitoring requires at least 1 INFRA node. Production typically uses 2; large-scale deployments use 3.
- PostgreSQL HA requires at least 1 ETCD node. Production typically uses 3; large-scale uses 5. Even-member clusters work, but do not tolerate more failures than an odd cluster with one fewer member, so prefer odd sizes.
- Silo object storage through the MINIO module requires at least 1 MINIO node. Production typically uses 4+ nodes in MNMD clusters.
- Production PG clusters typically use at least two-node primary-replica configuration; serious deployments use 3 nodes; high read loads can have dozens of replicas.
- For PostgreSQL, you can also use advanced configurations: offline instances, sync instances, standby clusters, delayed clusters, etc.
Single-Node Setup
The simplest configuration with everything on a single node. Installs four essential modules by default. Typically used for demos, devbox, or testing.
With an external S3/MinIO backup repository providing RTO/RPO guarantees, this configuration works for standard production environments.
Single-node variants:
- Rich (
rich): Production single-node template with local Silo object storage, local software repo, and all PG extensions. - Slim (
slim): Installs only PGSQL and ETCD, no monitoring infra. Slim installation can expand to multi-node HA deployment. - Infra-only (
infra): Opposite of slim—installs only INFRA monitoring infrastructure, no database services, for monitoring other instances. - Alternative kernels: Replace vanilla PG with derivatives:
pgsql,mssql,polar,ivory,mysql,pgtde,oriole,agens,pgedge.
Two-Node Setup
Two-node configuration enables database replication and Semi-HA capability with better data redundancy and limited failover support:
Two-node HA auto-failover has limitations. This “Semi-HA” setup only auto-recovers from specific node failures:
- If
node-1fails: No automatic failover—requires manual promotion ofnode-2 - If
node-2fails: Automatic failover works—node-1auto-promoted
Three-Node Setup
Three-node template provides true baseline HA configuration, tolerating any single node failure with automatic recovery.
| ID | NODE | PGSQL | INFRA | ETCD |
|---|---|---|---|---|
| 1 | node-1 | pg-meta-1 | infra-1 | etcd-1 |
| 2 | node-2 | pg-meta-2 | infra-2 | etcd-2 |
| 3 | node-3 | pg-meta-3 | infra-3 | etcd-3 |
Four-Node Setup
Pigsty Sandbox uses the standard four-node configuration.
For demo purposes, INFRA / ETCD modules aren’t configured for HA. You can adjust further:
| ID | NODE | PGSQL | INFRA | ETCD | MINIO |
|---|---|---|---|---|---|
| 1 | node-1 | pg-meta-1 | infra-1 | etcd-1 | minio-1 |
| 2 | node-2 | pg-test-1 | infra-2 | etcd-2 | |
| 3 | node-3 | pg-test-2 | etcd-3 | ||
| 4 | node-4 | pg-test-3 |
More Nodes
With proper virtualization infrastructure or abundant resources, you can use more nodes for dedicated deployment of each module, achieving optimal reliability, observability, and performance.
| ID | NODE | INFRA | ETCD | MINIO | PGSQL |
|---|---|---|---|---|---|
| 1 | 10.10.10.10 | infra-1 | pg-meta-1 | ||
| 2 | 10.10.10.11 | infra-2 | pg-meta-2 | ||
| 3 | 10.10.10.21 | etcd-1 | |||
| 4 | 10.10.10.22 | etcd-2 | |||
| 5 | 10.10.10.23 | etcd-3 | |||
| 6 | 10.10.10.31 | minio-1 | |||
| 7 | 10.10.10.32 | minio-2 | |||
| 8 | 10.10.10.33 | minio-3 | |||
| 9 | 10.10.10.34 | minio-4 | |||
| 10 | 10.10.10.40 | pg-src-1 | |||
| 11 | 10.10.10.41 | pg-src-2 | |||
| 12 | 10.10.10.42 | pg-src-3 | |||
| 13 | 10.10.10.50 | pg-test-1 | |||
| 14 | 10.10.10.51 | pg-test-2 | |||
| 15 | 10.10.10.52 | pg-test-3 | |||
| 16 | …… |
2.4 - Setup Admin User and Privileges
Pigsty requires an OS admin user with passwordless SSH and Sudo privileges on all managed nodes.
This user must be able to SSH to all managed nodes and execute sudo commands on them.
User
Typically use names like dba or admin, avoiding root and postgres:
- Using
rootfor deployment is possible but not a production best practice. - Using
postgres(pg_dbsu) as admin user is strictly prohibited.
Passwordless
The passwordless requirement is optional if you can accept entering a password for every ssh and sudo command.
Use -k|--ask-pass when running playbooks to prompt for SSH password,
and -K|--ask-become-pass to prompt for sudo password.
Some enterprise security policies may prohibit passwordless ssh or sudo. In such cases, use the options above,
or consider configuring a sudoers rule with a longer password cache time to reduce password prompts.
Create Admin User
Typically, your server/VM provider creates an initial admin user.
If unsatisfied with that user, Pigsty’s deployment playbook can create a new admin user for you.
Assuming you have root access or an existing admin user on the node, create an admin user with Pigsty itself:
This leverages the existing admin to create a new one—a dedicated dba (uid=88) user described by these parameters, with sudo/ssh properly configured:
| Name | Description | Default |
|---|---|---|
node_admin_enabled | Enable node admin user | true |
node_admin_uid | Node admin user UID | 88 |
node_admin_username | Node admin username | dba |
Sudo
All admin users should have sudo privileges on all managed nodes, preferably with passwordless execution.
To configure an admin user with passwordless sudo from scratch, edit/create a sudoers file (assuming username vagrant):
For admin user dba, the /etc/sudoers.d/dba content should be:
If your security policy prohibits passwordless sudo, remove the NOPASSWD: part:
Ansible relies on sudo to execute commands with root privileges on managed nodes.
In environments where sudo is unavailable (e.g., inside Docker containers), install sudo first.
SSH
Your current user should have passwordless SSH access to all managed nodes as the corresponding admin user.
Your current user can be the admin user itself, but this isn’t required—as long as you can SSH as the admin user.
SSH configuration is Linux 101, but here are the basics:
Generate SSH Key
If you don’t have an SSH key pair, generate one:
Pigsty will do this for you during the bootstrap stage if you lack a key pair.
Copy SSH Key
Distribute your generated public key to remote (and local) servers, placing it in the admin user’s ~/.ssh/authorized_keys file on all nodes.
Use the ssh-copy-id utility:
Using Alias
When direct SSH access is unavailable (jumpserver, non-standard port, different credentials), configure SSH aliases in ~/.ssh/config:
Reference the alias in the inventory using ansible_host for the real SSH alias:
SSH parameters work directly in Ansible. See Ansible Inventory Guide for details. This technique enables accessing nodes in private networks via jumpservers, or using different ports and credentials, or using your local laptop as an admin node.
Check Accessibility
You should be able to passwordlessly ssh from the admin node to all managed nodes as your current user.
The remote user (admin user) should have privileges to run passwordless sudo commands.
To verify passwordless ssh/sudo works, run this command on the admin node for all managed nodes:
If there’s no password prompt or error, passwordless ssh/sudo is working as expected.
Firewall
Production deployments typically require firewall configuration to block unauthorized port access.
By default, block inbound access from office/Internet networks except:
- SSH port
22for node access - HTTP (
80) / HTTPS (443) for WebUI services - PostgreSQL port
5432for database access
If accessing PostgreSQL via other ports, allow them accordingly. See used ports for the complete port list.
5432: PostgreSQL database6432: Pgbouncer connection pooler5433: PG primary service5434: PG replica service5436: PG default service5438: PG offline service
2.5 - Sandbox
Pigsty provides a standard 4-node sandbox environment for learning, testing, and feature demonstration.
The sandbox uses fixed IP addresses and predefined identity identifiers, making it easy to reproduce various demo use cases.
Description
The default sandbox environment consists of 4 nodes, using the ha/full.yml configuration template.
| ID | IP Address | Node | PostgreSQL | INFRA | ETCD | MINIO |
|---|---|---|---|---|---|---|
| 1 | 10.10.10.10 | meta | pg-meta-1 | infra-1 | etcd-1 | minio-1 |
| 2 | 10.10.10.11 | node-1 | pg-test-1 | |||
| 3 | 10.10.10.12 | node-2 | pg-test-2 | |||
| 4 | 10.10.10.13 | node-3 | pg-test-3 |
The sandbox configuration can be summarized as the following config:

PostgreSQL Clusters
The sandbox comes with a single-instance PostgreSQL cluster pg-meta on the meta node:
There’s also a 3-instance PostgreSQL HA cluster pg-test deployed on the other three nodes:
Two optional L2 VIPs are bound to the primary instances of pg-meta and pg-test clusters respectively.
Infrastructure
The meta node also hosts:
- ETCD cluster: Single-node
etcdcluster providing DCS service for PostgreSQL HA - Silo cluster: A single-node
miniocluster managed by the MINIO module, providing S3-compatible object storage
ha/full.yml also declares three Redis example topologies and enables Docker installation on the INFRA node. The standard deploy.yml does not deploy these two optional modules; run ./redis.yml and ./docker.yml separately when needed.
Creating Sandbox
Pigsty provides out-of-the-box templates. You can use Vagrant to create a local sandbox, or use Terraform to create a cloud sandbox.
Local Sandbox (Vagrant)
Local sandbox uses VirtualBox/libvirt to create local virtual machines, running free on your Mac / PC.
To run the full 4-node sandbox, your machine should have at least 4 CPU cores and 8GB memory.
The current Vagrant configuration uses the cloud-image/* boxes from Vagrant Cloud. See Vagrant: Supported Images for available images, source-pinned versions, and architecture details. Boxes without a version pinned in source are resolved by Vagrant to their currently available version.
Cloud Sandbox (Terraform)
Cloud sandbox uses public cloud API to create virtual machines. Easy to create and destroy, pay-as-you-go, ideal for quick testing.
Use the spec/aliyun-full.tf template to create a 4-node sandbox on Alibaba Cloud:
For more details, please refer to Terraform documentation.
Other Specs
Besides the standard 4-node sandbox, Pigsty also provides other environment specs:
Run the following Makefile shortcuts from ~/pigsty/vagrant:
Single Node Devbox (meta)
The simplest 1-node environment for quick start, development, and testing:
Two Node Environment (dual)
2-node environment for testing primary-replica replication:
Three Node Environment (trio)
3-node environment for testing basic high availability:
Production Simulation (simu)
20-node large simulation environment for full production environment testing:
This environment includes:
- 3 infrastructure nodes (
meta1,meta2,meta3) - 2 HAProxy proxy nodes
- 4 MINIO (Silo) nodes
- 5 ETCD nodes
- 6 PostgreSQL nodes (2 clusters, 3 nodes each)
2.6 - Vagrant
Vagrant is a popular local virtualization tool that creates local virtual machines in a declarative manner.
Pigsty requires a Linux environment to run. You can use Vagrant to easily create Linux virtual machines locally for testing.
The currently recommended and validated baselines are Rocky Linux 9.8 / 10.2, Debian 12.15 / 13.6, and Ubuntu 22.04.5 / 24.04.4 / 26.04.0. Major-version Vagrant aliases map to pinned box versions.
Quick Start
Install Dependencies
First, ensure you have Vagrant and a virtual machine provider (such as VirtualBox or libvirt) installed on your system.
On macOS, you can use Homebrew for one-click installation:
After installing VirtualBox, you need to restart your system and allow its kernel extensions in System Preferences.
On Linux, you can use VirtualBox or vagrant-libvirt as the VM provider.
Create Virtual Machines
Use the Pigsty-provided make shortcuts to create virtual machines:
You can use variant aliases to specify different operating system images:
Available OS suffixes: 8 (EL8), 9 (EL9), 10 (EL10), 12 (Debian 12.15), 13 (Debian 13.6), 22 (Ubuntu 22.04.5), 24 (Ubuntu 24.04.4), 26 (Ubuntu 26.04.0)
Build Environment
You can also use the following aliases to create Pigsty build environments. These templates won’t replace the base image:
Spec Templates
Pigsty provides multiple predefined VM specs in the vagrant/spec/ directory:
| Template | Nodes | Spec | Description | Alias |
|---|---|---|---|---|
| meta.rb | 1 node | 2c4g x 1 | Single-node devbox | Devbox |
| dual.rb | 2 nodes | 1c2g x 2 | Two-node environment | |
| trio.rb | 3 nodes | 1c2g x 3 | Three-node environment | |
| full.rb | 4 nodes | 2c4g + 1c2g x 3 | 4-node full sandbox | Sandbox |
| deci.rb | 10 nodes | Mixed | 10-node environment | |
| simu.rb | 20 nodes | Mixed | 20-node production simubox | Simubox |
| minio.rb | 4 nodes | 1c2g x 4 + disk | MinIO test environment | |
| citus.rb | 13 nodes | Mixed | Citus coordinator and six two-replica worker groups | |
| oss.rb | 7 nodes | 2c2g x 7 | 7-platform OSS build environment | |
| pro.rb | 7 nodes | 2c2g x 7 | 7-platform PRO build environment | |
| rpm.rb | 2 nodes | 1c2g x 2 | 2-node EL build environment | |
| deb.rb | 5 nodes | 1c2g x 5 | 5-node Deb build environment | |
| all.rb | 7 nodes | 1c2g x 7 | 7-node full build environment |
Each spec file contains a Specs variable describing the VM nodes. For example, full.rb contains the 4-node sandbox definition:
Current Vagrant templates explicitly provision a 32 GB primary system disk for every VM. Regular nodes also receive one data disk whose size comes from the spec’s disk value, defaulting to 128 GB when omitted. Object-storage nodes whose names begin with minio instead receive four 32 GB data disks mounted at /data1 through /data4.
These disks depend on Vagrant’s experimental disks feature. The repository Makefile exports VAGRANT_EXPERIMENTAL=disks automatically; set it yourself when invoking vagrant directly.
simu Spec Details
simu.rb provides a 20-node production environment simulation configuration:
- 3 x infra nodes (
meta1-3): 4c16g - 2 x haproxy nodes (
proxy1-2): 1c2g - 4 x minio nodes (
minio1-4): 1c2g - 5 x etcd nodes (
etcd1-5): 1c2g - 6 x pgsql nodes (
pg-src-1-3,pg-dst-1-3): 2c4g
Config Script
Use the vagrant/config script to generate the final Vagrantfile based on spec and options:
Image Aliases
The config script supports various image aliases:
| Distro | Alias | Vagrant Box |
|---|---|---|
| Rocky 8 | el8, rocky8, r8 | cloud-image/rocky-8 |
| Rocky 9 | el9, rocky9, el, r9 | cloud-image/rocky-9 |
| Rocky 10 | el10, rocky10, r10 | cloud-image/rocky-10 |
| Debian 12 | d12, debian12, deb12 | cloud-image/debian-12 |
| Debian 13 | d13, debian13, deb13 | cloud-image/debian-13 |
| Ubuntu 22.04.5 | u22, ubuntu22, ubuntu2204 | cloud-image/ubuntu-22.04 |
| Ubuntu 24.04.4 | u24, ubuntu24, ubuntu2404, ubuntu | cloud-image/ubuntu-24.04 |
| Ubuntu 26.04.0 | u26, ubuntu26, ubuntu2604 | cloud-image/ubuntu-26.04 |
| AlmaLinux 8 | alma8 | cloud-image/almalinux-8 |
| AlmaLinux 9 | alma9 | cloud-image/almalinux-9 |
| AlmaLinux 10 | alma10 | cloud-image/almalinux-10 |
| RHEL 8 / 9 | rhel8, rhel9 | generic/rhel8, generic/rhel9 |
| Oracle Linux 8 / 9 | oracle8, oracle9 | generic/oracle8, generic/oracle9 |
The historical d11/debian11/deb11 and u20/ubuntu20/ubuntu2004 aliases remain visible in the script mapping, but the current script explicitly rejects them; they are not supported images.
Resource Scaling
You can use the VM_SCALE environment variable to adjust the resource multiplier (default is 1):
For example, using VM_SCALE=4 with the meta spec will adjust the default 2c4g to 8c16g:
The simu and deci specs don’t support resource scaling. The scale parameter is automatically reset to 1 because their resource configurations are already optimized for simulation scenarios.
VM Management
The vagrant/Makefile provides shortcuts for managing virtual machines. Run the following commands from that directory:
SSH Keys
Pigsty Vagrant templates use your ~/.ssh/id_rsa[.pub] as the SSH key for VMs by default.
Before starting, ensure you have a valid SSH key pair. If not, generate one with:
Supported Images
The standard EL, Debian, Ubuntu, and AlmaLinux matrix uses cloud-image/* boxes from Vagrant Cloud. Explicit RHEL and Oracle Linux aliases use generic/* boxes. The current config script applies the same cloud-image/* mapping to VirtualBox, libvirt, amd64, and arm64; actual payload availability is still resolved by Vagrant Cloud at runtime.
VirtualBox and libvirt use the same mapping. vagrant/config writes the validated versions below for every supported cloud-image/* image, making amd64 and arm64 environments reproducible:
| OS | Vagrant Box | Source Version Policy |
|---|---|---|
| Rocky 8 | cloud-image/rocky-8 | 8.10.20240528.0 |
| Rocky 9 | cloud-image/rocky-9 | 9.8.20260525.0 |
| Rocky 10 | cloud-image/rocky-10 | 10.2.20260525.0 |
| Debian 12 | cloud-image/debian-12 | 20260806.2562.0 |
| Debian 13 | cloud-image/debian-13 | 20260810.2566.0 |
| Ubuntu 22.04 | cloud-image/ubuntu-22.04 | 20260810.0.0 |
| Ubuntu 24.04 | cloud-image/ubuntu-24.04 | 20260801.0.0 |
| Ubuntu 26.04 | cloud-image/ubuntu-26.04 | 20260731.0.0 |
| AlmaLinux 8 | cloud-image/almalinux-8 | 8.10.20260803 |
| AlmaLinux 9 | cloud-image/almalinux-9 | 9.8.20260810 |
| AlmaLinux 10 | cloud-image/almalinux-10 | 10.2.20260526.0 |
The retained but unsupported Debian 11 and Ubuntu 20.04 aliases are pinned to 20260618.2513.0 and 20250624.0.0; experimental generic/* RHEL, Oracle Linux, and CentOS 7 images are pinned to their final 4.3.12 release. These legacy images are outside the current support matrix.
Environment Variables
You can use the following environment variables to control Vagrant behavior:
Notes
When using older versions of VirtualBox as Vagrant provider, additional configuration is required to use 10.x.x.x CIDR as Host-Only network:
The first time you use Vagrant to start a specific operating system, it will download the corresponding Box image file (typically 1-2 GB). After download, the image is cached and reused for subsequent VM creation.
If you’re using libvirt as the provider, you can use make info to view VMs, networks, and storage volume information, and make nuke to forcefully destroy all related resources.
2.7 - Terraform
Terraform is a popular “Infrastructure as Code” tool that you can use to create virtual machines on public clouds with one click.
Pigsty currently provides example Terraform templates for Alibaba Cloud, AWS (global and China), Azure, GCP, Tencent Cloud, Hetzner, Vultr, DigitalOcean, and Linode. The aliyun-s3.tf template also creates a private OSS bucket and dedicated RAM read/write credentials for S3/pgBackRest scenarios.
Quick Start
Install Terraform
On macOS, you can use Homebrew to install Terraform:
For other platforms, refer to the Terraform Official Installation Guide.
Initialize and Apply
Enter the Terraform directory, select a template, initialize provider plugins, and apply the configuration:
After running the apply command, type yes to confirm when prompted. Terraform will create VMs and related cloud resources for you.
Get IP Address
After creation, print the public IP address of the admin node:
Configure SSH Access
Global-cloud templates usually also provide an executable ssh_command output:
The repository’s ./ssh script is a compatibility tool for legacy templates whose outputs are all IP addresses and whose root password is PigstyDemo4. It iterates over every Terraform output, treats it as an IP address, writes it to ~/.ssh/pigsty_config, and distributes keys with sshpass. It is suitable for compatibility templates such as aliyun.tf, aliyun-full.tf, aliyun-oss.tf, and aliyun-pro.tf. Do not run it against modern templates that output ssh_command, private IPs, or access keys.
When using a compatible template:
If you want to use the configuration in ~/.ssh/pigsty_config, ensure your ~/.ssh/config includes:
Destroy Resources
After testing, you can destroy all created cloud resources with one click:
Template Specs
Pigsty provides multiple predefined cloud resource templates in the terraform/spec/ directory:
| Template File | Cloud Provider | Description |
|---|---|---|
aliyun.tf | Alibaba Cloud | Single-node meta template, supports all distributions and AMD/ARM (default) |
aliyun-s3.tf | Alibaba Cloud | Single node + private OSS bucket and RAM read/write credentials for S3/pgBackRest |
aliyun-full.tf | Alibaba Cloud | Four-node sandbox, supports all distributions and AMD/ARM |
aliyun-oss.tf | Alibaba Cloud | Six-node build template, supports all distributions and AMD/ARM |
aliyun-pro.tf | Alibaba Cloud | Seven-node multi-distribution test template |
aws.tf | AWS | Global AWS single node, Debian 12/13, AMD/ARM |
aws-cn.tf | AWS | Legacy single-node environment for AWS China |
azure.tf | Azure | Single node, Debian 12/13, AMD/ARM |
gcp.tf | GCP | Single node, Debian 12/13, AMD/ARM |
qcloud.tf | Tencent Cloud | Tencent Cloud single-node environment |
hetzner.tf | Hetzner | Single node, Debian 12/13, AMD/ARM |
vultr.tf | Vultr | Single node, Debian 12/13, currently AMD only |
digitalocean.tf | DigitalOcean | Single node, Debian 12/13, currently AMD only |
linode.tf | Linode | Single node, Debian 12/13, currently AMD only |
When using a template, copy the template file to terraform.tf:
Variable Configuration
Variables differ between templates. Alibaba Cloud templates support the full multi-distribution matrix and default to u26. Global AWS, Azure, GCP, Tencent Cloud, and Hetzner support Debian 12/13 with AMD/ARM selection and generally default to d12/amd64. Vultr, DigitalOcean, and Linode currently expose AMD instance choices only.
Architecture and Distribution
Resource Configuration
Alibaba Cloud templates expose the following resource parameters in a locals block. Other cloud templates use provider-specific instance, disk, and network variables or local values; consult the selected .tf file.
Alibaba Cloud Configuration
Credential Setup
Add your Alibaba Cloud credentials to environment variables, for example in ~/.bash_profile or ~/.zshrc:
Supported Images
The following are commonly used ECS Public OS Image prefixes in Alibaba Cloud:
The currently recommended and validated baselines are Rocky Linux 9.8 / 10.2, Debian 12.15 / 13.6, and Ubuntu 22.04.5 / 24.04.4 / 26.04.0.
| Distro | Code | x86_64 Image Prefix | aarch64 Image Prefix |
|---|---|---|---|
| CentOS 7.9 | el7 | centos_7_9_x64 | - |
| Rocky 8.10 | el8 | rockylinux_8_10_x64 | rockylinux_8_10_arm64 |
| Rocky 9.8 | el9 | rockylinux_9_8_x64 | rockylinux_9_8_arm64 |
| Rocky 10.2 | el10 | rockylinux_10_2_x64 | rockylinux_10_2_arm64 |
| Debian 11.11 | d11 | debian_11_11_x64 | - |
| Debian 12.15 | d12 | debian_12_15_x64 | debian_12_15_arm64 |
| Debian 13.6 | d13 | debian_13_6_x64 | debian_13_6_arm64 |
| Ubuntu 22.04.5 LTS | u22 | ubuntu_22_04_x64_20G | ubuntu_22_04_arm64_20G |
| Ubuntu 24.04.4 LTS | u24 | ubuntu_24_04_x64_20G | ubuntu_24_04_arm64_20G |
| Ubuntu 26.04.0 LTS | u26 | ubuntu_26_04_x64_20G | ubuntu_26_04_arm64_20G |
| Anolis 8.10 | an8 | anolisos_8_10_x64 | anolisos_8_10_arm64 |
| Alibaba Cloud Linux 3 | al3 | aliyun_3_x64_20G_alibase_[0-9]+ | aliyun_3_arm64_20G_alibase_[0-9]+ |
OSS Storage Configuration
The aliyun-s3.tf template additionally creates an OSS bucket and related permissions for PostgreSQL PITR backup:
- OSS Bucket: Creates a private bucket named
pigsty-oss - RAM User: Creates a dedicated
pigsty-oss-useruser - Access Key: Generates AccessKey and saves to
~/pigsty.sk - RAM Policy: Grants the user
oss:*permissions on the bucket and its objects for read/write use
AWS Configuration
Credential Setup
Both global and China-region templates can read standard AWS environment variables or credential files:
aws.tf reads ~/.ssh/id_rsa.pub by default. The legacy China-region aws-cn.tf instead reads this dedicated public key:
aws.tf uses a rolling lookup for official Debian AMIs. aws-cn.tf uses a hard-coded China-region AMI and ~/.aws/pigsty-key.pub; verify the target region, AMI, and key before deployment.
Tencent Cloud Configuration
Credential Setup
Add Tencent Cloud credentials to environment variables:
Tencent Cloud templates are community-contributed examples and may need adjustments based on your specific requirements.
Other Cloud Credentials
The GCP template also requires a project variable, for example terraform apply -var="project=my-project". Except for AWS China, current key-based templates read ~/.ssh/id_rsa.pub by default; edit the selected template to use another public-key path.
Shortcut Commands
Pigsty provides some Makefile shortcuts for Terraform operations:
For modern templates with ssh_command, private-IP, or other non-IP outputs, run terraform apply directly; do not use make u, which invokes the legacy ./ssh script afterward.
Notes
Cloud resources created with Terraform incur costs. After testing, promptly use terraform destroy to destroy resources to avoid unnecessary expenses.
It’s recommended to use pay-as-you-go instance types for testing. Templates default to using Spot Instances to reduce costs.
Alibaba Cloud and Tencent Cloud templates set the default root password to PigstyDemo4; Linode uses PigstyDemo4! to satisfy its password-complexity rules.
Current AWS, Azure, GCP, Hetzner, Vultr, and DigitalOcean templates primarily use SSH public-key authentication and do not share a default root password. Example passwords are for temporary tests only; change them or disable password login in production.
These templates target demonstration and development. Their current security groups or cloud firewalls allow all or nearly all inbound traffic from 0.0.0.0/0 (some also include ::/0), not just the ports Pigsty requires.
Restrict source networks and ports before deployment; do not use these defaults unchanged in production.
After creation, SSH login to the admin node using:
Alibaba Cloud templates that retain the legacy output and password conventions can also use ./ssh or make ssh to write SSH aliases. For other templates, use their ssh_command output.
2.8 - Security Considerations
Pigsty defaults target development, testing, and demonstrations on a trusted intranet. A production deployment must configure credentials, network boundaries, authentication, certificates, backup, and audit according to its threat model.
See Security and Compliance for mechanisms and boundaries, and the Launch Hardening Checklist for executable checks. ha/safe is a hardening example, not a substitute for reviewing each control.
Confidentiality
Critical Files
Protect these assets:
pigsty.ymland other inventories, which normally contain system and application credentials;files/pki/ca/ca.key, which can issue certificates trusted by the deployment;- the administration user’s SSH private key, which can use sudo on managed nodes by default;
- client-certificate private keys and backup-encryption keys;
- generated
/pg/tmp/pg-user-*.sqlfiles.
Restrict access to the admin node and configuration repository. Do not commit complete inventories or private keys to public repositories. Back up the CA private key and recovery configuration through controlled channels.
Passwords
Replace every public default credential before production. Start with:
This option does not replace the pgBackRest cipher_pass, every Silo example credential in ha/safe, or user-defined values. Review the result against the Default Credentials Checklist.
PostgreSQL stores newly set or updated passwords with SCRAM-SHA-256 by default. To enforce complexity, preload passwordcheck through pg_libs, or configure credcheck. Declare account lifetime with expire_in or expire_at.
Credential rotation must also update database users, the PgBouncer user list, component configuration, and client connection information. Prepare a rollback plan before rotating.
Network Boundaries
IP Addresses
PostgreSQL listens on 0.0.0.0 by default. To constrain listen addresses, set:
A listen address is not the only boundary. Production reviews should also cover:
- cloud security groups or upstream firewalls;
node_firewall_public_port;- whether
node_firewall_intranettrusts overly broad CIDRs; - PostgreSQL and PgBouncer HBA rules;
- the Patroni REST API allowlist.
The demo pigsty.yml inventory also exposes 5432 publicly. Remove that exception in production. If direct database access is required, limit it to explicit application CIDRs.
Network Traffic
- PostgreSQL enables server-side TLS by default, but default intranet HBA rules do not require it.
- PgBouncer TLS is disabled by default and controlled by
pgbouncer_sslmode. - HTTPS for the Patroni REST API is disabled by default and controlled by
patroni_ssl_enabled. - Nginx and the object-storage backend selected by the MINIO module enable HTTPS by default; etcd uses TLS for client and peer traffic.
HBA auth: ssl requires an encrypted connection only. Clients should also use sslmode=verify-full with a trusted CA to verify the database server; see Encrypted Communication.
Grafana, VictoriaMetrics, and other components may listen on node ports, but the default firewall does not expose them directly to public networks. Prefer Nginx for external access, and restrict management pages by source address and identity.
Authentication and Access Control
- Use HBA to define the user, database, source address, and authentication method. Avoid broad
worldrules. - Use
auth: certfor privileged remote users, with a process for delivering and revoking client certificates. - Assign application privileges through built-in roles; do not grant superuser to ordinary application accounts.
- Set
revokeconn: truefor multi-tenant shared clusters, and inspect effective database ACLs. - Create objects through the declared database owner or a controlled administration role so default privileges apply.
- To isolate offline queries, set
role: offlineexplicitly on the HBA rule fordbrole_offline.
After changing HBA, users, or roles, compare both the inventory and the effective database state.
Integrity
Pigsty enables page checksums by default to detect page damage after write. Checksums do not detect every memory error, logical error, or incorrect application write.
The CRIT template enables Patroni strict synchronous mode and more detailed connection logging. The synchronous mode targets preservation of acknowledged transactions, but depends on synchronous_commit, synchronous-replica state, and failover conditions. Writes block when no synchronous replica is available.
CRIT configures watchdog as automatic; it activates only when the system has a usable watchdog device. Decide whether required is appropriate according to hardware and availability requirements.
Availability
- Critical clusters should normally have at least three instances across independent failure domains.
- Connect through HAProxy, a VIP, or DNS service name instead of binding clients to a fixed primary address.
- Use an odd number of etcd nodes across independent failure domains.
- Remove single points of failure in INFRA, DNS, monitoring, and software repositories according to availability requirements.
- When using
pg_rpoandpg_rto, understand their configuration semantics and validate objectives through exercises.
Replicas handle only some node failures; they do not replace backups.
Backup and Recovery
- The local pgBackRest repository is not encrypted by default and shares a failure domain with the database host.
- The
pgbackrest_method: minioobject-storage repository uses AES-256-CBC by default, butcipher_pass: pgBackRestis public and must be replaced. pgBR.${pg_cluster}inha/safeis also an example and must not be used as the final key.- Store important backups in an independent failure domain, and evaluate object locking, versioning, or offline copies.
- Exercise full restore and PITR regularly to validate WAL, keys, recovery time, and application consistency.
See Data Security and Backup and Recovery for details.
Audit and Response
The default OLTP template logs DDL, slow queries, and PostgreSQL 18 connection-authorization events. CRIT also logs connection and disconnection events.
pgaudit must be installed, preloaded, and configured with an audit policy. Installing the package alone does not produce SQL audit logs. When Vector and VictoriaLogs are enabled, adjust log retention, access, and archive policy to requirements.
Metrics, logs, and alerts are incident inputs only. Production also needs alert classification, on-call ownership, incident determination, response, evidence collection, and post-incident review.
Host and Software Supply Chain
- Move SELinux from the default
permissivetoenforcingafter compatibility validation. - Disable unnecessary SSH password authentication and remote root login; consider a bastion host or multi-factor authentication.
- Review sudo scope for the administration and database OS users.
- Keep supported Pigsty and upstream component versions current.
- Verify the software-repository GPG key fingerprint and enable per-package signature verification where required.
3 - Concepts
Pigsty is a portable, extensible open-source PostgreSQL distribution for building production-grade database services in local environments with declarative configuration and automation. It has a vast ecosystem providing a complete set of tools, scripts, and best practices to bring PostgreSQL to enterprise-grade RDS service levels.
Pigsty’s name comes from PostgreSQL In Great STYle, also understood as Postgres, Infras, Graphics, Service, Toolbox, it’s all Yours—a self-hosted PostgreSQL solution with graphical monitoring that’s all yours. You can find the source code on GitHub, visit the official documentation for more information, or experience the Web UI in the online demo.
Why Pigsty? What Can It Do?
PostgreSQL is a sufficiently perfect database kernel, but it needs more tools and systems to become a truly excellent database service. In production environments, you need to manage every aspect of your database: high availability, backup recovery, monitoring alerts, access control, parameter tuning, extension installation, connection pooling, load balancing…
Wouldn’t it be easier if all this complex operational work could be automated? This is precisely why Pigsty was created.
Pigsty provides:
Out-of-the-Box PostgreSQL Distribution
Pigsty deeply integrates 576 extensions from the PostgreSQL ecosystem, providing out-of-the-box distributed, time-series, geographic, spatial, graph, vector, search, and other multi-modal database capabilities. From kernel to RDS distribution, providing production-grade database services for versions 14-18 on EL/Debian/Ubuntu.
Self-Healing High Availability Architecture
A high availability architecture built on Patroni, Etcd, and HAProxy enables automatic failover for hardware failures with seamless traffic handoff. Primary failure recovery time RTO < 45s, data recovery point RPO ≈ 0. You can perform rolling maintenance and upgrades on the entire cluster without application coordination.
Complete Point-in-Time Recovery Capability
Based on pgBackRest and an optional Silo object-storage cluster, providing out-of-the-box PITR point-in-time recovery capability. Giving you the ability to quickly return to any point in time, protecting against software defects and accidental data deletion.
Flexible Service Access and Traffic Management
Through HAProxy, Pgbouncer, and VIP, providing flexible service access patterns for read-write separation, connection pooling, and automatic routing. Delivering stable, reliable, auto-routing, transaction-pooled high-performance database services.
Stunning Observability
An observability stack based on VictoriaMetrics and Grafana provides unparalleled monitoring best practices. Over three thousand types of monitoring metrics describe every aspect of the system, from global dashboards to CRUD operations on individual objects.
Declarative Configuration Management
Following the Infrastructure as Code philosophy, using declarative configuration to describe the entire environment. You just tell Pigsty “what kind of database cluster you want” without worrying about how to implement it—the system automatically adjusts to the desired state.
Modular Architecture Design
A modular architecture design that can be freely combined to suit different scenarios. Beyond the core PostgreSQL module, it also provides optional modules for Redis, MINIO (Silo), Etcd, and support for various PG-compatible kernels and modes.
Industry-leading security practices: a self-signed CA for encrypted communication, AES-encrypted backups, SCRAM-SHA-256 password hashing, an out-of-the-box ACL model, and least-privilege HBA rules.
Simple and Easy Deployment
All dependencies are pre-packaged for one-click installation in environments without internet access. Local sandbox environments can run on micro VMs with 1 core and 2GB RAM, providing functionality identical to production environments. Provides Vagrant-based local sandboxes and Terraform-based cloud deployments.
What Pigsty Is Not
Pigsty is not a traditional, all-encompassing PaaS (Platform as a Service) system.
Pigsty doesn’t provide basic hardware resources. It runs on nodes you provide, whether bare metal, VMs, or cloud instances, but it doesn’t create or manage these resources itself (though it provides Terraform templates to simplify cloud resource preparation).
Pigsty is not a container orchestration system. It runs directly on the operating system, not requiring Kubernetes or Docker as infrastructure. Of course, it can coexist with these systems and provides a Docker module for running stateless applications.
Pigsty is not a general database management tool. It focuses on PostgreSQL and its ecosystem. While it also supports peripheral components like Redis, Etcd, and Silo, the core is always built around PostgreSQL.
Pigsty won’t lock you in. It’s built on open-source components, doesn’t modify the PostgreSQL kernel, and introduces no proprietary protocols. You can continue using your well-managed PostgreSQL clusters anytime without Pigsty.
Pigsty doesn’t restrict how you should or shouldn’t build your database services. For example:
- Pigsty provides good parameter defaults and configuration templates, but you can override any parameter.
- Pigsty provides a declarative API, but you can still use underlying tools (Ansible, Patroni, pgBackRest, etc.) for manual management.
- Pigsty can manage the complete lifecycle, or you can use only its monitoring system to observe existing database instances or RDS.
Pigsty provides a different level of abstraction than the hardware layer—it works at the database service layer, focusing on how to deliver PostgreSQL at its best, rather than reinventing the wheel.
Evolution of PostgreSQL Deployment
To understand Pigsty’s value, let’s review the evolution of PostgreSQL deployment approaches.
Manual Deployment Era
In traditional deployment, DBAs needed to manually install and configure PostgreSQL, manually set up replication, manually configure monitoring, and manually handle failures. The problems with this approach are obvious:
- Low efficiency: Each instance requires repeating many manual operations, prone to errors.
- Lack of standardization: Databases configured by different DBAs can vary greatly, making maintenance difficult.
- Poor reliability: Failure handling depends on manual intervention, with long recovery times and susceptibility to human error.
- Weak observability: Lack of unified monitoring, making problem discovery and diagnosis difficult.
Managed Database Era
To solve these problems, cloud providers offer managed database services (RDS). Cloud RDS does solve some operational issues, but also brings new challenges:
- High cost: Managed services typically charge multiples to dozens of times hardware cost as “service fees.”
- Vendor lock-in: Migration is difficult, tied to specific cloud platforms.
- Limited functionality: Cannot use certain advanced features, extensions are restricted, parameter tuning is limited.
- Data sovereignty: Data stored in the cloud, reducing autonomy and control.
Local RDS Era
Pigsty represents a third approach: building database services in local environments that match or exceed cloud RDS.
Pigsty combines the advantages of both approaches:
- High automation: One-click deployment, automatic configuration, self-healing failures—as convenient as cloud RDS.
- Complete autonomy: Runs on your own infrastructure, data completely in your own hands.
- Extremely low cost: Run enterprise-grade database services at near-pure-hardware costs.
- Complete functionality: Unlimited use of PostgreSQL’s full capabilities and ecosystem extensions.
- Open architecture: Based on open-source components, no vendor lock-in, free to migrate anytime.
This approach is particularly suitable for:
- Private and hybrid clouds: Enterprises needing to run databases in local environments.
- Cost-sensitive users: Organizations looking to reduce database TCO.
- High-security scenarios: Critical data requiring complete autonomy and control.
- PostgreSQL power users: Scenarios requiring advanced features and rich extensions.
- Development and testing: Quickly setting up databases locally that match production environments.
What’s Next
Now that you understand Pigsty’s basic concepts, you can:
- View System Architecture to understand Pigsty’s modular design
- Learn about Cluster Model to understand how Pigsty organizes database clusters
- Study High Availability mechanisms to master self-healing principles
- Explore Point-in-Time Recovery to learn how to handle data deletion
- Research Service Access to understand stable database service delivery
- Experience Infrastructure as Code to feel the magic of declarative configuration
- Or directly start Quick Start to deploy your first Pigsty environment in minutes
3.1 - Architecture
Pigsty uses a modular architecture with a declarative interface. You can freely combine modules like building blocks as needed.
- Pigsty adopts a modular design that can be freely combined and used on demand (use one or all) to suit different scenarios.
- Pigsty uses config inventory and config parameters to describe the entire deployment environment, implemented via Ansible playbooks.
- Pigsty can run on any node—physical or virtual—as long as the OS is compatible.
Modules
Pigsty uses a modular design with six main default modules: PGSQL, INFRA, NODE, ETCD, REDIS, and MINIO.
PGSQL: Self-healing HA Postgres clusters powered by Patroni, Pgbouncer, HAproxy, PgBackrest, and more.INFRA: Local software repo, Nginx, Grafana, Victoria, AlertManager, Blackbox Exporter—the complete observability stack.NODE: Tune nodes to desired state—hostname, timezone, NTP, ssh, sudo, haproxy, docker, vector, keepalived.ETCD: Distributed key-value store as DCS for HA Postgres clusters: consensus leader election/config management/service discovery.REDIS: Redis servers supporting standalone primary-replica, sentinel, and cluster modes with full monitoring.MINIO: S3-compatible simple object storage that can serve as an optional backup destination for PG databases.
You can declaratively compose them freely. If you only want host monitoring, installing the INFRA module on infrastructure nodes and the NODE module on managed nodes is sufficient.
The ETCD and PGSQL modules are used to build HA PG clusters—installing these modules on multiple nodes automatically forms a high-availability database cluster.
You can reuse Pigsty infrastructure and develop your own modules; REDIS and MINIO can serve as examples. Protocol compatibility layers such as PostgreSQL Mongo mode are composed from standard PGSQL and Docker APP workflows.
Note that all modules depend strongly on the NODE module: in Pigsty, nodes must first have the NODE module installed to be managed before deploying other modules.
When nodes (by default) use the local software repo for installation, the NODE module has a weak dependency on the INFRA module. Therefore, the admin/infrastructure nodes with the INFRA module complete the bootstrap process in the deploy.yml playbook, resolving the circular dependency.
Standalone Installation
By default, Pigsty installs on a single node (physical/virtual machine). The deploy.yml playbook installs INFRA, ETCD, PGSQL, and optionally MINIO modules on the current node,
giving you a fully-featured observability stack (VictoriaMetrics, VictoriaLogs, VictoriaTraces, Grafana, Alertmanager, Blackbox Exporter, etc.), plus a built-in PostgreSQL standalone instance as a CMDB, ready to use out of the box (cluster name pg-meta, database name meta).
This node now has a complete self-monitoring system, visualization tools, and a Postgres database with PITR auto-configured (HA unavailable since you only have one node). You can use this node as a devbox, for testing, running demos, and data visualization/analysis. Or, use this node as an admin node to deploy and manage more nodes!
Monitoring
The installed standalone meta node can serve as an admin node and monitoring center to bring more nodes and database servers under its supervision and control.
Pigsty’s monitoring system can be used independently. If you want to install the VictoriaMetrics/Grafana observability stack, Pigsty provides best practices! It offers rich dashboards for host nodes and PostgreSQL databases. Whether or not these nodes or PostgreSQL servers are managed by Pigsty, with simple configuration, you immediately have a production-grade monitoring and alerting system, bringing existing hosts and PostgreSQL under management.
HA PostgreSQL Clusters
Pigsty helps you own your own production-grade HA PostgreSQL RDS service anywhere.
To create such an HA PostgreSQL cluster/RDS service, you simply describe it with a short config and run the playbook to create it:
In less than 10 minutes, you’ll have a PostgreSQL database cluster with service access, monitoring, backup PITR, and HA fully configured.
Hardware failures are covered by the self-healing HA architecture provided by patroni, etcd, and haproxy—in case of primary failure, automatic failover executes within 45 seconds by default. Clients don’t need to modify config or restart applications: Haproxy uses patroni health checks for traffic distribution, and read-write requests are automatically routed to the new cluster primary, avoiding split-brain issues. This process is seamless—for example, in case of replica failure or planned switchover, clients experience only a momentary flash of the current query.
Software failures, human errors, and datacenter-level disasters are covered by pgBackRest and the optional Silo cluster. This provides local/cloud PITR capabilities and, in case of datacenter failure, offers cross-region replication and disaster recovery.
3.1.1 - Nodes
A node is an abstraction of hardware resources and operating systems. It can be a physical machine, bare metal, virtual machine, or container/pod.
Any machine running a Linux OS (with systemd daemon) and standard CPU/memory/disk/network resources can be treated as a node.
Nodes can have modules installed. Pigsty has several node types, distinguished by which modules are deployed:
| Type | Description |
|---|---|
| Regular Node | A node managed by Pigsty |
| ADMIN Node | The node that runs Ansible to issue management commands |
| INFRA Node | Nodes with the INFRA module installed |
| ETCD Node | Nodes with the ETCD module for DCS |
| MINIO Node | Nodes with the MINIO module for object storage |
| PGSQL Node | Nodes with the PGSQL module installed |
| … | Nodes with other modules… |
In a singleton Pigsty deployment, multiple roles converge on one node: it serves as the regular node, admin node, infra node, ETCD node, and database node simultaneously.
Regular Node
Nodes managed by Pigsty can have modules installed. The node.yml playbook configures nodes to the desired state.
A regular node may run the following services:
| Component | Port | Description | Status |
|---|---|---|---|
node_exporter | 9100 | Host metrics exporter | Enabled |
haproxy | 9101 | HAProxy load balancer (admin port) | Enabled |
vector | 9598 | Log collection agent | Enabled |
docker | 9323 | Container runtime support | Optional |
keepalived | n/a | L2 VIP for node cluster | Optional |
keepalived_exporter | 9650 | Keepalived status monitor | Optional |
Here, node_exporter exposes host metrics, vector sends logs to the collection system, and haproxy provides load balancing. These three are enabled by default.
Docker, keepalived, and keepalived_exporter are optional and can be enabled as needed.
ADMIN Node
A Pigsty deployment has exactly one admin node—the node that runs Ansible playbooks and issues control/deployment commands.
This node has ssh/sudo access to all other nodes. Admin node security is critical and access must be strictly controlled; see Security Model: Trust Boundaries for its trust scope and critical assets.
During single-node installation and configuration, the current node becomes the admin node. However, alternatives exist. For example, if your laptop can SSH to all managed nodes and has Ansible installed, it can serve as the admin node—though this isn’t recommended for production.
For instance, you might use your laptop to manage a Pigsty VM in the cloud. In this case, your laptop is the admin node.
In serious production environments, the admin node is typically 1-2 dedicated DBA machines. In resource-constrained setups, INFRA nodes often double as admin nodes since all INFRA nodes have Ansible installed by default.
INFRA Node
A Pigsty deployment may have 1 or more INFRA nodes; large production environments typically have 2-3.
The infra group in the inventory defines which nodes are INFRA nodes. These nodes run the INFRA module with these components:
| Component | Port | Description |
|---|---|---|
nginx | 80/443 | Web UI, local software repository |
grafana | 3000 | Visualization platform |
victoriaMetrics | 8428 | Time-series database (metrics) |
victoriaLogs | 9428 | Log collection server |
victoriaTraces | 10428 | Trace collection server |
vmalert | 8880 | Alerting and derived metrics |
alertmanager | 9059 | Alert aggregation and routing |
blackbox_exporter | 9115 | Blackbox probing (ping nodes/VIPs) |
dnsmasq | 53 | Internal DNS resolution |
chronyd | 123 | NTP time server |
ansible | - | Playbook execution |
Nginx serves as the module’s entry point, providing the web UI and local software repository. With multiple INFRA nodes, services on each are independent, but you can access all monitoring data sources from any INFRA node’s Grafana.
Pigsty is licensed under Apache-2.0, though embedded Grafana component uses AGPLv3.
ETCD Node
The ETCD module provides Distributed Consensus Service (DCS) for PostgreSQL high availability.
The etcd group in the inventory defines ETCD nodes. These nodes run etcd servers on two ports:
| Component | Port | Description |
|---|---|---|
etcd | 2379 | ETCD key-value store (client port) |
etcd | 2380 | ETCD cluster peer communication |
MINIO Node
The MINIO module provides optional backup storage for PostgreSQL.
The minio inventory group defines MINIO module nodes. In v4.5.0, these nodes run Silo servers on:
| Component | Port | Description |
|---|---|---|
silo | 9000 | S3 API endpoint |
silo | 9001 | Silo admin console |
PGSQL Node
Nodes with the PGSQL module are called PGSQL nodes. Node and PostgreSQL instance have a 1:1 deployment—one PG instance per node.
PGSQL nodes can borrow identity from their PostgreSQL instance—controlled by node_id_from_pg, defaulting to true, meaning the node name is set to the PG instance name.
PGSQL nodes run these additional components beyond regular node services:
| Component | Port | Description | Status |
|---|---|---|---|
postgres | 5432 | PostgreSQL database server | Enabled |
pgbouncer | 6432 | PgBouncer connection pool | Enabled |
patroni | 8008 | Patroni HA management | Enabled |
pg_exporter | 9630 | PostgreSQL metrics exporter | Enabled |
pgbouncer_exporter | 9631 | PgBouncer metrics exporter | Enabled |
pgbackrest_exporter | 9854 | pgBackRest metrics exporter | Enabled |
vip-manager | n/a | Binds L2 VIP to cluster primary | Optional |
{{ pg_cluster }}-primary | 5433 | HAProxy service: pooled read/write | Enabled |
{{ pg_cluster }}-replica | 5434 | HAProxy service: pooled read-only | Enabled |
{{ pg_cluster }}-default | 5436 | HAProxy service: primary direct connection | Enabled |
{{ pg_cluster }}-offline | 5438 | HAProxy service: offline read | Enabled |
{{ pg_cluster }}-<service> | 543x | HAProxy service: custom PostgreSQL services | Custom |
The vip-manager is only enabled when users configure a PG VIP.
Additional custom services can be defined in pg_services, exposed via haproxy using additional service ports.
Node Relationships
Regular nodes typically reference an INFRA node via the admin_ip parameter as their infrastructure provider.
For example, with global admin_ip = 10.10.10.10, all nodes use infrastructure services at this IP.
Parameters that reference ${admin_ip}:
| Parameter | Module | Default Value | Description |
|---|---|---|---|
repo_endpoint | INFRA | http://${admin_ip}:80 | Software repo URL |
repo_upstream.baseurl | INFRA | http://${admin_ip}/pigsty | Local repo baseurl |
infra_portal.endpoint | INFRA | ${admin_ip}:<port> | Nginx proxy backend |
dns_records | INFRA | ["${admin_ip} i.pigsty", ...] | DNS records |
node_default_etc_hosts | NODE | ["${admin_ip} i.pigsty"] | Default static DNS |
node_etc_hosts | NODE | - | Custom static DNS |
node_dns_servers | NODE | ["${admin_ip}"] | Dynamic DNS servers |
node_ntp_servers | NODE | - | NTP servers (optional) |
Typically the admin node and INFRA node coincide. With multiple INFRA nodes, the admin node is usually the first one; others serve as backups.
In large-scale production deployments, you might separate the Ansible admin node from INFRA module nodes. For example, use 1-2 small dedicated hosts under the DBA team as the control hub (ADMIN nodes), and 2-3 high-spec physical machines as monitoring infrastructure (INFRA nodes).
Typical node counts by deployment scale:
| Scale | ADMIN | INFRA | ETCD | MINIO | PGSQL |
|---|---|---|---|---|---|
| Single-node | 1 | 1 | 1 | 0 | 1 |
| 3-node | 1 | 3 | 3 | 0 | 3 |
| Small prod | 1 | 2 | 3 | 0 | N |
| Large prod | 2 | 3 | 5 | 4+ | N |
3.1.2 - Infrastructure
Running production-grade, highly available PostgreSQL clusters typically requires a comprehensive set of infrastructure services (foundation) for support, such as monitoring and alerting, log collection, time synchronization, DNS resolution, and local software repositories. Pigsty provides the INFRA module to address this—it’s an optional module, but we strongly recommend enabling it.
Overview
The diagram below shows the architecture of a single-node deployment. The right half represents the components included in the INFRA module:
| Component | Type | Description |
|---|---|---|
| Nginx | Web Server | Unified entry for WebUI, local repo, reverse proxy for internal services |
| Repo | Software Repo | APT/DNF repository with all RPM/DEB packages needed for deployment |
| Grafana | Visualization | Displays metrics, logs, and traces; hosts dashboards, reports, and custom data apps |
| VictoriaMetrics | Time Series DB | Scrapes all metrics, Prometheus API compatible, provides VMUI query interface |
| VictoriaLogs | Log Platform | Centralized log storage; all nodes run Vector by default, pushing logs here |
| VictoriaTraces | Tracing | Collects slow SQL, service traces, and other tracing data |
| VMAlert | Eval Rule/Alert | Evaluates alerting rules, pushes events to Alertmanager |
| AlertManager | Alert Manager | Aggregates alerts, dispatches notifications via email, Webhook, etc. |
| BlackboxExporter | Blackbox Probe | Probes reachability of IPs/VIPs/URLs |
| DNSMASQ | DNS Service | Provides DNS resolution for domains used within Pigsty [Optional] |
| Chronyd | Time Sync | Provides NTP time synchronization to ensure consistent time across nodes [Optional] |
| CA | Certificate | Issues encryption certificates within the environment |
| Ansible | Orchestration | Batch, declarative, agentless tool for managing large numbers of servers |
Nginx
Nginx is the access entry point for all WebUI services in Pigsty, using ports 80 / 443 for HTTP/HTTPS by default. Live Demo
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10 | http://i.pigsty | https://i.pigsty | https://demo.pigsty.io |
Infrastructure components with WebUIs can be exposed uniformly through Nginx, such as Grafana, VictoriaMetrics (VMUI), AlertManager, and HAProxy console. Additionally, the local software repository and other static resources are served via Nginx.
Nginx configures local web servers or reverse proxy servers based on definitions in infra_portal.
By default, it exposes Pigsty’s admin homepage: i.pigsty. Different endpoints on this page proxy different components:
| Endpoint | Component | Native Port | Notes | Public Demo |
|---|---|---|---|---|
/ | Nginx | 80/443 | Homepage, local repo, file server | demo.pigsty.io |
/ui/ | Grafana | 3000 | Grafana dashboard entry | demo.pigsty.io/ui/ |
/vmetrics/ | VictoriaMetrics | 8428 | Time series DB Web UI | demo.pigsty.io/vmetrics/ |
/vlogs/ | VictoriaLogs | 9428 | Log DB Web UI | demo.pigsty.io/vlogs/ |
/vtraces/ | VictoriaTraces | 10428 | Tracing Web UI | demo.pigsty.io/vtraces/ |
/vmalert/ | VMAlert | 8880 | Alert rule management | demo.pigsty.io/vmalert/ |
/alertmgr/ | AlertManager | 9059 | Alert management Web UI | demo.pigsty.io/alertmgr/ |
/blackbox/ | Blackbox | 9115 | Blackbox probe |
Pigsty allows rich customization of Nginx as a local file server or reverse proxy, with self-signed or real HTTPS certificates.
For more information, see: Tutorial: Nginx—Expose Web Services via Proxy and Tutorial: Certbot—Request and Renew HTTPS Certificates
Repo
Pigsty creates a local software repository on the Infra node during installation to accelerate subsequent software installations. Live Demo
This repository defaults to the /www/pigsty directory,
served by Nginx and mounted at the /pigsty path:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/pigsty | http://i.pigsty/pigsty | https://i.pigsty/pigsty | https://demo.pigsty.io/pigsty |
Pigsty supports offline installation, which essentially pre-copies a prepared local software repository to the target environment.
When Pigsty finds /www/pigsty/repo_complete during deployment, it skips upstream downloads and uses the existing repository directly.
The current source has sow generate this file as both a completion marker and a SHA-256 manifest of repository contents. To force a rebuild, run ./infra.yml -t repo_build -e repo_build=true.
For more information, see: Config: INFRA - REPO
Grafana
Grafana is the core component of Pigsty’s monitoring system, used for visualizing metrics, logs, and various information. Live Demo
Grafana listens on port 3000 by default and is proxied via Nginx at the /ui path:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/ui | http://i.pigsty/ui | https://i.pigsty/ui | https://demo.pigsty.io/ui |
Pigsty provides pre-built dashboards based on VictoriaMetrics / Logs / Traces, with one-click drill-down and roll-up via URL jumps for rapid troubleshooting.
Grafana can also serve as a low-code visualization platform, so ECharts, victoriametrics-datasource, victorialogs-datasource plugins are installed by default,
with Vector / Victoria datasources registered uniformly as vmetrics-*, vlogs-*, vtraces-* for easy custom dashboard extension.

For more information, see: Config: INFRA - GRAFANA.
VictoriaMetrics
VictoriaMetrics is Pigsty’s time series database, responsible for scraping and storing all monitoring metrics. Live Demo
It listens on port 8428 by default, mounted at Nginx /vmetrics path, and also accessible via the p.pigsty domain:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/vmetrics | http://p.pigsty | https://i.pigsty/vmetrics | https://demo.pigsty.io/vmetrics |
VictoriaMetrics is fully compatible with the Prometheus API, supporting PromQL queries, remote read/write protocols, and the Alertmanager API. The built-in VMUI provides an ad-hoc query interface for exploring metrics data directly, and also serves as a Grafana datasource.
For more information, see: Config: INFRA - VMETRICS
VictoriaLogs
VictoriaLogs is Pigsty’s log platform, centrally storing structured logs from all nodes. Live Demo
It listens on port 9428 by default, mounted at Nginx /vlogs path:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/vlogs | http://i.pigsty/vlogs | https://i.pigsty/vlogs | https://demo.pigsty.io/vlogs |
All managed nodes run Vector Agent by default, collecting system logs, PostgreSQL logs, Patroni logs, Pgbouncer logs, etc., processing them into structured format and pushing to VictoriaLogs. The built-in Web UI supports log search and filtering, and can be integrated with Grafana’s victorialogs-datasource plugin for visual analysis.
For more information, see: Config: INFRA - VLOGS
VictoriaTraces
VictoriaTraces is used for collecting trace data and slow SQL records. Live Demo
It listens on port 10428 by default, mounted at Nginx /vtraces path:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/vtraces | http://i.pigsty/vtraces | https://i.pigsty/vtraces | https://demo.pigsty.io/vtraces |
VictoriaTraces provides a Jaeger-compatible interface for analyzing service call chains and database slow queries. Combined with Grafana dashboards, it enables rapid identification of performance bottlenecks and root cause tracing.
For more information, see: Config: INFRA - VTRACES
VMAlert
VMAlert is the alerting rule computation engine, responsible for evaluating alert rules and pushing triggered events to Alertmanager. Live Demo
It listens on port 8880 by default, mounted at Nginx /vmalert path:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/vmalert | http://i.pigsty/vmalert | https://i.pigsty/vmalert | https://demo.pigsty.io/vmalert |
VMAlert reads metrics data from VictoriaMetrics and periodically evaluates alerting rules. Pigsty provides pre-built alerting rules for PGSQL, NODE, REDIS, and other modules, covering common failure scenarios out of the box.
For more information, see: Config: INFRA - VMALERT
AlertManager
AlertManager handles alert event aggregation, deduplication, grouping, and dispatch. Live Demo
It listens on port 9059 by default, mounted at Nginx /alertmgr path, and also accessible via the a.pigsty domain:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/alertmgr | http://a.pigsty | https://i.pigsty/alertmgr | https://demo.pigsty.io/alertmgr |
AlertManager supports multiple notification channels: email, Webhook, Slack, PagerDuty, WeChat Work, etc. Through alert routing rules, differentiated dispatch based on severity level and module type is possible, with support for silencing, inhibition, and other advanced features.
For more information, see: Config: INFRA - AlertManager
BlackboxExporter
Blackbox Exporter is used for active probing of target reachability, enabling blackbox monitoring.
It listens on port 9115 by default, mounted at Nginx /blackbox path:
| IP Access (replace) | Domain (HTTP) | Domain (HTTPS) | Public Demo |
|---|---|---|---|
http://10.10.10.10/blackbox | http://i.pigsty/blackbox | https://i.pigsty/blackbox | https://demo.pigsty.io/blackbox |
It supports multiple probe methods including ICMP Ping, TCP ports, and HTTP/HTTPS endpoints. Useful for monitoring VIP reachability, service port availability, external dependency health, etc.—an important tool for assessing failure impact scope.
For more information, see: Config: INFRA - BLACKBOX
Ansible
Ansible is Pigsty’s core orchestration tool; all deployment, configuration, and management operations are performed through Ansible Playbooks.
Pigsty automatically installs Ansible on the admin node (Infra node) during installation. It adopts a declarative configuration style and idempotent playbook design: the same playbook can be run repeatedly, and the system automatically converges to the desired state without side effects.
Ansible’s core advantages:
- Agentless: Executes remotely via SSH, no additional software needed on target nodes.
- Declarative: Describes the desired state rather than execution steps; configuration is documentation.
- Idempotent: Multiple executions produce consistent results; supports retry after partial failures.
For more information, see: Playbooks: Pigsty Playbook
DNSMASQ
DNSMASQ provides DNS resolution on INFRA nodes, resolving domain names to their corresponding IP addresses.
DNSMASQ listens on port 53 (UDP/TCP) by default, providing DNS resolution for all nodes. Records are stored in the /etc/dnsmasq.d/pigsty directory.
Other modules automatically register their domain names with DNSMASQ during deployment, which you can use as needed. DNS is completely optional—Pigsty works normally without it. Client nodes can configure INFRA nodes as their DNS servers, allowing access to services via domain names without remembering IP addresses.
dns_records: Default DNS records written to INFRA nodesnode_dns_servers: Configure DNS servers for nodes, defaults to INFRA node viaadmin_ip(can also be disabled)
For more information, see: Config: INFRA - DNS and Tutorial: DNS—Configure Domain Resolution
Chronyd
Chronyd provides NTP time synchronization, ensuring consistent clocks across all nodes. It listens on port 123 (UDP) by default as the time source.
Time synchronization is critical for distributed systems: log analysis requires aligned timestamps, certificate validation depends on accurate clocks, and PostgreSQL streaming replication is sensitive to clock drift. In isolated network environments, the INFRA node can serve as an internal NTP server with other nodes synchronizing to it.
In Pigsty, all nodes run chronyd by default for time sync. The default upstream is pool.ntp.org public NTP servers.
Chronyd is essentially managed by the Node module, but in isolated networks, you can use admin_ip to point to the INFRA node’s Chronyd service as the internal time source.
In this case, the Chronyd service on the INFRA node serves as the internal time synchronization infrastructure.
For more information, see: Config: NODE - TIME
INFRA Node vs Regular Node
In Pigsty, the relationship between nodes and infrastructure is a weak circular dependency: node_monitor → infra → node
The NODE module itself doesn’t depend on the INFRA module, but the monitoring functionality (node_monitor) requires the monitoring platform and services provided by the infrastructure module.
Therefore, in the infra.yml and deploy playbooks, an “interleaved deployment” technique is used:
- First, initialize the NODE module on all regular nodes, but skip monitoring config since infrastructure isn’t deployed yet.
- Then, initialize the INFRA module on the INFRA node—monitoring is now available.
- Finally, reconfigure monitoring on all regular nodes, connecting to the now-deployed monitoring platform.
If you don’t need “one-shot” deployment of all nodes, you can use phased deployment: initialize INFRA nodes first, then regular nodes.
How Are Nodes Coupled to Infrastructure?
Regular nodes reference an INFRA node via the admin_ip parameter as their infrastructure provider.
For example, when you configure global admin_ip = 10.10.10.10, all nodes will typically use infrastructure services at this IP.
This design allows quick, batch switching of infrastructure providers. Parameters that may reference ${admin_ip}:
| Parameter | Module | Default Value | Description |
|---|---|---|---|
repo_endpoint | INFRA | http://${admin_ip}:80 | Software repo URL |
repo_upstream.baseurl | INFRA | http://${admin_ip}/pigsty | Local repo baseurl |
infra_portal.endpoint | INFRA | ${admin_ip}:<port> | Nginx proxy backend |
dns_records | INFRA | ["${admin_ip} i.pigsty", ...] | DNS records |
node_default_etc_hosts | NODE | ["${admin_ip} i.pigsty"] | Default static DNS |
node_etc_hosts | NODE | [] | Custom static DNS |
node_dns_servers | NODE | ["${admin_ip}"] | Dynamic DNS servers |
node_ntp_servers | NODE | ["pool pool.ntp.org iburst"] | NTP servers (optional) |
For example, when a node installs software, the local repo points to the Nginx local software repository at admin_ip:80/pigsty. The DNS server also points to DNSMASQ at admin_ip:53.
However, this isn’t mandatory—nodes can ignore the local repo and install directly from upstream internet sources (most single-node config templates); DNS servers can also remain unconfigured, as Pigsty has no DNS dependency.
INFRA Node vs ADMIN Node
The management-initiating ADMIN node typically coincides with the INFRA node.
In single-node deployment, this is exactly the case. In multi-node deployment with multiple INFRA nodes, the admin node is usually the first in the infra group; others serve as backups.
However, exceptions exist. You might separate them for various reasons:
For example, in large-scale production deployments, a classic pattern uses 1-2 dedicated management hosts (tiny VMs suffice) belonging to the DBA team as the control hub, with 2-3 high-spec physical machines (or more!) as monitoring infrastructure. Here, admin nodes are separate from infrastructure nodes. In this case, the admin_ip in your config should point to an INFRA node’s IP, not the current ADMIN node’s IP. This is for historical reasons: initially ADMIN and INFRA nodes were tightly coupled concepts, with separation capabilities evolving later, so the parameter name wasn’t changed.
Another common scenario is managing cloud nodes locally. For example, you can install Ansible on your laptop and specify cloud nodes as “managed targets.” In this case, your laptop acts as the ADMIN node, while cloud servers act as INFRA nodes.
Multiple INFRA Nodes
By default, Pigsty only needs one INFRA node for most requirements. Even if the INFRA module goes down, it won’t affect database services on other nodes.
However, in production environments with high monitoring and alerting requirements, you may want multiple INFRA nodes to improve infrastructure availability. A common deployment uses two Infra nodes for redundancy, monitoring each other… or more nodes to deploy a distributed Victoria cluster for unlimited horizontal scaling.
Each Infra node is independent—Nginx points to services on the local machine. VictoriaMetrics independently scrapes metrics from all services in the environment, and logs are pushed to all VictoriaLogs collection endpoints by default. The only exception is Grafana: every Grafana instance registers all VictoriaMetrics / Logs / Traces / PostgreSQL instances as datasources. Therefore, each Grafana instance can see complete monitoring data.
If you modify Grafana—such as adding new dashboards or changing datasource configs—these changes only affect the Grafana instance on that node. To keep Grafana consistent across all nodes, use a PostgreSQL database as shared storage. See Tutorial: Configure Grafana High Availability for details.
3.1.3 - PGSQL Arch
The PGSQL module organizes PostgreSQL in production as clusters—logical entities composed of a group of database instances associated by primary-replica relationships.
Overview
The PGSQL module includes the following components, working together to provide production-grade PostgreSQL HA cluster services:
| Component | Type | Description |
|---|---|---|
postgres | Database | The world’s most advanced open-source relational database, PGSQL core |
patroni | HA | Manages PostgreSQL, coordinates failover, leader election, config changes |
pgbouncer | Pool | Lightweight connection pooling middleware, reduces overhead, adds flexibility |
pgbackrest | Backup | Full/incremental backup and WAL archiving, supports local and object storage |
pg_exporter | Metrics | Exports PostgreSQL monitoring metrics in a Prometheus-compatible format |
pgbouncer_exporter | Metrics | Exports Pgbouncer connection pool metrics |
pgbackrest_exporter | Metrics | Exports backup status metrics |
vip-manager | VIP | Binds L2 VIP to current primary node for transparent failover [Optional] |
The vip-manager is an on-demand component. Additionally, PGSQL uses components from other modules:
| Component | Module | Type | Description |
|---|---|---|---|
haproxy | NODE | LB | Exposes service ports, routes traffic to primary or replicas |
vector | NODE | Logging | Collects PostgreSQL, Patroni, Pgbouncer logs and ships to center |
etcd | ETCD | DCS | Distributed consistent store for cluster metadata and leader info |
By analogy, the PostgreSQL database kernel is the CPU, while the PGSQL module packages it as a complete computer. Patroni and Etcd form the HA subsystem, while pgBackRest and optional Silo form the backup subsystem. HAProxy, Pgbouncer, and vip-manager form the access subsystem. Various Exporters and Vector build the observability subsystem; finally, you can swap different kernel CPUs and extension cards.

| Subsystem | Components | Function |
|---|---|---|
| HA Subsystem | Patroni + etcd | Failure detection, auto-failover, config management |
| Access Subsystem | HAProxy + Pgbouncer + vip-manager | Service exposure, load balancing, pooling, VIP |
| Backup Subsystem | pgBackRest (+ Silo) | Full/incremental backup, WAL archiving, PITR |
| Observability Subsystem | pg_exporter / pgbouncer_exporter / pgbackrest_exporter + Vector | Metrics collection, log aggregation |
Component Interaction
- Cluster DNS is resolved by DNSMASQ on infra nodes
- Cluster VIP is managed by vip-manager, which binds
pg_vip_addressto the cluster primary node.- vip-manager gets cluster leader info written by patroni from the etcd cluster
- Cluster services are exposed by HAProxy on nodes, different services distinguished by node ports (543x).
- HAProxy port 9101: Monitoring metrics & statistics & admin page
- HAProxy port 5433: Routes to primary pgbouncer: read-write service
- HAProxy port 5434: Routes to replica pgbouncer: read-only service
- HAProxy port 5436: Routes to primary postgres: default service
- HAProxy port 5438: Routes to offline postgres: offline service
- HAProxy routes traffic based on health check info from patroni.
- Pgbouncer is connection pooling middleware, listening on port 6432 by default, buffering connections, exposing additional metrics, and providing extra flexibility.
- PostgreSQL listens on port 5432, providing relational database services
- Installing PGSQL module on multiple nodes with the same cluster name automatically forms an HA cluster via streaming replication
- PostgreSQL process is managed by patroni by default.
- Patroni listens on port 8008 by default, supervising PostgreSQL server processes
- pg_exporter exposes postgres monitoring metrics on port 9630
- pgbouncer_exporter exposes pgbouncer metrics on port 9631
- pgBackRest uses local backup repository by default (
pgbackrest_method=local)- If using
local(default), pgBackRest creates local repository underpg_fs_bkupon primary node - If using
minio, pgBackRest creates the backup repository on dedicated Silo or an external S3 service
- If using
- Vector collects Postgres-related logs (postgres, pgbouncer, patroni, pgbackrest)
HA Subsystem
The HA subsystem consists of Patroni and etcd, responsible for PostgreSQL cluster failure detection, automatic failover, and configuration management.
How it works: Patroni runs on each node, managing the local PostgreSQL process and writing cluster state (leader, members, config) to etcd. When the primary fails, Patroni coordinates election via etcd, promoting the healthiest replica to new primary. The entire process is automatic, with RTO typically under 45 seconds.
Key Interactions:
- PostgreSQL: Starts, stops, reloads PG as parent process, controls its lifecycle
- etcd: External dependency, writes/watches leader key for distributed consensus and failure detection
- HAProxy: Provides health checks via REST API (
:8008), reporting instance role - vip-manager: Watches leader key in etcd, auto-migrates VIP
For more information, see: High Availability and Config: PGSQL - PG_BOOTSTRAP
Access Subsystem
The access subsystem consists of HAProxy, Pgbouncer, and vip-manager, responsible for service exposure, traffic routing, and connection pooling.
There are multiple access methods. A typical traffic path is: Client → DNS/VIP → HAProxy (543x) → Pgbouncer (6432) → PostgreSQL (5432)
| Layer | Component | Port | Role |
|---|---|---|---|
| L2 VIP | vip-manager | - | Binds L2 VIP to primary (optional) |
| L4 Load Bal | HAProxy | 543x | Service exposure, load balancing, health checks |
| L7 Pool | Pgbouncer | 6432 | Connection reuse, session management, transaction pooling |
Service Ports:
5433primary: Read-write service, routes to primary Pgbouncer5434replica: Read-only service, routes to replica Pgbouncer5436default: Default service, direct to primary (bypasses pool)5438offline: Offline service, direct to offline replica (ETL/analytics)
Key Features:
- HAProxy uses Patroni REST API to determine instance role, auto-routes traffic
- Pgbouncer uses transaction-level pooling, absorbs connection spikes, reduces PG connection overhead
- vip-manager watches etcd leader key, auto-migrates VIP during failover
For more information, see: Service Access and Config: PGSQL - PG_ACCESS
Backup Subsystem
The backup subsystem consists of pgBackRest (optionally with Silo or external S3 as a remote repository), responsible for data backup and point-in-time recovery (PITR).
Backup Types:
- Full backup: Complete database copy
- Incremental/differential backup: Only backs up changed data blocks
- WAL archiving: Continuous transaction log archiving, enables any point-in-time recovery
Storage Backends:
local(default): Local disk, backups stored atpg_fs_bkupmount pointminio: S3-compatible object storage, supports centralized backup management and off-site DR
Key Interactions:
- pgBackRest → PostgreSQL: Executes backup commands, manages WAL archiving
- pgBackRest → Patroni: Recovery can bootstrap replicas as new primary or standby
- pgbackrest_exporter → VictoriaMetrics: Exports backup status metrics through the Prometheus-compatible protocol to monitor backup health
For more information, see: PITR, Backup & Recovery, and Config: PGSQL - PG_BACKUP
Observability Subsystem
The observability subsystem consists of three Exporters and Vector, responsible for metrics collection and log aggregation.
| Component | Port | Target | Key Metrics |
|---|---|---|---|
| pg_exporter | 9630 | PostgreSQL | Sessions, transactions, replication lag, buffer hits |
| pgbouncer_exporter | 9631 | Pgbouncer | Pool utilization, wait queue, hit rate |
| pgbackrest_exporter | 9854 | pgBackRest | Latest backup time, size, type |
| vector | 9598 | postgres/patroni/pgbouncer logs | Structured log stream |
Data Flow:
- Metrics: Exporter → VictoriaMetrics (INFRA) → Grafana dashboards
- Logs: Vector → VictoriaLogs (INFRA) → Grafana log queries
pg_exporter / pgbouncer_exporter connect to target services via local Unix socket, decoupled from HA topology. In slim install mode, these components can be disabled.
For more information, see: Config: PGSQL - PG_MONITOR
PostgreSQL
PostgreSQL is the PGSQL module core, listening on port 5432 by default for relational database services, deployed 1:1 with nodes.
Pigsty currently supports PostgreSQL 14-18 (lifecycle major versions), installed via binary packages from the PGDG official repo. Pigsty also allows you to use other PG kernel forks to replace the default PostgreSQL kernel, and install up to 576 extension plugins on top of the PG kernel.
PostgreSQL processes are managed by default by the HA agent—Patroni. When a cluster has only one node, that instance is the primary; when the cluster has multiple nodes, other instances automatically join as replicas: through physical replication, syncing data changes from the primary in real-time. Replicas can handle read-only requests and automatically take over when the primary fails.
You can access PostgreSQL directly, or through HAProxy and Pgbouncer connection pool.
For more information, see: Config: PGSQL - PG_BOOTSTRAP
Patroni
Patroni is the PostgreSQL HA control component, listening on port 8008 by default.
Patroni takes over PostgreSQL startup, shutdown, configuration, and health status, writing leader and member information to etcd. It handles automatic failover, maintains replication factor, coordinates parameter changes, and provides a REST API for HAProxy, monitoring, and administrators.
HAProxy uses Patroni health check endpoints to determine instance roles and route traffic to the correct primary or replica. vip-manager monitors the leader key in etcd and automatically migrates the VIP when the primary changes.
For more information, see: Config: PGSQL - PG_BOOTSTRAP
Pgbouncer
Pgbouncer is a lightweight connection pooling middleware, listening on port 6432 by default, deployed 1:1 with PostgreSQL database and node.
Pgbouncer runs statelessly on each instance, connecting to PostgreSQL via local Unix socket, using Transaction Pooling by default for pool management, absorbing burst client connections, stabilizing database sessions, reducing lock contention, and significantly improving performance under high concurrency.
Pigsty routes production traffic (read-write service 5433 / read-only service 5434) through Pgbouncer by default,
while only the default service (5436) and offline service (5438) bypass the pool for direct PostgreSQL connections.
Pool mode is controlled by pgbouncer_poolmode, defaulting to transaction (transaction-level pooling).
Connection pooling can be disabled via pgbouncer_enabled.
For more information, see: Config: PGSQL - PG_ACCESS
pgBackRest
pgBackRest is a professional PostgreSQL backup/recovery tool, one of the strongest in the PG ecosystem, supporting full/incremental/differential backup and WAL archiving.
Pigsty uses pgBackRest for PostgreSQL PITR capability, allowing you to roll back clusters to any point within the backup retention window.
pgBackRest works with PostgreSQL to create backup repositories on the primary, executing backup and archive tasks.
By default, it uses local backup repository (pgbackrest_method = local),
but can be configured for Silo or external S3 object storage for centralized backup management.
After initialization, pgbackrest_init_backup can automatically trigger the first full backup.
Recovery integrates with Patroni, supporting bootstrapping replicas as new primaries or standbys.
For more information, see: Backup & Recovery and Config: PGSQL - PG_BACKUP
HAProxy
HAProxy is the service entry point and load balancer, exposing multiple database service ports.
| Port | Service | Target | Description |
|---|---|---|---|
9101 | Admin | - | HAProxy statistics and admin page |
5433 | primary | Primary Pgbouncer | Read-write service, routes to primary pool |
5434 | replica | Replica Pgbouncer | Read-only service, routes to replica pool |
5436 | default | Primary Postgres | Default service, direct to primary (bypasses pool) |
5438 | offline | Offline Postgres | Offline service, direct to offline replica (ETL/analytics) |
HAProxy uses Patroni REST API health checks to determine instance roles and route traffic to the appropriate primary or replica.
Service definitions are composed from pg_default_services and pg_services.
A dedicated HAProxy node group can be specified via pg_service_provider to handle higher traffic;
by default, HAProxy on local nodes publishes services.
For more information, see: Service Access and Config: PGSQL - PG_ACCESS
vip-manager
vip-manager binds L2 VIP to the current primary node. This is an optional component; enable it if your network supports L2 VIP.
vip-manager runs on each PG node, monitoring the leader key written by Patroni in etcd,
and binds pg_vip_address to the current primary node’s network interface.
When cluster failover occurs, vip-manager immediately releases the VIP from the old primary and rebinds it on the new primary, switching traffic to the new primary.
This component is optional, enabled via pg_vip_enabled.
When enabled, ensure all nodes are in the same VLAN; otherwise, VIP migration will fail.
Public cloud networks typically don’t support L2 VIP; it’s recommended only for on-premises and private cloud environments.
For more information, see: Tutorial: VIP Configuration and Config: PGSQL - PG_ACCESS
pg_exporter
pg_exporter exports PostgreSQL monitoring metrics, listening on port 9630 by default.
pg_exporter runs on each PG node, connecting to PostgreSQL via local Unix socket, exporting rich metrics covering sessions, buffer hits, replication lag, transaction rates, etc., scraped by VictoriaMetrics on INFRA nodes.
Collection configuration is specified by pg_exporter_config,
with support for automatic database discovery (pg_exporter_auto_discovery),
and tiered cache strategies via pg_exporter_cache_ttls.
You can disable this component via parameters; in slim install, this component is not enabled.
For more information, see: Config: PGSQL - PG_MONITOR
pgbouncer_exporter
pgbouncer_exporter exports Pgbouncer connection pool metrics, listening on port 9631 by default.
pgbouncer_exporter uses the same pg_exporter binary but with a dedicated metrics config file, supporting pgbouncer 1.8-1.25+.
pgbouncer_exporter reads Pgbouncer statistics views, providing pool utilization, wait queue, and hit rate metrics.
If Pgbouncer is disabled, this component is also disabled. In slim install, this component is not enabled.
For more information, see: Config: PGSQL - PG_MONITOR
pgbackrest_exporter
pgbackrest_exporter exports backup status metrics, listening on port 9854 by default.
pgbackrest_exporter parses pgBackRest status, generating metrics for most recent backup time, size, type, etc. Combined with alerting policies, it quickly detects expired or failed backups, ensuring data safety. Note that when there are many backups or using large network repositories, collection overhead can be significant, so pgbackrest_exporter has a default 2-minute collection interval. In the worst case, you may see the latest backup status in the monitoring system 2 minutes after a backup completes.
For more information, see: Config: PGSQL - PG_MONITOR
etcd
etcd is a distributed consistent store (DCS), providing cluster metadata storage and leader election capability for Patroni.
etcd is deployed and managed by the independent ETCD module, not part of the PGSQL module itself, but critical for PostgreSQL HA. Patroni writes cluster state, leader info, and config parameters to etcd; all nodes reach consensus through etcd. vip-manager also reads the leader key from etcd to enable automatic VIP migration.
For more information, see: ETCD Module
vector
Vector is a high-performance log collection component, deployed by the NODE module, responsible for collecting PostgreSQL-related logs.
Vector runs on nodes, tracking PostgreSQL, Pgbouncer, Patroni, and pgBackRest log directories, sending structured logs to VictoriaLogs on INFRA nodes for centralized storage and querying.
For more information, see: NODE Module
3.2 - ER Model
The largest entity concept in Pigsty is a Deployment. The main entities and relationships (E-R diagram) in a deployment are shown below:
A deployment can also be understood as an Environment. For example, Production (Prod), User Acceptance Testing (UAT), Staging, Testing, Development (Devbox), etc. Each environment corresponds to a Pigsty inventory that describes all entities and attributes in that environment.
Typically, an environment includes shared infrastructure (INFRA), which broadly includes ETCD (HA DCS) and MINIO (centralized backup repository),
serving multiple PostgreSQL database clusters (and other database module components). (Exception: there are also deployments without infrastructure)
In Pigsty, almost all database modules are organized as “Clusters”. Each cluster is an Ansible group containing several node resources. For example, PostgreSQL HA database clusters, Redis, Etcd, and Silo all exist as clusters. An environment can contain multiple clusters.
3.2.1 - E-R Model of Infra Cluster
The INFRA module plays a special role in Pigsty: it’s not a traditional “cluster” but rather a management hub composed of a group of infrastructure nodes, providing core services for the entire Pigsty deployment. Each INFRA node is an autonomous infrastructure service unit running core components like Nginx, Grafana, and VictoriaMetrics, collectively providing observability and management capabilities for managed database clusters.
There are two core entities in Pigsty’s INFRA module:
- Node: A server running infrastructure components—can be bare metal, VM, container, or Pod.
- Component: Various infrastructure services running on nodes, such as Nginx, Grafana, VictoriaMetrics, etc.
INFRA nodes typically serve as Admin Nodes, the control plane of Pigsty.
Component Composition
Each INFRA node runs the following core components:
| Component | Port | Description |
|---|---|---|
| Nginx | 80/443 | Web portal, local repo, unified reverse proxy |
| Grafana | 3000 | Visualization platform, dashboards, data apps |
| VictoriaMetrics | 8428 | Time-series database, Prometheus API compatible |
| VictoriaLogs | 9428 | Log database, receives structured logs from Vector |
| VictoriaTraces | 10428 | Trace storage for slow SQL / request tracing |
| VMAlert | 8880 | Alert rule evaluator based on VictoriaMetrics |
| Alertmanager | 9059 | Alert aggregation and dispatch |
| Blackbox Exporter | 9115 | ICMP/TCP/HTTP black-box probing |
| DNSMASQ | 53 | DNS server for internal domain resolution |
| Chronyd | 123 | NTP time server |
These components together form Pigsty’s observability infrastructure.
Examples
Let’s look at a concrete example with a two-node INFRA deployment:
The above config fragment defines a two-node INFRA deployment:
| Group | Description |
|---|---|
infra | INFRA infrastructure node group |
| Node | Description |
infra-1 | 10.10.10.10 INFRA node #1 |
infra-2 | 10.10.10.11 INFRA node #2 |
For production environments, deploying at least two INFRA nodes is recommended for infrastructure component redundancy.
Identity Parameters
Pigsty uses the INFRA_ID parameter group to assign deterministic identities to each INFRA module entity. One parameter is required:
| Parameter | Type | Level | Description | Format |
|---|---|---|---|---|
infra_seq | int | Node | INFRA node sequence, required | Natural number, starting from 1, unique within group |
With node sequence assigned at node level, Pigsty automatically generates unique identifiers for each entity based on rules:
| Entity | Generation Rule | Example |
|---|---|---|
| Node | infra-{{ infra_seq }} | infra-1, infra-2 |
The INFRA module assigns infra-N format identifiers to nodes for distinguishing multiple infrastructure nodes in the monitoring system.
However, this doesn’t change the node’s hostname or system identity; nodes still use their existing hostname or IP address for identification.
Service Portal
INFRA nodes provide unified web service entry through Nginx. The infra_portal parameter defines services exposed through Nginx.
The default configuration only defines the home server:
Pigsty automatically configures reverse proxy endpoints for enabled components (Grafana, VictoriaMetrics, AlertManager, etc.). If you need to access these services via separate domains, you can explicitly add configurations:
| Domain | Service | Description |
|---|---|---|
i.pigsty | Home | Pigsty homepage |
g.pigsty | Grafana | Monitoring dashboard |
p.pigsty | VictoriaMetrics | TSDB Web UI |
a.pigsty | Alertmanager | Alert management UI |
Accessing Pigsty services via domain names is recommended over direct IP + port.
Deployment Scale
The number of INFRA nodes depends on deployment scale and HA requirements:
| Scale | INFRA Nodes | Description |
|---|---|---|
| Dev/Test | 1 | Single-node deployment, all on one node |
| Small Prod | 1-2 | Single or dual node, can share with other services |
| Medium Prod | 2-3 | Dedicated INFRA nodes, redundant components |
| Large Prod | 3+ | Multiple INFRA nodes, component separation |
In singleton deployment, INFRA components share the same node with PGSQL, ETCD, etc.
In small-scale deployments, INFRA nodes typically also serve as “Admin Node” / backup admin node and local software repository (/www/pigsty).
In larger deployments, these responsibilities can be separated to dedicated nodes.
Monitoring Label System
Pigsty’s monitoring system collects metrics from INFRA components themselves. Unlike database modules, each component in the INFRA module is treated as an independent monitoring object, distinguished by the cls (class) label.
| Label | Description | Example |
|---|---|---|
cls | Component type, each forming a “class” | nginx |
ins | Instance name, format {component}-{infra_seq} | nginx-1 |
ip | INFRA node IP running the component | 10.10.10.10 |
job | VictoriaMetrics scrape job, fixed as infra | infra |
Using a two-node INFRA deployment (infra_seq: 1 and infra_seq: 2) as example, component monitoring labels are:
| Component | cls | ins Example | Port |
|---|---|---|---|
| Nginx | nginx | nginx-1, nginx-2 | 9113 |
| Grafana | grafana | grafana-1, grafana-2 | 3000 |
| VictoriaMetrics | vmetrics | vmetrics-1, vmetrics-2 | 8428 |
| VictoriaLogs | vlogs | vlogs-1, vlogs-2 | 9428 |
| VictoriaTraces | vtraces | vtraces-1, vtraces-2 | 10428 |
| VMAlert | vmalert | vmalert-1, vmalert-2 | 8880 |
| Alertmanager | alertmanager | alertmanager-1, alertmanager-2 | 9059 |
| Blackbox | blackbox | blackbox-1, blackbox-2 | 9115 |
All INFRA component metrics use a unified job="infra" label, distinguished by the cls label:
3.2.2 - E-R Model of PostgreSQL Cluster
The PGSQL module organizes PostgreSQL in production as clusters—logical entities composed of a group of database instances associated by primary-replica relationships.
Each cluster is an autonomous business unit consisting of at least one primary instance, exposing capabilities through services.
There are four core entities in Pigsty’s PGSQL module:
- Cluster: An autonomous PostgreSQL business unit serving as the top-level namespace for other entities.
- Service: A named abstraction that exposes capabilities, routes traffic, and exposes services using node ports.
- Instance: A single PostgreSQL server consisting of running processes and database files on a single node.
- Node: A hardware resource abstraction running Linux + Systemd environment—can be bare metal, VM, container, or Pod.
Along with two business entities—“Database” and “Role”—these form the complete logical view as shown below:
Examples
Let’s look at two concrete examples. Using the four-node Pigsty sandbox, there’s a three-node pg-test cluster:
The above config fragment defines a high-availability PostgreSQL cluster with these related entities:
| Cluster | Description |
|---|---|
pg-test | PostgreSQL 3-node HA cluster |
| Instance | Description |
pg-test-1 | PostgreSQL instance #1, default primary |
pg-test-2 | PostgreSQL instance #2, initial replica |
pg-test-3 | PostgreSQL instance #3, initial replica |
| Service | Description |
pg-test-primary | Read-write service (routes to primary pgbouncer) |
pg-test-replica | Read-only service (routes to replica pgbouncer) |
pg-test-default | Direct read-write service (routes to primary postgres) |
pg-test-offline | Offline read service (routes to dedicated postgres) |
| Node | Description |
node-1 | 10.10.10.11 Node #1, hosts pg-test-1 PG instance |
node-2 | 10.10.10.12 Node #2, hosts pg-test-2 PG instance |
node-3 | 10.10.10.13 Node #3, hosts pg-test-3 PG instance |

Identity Parameters
Pigsty uses the PG_ID parameter group to assign deterministic identities to each PGSQL module entity. Three parameters are required:
| Parameter | Type | Level | Description | Format |
|---|---|---|---|---|
pg_cluster | string | Cluster | PG cluster name, required | Valid DNS name, regex [a-zA-Z0-9-]+ |
pg_seq | int | Instance | PG instance number, required | Natural number, starting from 0 or 1, unique within cluster |
pg_role | enum | Instance | PG instance role, required | Enum: primary, replica, offline |
With cluster name defined at cluster level and instance number/role assigned at instance level, Pigsty automatically generates unique identifiers for each entity based on rules:
| Entity | Generation Rule | Example |
|---|---|---|
| Instance | {{ pg_cluster }}-{{ pg_seq }} | pg-test-1, pg-test-2, pg-test-3 |
| Service | {{ pg_cluster }}-{{ pg_role }} | pg-test-primary, pg-test-replica, pg-test-offline |
| Node | Explicitly specified or borrowed from PG | pg-test-1, pg-test-2, pg-test-3 |
Because Pigsty adopts a 1:1 exclusive deployment model for nodes and PG instances, by default the host node identifier borrows from the PG instance identifier (node_id_from_pg).
You can also explicitly specify nodename to override, or disable nodename_overwrite to use the current default.
Sharding Identity Parameters
When using multiple PostgreSQL clusters (sharding) to serve the same business, two additional identity parameters are used: pg_shard and pg_group.
In this case, this group of PostgreSQL clusters shares the same pg_shard name with their own pg_group numbers, like this Citus cluster:
In this case, pg_cluster cluster names are typically composed of: {{ pg_shard }}{{ pg_group }}, e.g., pg-citus0, pg-citus1, etc.
Pigsty provides dedicated monitoring dashboards for horizontal sharding clusters, making it easy to compare performance and load across shards, but this requires using the above entity naming convention.
There are also other identity parameters for special scenarios, such as pg_upstream for specifying backup clusters/cascading replication upstream, gp_role for Greenplum cluster identity,
pg_exporters for external monitoring instances, pg_offline_query for offline query instances, etc. See PG_ID parameter docs.
Monitoring Label System
Pigsty provides an out-of-box monitoring system that uses the above identity parameters to identify various PostgreSQL entities.
For example, the cls, ins, ip labels correspond to cluster name, instance name, and node IP—the identifiers for these three core entities.
They appear along with the job label in all native monitoring metrics collected by VictoriaMetrics and VictoriaLogs log streams.
The job name for collecting PostgreSQL metrics is fixed as pgsql;
The job name for monitoring remote PG instances is fixed as pgrds.
The job name for collecting PostgreSQL CSV logs is fixed as postgres;
The job name for collecting pgbackrest logs is fixed as pgbackrest, other PG components collect logs via job: syslog.
Additionally, some entity identity labels appear in specific entity-related monitoring metrics, such as:
datname: Database name, if a metric belongs to a specific database.relname: Table name, if a metric belongs to a specific table.idxname: Index name, if a metric belongs to a specific index.funcname: Function name, if a metric belongs to a specific function.seqname: Sequence name, if a metric belongs to a specific sequence.query: Query fingerprint, if a metric belongs to a specific query.
3.2.3 - E-R Model of Etcd Cluster
The ETCD module organizes ETCD in production as clusters—logical entities composed of a group of ETCD instances associated through the Raft consensus protocol.
Each cluster is an autonomous distributed key-value storage unit consisting of at least one ETCD instance, exposing service capabilities through client ports.
There are three core entities in Pigsty’s ETCD module:
- Cluster: An autonomous ETCD service unit serving as the top-level namespace for other entities.
- Instance: A single ETCD server process running on a node, participating in Raft consensus.
- Node: A hardware resource abstraction running Linux + Systemd environment, implicitly declared.
Compared to PostgreSQL clusters, the ETCD cluster model is simpler, without Services or complex Role distinctions. All ETCD instances are functionally equivalent, electing a Leader through the Raft protocol while others become Followers. During scale-out intermediate states, non-voting Learner instance members are also allowed.
Examples
Let’s look at a concrete example with a three-node ETCD cluster:
The above config fragment defines a three-node ETCD cluster with these related entities:
| Cluster | Description |
|---|---|
etcd | ETCD 3-node HA cluster |
| Instance | Description |
etcd-1 | ETCD instance #1 |
etcd-2 | ETCD instance #2 |
etcd-3 | ETCD instance #3 |
| Node | Description |
10.10.10.10 | Node #1, hosts etcd-1 instance |
10.10.10.11 | Node #2, hosts etcd-2 instance |
10.10.10.12 | Node #3, hosts etcd-3 instance |
Identity Parameters
Pigsty uses the ETCD parameter group to assign deterministic identities to each ETCD module entity. Two parameters are required:
| Parameter | Type | Level | Description | Format |
|---|---|---|---|---|
etcd_cluster | string | Cluster | ETCD cluster name, required | Valid DNS name, defaults to fixed etcd |
etcd_seq | int | Instance | ETCD instance number, required | Natural number, starting from 1, unique within cluster |
With cluster name defined at cluster level and instance number assigned at instance level, Pigsty automatically generates unique identifiers for each entity based on rules:
| Entity | Generation Rule | Example |
|---|---|---|
| Instance | {{ etcd_cluster }}-{{ etcd_seq }} | etcd-1, etcd-2, etcd-3 |
The ETCD module does not assign additional identity to host nodes; nodes are identified by their existing hostname or IP address.
Ports & Protocols
Each ETCD instance listens on the following two ports:
| Port | Parameter | Purpose |
|---|---|---|
| 2379 | etcd_port | Client port, accessed by Patroni, vip-manager, etc. |
| 2380 | etcd_peer_port | Peer communication port, used for Raft consensus |
ETCD clusters enable TLS-encrypted communication by default and use RBAC authentication. Clients need the correct certificates and passwords to access ETCD services.
Cluster Size
As a distributed coordination service, ETCD cluster size directly affects availability, requiring more than half (quorum) of nodes to be alive to maintain service.
| Cluster Size | Quorum | Fault Tolerance | Use Case |
|---|---|---|---|
| 1 node | 1 | 0 | Dev, test, demo |
| 3 nodes | 2 | 1 | Small-medium production |
| 5 nodes | 3 | 2 | Large-scale production |
Even-member ETCD clusters are technically valid, but they do not tolerate more failures than an odd cluster with one fewer member and add deployment and quorum cost. Production clusters therefore usually have one, three, or five members; clusters larger than five are uncommon.
Monitoring Label System
Pigsty provides an out-of-box monitoring system that uses the above identity parameters to identify various ETCD entities.
For example, the cls, ins, ip labels correspond to cluster name, instance name, and node IP—the identifiers for these three core entities.
They appear along with the job label in all ETCD monitoring metrics collected by VictoriaMetrics.
The job name for collecting ETCD metrics is fixed as etcd.
3.2.4 - MINIO Cluster Model
MINIO is Pigsty’s compatibility module name for object storage. The current v4.5.0 source deploys Silo through minio_type: silo and organizes a group of object-storage instances into a cluster.
Each cluster is an autonomous S3-compatible object-storage unit consisting of at least one instance and exposing service through the S3 API port.
There are three core entities in Pigsty’s MINIO module:
- Cluster: An autonomous object-storage service unit serving as the top-level namespace for other entities.
- Instance: A single Silo server process running on a node and managing local disks.
- Node: A hardware resource abstraction running Linux + Systemd environment, implicitly declared.
Silo also retains the Storage Pool concept for expansion.
Deployment Modes
Silo supports Pigsty’s three inventory deployment modes:
| Mode | Code | Description | Use Case |
|---|---|---|---|
| Single-Node Single-Drive | SNSD | Single node, single data directory or disk | Dev, test, demo |
| Single-Node Multi-Drive | SNMD | Single node, multiple disks, typically 4+ | Resource-constrained small deployments |
| Multi-Node Multi-Drive | MNMD | Multiple nodes, multiple disks per node | Production recommended |
SNSD mode can use a regular directory for quick experimentation. Multi-drive Silo deployments should use real disk mount points or the service will refuse to start.
Examples
The following example explicitly selects the current default Silo backend and defines a four-node multi-drive cluster:
This config fragment defines a four-node Silo cluster with four disks per node. Instance identifiers retain the MINIO module’s compatibility naming:
| Cluster | Description |
|---|---|
minio | Silo 4-node HA cluster |
| Instance | Description |
minio-1 | Object-storage instance #1, managing 4 disks |
minio-2 | Object-storage instance #2, managing 4 disks |
minio-3 | Object-storage instance #3, managing 4 disks |
minio-4 | Object-storage instance #4, managing 4 disks |
| Node | Description |
10.10.10.10 | Node #1, hosts minio-1 instance |
10.10.10.11 | Node #2, hosts minio-2 instance |
10.10.10.12 | Node #3, hosts minio-3 instance |
10.10.10.13 | Node #4, hosts minio-4 instance |
Identity Parameters
Pigsty uses the MINIO parameter group to assign deterministic identities to each MinIO module entity. Two parameters are required:
| Parameter | Type | Level | Description | Format |
|---|---|---|---|---|
minio_cluster | string | Cluster | Object-storage cluster name, required | Valid non-empty name, no default |
minio_seq | int | Instance | Object-storage instance number, required | Natural number, starting from 1, unique within cluster |
With cluster name defined at cluster level and instance number assigned at instance level, Pigsty automatically generates unique identifiers for each entity based on rules:
| Entity | Generation Rule | Example |
|---|---|---|
| Instance | {{ minio_cluster }}-{{ minio_seq }} | minio-1, minio-2, minio-3, minio-4 |
The MINIO module does not assign additional identity to host nodes; nodes are identified by their existing hostname or IP address.
The minio_node parameter generates node names for internal Silo cluster use (written to /etc/hosts for cluster discovery), not host-node identity.
Roles locate actual members across the entire inventory by minio_cluster; the Ansible group name does not need to match the cluster name. minio_type is a retained backend selector and currently must be silo.
Core Configuration Parameters
Beyond identity parameters, the following parameters are critical for Silo cluster configuration:
| Parameter | Type | Description |
|---|---|---|
minio_type | enum | Retained selector; currently only silo |
minio_data | path | Data directory, use {x...y} for multi-drive |
minio_node | string | Node name pattern for multi-node deployment |
minio_domain | string | Service domain, defaults to sss.pigsty |
These parameters determine minio_volumes, which the role writes to Silo’s MINIO_VOLUMES:
- SNSD: Direct
minio_datavalue, e.g.,/data/minio - SNMD: Expanded
minio_datadirectories, e.g.,/data{1...4} - MNMD: Combined
minio_nodeandminio_data, e.g.,https://minio-{1...4}.pigsty:9000/data{1...4}
Ports & Services
Each object-storage instance listens on the following ports:
| Port | Parameter | Purpose |
|---|---|---|
| 9000 | minio_port | S3 API service port |
| 9001 | minio_admin_port | Web admin console port |
The MINIO module enables HTTPS by default, controlled by minio_https. Keep HTTPS enabled with the default pgBackRest S3 repository configuration and install the Pigsty CA correctly.
Clients can reach a multi-node Silo cluster through any member. For a stable entry point, use a load balancer such as HAProxy with a VIP.
Resource Provisioning
After Silo cluster deployment, Pigsty automatically creates the following resources (controlled by minio_provision):
Default Buckets (defined by minio_buckets):
| Bucket | Purpose |
|---|---|
pgsql | PostgreSQL pgBackREST backup storage |
meta | Metadata storage, versioning enabled |
data | General data storage |
Default Users (defined by minio_users):
| User | Default Password | Policy | Purpose |
|---|---|---|---|
pgbackrest | S3User.Backup | pgsql | PostgreSQL backup dedicated user |
s3user_meta | S3User.Meta | meta | Access meta bucket |
s3user_data | S3User.Data | data | Access data bucket |
These passwords are publicly documented default credentials, intended only for demonstrations and local development. Replace them before production deployment.
pgbackrest is used for PostgreSQL cluster backups; s3user_meta and s3user_data are reserved users not actively used.
Monitoring Label System
Pigsty uses the identity parameters above to identify object-storage entities. A Silo availability series looks like this:
Here cls, ins, and ip identify the cluster name, instance name, and node IP. Compatible monitoring naming keeps job="minio", while the current backend label is flavor=silo. See the metric list for details.
3.2.5 - E-R Model of Redis Cluster
The Redis module organizes Redis in production as clusters—logical entities composed of a group of Redis instances deployed on one or more nodes.
Each cluster is an autonomous high-performance cache/storage unit consisting of at least one Redis instance, exposing service capabilities through ports.
There are three core entities in Pigsty’s Redis module:
- Cluster: An autonomous Redis service unit serving as the top-level namespace for other entities.
- Instance: A single Redis server process running on a specific port on a node.
- Node: A hardware resource abstraction running Linux + Systemd environment, can host multiple Redis instances, implicitly declared.
Unlike PostgreSQL, Redis uses a single-node multi-instance deployment model: one physical/virtual machine node typically deploys multiple Redis instances to fully utilize multi-core CPUs. Therefore, nodes and instances have a 1:N relationship. Additionally, production typically advises against Redis instances with memory > 12GB.
Operating Modes
Redis has three different operating modes, specified by the redis_mode parameter:
| Mode | Code | Description | HA Mechanism |
|---|---|---|---|
| Standalone | standalone | Classic master-replica, default mode | Requires Sentinel |
| Sentinel | sentinel | HA monitoring and auto-failover for standalone | Multi-node quorum |
| Native Cluster | cluster | Redis native distributed cluster, no sentinel needed | Built-in auto-failover |
- Standalone: Default mode, replication via
replica_ofparameter. Requires additional Sentinel cluster for HA. - Sentinel: Stores no business data, dedicated to monitoring standalone Redis clusters for auto-failover; multi-node itself provides HA.
- Native Cluster: Data auto-sharded across multiple primaries, each can have multiple replicas, built-in HA, no sentinel needed.
Examples
Let’s look at concrete examples for each mode:
Standalone Cluster
Classic master-replica on a single node:
| Cluster | Description |
|---|---|
redis-ms | Redis standalone cluster |
| Node | Description |
redis-ms-1 | 10.10.10.10 Node #1, hosts 2 instances |
| Instance | Description |
redis-ms-1-6379 | Primary instance, listening on port 6379 |
redis-ms-1-6380 | Replica instance, port 6380, replicates from 6379 |
Sentinel Cluster
Three sentinel instances on a single node for monitoring standalone clusters. Sentinel clusters specify monitored standalone clusters via redis_sentinel_monitor:
Native Cluster
A Redis native distributed cluster with two nodes and six instances (minimum spec: 3 primaries, 3 replicas):
This creates a 3 primary 3 replica native Redis cluster.
| Cluster | Description |
|---|---|
redis-test | Redis native cluster (3P3R) |
| Instance | Description |
redis-test-1-6379 | Instance on node 1, port 6379 |
redis-test-1-6380 | Instance on node 1, port 6380 |
redis-test-1-6381 | Instance on node 1, port 6381 |
redis-test-2-6379 | Instance on node 2, port 6379 |
redis-test-2-6380 | Instance on node 2, port 6380 |
redis-test-2-6381 | Instance on node 2, port 6381 |
| Node | Description |
redis-test-1 | 10.10.10.12 Node #1, hosts 3 instances |
redis-test-2 | 10.10.10.13 Node #2, hosts 3 instances |
Identity Parameters
Pigsty uses the REDIS parameter group to assign deterministic identities to each Redis module entity. Three parameters are required:
| Parameter | Type | Level | Description | Format |
|---|---|---|---|---|
redis_cluster | string | Cluster | Redis cluster name, required | Valid DNS name, regex [a-z][a-z0-9-]* |
redis_node | int | Node | Redis node number, required | Natural number, starting from 1, unique within cluster |
redis_instances | dict | Node | Redis instance definition, required | JSON object, key is port, value is instance config |
With cluster name defined at cluster level and node number/instance definition assigned at node level, Pigsty automatically generates unique identifiers for each entity:
| Entity | Generation Rule | Example |
|---|---|---|
| Instance | {{ redis_cluster }}-{{ redis_node }}-{{ port }} | redis-ms-1-6379, redis-ms-1-6380 |
The Redis module does not assign additional identity to host nodes; nodes are identified by their existing hostname or IP address.
redis_node is used for instance naming, not host node identity.
Instance Definition
redis_instances is a JSON object with port number as key and instance config as value:
Each Redis instance listens on a unique port within the node. You can choose any port number,
but avoid system reserved ports (< 1024) or conflicts with Pigsty used ports.
The replica_of parameter sets replication relationship in standalone mode, format '<ip> <port>', specifying upstream primary address and port.
Additionally, each Redis node runs a Redis Exporter collecting metrics from all local instances:
| Port | Parameter | Purpose |
|---|---|---|
| 9121 | redis_exporter_port | Redis Exporter port |
Redis’s single-node multi-instance deployment model has some limitations:
- Node Exclusive: A node can only belong to one Redis cluster, not assigned to different clusters simultaneously.
- Port Unique: Redis instances on the same node must use different ports to avoid conflicts.
- Password Shared: Multiple instances on the same node cannot have different passwords (redis_exporter limitation).
- Manual HA: Standalone Redis clusters require additional Sentinel configuration for auto-failover.
Monitoring Label System
Pigsty provides an out-of-box monitoring system that uses the above identity parameters to identify various Redis entities.
For example, the cls, ins, ip labels correspond to cluster name, instance name, and node IP—the identifiers for these three core entities.
They appear along with the job label in all Redis monitoring metrics collected by VictoriaMetrics.
The job name for collecting Redis metrics is fixed as redis.
3.3 - Infra as Code
Pigsty follows the IaC and GitOPS philosophy: use a declarative config inventory to describe the entire environment, and materialize it through idempotent playbooks.
Users describe their desired state declaratively through parameters, and playbooks idempotently adjust target nodes to reach that state. This is similar to Kubernetes CRDs & Operators, but Pigsty implements this functionality on bare metal and virtual machines through Ansible.
Pigsty was born to solve the operational management problem of ultra-large-scale PostgreSQL clusters. The idea behind it is simple — we need the ability to replicate the entire infrastructure (100+ database clusters + PG/Redis + observability) on ready servers within ten minutes. No GUI + ClickOps can complete such a complex task in such a short time, making CLI + IaC the only choice — it provides precise, efficient control.
The config inventory pigsty.yml file describes the state of the entire deployment. Whether it’s production (prod), staging, test, or development (devbox) environments,
the difference between infrastructures lies only in the config inventory, while the deployment delivery logic is exactly the same.
You can use git for version control and auditing of this deployment “seed/gene”, and Pigsty even supports storing the config inventory as database tables in PostgreSQL CMDB, further achieving Infra as Data capability. Seamlessly integrate with your existing workflows.
IaC is designed for professional users and enterprise scenarios but is also deeply optimized for individual developers and SMBs. Even if you’re not a professional DBA, you don’t need to understand these hundreds of adjustment knobs and switches. All parameters come with well-performing default values. You can get an out-of-the-box single-node database with zero configuration; Simply add two more IP addresses to get an enterprise-grade high-availability PostgreSQL cluster.
Declare Modules
Take the following default config snippet as an example. This config describes a node 10.10.10.10 with INFRA, NODE, ETCD, and PGSQL modules installed.
To actually install these modules, execute the following playbooks:
Declare Clusters
You can declare PostgreSQL database clusters by installing the PGSQL module on multiple nodes, making them a service unit:
For example, to deploy a three-node high-availability PostgreSQL cluster using streaming replication on the following three Pigsty-managed nodes,
you can add the following definition to the all.children section of the config file pigsty.yml:
After defining, you can use playbooks to create the cluster:

You can use different instance roles such as primary, replica, offline, delayed, sync standby; as well as different clusters: such as standby clusters, Citus clusters, and even Redis / MINIO (Silo) / Etcd clusters
Customize Cluster Content
Not only can you define clusters declaratively, but you can also define databases, users, services, and HBA rules within the cluster. For example, the following config file deeply customizes the content of the default pg-meta single-node database cluster:
Including: declaring six business databases and seven business users, adding an extra standby service (synchronous standby, providing read capability with no replication delay), defining some additional pg_hba rules, an L2 VIP address pointing to the cluster primary, and a customized backup strategy.
Declare Access Control
You can also customize Pigsty’s access control through declarative configuration. For example, the following config file provides deep security customization for the pg-meta cluster:
Uses the three-node core cluster template: crit.yml, to ensure data consistency is prioritized with zero data loss during failover.
Enables L2 VIP and restricts database and connection pool listening addresses to local loopback IP + internal network IP + VIP three specific addresses.
The template enables TLS for the Patroni API and PgBouncer, and requires SSL for database access through HBA.
It also enables $libdir/passwordcheck in pg_libs to enforce a password-strength policy.
Finally, a separate pg-meta-delay cluster is declared as pg-meta’s delayed replica from one hour ago, for emergency data deletion recovery.
Citus Distributed Cluster
Below is a declarative configuration for a four-node Citus distributed cluster:
Redis Clusters
Below are declarative configuration examples for Redis primary-replica cluster, sentinel cluster, and Redis Cluster:
ETCD Cluster
Below is a declarative configuration example for a three-node Etcd cluster:
MINIO (Silo) Cluster
Below is a declarative configuration example for a three-node Silo cluster. The inventory group and parameters retain the MINIO module’s compatibility names:
3.3.1 - Inventory
Every Pigsty deployment corresponds to an Inventory that describes key properties of the infrastructure and database clusters.
Configuration File
Pigsty uses Ansible YAML configuration format by default,
with a single YAML configuration file pigsty.yml as the inventory.
You can directly edit this configuration file to customize your deployment, or use the configure wizard script provided by Pigsty to automatically generate an appropriate configuration file.
Configuration Structure
The inventory uses standard Ansible YAML configuration format, consisting of two parts: global parameters (all.vars) and multiple groups (all.children).
You can define new clusters in all.children and describe the infrastructure using global variables: all.vars, which looks like this:
Cluster Definition
Each Ansible group may represent a cluster, which can be a node cluster, PostgreSQL cluster, Redis cluster, Etcd cluster, Silo cluster, etc.
A cluster definition consists of two parts: cluster members (hosts) and cluster parameters (vars).
You can define cluster members in <cls>.hosts and describe the cluster using configuration parameters in <cls>.vars.
Here’s an example of a 3-node high-availability PostgreSQL cluster definition:
Cluster-level vars (cluster parameters) override global parameters, and instance-level vars override both cluster parameters and global parameters.
Splitting Configuration
If your deployment is large or you want to better organize configuration files, you can split the inventory into multiple files for easier management and maintenance.
You can place cluster member definitions in the hosts.yml file and put cluster-level configuration parameters in corresponding files under the group_vars directory.
Switching Configuration
You can temporarily specify a different inventory file when running playbooks using the -i parameter.
Additionally, Ansible supports multiple configuration methods. You can use local yaml|ini configuration files, or use CMDB and any dynamic configuration scripts as configuration sources.
In Pigsty, we specify pigsty.yml in the same directory as the default inventory through ansible.cfg in the Pigsty home directory. You can modify it as needed.
Additionally, Pigsty supports using a CMDB metabase to store the inventory, facilitating integration with existing systems.
3.3.2 - Configure
Pigsty provides a configure script as a configuration wizard that automatically generates an appropriate pigsty.yml configuration file based on your current environment.
This is an optional script: if you already understand how to configure Pigsty, you can directly edit the pigsty.yml configuration file and skip the wizard.
Quick Start
Enter the pigsty source home directory and run ./configure to automatically start the configuration wizard. Without any arguments, it defaults to the meta single-node configuration template:
This command will use the selected template as a base, detect the current node’s IP address and region, and generate a pigsty.yml configuration file suitable for the current environment.
Features
The configure script performs the following adjustments based on environment and input, generating pigsty.yml in the Pigsty directory by default.
- Detects the current node IP address; if multiple IPs exist, prompts the user to input a primary IP address as the node’s identity
- Uses the IP address to replace the placeholder
10.10.10.10in the configuration template and sets it as theadmin_ipparameter value - Detects the current region, setting
regiontodefault(global default repos) orchina(using Chinese mirror repos) - For micro instances (vCPU < 4), uses the
tinyparameter template fornode_tuneandpg_confto optimize resource usage - If
-vis specified, switchespg_versionandpg18-*package-group aliases in the template to that major version; fixed-kernel templatesmssql,polar, andpg19are excluded from this replacement - If
-gis specified, replaces default passwords recognized by the configuration wizard with randomly generated strong passwords; review uncovered values against the Default Credentials Checklist (strongly recommended) - When PG major version ≥ 17, prioritizes the built-in
C.UTF-8locale, or the OS-supportedC.UTF-8 - Checks if the core dependency
ansiblefor deployment is available in the current environment - Also checks if the deployment target node is SSH-reachable and can execute commands with sudo (
-sto skip)
Usage Examples
Command Arguments
Argument Details
| Argument | Description |
|---|---|
-c, --conf | Generate config from conf/<template>.yml, supports subdirectories like ha/full |
-i, --ip | Replace placeholder 10.10.10.10 in config template with specified IP |
-v, --version | Specify PostgreSQL major version (14-19); PG19 is Beta, so prefer the dedicated pg19 template |
-r, --region | Set software repo mirror region: default, china (Chinese mirrors), europe (European) |
-o, --output | Output path, default pigsty.yml; relative paths use Pigsty home, absolute paths are used as given |
-s, --skip | Skip IP probing, target SSH/Sudo checks, and effective IP replacement; keep 10.10.10.10 |
-x, --proxy | Write current environment proxy variables (HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, NO_PROXY) to config |
-n, --non-interactive | Non-interactive mode; a single/demo IP is auto-selected, while ambiguous multi-IP hosts require -i |
-p, --port | SSH port used by readiness checks only; it does not write ansible_port into the generated config |
-g, --generate | Generate random values for passwords in config file, improving security (strongly recommended) |
Execution Flow
The configure script executes detection and configuration in the following order:
Automatic Behaviors
Region Detection
The script automatically detects the network environment to determine if you’re in mainland China (behind GFW):
- If Google is reachable, uses the
region: defaultrepositories - If Google is unreachable but
https://pigsty.ccis reachable, setsregion: china - If neither endpoint is reachable, falls back to
region: defaultand emits an internet-unreachable warning - Can manually specify region via
-rargument
IP Address Handling
The script determines the primary IP address in the following priority:
- Command line argument: If IP is specified via
-i, use it directly - Single IP detection: If the current node has only one IP, use it automatically
- Demo IP detection: If
10.10.10.10is detected, select it automatically (for sandbox environments) - Interactive input: When multiple IPs exist, prompt user to choose or input
Low-End Hardware Optimization
When fewer than 4 CPU cores are detected (1-3 cores), the script automatically adjusts configuration:
This ensures smooth operation on low-spec virtual machines.
Locale Settings
The script automatically enables C.UTF-8 as the default locale when:
- PostgreSQL version ≥ 17 (built-in Locale Provider support)
- Or the current system supports
C.UTF-8/C.utf8locale
China Region Special Handling
When region is set to china, the script automatically:
- Enables
docker_registry_mirrorsDocker mirror acceleration - Enables
PIP_MIRROR_URLPython mirror acceleration
Password Generation
When using the -g argument, the script generates 24-character random strings for the following passwords:
| Password Parameter | Description |
|---|---|
grafana_admin_password | Grafana admin password |
pg_admin_password | PostgreSQL admin password |
pg_monitor_password | PostgreSQL monitor user password |
pg_replication_password | PostgreSQL replication user password |
patroni_password | Patroni API password |
haproxy_admin_password | HAProxy admin password |
minio_secret_key | Silo Root Secret |
etcd_root_password | ETCD Root password |
It also replaces the following placeholder passwords:
DBUser.Meta→ random passwordDBUser.Viewer→ random passwordS3User.Backup→ random passwordS3User.Meta→ random passwordS3User.Data→ random passwordDBUser.Supa→ random passwordVibe.Coding→ random password
Configuration Templates
The script reads templates from conf/. The value of -c is a path relative to that directory without the .yml suffix, such as ha/full or app/immich.
Core Templates
| Template | Description |
|---|---|
meta | Default template: Single-node installation with INFRA + NODE + ETCD + PGSQL |
rich | Feature-rich version: Includes almost all extensions, Silo, local repo |
slim | Minimal version: PostgreSQL + ETCD only, no monitoring infrastructure |
fat | Complete version: rich base with more extensions installed |
pgsql | Pure PostgreSQL template |
pg19 | Single-node PostgreSQL 19 Beta evaluation template |
infra | Pure infrastructure template |
HA Templates (ha/)
| Template | Description |
|---|---|
ha/dual | 2-node HA cluster |
ha/trio | 3-node HA cluster |
ha/full | 4-node complete sandbox environment |
ha/safe | Security-hardened HA configuration |
ha/octo | Compact 8-node HA simulation |
ha/simu | 20-node production simulation environment |
ha/citus | 13-node Citus distributed cluster |
Application Templates
| Template | Description |
|---|---|
supabase | Supabase self-hosted configuration |
app/dify | Dify AI platform configuration |
app/odoo | Odoo ERP configuration |
app/electric | Electric sync engine configuration |
app/insforge | Insforge backend platform configuration |
app/hindsight | Hindsight application configuration |
app/teable | Teable table database configuration |
app/mattermost | Mattermost collaboration platform configuration |
app/maybe | Maybe finance application configuration |
app/registry | Docker Registry configuration |
app/immich | Immich photo and video management |
app/jumpserver | JumpServer bastion host |
Special Kernel Templates
| Template | Description |
|---|---|
ivory | IvorySQL: Oracle-compatible PostgreSQL |
mssql | Babelfish: SQL Server-compatible PostgreSQL |
polar | PolarDB: Alibaba Cloud open-source distributed PostgreSQL |
ha/citus | Citus: Distributed PostgreSQL HA cluster |
mysql | OpenHalo: MySQL protocol-compatible PostgreSQL |
pgtde | Percona PostgreSQL Server: transparent encryption |
oriole | OrioleDB: Next-generation storage engine |
agens | AgensGraph: graph database kernel |
pgedge | pgEdge: distributed PostgreSQL kernel |
mongo | MongoDB-compatible stack template |
Demo and Build Templates
| Template | Description |
|---|---|
vibe | Vibe Coding development environment |
docker | Run Pigsty inside a Docker container |
demo/bare | Minimal readable single-node example |
demo/el | Full parameter example for EL distributions |
demo/debian | Full parameter example for Debian/Ubuntu |
demo/demo | Multi-module demo environment |
demo/kernel | Ten-node database-kernel matrix |
demo/redis | Redis replica, Sentinel, and native Cluster demo |
demo/minio | Multi-node, multi-drive Silo demo (source default) |
demo/kafka | Kafka KRaft development and secure-cluster demo |
demo/mysql | Native MySQL 8.4 pilot demo |
demo/remote | Remote PostgreSQL/RDS monitoring example |
demo/saas | Legacy single-node SaaS component bundle |
demo/wool | Small cloud-instance example for China |
build/oss | Cross-distribution open-source package build env |
build/dev | Three-node development and build environment |
Output Example
Environment Variables
The script supports the following environment variables:
| Environment Variable | Description | Default |
|---|---|---|
PIGSTY_HOME | Pigsty installation directory | ~/pigsty |
METADB_URL | Metabase connection URL | service=meta |
HTTP_PROXY | HTTP proxy | - |
HTTPS_PROXY | HTTPS proxy | - |
ALL_PROXY | Universal proxy | - |
NO_PROXY | Proxy whitelist | Built-in default |
Notes
Passwordless access: Before running
configure, ensure the current user has passwordless sudo privileges and passwordless SSH to localhost. This can be automatically configured via thebootstrapscript.IP address selection: Choose an internal IP as the primary IP address, not a public IP or
127.0.0.1.Password security: In production, always change default passwords in the configuration file. Use
-gto randomize recognized credentials, then review the Default Credentials Checklist for remaining values.Configuration review: After the script completes, it’s recommended to review the generated
pigsty.ymlfile to confirm the configuration meets expectations.Multiple executions: You can run
configuremultiple times to regenerate configuration; each run will overwrite the existingpigsty.yml.macOS limitations: When running on macOS, the script skips some Linux-specific checks and uses placeholder IP
10.10.10.10. macOS can only serve as an admin node.
FAQ
How to use a custom configuration template?
Place your configuration file in the conf/ directory, then specify it with the -c argument:
How to generate different configurations for multiple clusters?
Use the -o argument to specify different output files:
Then specify the configuration file when running playbooks:
How to handle multiple IPs in non-interactive mode?
You must explicitly specify the IP address using the -i argument:
How to keep the placeholder IP in the template?
Use the -s argument to skip IP replacement:
Related Documentation
- Inventory: Understand the Ansible inventory structure
- Parameters: Understand Pigsty parameter hierarchy and priority
- Templates: View all available configuration templates
- Installation: Understand the complete installation process
- Metabase: Use PostgreSQL as a dynamic configuration source
3.3.3 - Parameters
In the inventory, you can use various parameters to fine-tune Pigsty customization. These parameters cover everything from infrastructure settings to database configuration.
Parameter List
According to the current source and parameter reference pages, Pigsty’s 10 official modules expose 373 public parameters for fine-grained control. See Reference - Parameter List for the complete list. The native MySQL 8.4 pilot module exposes 13 additional public parameters that are listed separately and excluded from this total.
| Module | Groups | Params | Description |
|---|---|---|---|
| PGSQL | 9 | 124 | PostgreSQL high-availability cluster configuration |
| INFRA | 10 | 73 | Software repositories and Victoria observability infrastructure |
| NODE | 11 | 73 | Node initialization, system tuning, and operations baseline |
| ETCD | 2 | 13 | ETCD cluster and removal protection parameters |
| MINIO | 2 | 22 | Silo deployment, observability, and removal parameters |
| REDIS | 2 | 22 | Redis/Valkey deployment and removal parameters |
| DOCKER | 1 | 8 | Docker engine parameters |
| JUICE | 1 | 2 | JuiceFS instance and cache parameters |
| VIBE | 1 | 18 | Code/Jupyter/Node.js/Claude/Codex configuration |
| KAFKA | 2 | 18 | Kafka deployment and removal-protection parameters |
Parameter Form
Parameters are key-value pairs that describe entities. The Key is a string, and the Value can be one of five types: boolean, string, number, array, or object.
Parameter Priority
Parameters can be set at different levels with the following priority:
| Level | Location | Description | Priority |
|---|---|---|---|
| CLI | -e command line argument | Passed via command line | Highest (5) |
| Host/Instance | <group>.hosts.<host> | Parameters specific to a single host | Higher (4) |
| Group/Cluster | <group>.vars | Parameters shared by hosts in group/cluster | Medium (3) |
| Global | all.vars | Parameters shared by all hosts | Lower (2) |
| Default | <roles>/default/main.yml | Role implementation defaults | Lowest (1) |
Here are some examples of parameter priority:
- Use command line parameter
-e grafana_clean=truewhen running playbooks to wipe Grafana data - Use instance-level parameter
pg_roleon host variables to override pg instance role - Use cluster-level parameter
pg_clusteron group variables to override pg cluster name - Use global parameter
node_ntp_serverson global variables to specify global NTP servers - If
pg_versionis not set, Pigsty will use the default value from thepgsqlrole implementation (default is18)
Except for identity parameters, every parameter has an appropriate default value, so explicit setting is not required.
Identity Parameters
Identity parameters are special parameters that serve as entity ID identifiers, therefore they have no default values and must be explicitly set.
| Module | Identity Parameters |
|---|---|
PGSQL | pg_cluster, pg_seq, pg_role, … |
NODE | nodename, node_cluster |
ETCD | etcd_cluster, etcd_seq |
MINIO | minio_cluster, minio_seq |
REDIS | redis_cluster, redis_node, redis_instances |
INFRA | infra_seq |
The exception is etcd_cluster, which still defaults to etcd.
Object storage minio_cluster no longer has a default and must be defined explicitly in each object-storage cluster’s variables.
Do not place it in all.vars, or every host will be marked as a MINIO module member.
3.3.4 - Conf Templates
In Pigsty, deployment blueprint details are defined by the inventory, which is the pigsty.yml configuration file. You can customize it through declarative configuration.
However, writing configuration files directly can be daunting for new users. To address this, we provide some ready-to-use configuration templates covering common usage scenarios.
Each template is a predefined pigsty.yml configuration file containing reasonable defaults suitable for specific scenarios.
You can choose a template as your customization starting point, then modify it as needed to meet your specific requirements.
Using Templates
Pigsty provides the configure script as an optional configuration wizard that generates an inventory with good defaults based on your environment and input.
Use ./configure -c <conf> to specify a configuration template, where <conf> is the path relative to the conf directory (the .yml suffix can be omitted).
If no template is specified, Pigsty defaults to the meta.yml single-node configuration template.
Template List
Main Templates
The following are single-node configuration templates for installing Pigsty on a single server:
| Template | Description |
|---|---|
meta.yml | Default template, single-node PostgreSQL online installation |
rich.yml | Feature-rich template with local repo, Silo, and more examples |
slim.yml | Minimal template, PostgreSQL only without monitoring and infrastructure |
Database Kernel Templates
Templates for various database management systems and kernels:
| Template | Description |
|---|---|
pgsql.yml | Native PostgreSQL kernel, basic features (14~18) |
pg19.yml | PostgreSQL 19 Beta trial template |
mssql.yml | Babelfish kernel, SQL Server protocol compatible (17/18) |
polar.yml | PolarDB PG kernel, Aurora/RAC style (17) |
ivory.yml | IvorySQL kernel, Oracle syntax compatible (18) |
mysql.yml | OpenHalo kernel, MySQL compatible (14) |
pgtde.yml | Percona PostgreSQL Server transparent encryption (18) |
oriole.yml | OrioleDB kernel, OLTP enhanced (16~18) |
agens.yml | AgensGraph graph database kernel (17) |
pgedge.yml | pgEdge distributed database kernel (15~18, default 18) |
supabase.yml | Supabase self-hosted configuration (15~18) |
You can add more nodes later or use HA templates to plan your cluster from the start.
HA Templates
You can configure Pigsty to run on multiple nodes, forming a high-availability (HA) cluster:
| Template | Description |
|---|---|
dual.yml | 2-node semi-HA deployment |
trio.yml | 3-node standard HA deployment |
full.yml | 4-node standard deployment |
safe.yml | 4-node security-enhanced deployment with delayed replica |
octo.yml | Compact 8-node HA simulation |
simu.yml | 20-node production environment simulation |
ha/citus.yml | Citus distributed HA PostgreSQL (14~18) |
Application Templates
You can use the following templates to run Docker applications/software:
| Template | Description |
|---|---|
supabase.yml | Start single-node Supabase |
odoo.yml | Start Odoo ERP system |
dify.yml | Start Dify AI workflow system |
electric.yml | Start Electric sync engine |
insforge.yml | Start Insforge backend platform |
hindsight.yml | Start Hindsight application |
mattermost.yml | Start Mattermost collaboration platform |
teable.yml | Start Teable spreadsheet database |
maybe.yml | Start Maybe finance app |
registry.yml | Start Docker Registry |
Demo Templates
Besides main templates, Pigsty provides a set of demo templates for different scenarios:
| Template | Description |
|---|---|
el.yml | Full-parameter config file for EL 8/9 systems |
debian.yml | Full-parameter config file for Debian/Ubuntu systems |
remote.yml | Example config for monitoring remote PostgreSQL clusters or RDS |
redis.yml | Redis cluster example configuration |
minio.yml | 4-node multi-drive Silo cluster example (source default) |
kafka.yml | Kafka dynamic KRaft example with a single-node dev cluster and a three-node secure cluster |
mysql.yml | Native MySQL 8.4 single-node/three-node pilot example; distinct from OpenHalo conf/mysql.yml |
demo.yml | Configuration file for Pigsty public demo site |
fat.yml | Single-node config with local repo and full feature set |
infra.yml | Deploy only the infrastructure modules |
vibe.yml | Vibe Coding / AI application development template |
mongo.yml | FerretDB / MongoDB-compatible example |
docker.yml | Docker application host template |
Build Templates
The following configuration templates are for development and testing purposes:
| Template | Description |
|---|---|
build/oss.yml | Open source build config for EL 9/10, Debian 12/13, Ubuntu 22.04/24.04/26.04 |
build/dev.yml | Development and testing build config |
3.3.5 - Use CMDB as Config Inventory
Pigsty allows you to use a PostgreSQL metabase as a dynamic configuration source, replacing static YAML configuration files for more powerful configuration management capabilities.
Overview
CMDB (Configuration Management Database) is a method of storing configuration information in a database for management.
In Pigsty, the default configuration source is a static YAML file pigsty.yml,
which serves as Ansible’s inventory.
This approach is simple and direct, but when infrastructure scales and requires complex, fine-grained management and external integration, a single static file becomes insufficient.
| Feature | Static YAML File | CMDB Metabase |
|---|---|---|
| Querying | Manual search/grep | SQL queries with any conditions, aggregation analysis |
| Versioning | Depends on Git or manual backup | Database transactions, audit logs, time-travel snapshots |
| Access Control | File system permissions, coarse-grained | PostgreSQL fine-grained access control |
| Concurrent Editing | Requires file locking or merge conflicts | Database transactions naturally support concurrency |
| External Integration | Requires YAML parsing | Standard SQL interface, easy integration with any language |
| Scalability | Difficult to maintain when file becomes too large | Scales to physical limits |
| Dynamic Generation | Static file, changes require manual application | Immediate effect, real-time configuration changes |
Pigsty provides the CMDB database schema in the sample database pg-meta.meta schema baseline definition.
How It Works
The core idea of CMDB is to replace the static configuration file with a dynamic script.
Ansible supports using executable scripts as inventory, as long as the script outputs inventory data in JSON format.
When you enable CMDB, Pigsty creates a dynamic inventory script named inventory.sh:
This script’s function is simple: every time Ansible needs to read the inventory, it queries configuration data from the PostgreSQL database’s pigsty.inventory view and returns it in JSON format.
The overall architecture is as follows:
flowchart LR
conf["bin/inventory_conf"]
tocmdb["bin/inventory_cmdb"]
load["bin/inventory_load"]
ansible["🚀 Ansible"]
subgraph static["📄 Static Config Mode"]
yml[("pigsty.yml")]
end
subgraph dynamic["🗄️ CMDB Dynamic Mode"]
sh["inventory.sh"]
cmdb[("PostgreSQL CMDB")]
end
conf -->|"switch"| yml
yml -->|"load config"| load
load -->|"write"| cmdb
tocmdb -->|"switch"| sh
sh --> cmdb
yml --> ansible
cmdb --> ansibleData Model
The CMDB database schema is defined in files/cmdb.sql, with all objects in the pigsty schema.
Core Tables
| Table | Description | Primary Key |
|---|---|---|
pigsty.group | Cluster/group definitions, corresponds to Ansible groups | cls |
pigsty.host | Host definitions, belongs to a group | (cls, ip) |
pigsty.global_var | Global variables, corresponds to all.vars | key |
pigsty.group_var | Group variables, corresponds to all.children.<cls>.vars | (cls, key) |
pigsty.host_var | Host variables, host-level variables | (cls, ip, key) |
pigsty.default_var | Default variable definitions, stores parameter metadata | key |
pigsty.job | Job records table, records executed tasks | id |
Table Structure Details
Cluster Table pigsty.group
Host Table pigsty.host
Global Variables Table pigsty.global_var
Group Variables Table pigsty.group_var
Host Variables Table pigsty.host_var
Core Views
CMDB provides a series of views for querying and displaying configuration data:
| View | Description |
|---|---|
pigsty.inventory | Core view: Generates Ansible dynamic inventory JSON |
pigsty.raw_config | Raw configuration in JSON format |
pigsty.global_config | Global config view, merges defaults and global vars |
pigsty.group_config | Group config view, includes host list and group vars |
pigsty.host_config | Host config view, merges group and host-level vars |
pigsty.pg_cluster | PostgreSQL cluster view |
pigsty.pg_instance | PostgreSQL instance view |
pigsty.pg_database | PostgreSQL database definition view |
pigsty.pg_users | PostgreSQL user definition view |
pigsty.pg_service | PostgreSQL service definition view |
pigsty.pg_hba | PostgreSQL HBA rules view |
pigsty.pg_remote | Remote PostgreSQL instance view |
pigsty.inventory is the core view that converts database configuration data to the JSON format required by Ansible:
Utility Scripts
Pigsty provides three convenience scripts for managing CMDB:
| Script | Function |
|---|---|
bin/inventory_load | Load YAML configuration file into PostgreSQL database |
bin/inventory_cmdb | Switch configuration source to CMDB (dynamic inventory script) |
bin/inventory_conf | Switch configuration source to static config file pigsty.yml |
inventory_load
Parse and import YAML configuration file into CMDB:
The script performs the following operations:
- Clears existing data in the
pigstyschema - Parses the YAML configuration file
- Writes global variables to the
global_vartable - Writes cluster definitions to the
grouptable - Writes cluster variables to the
group_vartable - Writes host definitions to the
hosttable - Writes host variables to the
host_vartable
Environment Variables
PIGSTY_HOME: Pigsty installation directory, defaults to~/pigstyMETADB_URL: Database connection URL, defaults toservice=meta
inventory_cmdb
Switch Ansible to use CMDB as the configuration source:
The script performs the following operations:
- Creates dynamic inventory script
${PIGSTY_HOME}/inventory.sh - Modifies
ansible.cfgto setinventorytoinventory.sh
The generated inventory.sh contents:
inventory_conf
Switch back to using static YAML configuration file:
The script modifies ansible.cfg to set inventory back to pigsty.yml.
Usage Workflow
First-time CMDB Setup
- Initialize CMDB schema (usually done automatically during Pigsty installation):
- Load configuration to database:
- Switch to CMDB mode:
- Verify configuration:
Query Configuration
After enabling CMDB, you can flexibly query configuration using SQL:
Modify Configuration
You can modify configuration directly via SQL:
Changes take effect immediately without reloading or restarting any service.
Switch Back to Static Configuration
To switch back to static configuration file mode:
Advanced Usage
Export Configuration
Export CMDB configuration to YAML format:
Or use the ansible-inventory command:
Configuration Auditing
Track configuration changes using the mtime field:
Integration with External Systems
CMDB uses standard PostgreSQL, making it easy to integrate with other systems:
- Web Management Interface: Expose configuration data through REST API (e.g., PostgREST)
- CI/CD Pipelines: Read/write database directly in deployment scripts
- Monitoring & Alerting: Generate monitoring rules based on configuration data
- ITSM Systems: Sync with enterprise CMDB systems
Considerations
Data Consistency: After modifying configuration, you need to re-run the corresponding Ansible playbooks to apply changes to the actual environment
Backup: Configuration data in CMDB is critical, ensure regular backups
Permissions: Configure appropriate database access permissions for CMDB to avoid accidental modifications
Transactions: When making batch configuration changes, perform them within a transaction for rollback on errors
Connection Pooling: The
inventory.shscript creates a new connection on each execution; if Ansible runs frequently, consider using connection pooling
Summary
CMDB is Pigsty’s advanced configuration management solution, suitable for scenarios requiring large-scale cluster management, complex queries, external integration, or fine-grained access control. By storing configuration data in PostgreSQL, you can fully leverage the database’s powerful capabilities to manage infrastructure configuration.
| Feature | Description |
|---|---|
| Storage | PostgreSQL pigsty schema |
| Dynamic Inventory | inventory.sh script |
| Config Load | bin/inventory_load |
| Switch to CMDB | bin/inventory_cmdb |
| Switch to YAML | bin/inventory_conf |
| Core View | pigsty.inventory |
3.4 - High Availability
Overview
Pigsty’s PostgreSQL clusters come with out-of-the-box high availability, with core capabilities provided by Patroni, Etcd, and HAProxy.
When your PostgreSQL cluster has two or more instances, you automatically have self-healing database high availability without any additional configuration — as long as any instance in the cluster survives, the cluster can provide complete service. Clients only need to connect to any node in the cluster to get full service without worrying about primary-replica topology changes.
The default norm mode targets an RTO under 45 seconds. With asynchronous replication, pg_rpo=1MiB is Patroni’s sampled lag threshold for failover candidates, not a hard upper bound on actual data loss. Strict synchronous mode with crit.yml keeps acknowledged transactions at RPO = 0 during failover. These behaviors can be configured for your hardware and reliability requirements.
Pigsty includes built-in HAProxy load balancers for automatic traffic switching, providing DNS/VIP/LVS and other access methods for clients. Failover and switchover are almost transparent to the business side except for brief interruptions - applications don’t need to modify connection strings or restart. The minimal maintenance window requirements bring great flexibility and convenience: you can perform rolling maintenance and upgrades on the entire cluster without application coordination. The feature that hardware failures can wait until the next day to handle lets developers, operations, and DBAs sleep well during incidents.

Many large organizations and core institutions have been using Pigsty in production for extended periods. The largest deployment has 25K CPU cores and 220+ PostgreSQL ultra-large instances (64c / 512g / 3TB NVMe SSD). In this deployment case, dozens of hardware failures and various incidents occurred over five years, yet overall availability of over 99.999% was maintained.
What problems does High Availability solve?
- Elevates availability in the data security C/IA model: RPO ≈ 0, RTO < 45s.
- Gains seamless rolling maintenance capability, minimizing maintenance window requirements and bringing great convenience.
- Hardware failures can self-heal immediately without human intervention, allowing operations and DBAs to sleep well.
- Replicas can handle read-only requests, offloading primary load and fully utilizing resources.
What are the costs of High Availability?
- Infrastructure dependency: HA requires DCS (etcd/zk/consul) for consensus.
- Higher starting threshold: A meaningful HA deployment requires at least three nodes.
- Extra resource consumption: Each new replica consumes additional resources, though this is usually not a major concern.
- Significantly increased complexity: Backup costs increase significantly, requiring tools to manage complexity.
Limitations of High Availability
Since replication happens in real-time, all changes are immediately applied to replicas. Therefore, streaming replication-based HA solutions cannot handle data deletion or modification caused by human errors and software defects. (e.g., DROP TABLE or DELETE data)
Such failures require using delayed clusters or performing point-in-time recovery using previous base backups and WAL archives.
| Configuration Strategy | RTO | RPO |
|---|---|---|
| Standalone + Nothing | Data permanently lost, unrecoverable | All data lost |
| Standalone + Base Backup | Depends on backup size and bandwidth (hours) | Lose data since last backup (hours to days) |
| Standalone + Base Backup + WAL Archive | Depends on backup size and bandwidth (hours) | Lose unarchived data (tens of MB) |
| Primary-Replica + Manual Failover | ~10 minutes | Lose data in replication lag (~100KB) |
| Primary-Replica + Auto Failover | Within 1 minute | Lose data in replication lag (~100KB) |
| Primary-Replica + Auto Failover + Sync Commit | Within 1 minute | No data loss |
How It Works
In Pigsty, the high availability architecture works as follows:
- PostgreSQL uses standard streaming replication to build physical replicas; replicas take over when the primary fails.
- Patroni manages PostgreSQL server processes and handles high availability matters.
- Etcd provides distributed configuration storage (DCS) capability and is used for leader election after failures.
- Patroni relies on Etcd to reach cluster leader consensus and provides health check interfaces externally.
- HAProxy exposes cluster services externally and uses Patroni health check interfaces to automatically distribute traffic to healthy nodes.
- vip-manager provides an optional Layer 2 VIP, retrieves leader information from Etcd, and binds the VIP to the node where the cluster primary resides.
When the primary fails, a new round of leader election is triggered. The healthiest replica in the cluster (highest LSN position, minimum data loss) wins and is promoted to the new primary. After the winning replica is promoted, read-write traffic is immediately routed to the new primary. The impact of primary failure is brief write service unavailability: write requests will be blocked or fail directly from primary failure until new primary promotion, with unavailability typically lasting 15 to 30 seconds, usually not exceeding 1 minute.
When a replica fails, read-only traffic is routed to other replicas. Only when all replicas fail will read-only traffic ultimately be handled by the primary. The impact of replica failure is partial read-only query interruption: queries currently running on that replica will abort due to connection reset and be immediately taken over by other available replicas.
Failure detection is performed jointly by Patroni and Etcd. The cluster leader holds a lease; if it fails to renew the lease within its TTL (30 seconds in the default norm mode), the lease expires, triggering a Failover and a new election.
Even without any failures, you can proactively change the cluster primary through Switchover. In this case, write queries on the primary will experience a brief interruption and be immediately routed to the new primary. This operation is typically used for rolling maintenance/upgrades of database servers.
3.4.1 - RPO Trade-offs
RPO (Recovery Point Objective) defines the maximum amount of data loss allowed when the primary fails.
For scenarios where data integrity is critical, such as financial transactions, RPO = 0 is typically required, meaning no data loss is allowed.
However, stricter RPO targets come at a cost: higher write latency, reduced system throughput, and the risk that replica failures may cause primary unavailability. For typical scenarios, some data loss is acceptable in exchange for higher availability and performance.
Trade-offs
In asynchronous replication scenarios, there is typically some replication lag between replicas and the primary (depending on network and throughput, normally in the range of 10KB-100KB / 100µs-10ms). This means when the primary fails, replicas may not have fully synchronized with the latest data. If a failover occurs, the new primary may lose some unreplicated data.
The pg_rpo parameter is written to Patroni’s maximum_lag_on_failover and defaults to 1048576 (1MiB). It is the sampled lag threshold that permits a replica to participate as a failover candidate, not a hard upper bound on actual data loss.
When the cluster primary fails, if any replica has replication lag within this threshold, Pigsty will automatically promote that replica to be the new primary. However, when all replicas exceed this threshold, Pigsty will refuse [automatic failover] to prevent data loss. Manual intervention is then required to decide whether to wait for the primary to recover (which may never happen) or accept the data loss and force-promote a replica.
Because the primary’s WAL position is not sampled continuously, the worst-case loss under asynchronous replication can also include WAL generated during the most recent ttl window (on average, roughly another loop_wait/2 of WAL). Configure this threshold with your workload’s write rate in mind. Increasing it improves the chance of automatic failover but also broadens candidate eligibility.
When you set pg_rpo = 0, Pigsty enables synchronous replication, ensuring the primary only returns write success after at least one replica has persisted the data.
This configuration ensures zero replication lag but introduces significant write latency and reduces overall throughput.
flowchart LR
A([Primary Failure]) --> B{Synchronous<br/>Replication?}
B -->|No| C{Lag < RPO?}
B -->|Yes| D{Sync Replica<br/>Available?}
C -->|Yes| E[Lossy Auto Failover<br/>Sampled candidate lag is within threshold]
C -->|No| F[Refuse Auto Failover<br/>Wait for Primary Recovery<br/>or Manual Intervention]
D -->|Yes| G[Lossless Auto Failover<br/>RPO = 0]
D -->|No| H{Strict Mode?}
H -->|No| C
H -->|Yes| F
style A fill:#dc3545,stroke:#b02a37,color:#fff
style E fill:#F0AD4E,stroke:#146c43,color:#fff
style G fill:#198754,stroke:#146c43,color:#fff
style F fill:#BE002F,stroke:#565e64,color:#fffProtection Modes
Pigsty provides three protection modes to help users make trade-offs under different RPO requirements, similar to Oracle Data Guard protection modes.
- Default mode, asynchronous replication, transactions commit with only local WAL persistence, no waiting for replicas, replica failures are completely transparent to the primary
- Primary failure may lose unsent/unreceived WAL. The default sampled candidate-lag threshold is 1MiB, but this is not a hard upper bound on actual loss
- Optimized for performance, suitable for typical business scenarios that tolerate minor data loss during failures
- Configured with
pg_rpo = 0, enables Patroni synchronous commit mode:synchronous_mode: true - Under normal conditions, waits for at least one replica confirmation, achieving zero data loss. When all sync replicas fail, automatically degrades to async mode to continue service
- Balances data safety and service availability, recommended configuration for production critical business
- Uses
crit.ymltemplate, enables Patroni strict synchronous mode:synchronous_mode: true/synchronous_mode_strict: true - When all sync replicas fail, primary refuses writes to prevent data loss, transactions must be persisted on at least one replica before returning success
- Suitable for financial transactions, medical records, and other scenarios with extremely high data integrity requirements
| Name | Maximum Performance | Maximum Availability | Maximum Protection |
|---|---|---|---|
| Replication | Asynchronous | Synchronous | Strict Synchronous |
| Data Loss | Possible (replication lag) | Zero normally, minor when degraded | Zero |
| Write Latency | Lowest | Medium (+1 network RTT) | Medium (+1 network RTT) |
| Throughput | Highest | Reduced | Reduced |
| Replica Failure Impact | None | Auto degrade, service continues | Primary stops writes |
| RPO | Possible loss; 1MiB default candidate threshold | = 0 normally / possible loss after degradation | = 0 |
| Use Case | Typical business, performance first | Critical business, safety first | Financial core, compliance first |
| Configuration | Default config | pg_rpo = 0 | pg_conf: crit.yml |
Implementation
The three protection modes differ in how two core Patroni parameters are configured: synchronous_mode and synchronous_mode_strict:
synchronous_mode: Whether Patroni enables synchronous replication. If enabled, check ifsynchronous_mode_strictenables strict synchronous mode.synchronous_mode_strict = false: Default configuration, allows degradation to async mode when replicas fail, primary continues service (Maximum Availability)synchronous_mode_strict = true: Degradation forbidden, primary stops writes until sync replica recovers (Maximum Protection)
| Mode | synchronous_mode | synchronous_mode_strict | Replication Mode | Replica Failure Behavior |
|---|---|---|---|---|
| Max Performance | false | - | Async | No impact |
| Max Availability | true | false | Synchronous | Auto degrade to async |
| Max Protection | true | true | Strict Synchronous | Primary refuses writes |
Typically, you only need to set the pg_rpo parameter to 0 to enable the synchronous_mode switch, activating Maximum Availability mode.
If you use pg_conf = crit.yml template, it additionally enables the synchronous_mode_strict strict mode switch, activating Maximum Protection mode.
Additionally, you can enable watchdog to fence the primary directly during node/Patroni freeze scenarios instead of degrading, achieving behavior equivalent to Oracle Maximum Protection mode.
You can also directly configure these Patroni parameters as needed. Refer to Patroni and PostgreSQL documentation to achieve stronger data protection, such as:
- Specify the synchronous replica list, configure more sync replicas to improve disaster tolerance, use quorum synchronous commit, or even require all replicas to perform synchronous commit.
- Configure
synchronous_commit:'remote_apply'to strictly ensure primary-replica read-write consistency. (Oracle Maximum Protection mode is equivalent toremote_write)
Recommendations
Maximum Performance mode (asynchronous replication) is the default mode used by Pigsty and is sufficient for the vast majority of workloads.
It tolerates some loss during a failure in exchange for higher throughput and availability.
In this mode, pg_rpo adjusts the sampled lag threshold for failover candidates; actual worst-case loss also depends on write rate, ttl, and sampling timing.
Maximum Availability mode (synchronous replication) is suitable for scenarios with high data-integrity requirements. Acknowledged transactions have zero loss while a synchronous replica is healthy, but the cluster can degrade when all synchronous replicas are unavailable.
In this mode, a minimum of two-node PostgreSQL cluster (one primary, one replica) is required.
Set pg_rpo to 0 to enable this mode.
Maximum Protection mode (strict synchronous replication) is suitable for financial transactions, medical records, and other scenarios with extremely high data integrity requirements. We recommend using at least a three-node cluster (one primary, two replicas), because with only two nodes, if the replica fails, the primary will stop writes, causing service unavailability, which reduces overall system reliability. With three nodes, if only one replica fails, the primary can continue to serve.
3.4.2 - Failure Model
Patroni failures can be classified into 10 categories by failure target, and further consolidated into five categories based on detection path, which are detailed in this section.
| # | Failure Scenario | Description | Final Path |
|---|---|---|---|
| 1 | PG process crash | crash, OOM killed | Active Detection |
| 2 | PG connection refused | max_connections | Active Detection |
| 3 | PG zombie | Process alive but unresponsive | Active Detection (timeout) |
| 4 | Patroni process crash | kill -9, OOM | Passive Detection |
| 5 | Patroni zombie | Process alive but stuck | Watchdog |
| 6 | Node down | Power outage, hardware failure | Passive Detection |
| 7 | Node zombie | IO hang, CPU starvation | Watchdog |
| 8 | Primary ↔ DCS network failure | Firewall, switch failure | Network Partition |
| 9 | Storage failure | Disk failure, disk full, mount failure | Active Detection or Watchdog |
| 10 | Manual switchover | Switchover/Failover | Manual Trigger |
However, for RTO calculation purposes, all failures ultimately converge to two paths. This section explores the upper bound, lower bound, and average RTO for these two scenarios.
- Passive election triggered after Patroni loses contact
- Patroni actively detects failure and triggers switchover
flowchart LR
A([Primary Failure]) --> B{Patroni<br/>Detected?}
B -->|PG Crash| C[Attempt Local Restart]
B -->|Node Down| D[Wait TTL Expiration]
C -->|Success| E([Local Recovery])
C -->|Fail/Timeout| F[Release Leader Lock]
D --> F
F --> G[Replica Election]
G --> H[Execute Promote]
H --> I[HAProxy Detects]
I --> J([Service Restored])
style A fill:#dc3545,stroke:#b02a37,color:#fff
style E fill:#198754,stroke:#146c43,color:#fff
style J fill:#198754,stroke:#146c43,color:#fff3.4.2.1 - Model of Patroni Passive Failure
infographic list-row-simple-horizontal-arrow
data
desc Lease Expiration Stages
items
- label Lease Expiration
- label Replica Detect
- label Elect & Promote
- label Haproxy Up
theme light
palette antvRTO Timeline
tooltip: { trigger: axis, axisPointer: { type: shadow }, formatter: $fn:fmt }
legend: { top: 0, itemGap: 12, data: [Lease Expiration, Replica Detection, Lock Contest & Promote, Health Check] }
grid: { left: 64, right: 24, bottom: 32, top: 40 }
xAxis: { type: value, name: Seconds, nameLocation: end, max: 160, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: true, lineStyle: { type: dashed, opacity: 0.5 } }, minorTick: { show: true, splitNumber: 5 }, minorSplitLine: { show: true, lineStyle: { type: dotted, opacity: 0.2 } } }
yAxis: { type: category, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: false }, axisLabel: { fontSize: 10, fontFamily: monospace }, data: [wide-max, wide-avg, wide-min, "", safe-max, safe-avg, safe-min, "", norm-max, norm-avg, norm-min, "", fast-max, fast-avg, fast-min] }
series:
- { name: Lease Expire, type: bar, stack: main, barWidth: 20, z: 2, emphasis: { focus: series }, itemStyle: { color: "#e15759" }, data: [120, 110, 100, "-", 60, 55, 50, "-", 30, 27, 25, "-", 20, 17, 15] }
- { name: Replica Detect, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#edc949" }, data: [20, 10, 0, "-", 10, 5, 0, "-", 5, 3, 0, "-", 5, 3, 0] }
- { name: Elect & Promote, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#59a14f" }, data: [2, 1, 0, "-", 2, 1, 0, "-", 2, 1, 0, "-", 2, 1, 0] }
- { name: HAProxy Check, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#4e79a7" }, data: [8, 6, 4, "-", 6, 5, 3, "-", 4, 3, 2, "-", 2, 2, 1] }
- { name: Total RTO, type: bar, barGap: "-100%", barWidth: 20, z: 1, itemStyle: { color: "#888", opacity: 0 }, emphasis: { itemStyle: { opacity: 0 } }, data: [150, 127, 104, "-", 78, 66, 53, "-", 41, 34, 27, "-", 29, 23, 16] }
- { name: RTO Budget, type: bar, barGap: "-100%", barWidth: 20, z: 0, itemStyle: { color: "rgba(0,0,0,0.08)" }, emphasis: { itemStyle: { color: "rgba(0,0,0,0.12)" } }, data: [150, 150, 150, "-", 90, 90, 90, "-", 45, 45, 45, "-", 30, 30, 30] }Failure Model
| Phase | Best | Worst | Average | Description |
|---|---|---|---|---|
| Lease Expiration | ttl - loop | ttl | ttl - loop/2 | Best: crash just before refresh Worst: crash right after refresh |
| Replica Detect | 0 | loop | loop / 2 | Best: exactly at check point Worst: just missed check point |
| Election Promote | 0 | 2 | 1 | Best: direct lock and promote Worst: API timeout + Promote |
| HAProxy Check | (rise-1) × fastinter | (rise-1) × fastinter + inter | (rise-1) × fastinter + inter/2 | Best: state change before check Worst: state change right after check |
Key Difference Between Passive and Active Failover:
| Scenario | Patroni Status | Lease Handling | Primary Wait Time |
|---|---|---|---|
| Active Failover (PG crash) | Alive, healthy | Actively tries to restart PG, releases lease on timeout | primary_start_timeout |
| Passive Failover (Node crash) | Dies with node | Cannot actively release, must wait for TTL expiration | ttl |
In passive failover scenarios, Patroni dies along with the node and cannot actively release the Leader Key. The lease in DCS can only trigger cluster election after TTL naturally expires.
Timeline Analysis
Phase 1: Lease Expiration
The Patroni primary refreshes the Leader Key every loop_wait cycle, resetting TTL to the configured value.
- Best case: Failure occurs just before lease refresh (elapsed
loopsince last refresh), remaining TTL =ttl - loop - Worst case: Failure occurs right after lease refresh, must wait full
ttl - Average case:
ttl - loop/2
Phase 2: Replica Detection
Replicas wake up on loop_wait cycles and check the Leader Key status in DCS.
- Best case: Replica happens to wake when lease expires, wait
0 - Worst case: Replica just entered sleep when lease expires, wait
loop - Average case:
loop/2
Phase 3: Lock Contest & Promote
When replicas detect Leader Key expiration, they start the election process. The replica that acquires the Leader Key executes pg_ctl promote to become the new primary.
- Via REST API, parallel queries to check each replica’s replication position, typically 10ms, hardcoded 2s timeout.
- Compare WAL positions to determine the best candidate, replicas attempt to create Leader Key (CAS atomic operation)
- Execute
pg_ctl promoteto become primary (very fast, typically negligible)
- Best case: Single replica or immediate lock acquisition and promotion, constant overhead
0.1s - Worst case: DCS API call timeout:
2s - Average case:
1sconstant overhead
Phase 4: Health Check
HAProxy detects the new primary online, requiring rise consecutive successful health checks.
- Best case: New primary promoted just before check,
(rise-1) × fastinter - Worst case: New primary promoted right after check,
(rise-1) × fastinter + inter - Average case:
(rise-1) × fastinter + inter/2
RTO Formula
Sum all phase times to get total RTO:
Best Case
Average Case
Worst Case
Model Calculation
Substitute the four RTO model parameters into the formulas above:
Four Mode Calculation Results (unit: seconds, format: min / avg / max)
| Phase | fast | norm | safe | wide |
|---|---|---|---|---|
| Lease Expiration | 15 / 17 / 20 | 25 / 27 / 30 | 50 / 55 / 60 | 100 / 110 / 120 |
| Replica Detection | 0 / 3 / 5 | 0 / 3 / 5 | 0 / 5 / 10 | 0 / 10 / 20 |
| Lock Contest & Promote | 0 / 1 / 2 | 0 / 1 / 2 | 0 / 1 / 2 | 0 / 1 / 2 |
| Health Check | 1 / 2 / 2 | 2 / 3 / 4 | 3 / 5 / 6 | 4 / 6 / 8 |
| Total | 16 / 23 / 29 | 27 / 34 / 41 | 53 / 66 / 78 | 104 / 127 / 150 |
3.4.2.2 - Model of Patroni Active Failure
infographic list-row-simple-horizontal-arrow
data
desc When Patroni is healthy but PostgreSQL crashes
items
- label Crash Found
- label Restart Timeout
- label Replica Detect
- label Elect Promote
- label HAProxy Check
theme light
palette antvRTO Timeline
tooltip: { trigger: axis, axisPointer: { type: shadow }, formatter: $fn:fmt }
legend: { top: 0, itemGap: 12, data: [ Crash Found, Restart Timeout, Replica Detection, Elect Promote, HAProxy Check] }
grid: { left: 64, right: 24, bottom: 32, top: 40 }
xAxis: { type: value, name: Seconds, nameLocation: end, max: 160, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: true, lineStyle: { type: dashed, opacity: 0.5 } }, minorTick: { show: true, splitNumber: 5 }, minorSplitLine: { show: true, lineStyle: { type: dotted, opacity: 0.2 } } }
yAxis: { type: category, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: false }, axisLabel: { fontSize: 10, fontFamily: monospace }, data: [wide-max, wide-avg, wide-min, "", safe-max, safe-avg, safe-min, "", norm-max, norm-avg, norm-min, "", fast-max, fast-avg, fast-min] }
series:
- { name: Crash Found, type: bar, stack: main, barWidth: 20, z: 2, emphasis: { focus: series }, itemStyle: { color: "#b07aa1" }, data: [20, 10, 0, "-", 10, 5, 0, "-", 5, 3, 0, "-", 5, 3, 0] }
- { name: Restart Timeout, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#f28e2c" }, data: [95, 95, 0, "-", 45, 45, 0, "-", 25, 25, 0, "-", 15, 15, 0] }
- { name: Replica Detect, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#edc949" }, data: [20, 10, 0, "-", 10, 5, 0, "-", 5, 3, 0, "-", 5, 3, 0] }
- { name: Elect Promote, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#59a14f" }, data: [2, 1, 0, "-", 2, 1, 0, "-", 2, 1, 0, "-", 2, 1, 0] }
- { name: HAProxy Check, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#4e79a7" }, data: [8, 6, 4, "-", 6, 5, 3, "-", 4, 3, 2, "-", 2, 2, 1] }
- { name: RTO Total, type: bar, barGap: "-100%", barWidth: 20, z: 1, itemStyle: { color: "#888", opacity: 0 }, emphasis: { itemStyle: { opacity: 0 } }, data: [145, 122, 4, "-", 73, 61, 3, "-", 41, 35, 2, "-", 29, 24, 1] }
- { name: RTO Budget, type: bar, barGap: "-100%", barWidth: 20, z: 0, itemStyle: { color: "rgba(0,0,0,0.08)" }, emphasis: { itemStyle: { color: "rgba(0,0,0,0.12)" } }, data: [150, 150, 150, "-", 90, 90, 90, "-", 45, 45, 45, "-", 30, 30, 30] }Failure Model
| Item | Best | Worst | Average | Description |
|---|---|---|---|---|
| Crash Found | 0 | loop | loop/2 | Best: PG crashes right before check Worst: PG crashes right after check |
| Restart Timeout | 0 | start | start | Best: PG recovers instantly Worst: Wait full start timeout before releasing lease |
| Replica Detect | 0 | loop | loop/2 | Best: Right at check point Worst: Just missed check point |
| Elect Promote | 0 | 2 | 1 | Best: Acquire lock and promote directly Worst: API timeout + Promote |
| HAProxy Check | (rise-1) × fastinter | (rise-1) × fastinter + inter | (rise-1) × fastinter + inter/2 | Best: State changes before check Worst: State changes right after check |
Key Difference Between Active and Passive Failure:
| Scenario | Patroni Status | Lease Handling | Main Wait Time |
|---|---|---|---|
| Active Failure (PG crash) | Alive, healthy | Actively tries to restart PG, releases lease after timeout | primary_start_timeout |
| Passive Failure (node down) | Dies with node | Cannot actively release, must wait for TTL expiry | ttl |
In active failure scenarios, Patroni remains alive and can actively detect PG crash and attempt restart. If restart succeeds, service self-heals; if timeout expires without recovery, Patroni actively releases the Leader Key, triggering cluster election.
Timing Analysis
Phase 1: Failure Detection
Patroni checks PostgreSQL status every loop_wait cycle (via pg_isready or process check).
- Best case: PG crashes right before Patroni check, detected immediately, wait
0 - Worst case: PG crashes right after check, wait for next cycle, wait
loop - Average case:
loop/2
Phase 2: Restart Timeout
After Patroni detects PG crash, it attempts to restart PostgreSQL. This phase has two possible outcomes:
Path A: Self-healing Success (Best case)
- PG restarts successfully, service recovers
- No failover triggered, extremely short RTO
- Wait time:
0(relative to Failover path)
Path B: Failover Required (Average/Worst case)
- PG still not recovered after
primary_start_timeout - Patroni actively releases Leader Key
- Wait time:
start
Note: Average case assumes failover is required. If PG can quickly self-heal, overall RTO will be significantly lower.
Phase 3: Standby Detection
Standbys wake up on loop_wait cycle and check Leader Key status in DCS. When primary Patroni releases the Leader Key, standbys discover this and begin election.
- Best case: Standby wakes right when lease is released, wait
0 - Worst case: Standby just went to sleep when lease released, wait
loop - Average case:
loop/2
Phase 4: Lock & Promote
After standbys discover Leader Key vacancy, election begins. The standby that acquires the Leader Key executes pg_ctl promote to become the new primary.
- Via REST API, parallel queries to check each standby’s replication position, typically 10ms, hardcoded 2s timeout.
- Compare WAL positions to determine best candidate, standbys attempt to create Leader Key (CAS atomic operation)
- Execute
pg_ctl promoteto become primary (very fast, typically negligible)
- Best case: Single standby or direct lock acquisition and promote, constant overhead
0.1s - Worst case: DCS API call timeout:
2s - Average case:
1sconstant overhead
Phase 5: Health Check
HAProxy detects new primary online, requires rise consecutive successful health checks.
- Best case: New primary comes up right at check time,
(rise-1) × fastinter - Worst case: New primary comes up right after check,
(rise-1) × fastinter + inter - Average case:
(rise-1) × fastinter + inter/2
RTO Formula
Sum all phase times to get total RTO:
Best Case (PG instant self-healing)
Average Case (Failover required)
Worst Case
Model Calculation
Substituting the four RTO model parameters into the formulas above:
Calculation Results for Four Modes (unit: seconds, format: min / avg / max)
| Phase | fast | norm | safe | wide |
|---|---|---|---|---|
| Failure Detection | 0 / 3 / 5 | 0 / 3 / 5 | 0 / 5 / 10 | 0 / 10 / 20 |
| Restart Timeout | 0 / 15 / 15 | 0 / 25 / 25 | 0 / 45 / 45 | 0 / 95 / 95 |
| Standby Detection | 0 / 3 / 5 | 0 / 3 / 5 | 0 / 5 / 10 | 0 / 10 / 20 |
| Lock & Promote | 0 / 1 / 2 | 0 / 1 / 2 | 0 / 1 / 2 | 0 / 1 / 2 |
| Health Check | 1 / 2 / 2 | 2 / 3 / 4 | 3 / 5 / 6 | 4 / 6 / 8 |
| Total | 1 / 24 / 29 | 2 / 35 / 41 | 3 / 61 / 73 | 4 / 122 / 145 |
Comparison with Passive Failure
| Phase | Active Failure (PG crash) | Passive Failure (node down) | Description |
|---|---|---|---|
| Detection Mechanism | Patroni active detection | TTL passive expiry | Active detection discovers failure faster |
| Core Wait | start | ttl | start is usually less than ttl, but requires additional failure detection time |
| Lease Handling | Active release | Passive expiry | Active release is more timely |
| Self-healing Possible | Yes | No | Active detection can attempt local recovery |
RTO Comparison (Average case):
| Mode | Active Failure (PG crash) | Passive Failure (node down) | Difference |
|---|---|---|---|
| fast | 24s | 23s | +1s |
| norm | 35s | 34s | +1s |
| safe | 61s | 66s | -5s |
| wide | 122s | 127s | -5s |
Analysis: In
fastandnormmodes, active failure RTO is slightly higher than passive failure because it waits forprimary_start_timeout(start); but insafeandwidemodes, sincestart < ttl - loop, active failure is actually faster. However, active failure has the possibility of self-healing, with potentially extremely short RTO in best case scenarios.
3.4.2.3 - Network Partition
infographic list-row-simple-horizontal-arrow
data
title Network Partition Failover Flow
desc Primary partitioned from DCS, Patroni proactively demotes to prevent split-brain, waits for TTL expiration before switchover
items
- label Primary Demote
desc Patroni demotes PG after retry timeout
icon mingcute/shield-fill
- label Lease Expiration
desc Leader Key TTL expires
icon mingcute/close-circle-fill
- label Replica Detection
desc Replica detects lease expiration, starts election
icon mingcute/key-2-fill
- label Lock & Promote
desc Replica acquires lock and promotes to new primary
icon mingcute/radar-fill
- label Health Check
desc HAProxy detects new primary online
icon mingcute/arrow-up-circle-fill
theme light
palette antvRTO Timeline
tooltip: { trigger: axis, axisPointer: { type: shadow }, formatter: $fn:fmt }
legend: { top: 0, itemGap: 12, data: [Primary Demote, Lease Expiration, Replica Detection, Lock & Promote, Health Check] }
grid: { left: 64, right: 24, bottom: 32, top: 40 }
xAxis: { type: value, name: sec, nameLocation: end, max: 160, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: true, lineStyle: { type: dashed, opacity: 0.5 } }, minorTick: { show: true, splitNumber: 5 }, minorSplitLine: { show: true, lineStyle: { type: dotted, opacity: 0.2 } } }
yAxis: { type: category, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: false }, axisLabel: { fontSize: 10, fontFamily: monospace }, data: [wide-max, wide-avg, wide-min, "", safe-max, safe-avg, safe-min, "", norm-max, norm-avg, norm-min, "", fast-max, fast-avg, fast-min] }
series:
- { name: Primary Demote, type: bar, stack: main, barWidth: 20, z: 2, emphasis: { focus: series }, itemStyle: { color: "#76b7b2" }, data: [50, 40, 30, "-", 30, 25, 20, "-", 15, 13, 10, "-", 10, 8, 5] }
- { name: Lease Expiration, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#e15759" }, data: [70, 70, 70, "-", 30, 30, 30, "-", 15, 15, 15, "-", 10, 10, 10] }
- { name: Replica Detection, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#edc949" }, data: [20, 10, 0, "-", 10, 5, 0, "-", 5, 3, 0, "-", 5, 3, 0] }
- { name: Lock & Promote, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#59a14f" }, data: [2, 1, 0, "-", 2, 1, 0, "-", 2, 1, 0, "-", 2, 1, 0] }
- { name: Health Check, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#4e79a7" }, data: [8, 6, 4, "-", 6, 5, 3, "-", 4, 3, 2, "-", 2, 2, 1] }
- { name: RTO Total, type: bar, barGap: "-100%", barWidth: 20, z: 1, itemStyle: { color: "#888", opacity: 0 }, emphasis: { itemStyle: { opacity: 0 } }, data: [150, 127, 104, "-", 78, 66, 53, "-", 41, 34, 27, "-", 29, 23, 16] }
- { name: RTO Budget, type: bar, barGap: "-100%", barWidth: 20, z: 0, itemStyle: { color: "rgba(0,0,0,0.08)" }, emphasis: { itemStyle: { color: "rgba(0,0,0,0.12)" } }, data: [150, 150, 150, "-", 90, 90, 90, "-", 45, 45, 45, "-", 30, 30, 30] }Failure Model
| Phase | Best | Worst | Average | Notes |
|---|---|---|---|---|
| Demote | retry | loop + retry | loop/2 + retry | Patroni retries after detecting partition, demotes after timeout |
| Lease Expiration | ttl - loop - retry | ttl - loop - retry | ttl - loop - retry | Remaining TTL time after demotion (approximately constant) |
| Replica Detection | 0 | loop | loop/2 | Best: Right at detection point Worst: Just missed detection |
| Lock & Promote | 0 | 2 | 1 | Best: Direct lock and promote Worst: API timeout + Promote |
| Health Check | (rise-1) × fastinter | (rise-1) × fastinter + inter | (rise-1) × fastinter + inter/2 | Best: State changes before check Worst: State changes right after check |
Key difference between network partition and node crash:
| Scenario | Patroni State | PostgreSQL State | Lease Handling | Split-brain Risk |
|---|---|---|---|---|
| Node Crash (Expire) | Dies with node | Completely unavailable | Passive wait for TTL expiration | None |
| Network Partition (This scenario) | Alive but cannot access DCS | May still be running (needs active demotion) | Passive wait for TTL expiration | Yes, needs protection |
In network partition scenarios, the primary PostgreSQL may still be running and accepting writes, causing split-brain issues. Patroni solves this through active demotion: when unable to refresh Leader Key, proactively demotes PostgreSQL to read-only or shuts it down.
Timeline Analysis
Phase 1: Primary Demotion
When primary Patroni is network-partitioned from DCS, it cannot refresh Leader Key and starts retrying.
- Detection delay: After partition occurs, must wait for next
loop_waitcycle to detect - Retry phase: Patroni continuously retries DCS operations during
retry_timeout - Active demotion: After retry timeout, Patroni proactively demotes PostgreSQL (prevents split-brain)
Key design: Patroni requires constraint loop_wait + 2 × retry_timeout ≤ ttl to ensure primary demotes before TTL expires.
Phase 2: Lease Expiration
After primary demotion, Leader Key still exists in DCS, must wait for TTL to naturally expire.
Since the primary has demoted, waiting time during this phase is the remaining TTL time. Since partition detection and remaining TTL are negatively correlated (earlier partition means slower detection but longer remaining TTL), their sum is constant:
Note: Primary demotion + lease expiration total time still approximately equals ttl, same as expire failure.
Phase 3: Replica Detection
Replica wakes up in loop_wait cycle and checks Leader Key status in DCS.
- Best case: Replica wakes right when lease expires, wait
0 - Worst case: Replica just entered sleep when lease expires, wait
loop - Average case:
loop/2
Phase 4: Lock & Promote
After replica discovers Leader Key expired, it starts the election process.
- Best case: Single replica or directly acquires lock and promotes,
≈ 0 - Worst case: DCS API call timeout,
2s - Average case:
1s
Phase 5: Health Check
HAProxy detects new primary coming online, requires rise consecutive successful health checks.
- Best case:
(rise-1) × fastinter - Worst case:
(rise-1) × fastinter + inter - Average case:
(rise-1) × fastinter + inter/2
RTO Formula
Sum all phase times to get total RTO.
Since primary demotion + lease expiration ≈ ttl, network partition RTO formula is same as expire failure:
Best Case
Average Case
Worst Case
Model Calculation
Substituting the four RTO model parameters into the formulas:
Patroni constraint validation (loop + 2×retry ≤ ttl):
| Mode | loop | retry | TTL | loop + 2×retry | Meets constraint? |
|---|---|---|---|---|---|
| fast | 5 | 5 | 20s | 15s | ✓ Safe |
| norm | 5 | 10 | 30s | 25s | ✓ Safe |
| safe | 10 | 20 | 60s | 50s | ✓ Safe |
| wide | 20 | 30 | 120s | 80s | ✓ Safe |
Four mode calculation results (seconds, format: min / avg / max)
| Phase | fast | norm | safe | wide |
|---|---|---|---|---|
| Primary Demote | 5 / 8 / 10 | 10 / 13 / 15 | 20 / 25 / 30 | 30 / 40 / 50 |
| Lease Expiration | 10 | 15 | 30 | 70 |
| Replica Detection | 0 / 3 / 5 | 0 / 3 / 5 | 0 / 5 / 10 | 0 / 10 / 20 |
| Lock & Promote | 0 / 1 / 2 | 0 / 1 / 2 | 0 / 1 / 2 | 0 / 1 / 2 |
| Health Check | 1 / 2 / 2 | 2 / 3 / 4 | 3 / 5 / 6 | 4 / 6 / 8 |
| Total | 16 / 23 / 29 | 27 / 34 / 41 | 53 / 66 / 78 | 104 / 127 / 150 |
Conclusion: Network partition RTO is same as expire failure (node crash), as the bottleneck is TTL expiration time.
Split-brain Protection
The biggest risk of network partition is split-brain: old primary may still be running and accepting writes. Patroni provides multiple protection mechanisms:
1. Primary Self-Demotion
Patroni’s core protection mechanism: when unable to refresh Leader Key, proactively demotes PostgreSQL.
2. Linux Watchdog
If Patroni process hangs and cannot execute demotion, Linux watchdog will force system restart.
3. Fencing Mechanism
Can configure fencing scripts to forcibly isolate old primary (e.g., disable network interface, stop service, etc.).
Special Scenarios
Scenario A: Primary partitioned from DCS, replicas normal
This is the most common network partition scenario, the main focus of this article.
- Primary Patroni cannot refresh Leader Key → Active demotion
- Replica normally detects TTL expiration → Elected as new primary
- RTO ≈ Expire failure RTO
Scenario B: Primary normal, replica partitioned from DCS
- Primary normally refreshes Leader Key
- Replica cannot participate in election (but replication can continue)
- No failover triggered, service continues normally
Scenario C: All nodes partitioned from DCS
- Primary demotes, replica cannot elect
- Cluster completely unavailable
- Requires manual intervention to restore DCS connectivity
Comparison with Other Failures
| Failure Type | Primary State | Lease Handling | RTO | Split-brain Risk |
|---|---|---|---|---|
| Expire Failure | Node crash | Passive wait TTL expiration | 16s ~ 150s | None |
| Crash Failure | PG crash, Patroni alive | Release after restart timeout | 1s ~ 111s | None |
| Network Partition | Alive but isolated from DCS | Passive wait TTL expiration | 16s ~ 150s | Yes, needs protection |
| Manual Switchover | Normal or failed | Direct release/acquire | 1s ~ 11s | None |
Key Insight: Network partition RTO is same as expire failure, but requires additional split-brain protection mechanisms.
Ensuring loop_wait + 2 × retry_timeout ≤ ttl constraint is the key design to prevent split-brain.
3.4.3 - RTO Trade-offs
RTO (Recovery Time Objective) defines the maximum time required for the system to restore write capability when the primary fails.
For critical transaction systems where availability is paramount, the shortest possible RTO is typically required, such as under one minute.
However, shorter RTO comes at a cost: increased false failover risk. Network jitter may be misinterpreted as a failure, leading to unnecessary failovers. For cross-datacenter/cross-region deployments, RTO requirements are typically relaxed (e.g., 1-2 minutes) to reduce false failover risk.
Trade-offs
The upper limit of unavailability during failover is controlled by the pg_rto parameter. Pigsty provides four preset RTO modes:
fast, norm, safe, wide, each optimized for different network conditions and deployment scenarios. The default is norm mode (~45 seconds).
When the primary fails, the entire recovery process involves multiple phases: Patroni detects the failure, DCS lock expires, new primary election, promote execution, HAProxy detects the new primary. Reducing RTO means shortening the timeout for each phase, which makes the cluster more sensitive to network jitter, thereby increasing false failover risk.
You need to choose the appropriate mode based on actual network conditions, balancing recovery speed and false failover risk. The worse the network quality, the more conservative mode you should choose; the better the network quality, the more aggressive mode you can choose.
flowchart LR
A([Primary Failure]) --> B{Patroni<br/>Detected?}
B -->|PG Crash| C[Attempt Local Restart]
B -->|Node Down| D[Wait TTL Expiration]
C -->|Success| E([Local Recovery])
C -->|Fail/Timeout| F[Release Leader Lock]
D --> F
F --> G[Replica Election]
G --> H[Execute Promote]
H --> I[HAProxy Detects]
I --> J([Service Restored])
style A fill:#dc3545,stroke:#b02a37,color:#fff
style E fill:#198754,stroke:#146c43,color:#fff
style J fill:#198754,stroke:#146c43,color:#fffFour Modes
Pigsty provides four RTO modes to help users make trade-offs under different network conditions.
| Name | fast | norm | safe | wide |
|---|---|---|---|---|
| Use Case | Same rack | Same datacenter (default) | Same region, cross-DC | Cross-region/continent |
| Network | < 1ms, very stable | 1-5ms, normal | 10-50ms, cross-DC | 100-200ms, public network |
| Target RTO | 30s | 45s | 90s | 150s |
| False Failover Risk | Higher | Medium | Lower | Very Low |
| Configuration | pg_rto: fast | pg_rto: norm | pg_rto: safe | pg_rto: wide |
- Suitable for scenarios with extremely low network latency (< 1ms) and very stable networks, such as same-rack or same-switch deployments
- Average RTO: 14s, worst case: 29s, TTL only 20s, check interval 5s
- Highest network quality requirements, any jitter may trigger failover, higher false failover risk
- Default mode, suitable for same-datacenter deployment, network latency 1-5ms, normal quality, reasonable packet loss rate
- Average RTO: 21s, worst case: 43s, TTL is 30s, provides reasonable tolerance window
- Balances recovery speed and stability, suitable for most production environments
- Suitable for same-region/same-area cross-datacenter deployment, network latency 10-50ms, occasional jitter possible
- Average RTO: 43s, worst case: 91s, TTL is 60s, longer tolerance window
- Primary restart wait time is longer (60s), gives more local recovery opportunities, lower false failover risk
- Suitable for cross-region or even cross-continent deployment, network latency 100-200ms, possible public-network-level packet loss
- Average RTO: 92s, worst case: 207s, TTL is 120s, very wide tolerance window
- Sacrifices recovery speed for extremely low false failover rate, suitable for geo-disaster recovery scenarios
RTO Timeline
Patroni / PG HA has two key failure paths: active failure detection (Patroni detects a PG crash and attempts restart) and passive lease expiration (node down waits for TTL expiration to trigger election).
tooltip: { trigger: axis, axisPointer: { type: shadow }, formatter: $fn:fmt }
legend: { top: 0, itemGap: 10, data: [Lease Expiration, Failure Detection, Restart Timeout, Replica Detection, Lock & Promote, Health Check] }
grid: { left: 110, right: 24, bottom: 32, top: 40 }
xAxis: { type: value, name: Seconds, nameLocation: end, max: 160, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: true, lineStyle: { type: dashed, opacity: 0.5 } }, minorTick: { show: true, splitNumber: 5 }, minorSplitLine: { show: true, lineStyle: { type: dotted, opacity: 0.2 } } }
yAxis: { type: category, axisLine: { show: true }, axisTick: { show: true }, splitLine: { show: false }, axisLabel: { fontSize: 9, fontFamily: monospace }, data: [wide-passive-max, wide-passive-avg, wide-passive-min, wide-active-max, wide-active-avg, wide-active-min, "", safe-passive-max, safe-passive-avg, safe-passive-min, safe-active-max, safe-active-avg, safe-active-min, "", norm-passive-max, norm-passive-avg, norm-passive-min, norm-active-max, norm-active-avg, norm-active-min, "", fast-passive-max, fast-passive-avg, fast-passive-min, fast-active-max, fast-active-avg, fast-active-min] }
series:
- { name: Lease Expiration, type: bar, stack: main, barWidth: 16, z: 2, emphasis: { focus: series }, itemStyle: { color: "#e15759" }, data: [120, 110, 100, "-", "-", "-", "-", 60, 55, 50, "-", "-", "-", "-", 30, 27, 25, "-", "-", "-", "-", 20, 17, 15, "-", "-", "-"] }
- { name: Failure Detection, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#b07aa1" }, data: ["-", "-", "-", 20, 10, 0, "-", "-", "-", "-", 10, 5, 0, "-", "-", "-", "-", 5, 3, 0, "-", "-", "-", "-", 5, 3, 0] }
- { name: Restart Timeout, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#f28e2c" }, data: ["-", "-", "-", 95, 95, 0, "-", "-", "-", "-", 45, 45, 0, "-", "-", "-", "-", 25, 25, 0, "-", "-", "-", "-", 15, 15, 0] }
- { name: Replica Detection, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#edc949" }, data: [20, 10, 0, 20, 10, 0, "-", 10, 5, 0, 10, 5, 0, "-", 5, 3, 0, 5, 3, 0, "-", 5, 3, 0, 5, 3, 0] }
- { name: Lock & Promote, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#59a14f" }, data: [2, 1, 0, 2, 1, 0, "-", 2, 1, 0, 2, 1, 0, "-", 2, 1, 0, 2, 1, 0, "-", 2, 1, 0, 2, 1, 0] }
- { name: Health Check, type: bar, stack: main, z: 2, emphasis: { focus: series }, itemStyle: { color: "#4e79a7" }, data: [8, 6, 4, 8, 6, 4, "-", 6, 5, 3, 6, 5, 3, "-", 4, 3, 2, 4, 3, 2, "-", 2, 2, 1, 2, 2, 1] }
- { name: RTO Total, type: bar, barGap: "-100%", barWidth: 16, z: 1, itemStyle: { color: "#888", opacity: 0 }, emphasis: { itemStyle: { opacity: 0 } }, data: [150, 127, 104, 145, 122, 4, "-", 78, 66, 53, 73, 61, 3, "-", 41, 34, 27, 41, 35, 2, "-", 29, 23, 16, 29, 24, 1] }
- { name: RTO Budget, type: bar, barGap: "-100%", barWidth: 16, z: 0, itemStyle: { color: "rgba(0,0,0,0.08)" }, emphasis: { itemStyle: { color: "rgba(0,0,0,0.12)" } }, data: [150, 150, 150, 150, 150, 150, "-", 90, 90, 90, 90, 90, 90, "-", 45, 45, 45, 45, 45, 45, "-", 30, 30, 30, 30, 30, 30] }Implementation
The four RTO modes differ in how the following 10 Patroni and HAProxy HA-related parameters are configured.
| Component | Parameter | fast | norm | safe | wide | Description |
|---|---|---|---|---|---|---|
patroni | ttl | 20 | 30 | 60 | 120 | Leader lock TTL (seconds) |
loop_wait | 5 | 5 | 10 | 20 | HA loop check interval (seconds) | |
retry_timeout | 5 | 10 | 20 | 30 | DCS operation retry timeout (seconds) | |
primary_start_timeout | 15 | 25 | 45 | 95 | Primary restart wait time (seconds) | |
safety_margin | 5 | 5 | 10 | 15 | Watchdog safety margin (seconds) | |
haproxy | inter | 1s | 2s | 3s | 4s | Normal state check interval |
fastinter | 0.5s | 1s | 1.5s | 2s | State transition check interval | |
downinter | 1s | 2s | 3s | 4s | DOWN state check interval | |
rise | 3 | 3 | 3 | 3 | Consecutive successes to mark UP | |
fall | 3 | 3 | 3 | 3 | Consecutive failures to mark DOWN |
Patroni Parameters
ttl: Leader lock TTL. Primary must renew within this time, otherwise lock expires and triggers election. Directly determines passive failure detection delay.loop_wait: Patroni main loop interval. Each loop performs one health check and state sync, affects failure discovery timeliness.retry_timeout: DCS operation retry timeout. During network partition, Patroni retries continuously within this period; after timeout, primary actively demotes to prevent split-brain.primary_start_timeout: Wait time for Patroni to attempt local restart after PG crash. After timeout, releases Leader lock and triggers failover.safety_margin: Watchdog safety margin. Ensures sufficient time to trigger system restart during failures, avoiding split-brain.
HAProxy Parameters
inter: Health check interval in normal state, used when service status is stable.fastinter: Check interval during state transition, uses shorter interval to accelerate confirmation when state change detected.downinter: Check interval in DOWN state, uses this interval to probe recovery after service marked DOWN.rise: Consecutive successes required to mark UP. After new primary comes online, must passriseconsecutive checks before receiving traffic.fall: Consecutive failures required to mark DOWN. Service must failfallconsecutive times before being marked DOWN.
Key Constraint
Patroni core constraint: Ensures primary can complete demotion before TTL expires, preventing split-brain.
Data Summary
Recommendations
fast mode is suitable for scenarios with extremely high RTO requirements, but requires sufficiently good network quality (latency < 1ms, very low packet loss). Recommended only for same-rack or same-switch deployments, and should be thoroughly tested in production before enabling.
norm mode (default) is Pigsty’s default configuration, sufficient for the vast majority of same-datacenter deployments. In the model used by this page, the passive and active paths average about 34 and 35 seconds, while still providing a reasonable tolerance window against false failovers caused by network jitter.
safe mode is suitable for same-city cross-datacenter deployments with higher network latency or occasional jitter. The longer tolerance window effectively prevents false failovers from network jitter, making it the recommended configuration for cross-datacenter disaster recovery.
wide mode is suitable for cross-region or even cross-continent deployments with high network latency and possible public-network-level packet loss. In such scenarios, stability is more important than recovery speed, so an extremely wide tolerance window ensures very low false failover rate.
| Mode | Target RTO | Passive RTO | Active RTO | Scenario |
|---|---|---|---|---|
fast | 30 | 16 / 23 / 29 | 1 / 24 / 29 | Same switch, high-quality network |
norm | 45 | 27 / 34 / 41 | 2 / 35 / 41 | Default, same DC, standard network |
safe | 90 | 53 / 66 / 78 | 3 / 61 / 73 | Same-city active-active / cross-DC DR |
wide | 150 | 104 / 127 / 150 | 4 / 122 / 145 | Geo-DR / cross-country |
default | 326 | 22 / 34 / 46 | 2 / 314 / 326 | Patroni default params |
Typically you only need to set pg_rto to the mode name, and Pigsty will automatically configure Patroni and HAProxy parameters.
The current template looks up pg_rto with pg_rto in pg_rto_plan; a numeric or unknown key falls back directly to norm. Do not treat that fallback as a supported “RTO in seconds” configuration.
The mode configuration actually loads the corresponding parameter set from pg_rto_plan. You can modify or override this configuration to implement custom RTO strategies.
3.4.4 - Service Access
Split read and write operations, route traffic correctly, and deliver PostgreSQL cluster capabilities reliably.
Service is an abstraction: it represents the form in which database clusters expose their capabilities externally, encapsulating underlying cluster details.
Services are crucial for stable access in production environments, showing their value during automatic failover in high availability clusters. Personal users typically don’t need to worry about this concept.
Personal Users
The concept of “service” is for production environments. Personal users with single-node clusters can skip the complexity and directly use instance names or IP addresses to access the database.
For example, Pigsty’s default single-node pg-meta.meta database can be connected directly using three different users:
Service Overview
In real-world production environments, we use primary-replica database clusters based on replication. Within a cluster, one and only one instance serves as the leader (primary) that can accept writes. Other instances (replicas) continuously fetch change logs from the cluster leader to stay synchronized. Replicas can also handle read-only requests, significantly offloading the primary in read-heavy, write-light scenarios. Therefore, distinguishing write requests from read-only requests is a common practice.
Additionally, for production environments with high-frequency, short-lived connections, we pool requests through connection pool middleware (Pgbouncer) to reduce connection and backend process creation overhead. However, for scenarios like ETL and change execution, we need to bypass the connection pool and directly access the database. Meanwhile, high-availability clusters may undergo failover during failures, causing cluster leadership changes. Therefore, high-availability database solutions require write traffic to automatically adapt to cluster leadership changes. These varying access needs (read-write separation, pooled vs. direct connections, failover auto-adaptation) ultimately lead to the abstraction of the Service concept.
Typically, database clusters must provide this most basic service:
- Read-write service (primary): Can read from and write to the database
For production database clusters, at least these two services should be provided:
- Read-write service (primary): Write data: Can only be served by the primary.
- Read-only service (replica): Read data: Can be served by replicas; falls back to primary when no replicas are available
Additionally, depending on specific business scenarios, there may be other services, such as:
- Default direct service (default): Allows (admin) users to bypass the connection pool and directly access the database
- Offline replica service (offline): Dedicated replica not serving online read traffic, used for ETL and analytical queries
- Sync replica service (standby): Read-only service with no replication delay, handled by synchronous standby/primary for read queries
- Delayed replica service (delayed): Access data from the same cluster as it was some time ago, handled by delayed replicas
Access Services
Pigsty’s service delivery boundary stops at the cluster’s HAProxy. Users can access these load balancers through various means.
The typical approach is to use DNS or VIP access, binding them to all or any number of load balancers in the cluster.

You can use different host & port combinations, which provide PostgreSQL service in different ways.
Host
| Type | Sample | Description |
|---|---|---|
| Cluster Domain Name | pg-test | Resolved by dnsmasq on INFRA nodes; with pg_dns_target: auto, points to the VIP when enabled, otherwise to the primary IP |
| Cluster VIP Address | 10.10.10.3 | When pg_vip_enabled is enabled, an L2 VIP managed by vip-manager and bound to the primary node |
| Instance Hostname | pg-test-1 | Access via any instance hostname (resolved by dnsmasq @ infra nodes) |
| Instance IP Address | 10.10.10.11 | Access any instance’s IP address |
Port
Pigsty uses different ports to distinguish pg services
| Port | Service | Type | Description |
|---|---|---|---|
| 5432 | postgres | Database | Direct access to postgres server |
| 6432 | pgbouncer | Middleware | Access postgres through connection pool middleware |
| 5433 | primary | Service | Access primary pgbouncer (or postgres) |
| 5434 | replica | Service | Access replica pgbouncer (or postgres) |
| 5436 | default | Service | Access primary postgres |
| 5438 | offline | Service | Access offline postgres |
Combinations
3.5 - Point-in-Time Recovery — A Time Machine for PostgreSQL
If data, a table, or even a database is deleted accidentally, Point-in-Time Recovery (PITR) can return the cluster to an earlier state.
This capability, once treated as specialist DBA work, is enabled by Pigsty’s standard PostgreSQL configuration.
Replication Is Not Backup
High availability can fail over to another instance when hardware fails. It has a natural blind spot, however: replication is not backup.
Streaming replication faithfully sends every primary change to every replica within milliseconds, including a DELETE without a WHERE clause or a DROP TABLE issued against the wrong database. Failover handles a broken machine; when the data itself is wrong, every replica can contain the same error.
Database disasters therefore fall into two broad classes. Redundancy handles physical service failure through multiple copies and automatic failover. Logical errors require history: a base backup plus continuous WAL archives from which PostgreSQL can reconstruct a state before the mistake.
| Threat | High Availability | Delayed Cluster | PITR |
|---|---|---|---|
| Hardware or instance failure | ✔ Automatic failover | ✘ | ✔, with a longer RTO |
| Accidental DML, table drop, or database drop | ✘ The error is replicated | ✔ Within the delay | ✔ At any recoverable point |
| Defective software corrupts data over time | ✘ The error is replicated | ✔ Within the delay | ✔ Try different recovery targets |
| Entire cluster or site is lost | ✘ | ✘ | ✔ Only if the repository survives that failure domain |
These mechanisms complement one another: HA restores service quickly, a delayed cluster provides a short undo window, and PITR is the final historical recovery path.
How the Time Machine Works
A database can be viewed as a state machine. A base backup is a complete physical snapshot at one point, while WAL (Write-Ahead Log) records every subsequent state change. With a snapshot and an unbroken WAL history starting from it, PostgreSQL can replay the database to any target covered by that history. The backup determines how far back recovery can start; the latest archived WAL determines how close to the present it can reach.
Base backup + WAL archive = point-in-time recovery
Pigsty orchestrates both inputs. Cluster initialization attempts an initial full backup by default, and the primary continuously sends completed WAL segments to the selected repository. See How PITR Works for the complete model of backups, archives, targets, and timelines.
Available Out of the Box
PITR is enabled in Pigsty’s standard PostgreSQL configuration. Each cluster is prepared with a backup repository, WAL archiving, and recovery tooling powered by pgBackRest. The policy remains declarative and can be customized with a few parameters:
The default local method stores backups under /pg/backup and retains two full backups. With one successful full backup per day, the resulting window is roughly 24–48 hours. Selecting the remote minio preset places the repository in Silo or compatible S3 storage, enables AES-256-CBC repository encryption, and uses time-based retention. With a 14-day retention setting and weekly full backups, the steady-state recovery window is roughly 14–21 days. Treat both ranges as policy estimates: actual coverage starts at the oldest usable backup and ends at the latest WAL that reached the repository.
Recovery is declarative too: specify a target, then let the playbook stop the cluster, restore files, replay WAL, and rebuild HA. An operator must still verify the recovered business state.
This follows Pigsty’s declarative configuration model: backup policy is part of the cluster definition, and a recovery target is another declared parameter.
Benefits and Costs
PITR materially improves data integrity and availability:
- RPO (maximum data loss) is usually reduced to minutes, bounded by WAL that had not reached a surviving repository.
- RTO (time to restore service) becomes tens of minutes to hours rather than permanent loss, depending on backup size, WAL replay distance, and disk or network throughput.
| Standalone strategy | Event | RTO | RPO |
|---|---|---|---|
| No backup | Host and local data are lost | Permanent loss | All data |
| Base backups only | Host and local data are lost | Backup size and bandwidth, often hours | Changes since the latest backup |
| Base backups + WAL archives | Host and local data are lost | Backup size, replay distance, and bandwidth | WAL not yet present in the surviving repository |
The costs fall mainly into three areas:
- Confidentiality: backups are another copy of business data and need encryption and access control. Pigsty’s remote preset enables repository encryption, but its default password must be changed.
- Resources: backups consume storage and archiving consumes bandwidth. Compression, bundling, and block incremental backup reduce this cost but do not eliminate capacity planning.
- Operations: backup status must be monitored and recovery must be rehearsed. A green backup job alone is not proof that the data can be restored within the required RTO.
PITR by itself does not replace HA. A production design normally combines HA for physical failures with PITR for logical errors and site-level recovery.
Next Steps
- How PITR Works: snapshots, WAL history, recovery windows, targets, and timelines
- PITR Architecture: pgBackRest, repository selection, archive flow, scheduling, and failover behavior
- PITR Tradeoffs: failure domains, capacity, retention, and backup frequency
- Declarative Recovery: the
pg_pitrparameter,pgsql-pitr.yml, andpig pitr - PITR Scenarios: accidental deletion, bad releases, investigation, and site loss
For the operational runbooks, see PGSQL Backup and Recovery.
3.5.1 - How PITR Works
If a database is a state machine, WAL (Write-Ahead Log) is its ordered change history. PostgreSQL records each modification in WAL before applying it to data files. Save a physical snapshot at one point, preserve all later WAL, and PostgreSQL can replay that history to a selected consistent state.
PITR is therefore the combination of three simple elements: a snapshot (base backup), history (WAL archive), and a target (where replay should stop).
Snapshot: Base Backup
A base backup is a physical snapshot of the whole PostgreSQL cluster and supplies a starting point for recovery. Pigsty uses pgBackRest to create and manage three backup types:
| Type | Contents | Recovery characteristics |
|---|---|---|
| Full | All database-cluster files | Self-contained, shortest chain, largest backup |
| Differential | Changes since the latest full backup | Restore uses the full plus the differential |
| Incremental | Changes since the latest backup of any type | Smallest backup, restore depends on its complete chain |
The wrapper pg-backup [full|diff|incr] triggers a backup. With no argument it requests incr; pgBackRest creates a full backup instead when no valid full exists. pg_crontab declares recurring jobs and installs them in the postgres user’s crontab.
Backup frequency affects recovery time: the newer the usable backup, the less WAL must be replayed to reach a given target. See PITR Tradeoffs.
WAL History
A snapshot reaches only its own state. WAL archiving preserves every later change needed to advance beyond it. Pigsty’s standard Patroni templates enable archiving and ask PostgreSQL to hand each completed WAL segment to pgBackRest:
Two implementation details matter:
archive_timeout: 300: on a low-write cluster, PostgreSQL can force a segment switch after five minutes so a partially filled segment does not wait indefinitely. This normally keeps the right edge of the recovery window within minutes when WAL is being generated; it is not a promise that every commit is already remote.- Asynchronous archive: pgBackRest uses
/pg/spoolwitharchive-async=yto batch transfers. Pigsty setsarchive-push-queue-max=4GiB; if repository failure lets the queue cross that bound, pgBackRest can drop the queued WAL to protect local disk. That creates an archive gap, so a new full backup is required to establish a fresh recoverable chain.
Expiration is automatic. When old backups expire under the repository policy, pgBackRest also expires archived WAL that no remaining backup needs, unless archive retention is overridden explicitly.
Recovery Window
The backup and its continuous WAL history form a recovery window:
- Left boundary: the start of the oldest usable remaining backup chain. In practical time-based descriptions, this is usually summarized by the oldest retained full backup’s time.
- Right boundary: the latest WAL successfully archived to a repository that survives the incident.
The window moves forward as new backups arrive and old chains expire. Pigsty’s local preset keeps two full backups; with one successful full per day, coverage is roughly one to two days. The minio preset uses retention_full_type: time with retention_full: 14; with weekly full backups, the oldest retained chain normally yields roughly 14–21 days of steady-state coverage. These are estimates, not SLAs: missed backups, archive gaps, explicit archive-retention overrides, or repository loss change the actual window. Verify it with pig pb info and restore drills.
See PITR Tradeoffs and Backup Policy.
Targets: Where Replay Stops
PostgreSQL supports several ways to locate a state inside the recovery window. Pigsty exposes six target types through pg_pitr:
pg_pitr type | Meaning | Typical use |
|---|---|---|
default | Replay through all WAL available from the repository | Restore the newest archived state after total loss |
time | Stop at a timestamp | Recover from accidental DML or DDL |
xid | Stop at a transaction ID | Exclude a precisely identified bad transaction |
lsn | Stop at a WAL location | Low-level exact targeting |
name | Stop at a restore point created with pg_create_restore_point() | Planned change checkpoint |
immediate | Stop as soon as the selected backup becomes consistent | Validate or expose the selected backup state quickly |
The set field is different: it chooses which backup set pgBackRest restores as the starting snapshot; it is not itself a replay stop target.
Boundary Semantics
Targets are inclusive by default: the transaction at the target is retained. To stop immediately before a known bad target, set exclusive: true, which maps to recovery_target_inclusive = false.
Transactions remain atomic. Committed transactions before the effective target survive; transactions not committed at that point are rolled back. Recovery produces a consistent database state rather than half of a transaction.
Timelines
Restoring to the past and accepting new writes creates a fork in history. PostgreSQL uses a timeline to distinguish each branch. PITR promotion, replica promotion, and failover can all create a new timeline; new WAL does not overwrite the old timeline’s files.
gitGraph
commit id: "Full backup"
commit id: "Normal writes"
commit id: "Bad change"
commit id: "More writes"
branch Timeline-2
checkout Timeline-2
commit id: "PITR before bad change"
commit id: "New writes"Keeping the old history allows another attempt if the first target was wrong. The timeline field can select a timeline; Pigsty’s recovery declaration defaults to latest.
Continue with PITR Architecture to see how these concepts map to Pigsty components and configuration.
3.5.2 - PITR Architecture
The PITR principle is compact; the engineering is not. WAL archiving must not stall production writes, object-storage backups need encryption, backup jobs must follow the primary after failover, shared repositories must isolate clusters, and large numbers of small objects can limit throughput.
Pigsty uses pgBackRest as its backup engine and ships production-oriented defaults for those concerns. This page describes the engine, repository abstraction, archive path, scheduler, and primary-aware execution model.
Backup Engine: pgBackRest
Pigsty uses pgBackRest for three responsibilities: create base backups with backup, receive WAL with archive-push, and restore data with restore plus archive-get.
Relevant capabilities include:
- Parallelism: backup, archive, and restore operations can use multiple processes.
- Backup chains: full, differential, incremental, and block incremental backups reduce repeated transfer and storage.
- Compression and encryption: zstd compression and AES-256-CBC repository encryption are built in.
- Repository backends: POSIX filesystems, S3-compatible services such as Silo and MinIO, Azure, GCS, and SFTP are supported by pgBackRest.
- Bundling: small files can be packed into larger repository objects, reducing object-storage overhead.
pgBackRest separates cluster histories using a stanza. Pigsty maps the stanza name directly to pg_cluster, allowing multiple clusters to share one storage service without sharing a backup identity:
Repository Abstraction
Two parameters define repository selection. pgbackrest_method chooses one repository name, and pgbackrest_repo is a dictionary of candidate definitions. Pigsty v4.5.0 renders only the selected pgbackrest_repo[pgbackrest_method] entry as pgBackRest repo1; listing both local and minio does not enable two active repositories.
The presets intentionally differ. local favors simplicity and fast local restore; it is unencrypted, unbundled, and retained by full-backup count. minio targets a remote Silo or compatible S3 repository, enabling encryption, bundles, block incremental backup, and time-based retention.
Rendering is mechanical: underscores in the chosen repository’s keys become hyphens and each key gets a repo1- prefix in /etc/pgbackrest/pgbackrest.conf. A custom cloud repository can therefore use pgBackRest options directly:
See Backup Repository for Silo, external S3-compatible storage, versioning, object locking, TLS, and credential details.
Archiving and Scheduling
When pgbackrest_enabled is true, as it is by default, the Patroni templates configure:
Base backups enter the system in two ways:
- Initial backup: after bootstrapping a top-level primary, Pigsty attempts a backup when
pgbackrest_init_backupis true. The task ignores backup failure and writes/etc/pgbackrest/initial.doneonly after success, so the marker means “completed,” not merely “attempted.” - Scheduled backup:
pg_crontabinstalls jobs in the database superuser’s crontab. Its role default is an empty list; standard example configurations usually add a daily 01:00 full backup.
pg-backup [full|diff|incr] is a small wrapper around pgbackrest backup. With no argument it requests an incremental backup, which pgBackRest promotes to a full backup if no usable full exists.
Backups Follow the Primary
pgBackRest and the same scheduled job are installed on every PostgreSQL node, but pg-backup checks /pg/bin/pg-role and only proceeds on the current primary. Replicas fail fast rather than writing a competing backup.
That design decouples the backup schedule from the HA topology:
- all members receive the same repository configuration and crontab;
- after failover, the new primary becomes eligible for subsequent backups and WAL archiving without rewriting the schedule;
- one current primary owns the authoritative write flow to a stanza.
With a non-local repository, Pigsty also adds pgBackRest after basebackup in Patroni’s create_replica_methods. Patroni tries basebackup first; if that method fails, it can restore a replica from the repository with pgbackrest --delta restore, shifting the copy load away from the primary.
Performance Defaults
The shipped pgBackRest template favors light production overhead and aggressive restore throughput:
| Setting | v4.5.0 behavior | Rationale |
|---|---|---|
| Compression | compress-type=zst | Balance compression ratio and throughput |
| Backup/archive workers | One quarter of CPU, clamped to 2–4 | Limit competition with the database |
| Restore workers | All detected CPU, capped at 8 | Minimize restore time |
| Asynchronous archive | archive-async=y, spool under /pg/spool | Batch transfer without synchronous object-store latency |
| Archive queue limit | archive-push-queue-max=4GiB | Bound local spool growth |
| Fast backup start | start-fast=y | Request an immediate checkpoint |
| Incremental restore | delta=y | Reuse destination files that already match |
The 4 GiB queue is a safety tradeoff: if the repository remains unavailable and the queue exceeds the limit, pgBackRest can discard queued archive files. PostgreSQL continues running, but the WAL archive becomes incomplete and a new full backup is needed to establish a new recovery chain. See How PITR Works.
Observability
When both backup and exporter settings are enabled, pgbackrest_exporter runs on each PostgreSQL node and exposes metrics on port 9854. The monitoring stack uses those metrics for backup age, type, size, duration, and error visibility.
Useful diagnostic entry points include:
| Entry | Purpose |
|---|---|
pb info | Shell helper for pgbackrest info using the configured stanza |
/pg/log/pgbackrest/ | pgBackRest backup, archive, and restore logs |
pg-backup | Manually request a backup on the primary: full / diff / incr |
See Backup Administration for operational checks, then PITR Tradeoffs for policy design.
3.5.3 - PITR Tradeoffs
A backup is an insurance policy. Its premium is storage, network traffic, and operational work; its benefit is how much data can be recovered and how quickly service can return. There is no universal free policy: more history normally needs more capacity, while a shorter RTO normally needs newer backups and tested procedures.
Designing a policy means answering three questions: where is the repository, how long is history retained, and how often are backups taken?
Where: Choose the Failure Domain
Repository location is the most important decision because it defines which disasters the backup survives.
A local repository (pgbackrest_method: local) stores backups on the primary’s local filesystem. It is simple, fast, and has no remote service dependency. But data and backup normally share one host failure domain: loss of the machine, disk, or filesystem can destroy both. Local backup protects well against logical errors, but not total host loss unless /pg/backup is deliberately placed on independent storage.
An object-storage repository (pgbackrest_method: minio or a custom S3 definition) sends backups to Silo or S3. It becomes an independent disaster-recovery copy only when deployed outside the database host or site failure domain. Pigsty’s minio preset also enables AES-256-CBC repository encryption, bundling, and block incremental backup. Recovery throughput then depends on the network and storage service, and that service adds operational responsibility.
| Scenario | Recommended repository | Reason |
|---|---|---|
| Development, test, demo | local | Minimal dependencies; rebuild is acceptable |
| Production | Dedicated Silo or compatible S3 storage | Independent failure domain and encrypted repository |
| Cloud deployment | Managed S3-compatible or cloud object storage supported by pgBackRest | Independent storage and lower operational burden |
| Ransomware/compliance | Versioned storage plus correctly configured object lock/retention | Prevent privileged database-host access from deleting protected versions |
The backup repository is itself sensitive business data. Change the default access keys and cipher_pass, restrict access, protect credentials separately from the database hosts, and verify any object-lock policy. See Backup Repository.
How Long: Capacity and Recovery Window
Longer retained history generally consumes more storage, but compression, deduplication, block incremental backup, database change rate, and the mix of full/differential/incremental backups determine the actual amount. Measure real backup and WAL growth instead of relying on a fixed multiplier.
For an illustrative 100 GB database changing by 10 GB per day, before compression:
- Daily full, retain two (
localpreset policy): about 200 GB of full backups plus WAL, commonly giving roughly a one-to-two-day window when every job succeeds. - Weekly full, daily incremental, retain full history by 14 days (
miniopreset policy): the oldest surviving weekly chain commonly produces roughly 14–21 days of coverage. Capacity must include multiple full backups, their incrementals, archived WAL, and transient retention-plus-one behavior during expiration.
The precise window is not the configuration number alone. It runs from the oldest usable backup chain to the newest WAL present in the surviving repository. pgBackRest’s time retention removes an old full only when another qualifying full can satisfy the period, and related incrementals and WAL follow the retained full chains. Check pig pb info, monitor archive health, and prove coverage with a restore.
Choose a window long enough to cover the delay between an error occurring and being detected. A dropped table may be noticed in minutes; slow corruption or a month-end reconciliation failure can take weeks to surface.
How Often: Backup Frequency and RTO
Restore time has two main components: restore a backup chain, then replay WAL to the target. Backup size and storage throughput shape the first; the distance between the chosen backup and target shapes the second.
WAL replay is largely serial. On a write-heavy database, restoring from a weekly full immediately before the next full can require nearly a week of replay. Daily incremental backups reduce that replay distance while transferring only changes since the previous backup. They still depend on a valid chain, so monitor and test the entire chain rather than only the newest file.
A useful rule is: within the available backup window and production load budget, take backups often enough that measured restore time meets the RTO.
Pigsty Presets
Pigsty provides two candidate repository definitions, but pgbackrest_method selects one for the generated repo1 configuration.
Standard policy: local repository and daily full backup. It is simple and restores through local I/O, making it suitable for development or environments where host-level disaster recovery is provided separately:
Production policy: remote Silo/S3 repository, weekly full, daily incremental. It separates the repository failure domain and uses the encrypted minio preset:
Keeping both local and minio in pgbackrest_repo is not a dual-repository setup. They are alternative definitions, and the template renders only pgbackrest_repo[pgbackrest_method] as repo1. A genuine multi-repository pgBackRest design requires explicit advanced configuration plus an independently tested backup, expiration, and restore workflow; the two presets alone do not provide it.
Use Backup Policy for capacity modelling and schedule details.
A Backup Is Proven by Restore
Monitoring a successful backup job is necessary but insufficient. Add clone restore drills to routine operations so you can answer:
- Is the chain usable? Restore it end to end and validate data.
- What is the measured RTO? Database size and WAL volume change over time.
- Can the on-call operator execute the runbook? The first full exercise should not happen during an incident.
A clone recovery leaves the source cluster online but overwrites the designated destination cluster, so verify the exact target and use disposable infrastructure. See Declarative Recovery for the recovery interface.
3.5.4 - Declarative Recovery
The value of a backup system is realized at restore time, often during an incident when every minute matters. A traditional PITR procedure requires a long sequence of coupled manual steps: pause HA, stop PostgreSQL, prepare recovery settings, restore the backup, replay WAL, validate the target, rebuild metadata, and start the cluster again.
Pigsty applies the same approach used by declarative configuration to recovery: declare the recovery target, then let the orchestration tools stop the cluster, restore the data, replay WAL, and return control to the operator.
Declare a Recovery Target
Describe the target with the pg_pitr parameter and execute it with pgsql-pitr.yml.
The most common form restores a cluster to a specific time:
The six recovery target types and the rest of the recovery behavior are expressed through fields in this parameter:
See Restore Operations for the complete field reference and examples.
What the Playbook Does
pgsql-pitr.yml turns the manual recovery workflow into six stages and supports Ansible tags for staged execution:
| Stage | Action |
|---|---|
| Print the source cluster, target, and restore command; this stage reports the plan and does not prompt for confirmation | |
| pause | Run patronictl pause so Patroni does not intervene during maintenance |
| stop | Stop Patroni and PostgreSQL on replicas, then on the primary |
| pitr | Render recovery settings, run an incremental pgBackRest restore, start PostgreSQL to replay WAL, wait for consistency, and print control data |
| etcd | Remove stale cluster metadata from etcd so old and new timelines are not mixed |
| start | Start Patroni again, resume HA management, and rebuild replicas |
Several details are important:
- Incremental restore: pgBackRest uses
delta, so it rewrites only files that differ from the backup. For large databases, this can reduce RTO substantially. - Verification, not assumption: the playbook prints checkpoint LSN, timeline, and NextXID data from
pg_controldata; an operator must still verify that the recovered business state is correct. - Rollback copy: with
backup: true, the original data directory is moved to/pg/data-backupbefore recovery. A later run withbackup: trueremoves an existing/pg/data-backup, so this is not a versioned snapshot store. - Staged execution: run
-t down,-t pitr, and-t upseparately when you want an operator checkpoint between phases. Completion of thepitrphase means PostgreSQL reached a consistent recovery state; for a time, XID, LSN, or named target, also confirm WAL replay reached that target.
The action field controls what happens at the target: promote opens a new timeline, pause waits at the target for inspection, and shutdown stops PostgreSQL there.
A targeted recovery defaults to pause when action is omitted. To preserve a manual gate for pause or shutdown, run the stages separately; a one-shot recovery should choose promote explicitly.
The playbook performs the mechanical workflow, but it cannot decide whether the recovered data is correct.
Command-Line Recovery with pig
The pig CLI provides single-instance PITR orchestration directly on a database node, without requiring the management node or an Ansible environment:
pig pitr validates the target, stanza, and available backups; stops Patroni and PostgreSQL; performs the restore; optionally starts PostgreSQL; and prints post-recovery instructions.
For a Patroni-managed data directory, Patroni remains stopped afterward. Validate the data, then use pig pt start to return the instance to HA management.
This single-node workflow does not clear etcd, rebuild replicas, or automatically rejoin the cluster, and it refuses destructive forced shutdown unless --force-stop is supplied explicitly.
The lower-level pig pb commands wrap pgBackRest: pb info lists backups, pb backup creates a backup, and pb restore performs a raw restore.
There is a deliberate safety boundary: pig pb restore refuses to run while Patroni still manages the instance, because Patroni could restart PostgreSQL during the restore.
Use pig pitr or pgsql-pitr.yml for Patroni-managed instances.
In-Place and Clone Recovery
The same mechanism supports two different workflows:
| Dimension | In-place recovery | Clone recovery |
|---|---|---|
| Method | Roll the production cluster back | Restore a source backup into a different cluster |
| Downtime | Required during recovery | The source production cluster remains online |
| Effect | Discards all writes after the target | Does not affect the source; the destination is overwritten and can be retried |
| Best for | Whole-cluster corruption or disaster recovery | Recovering deleted objects, audit work, and recovery drills |
For a clone recovery, the cluster field names the source backup stanza.
This example restores the historical state of pg-meta into pg-test without stopping the source cluster:
Exporting an accidentally deleted table from the clone and importing it into production is generally safer than rolling the entire production cluster back. See Clone a Database Cluster for the complete workflow and cleanup steps.
After Recovery
Recovery completion is not the end of the incident. Include these steps in the closeout checklist:
- New timeline, new backup: after promotion, create a full backup with
pg-backup fullso a recoverable window exists on the new timeline. - Archiving state: if an exploratory restore used
archive: false, restore normal archiving as described in Post-Recovery. - Clone cleanup: a clone’s cluster identity and source backup stanza do not match. Recreate the destination stanza before enabling its own backups; see Clone a Database Cluster.
The tools execute the procedure; operators still decide the target, whether to restore in place or into a clone, and whether the recovered data is correct. Continue with PITR Scenarios for that decision framework.
3.5.5 - PITR Scenarios
During an incident, the most expensive resource is often decision time. Pigsty can orchestrate the mechanical recovery steps, but an operator must still answer three questions: what is the target, should recovery be in place or into a clone, and how will the result be validated?
Read and rehearse this framework before an incident.
Decision Framework
| Scenario | Typical problem | Recommended workflow | Target |
|---|---|---|---|
| Accidental DML | DELETE or UPDATE affects the wrong rows | Clone, validate, then copy back data | time / xid |
| Dropped table, schema, or database | DROP or an incorrect migration | Clone, validate, then copy back objects | time / name |
| Defective release or batch corruption | Software writes incorrect data for a period | Clone and compare before choosing repair or cutover | time / xid |
| Audit, investigation, or forensics | Inspect historical state | Clone and hold at the target for inspection | time / lsn |
| Whole-cluster or site loss | Hosts or storage are gone or encrypted | Recover in place on replacement infrastructure | default / time |
Two principles apply throughout:
- Stop the damage first. Pause the defective application or remove its write access before choosing a target. The window is moving, but a rushed restore to the wrong cluster can cause a second incident.
- Prefer a clone while production is usable. It leaves the source untouched, supports repeated target selection, and allows validation before export or cutover. It does overwrite the designated destination cluster. In-place recovery is appropriate when the whole cluster is unusable or the business has explicitly accepted rolling every database back.
flowchart TD
A["Data error detected"] --> B["Contain the source of bad writes"]
B --> C{"Can production still serve?"}
C -->|Yes| D["Clone recovery<br/>validate and copy back or cut over"]
C -->|No| E["In-place recovery<br/>or rebuild on new infrastructure"]
D --> F["Validate, take a new backup, review the incident"]
E --> FAccidental DML
A DELETE without WHERE, an incorrect UPDATE, or a defective batch job is the most common PITR use case.
First locate the error using application logs, PostgreSQL logs, metrics, or audit records. A timestamp is usually sufficient. If the exact transaction ID is known, xid plus exclusive: true can stop immediately before that transaction.
Validate the recovered rows, then copy only the required data back with pg_dump, COPY, or an application-specific reconciliation procedure. If a configured delayed cluster is still inside its delay window, reading from it may be faster than PITR.
Dropped Objects
The same approach applies to DROP TABLE, DROP DATABASE, or a migration executed in the wrong environment, with an even stronger preference for a clone. Rolling the entire production cluster back to recover one object also discards every legitimate write after the target.
Restore a separate destination to before the DDL, validate the object, export it with pg_dump, and import it into production. For planned high-risk changes, create a named restore point with pg_create_restore_point() beforehand; a name target then removes timestamp ambiguity.
Defective Release or Batch Corruption
When a faulty release corrupts data for hours, the challenge is usually identifying the last clean state and the full impact. A clone provides a clean comparison set. Restore repeatedly to candidate times, compare it with production, and decide whether to copy back corrected rows or cut over to a recovered cluster.
This decision needs application-owner validation: a successful PostgreSQL restore proves consistency at a target, not that the target represents correct business state.
Audit and Investigation
Questions such as “what was this balance at month end?” require historical state. Restore into a separate destination, stop at a time, LSN, XID, or named restore point, and inspect without altering the source.
action: pause is the targeted-restore default and holds recovery at the target for inspection; it does not itself configure read-only access or create a separate cluster. The inventory limit and cluster source field determine the destination workflow. Run -t down, -t pitr, and -t up separately when you need an operator gate before promotion, and enforce read-only access explicitly if the investigation requires it. immediate means “stop at the first consistent point,” not “choose a historical timestamp.”
Site Loss
If every database host is destroyed or encrypted, HA cannot help. Recovery requires a repository and the other control-plane assets to have survived outside that failure domain. That survivor can be Silo/S3, another protected host or filesystem, or another tested pgBackRest backend; a remote object store is recommended but the essential property is independent failure-domain survival.
Rebuild hosts, restore the declarative inventory, credentials, and PKI, point the cluster at the surviving repository, then restore through the end of archived WAL:
Inventory and backup data are necessary but not sufficient. Preserve installation media or package repositories, repository credentials and encryption passwords, CA material, custom files, DNS dependencies, and an independently accessible runbook. Keep secrets encrypted and separate from both the database hosts and ordinary source control.
Make Recovery a Routine Drill
The first end-to-end execution of any of these workflows should not occur during a production incident. Use a disposable destination to rehearse clone recovery regularly and after material architecture changes. Measure three outcomes:
- Usability: can the backup and complete WAL chain be restored and validated?
- RTO: how long does the actual restore and replay take now?
- Operator readiness: can the on-call engineer identify source and destination, select a target, and follow the safety gates?
See Restore Operations and Clone a Database Cluster for the task-level runbooks.
3.6 - Monitoring System
Pigsty’s monitoring system has three pillars—metrics, logs, and alerting—and is available out of the box. Logs and alerts are also important inputs for audit and traceability. It can monitor clusters managed by Pigsty, existing PostgreSQL clusters, and external RDS services.
Monitoring Targets
Pigsty monitoring covers these core targets:
- PostgreSQL clusters and instances (SQL performance, connections, replication, transactions, checkpoints, WAL)
- Infrastructure components (Grafana, VictoriaMetrics, Alertmanager, Nginx, etc.)
- Host nodes (CPU, memory, disk, network, kernel)
- Key middleware (ETCD, MINIO, REDIS, JUICE, VIBE, etc.)
Technology Stack
| Component | Purpose |
|---|---|
| Grafana | Visualization dashboards, unified entry point, alert views |
| VictoriaMetrics | Time-series metric ingestion, storage, and query |
| VictoriaLogs | Structured log ingestion, indexing, and search |
| VMAlert + Alertmanager | Alert rule evaluation and notification delivery |
| Exporter / Agent | Database/system metric exposure and log forwarding |
Onboarding Modes
Pigsty supports three monitoring onboarding modes:
| Mode | Use Case | Entry |
|---|---|---|
FULL | Database is deployed and managed directly by Pigsty | PGSQL Monitoring System |
MANAGED | Existing PostgreSQL cluster with SSH-manageable nodes | Monitor Existing Cluster |
RDS | Cloud database accessible only by connection string | Monitor RDS |
Continue Reading
- PGSQL Monitoring System: Database metrics, logs, alerting, and dashboards
- INFRA Monitoring & Alerting: Health of the monitoring stack itself
- NODE Monitoring & Alerting: Host resource and system health
- ETCD Monitoring & Alerting: Consistency and availability monitoring
- MINIO Monitoring & Alerting: Object storage cluster monitoring
- REDIS Monitoring & Alerting: Cache cluster runtime monitoring
3.7 - Security and Compliance
The database is usually the most sensitive component in an information system: it stores the most valuable data, so attacks and failures can have the most serious consequences. Database security is not a feature that can be enabled with one switch. It is the combined answer to a series of questions: Who can connect? What can they do after connecting? Can traffic be intercepted? Are operations recorded? Can damaged, lost, or deleted data be recovered?
Pigsty turns these answers into an out-of-the-box security baseline and manages it through declarative configuration: HBA rules, roles and privileges, certificates, encryption, backups, and audit policies are declared as parameters in the inventory, then rendered and applied by idempotent playbooks.
This Security as Code approach is itself an important security practice. Policies can be versioned, reviewed, and traced, while one inventory provides a consistent baseline across many instances. When an auditor asks who can access a database, you can start from a readable YAML declaration, then verify the generated HBA rules and database grants against the running system.
Security as Code
In traditional operations, security settings are often scattered across the environment: pg_hba.conf on one server, a GRANT statement executed manually by a DBA, or a firewall rule opened temporarily during an incident.
Over time, documentation and actual state can drift, making it difficult to determine which rule set each instance is using.
Pigsty takes a different approach: security policy is part of the cluster definition and lives alongside other cluster properties.
Users, privileges, and HBA rules are described declaratively, and playbooks apply them idempotently to every cluster instance.
New instances inherit the same policy, and Git history records security configuration changes. Manual GRANT statements, runtime parameter changes, and edits to node files can still cause drift, so production environments should compare declared and actual state regularly.
Default Security Baseline
Reasonable defaults reduce omissions. The following capabilities are enabled in the default Pigsty configuration:
| Capability | Default Behavior | Related Parameter |
|---|---|---|
| Password hashing | New or updated PostgreSQL passwords use SCRAM-SHA-256 | pg_pwd_enc |
| Data checksums | Page checksums are enabled during cluster initialization to detect silent corruption | pg_checksum |
| Server-side TLS | PostgreSQL server certificates are installed and ssl is enabled, so TLS connections are accepted | — |
| Local CA | A self-signed CA is created automatically for managed component certificates | ca_create |
| etcd encryption and authentication | TLS for client and peer traffic, plus RBAC password authentication | etcd_root_password |
| MINIO object storage HTTPS | Silo backup traffic uses HTTPS by default | minio_https |
| Nginx HTTPS | Web ingress listens on both ports 80 and 443 by default | nginx_sslmode |
| HBA rules | Layered access: local ident, intranet password authentication, and SSL required for public administrator access | pg_default_hba_rules |
| Roles and privileges | A four-tier role model and default privilege templates provide a least-privilege baseline | pg_default_roles |
| Backup and recovery | pgBackRest is enabled by default, with two full backups retained in the local repository | pgbackrest_enabled |
| Firewall | Zone mode trusts intranet CIDRs and exposes only required ports to public networks | node_firewall_mode |
| Restricted sudo | Sudo access for the database OS user is limited to the required command set | pg_dbsu_sudo |
Hardening with Trade-offs
The default configuration targets deployments on a trusted intranet. Some controls require explicit enablement because they impose performance or compatibility costs, or require decisions from the operator:
- Default configurations and examples contain publicly documented default passwords for quick starts and local testing. Before production deployment, use
./configure -gto randomize the credentials it recognizes, then check the pgBackRest encryption passphrase, Silo users inha/safe, and all custom values. - TLS is disabled by default for the Patroni REST API and PgBouncer (
patroni_ssl_enabled,pgbouncer_sslmode); enable it explicitly with the certificates already issued. - Password strength checks (
passwordcheck) and the audit extension (pgaudit) are disabled by default. Confirm package availability, then configure preloading and policy before use. - SELinux defaults to
permissive. Demo configurations also expose port5432through the firewall; remove that exception in production. - The local backup repository is not encrypted by default. The remote
miniorepository preset uses AES-256 encryption by default, but its default encryption passphrase must be changed.
The ha/safe hardening template combines TLS, certificate authentication, password checks, and backup encryption.
Together with the consistency-first CRIT parameter template, it provides a practical starting point. Public credentials, audit extensions, and the failure model still require explicit review.
See the Security Model for the complete upgrade path.
This Chapter
| Section | Question Answered |
|---|---|
| Security Model | Where is the root of trust? How many defensive layers exist? How should the baseline be hardened? |
| Authentication | Who can connect? How is identity proven? How are HBA rules declared and applied? |
| Access Control | What can a connected user do? How does least privilege become the default? |
| Encrypted Communication | How is traffic encrypted? Who issues, distributes, and rotates certificates? |
| Data Security | How is data kept intact, recoverable, confidential, and traceable? |
| Compliance | How do security capabilities map to MLPS and SOC 2 controls? |
Related Topics
Beyond the conceptual model, these pages provide operational security guidance:
- 🔰 Security Recommendations: minimum hardening for a quick single-node deployment
- 🛡️ Security Considerations: production hardening checklist
- 📄
ha/safeTemplate: complete hardening configuration reference - 🔑 HBA Rules: detailed PGSQL HBA configuration
- 👤 Access Control: role and privilege parameter reference
- ♾️ High Availability: business continuity
- ⏰ Backup and Recovery: PITR and disaster recovery
3.7.1 - Security Model
Before examining individual security features, answer two more fundamental questions: Where is the root of trust? and How many defensive layers exist? The first determines what deserves the strongest protection. The second determines what remains when one layer fails.
Trust Boundaries
Pigsty is an Ansible-based declarative deployment system. Like other control-plane systems, its admin node is the control plane and the node that requires the strongest protection.
| Role | Assets and Privileges |
|---|---|
| Admin node | The pigsty.yml inventory, which normally contains system and application credentials; the CA private key; SSH administration access to every node |
| INFRA nodes | Monitoring and alerts, DNS, Nginx ingress, and software repositories |
| Database nodes | Database instances, local dbsu, and restricted sudo |
| Clients | Database credentials or client certificates; access through service ports, HBA, and authentication |
These roles hold different capabilities; they do not form a simple linear hierarchy. Three assets are especially important:
- The
pigsty.ymlinventory contains component passwords and credentials. Strictly control access to the admin node and to the configuration repository when Git is used. - The CA private key,
files/pki/ca/ca.key, is the trust anchor for the deployment. Anyone holding it can issue an arbitrary trusted certificate. The file uses mode0600inside a0700directory; keep an offline backup. - The administration user’s SSH private key lets the admin node manage every enrolled node with passwordless sudo. It is effectively root access to the managed fleet.
Pigsty’s security policy states this boundary explicitly: an attack that requires admin-node access, or possession of both pigsty.yml and the CA private key, is not treated as a product vulnerability.
These are high-trust control-plane assets by design and must be protected accordingly.
Seven Defensive Layers
Defense in depth does not ask one mechanism to solve every problem. It combines controls so that one failure does not remove all protection. Pigsty’s security capabilities can be summarized as seven layers:
| # | Layer | Mechanisms | Details |
|---|---|---|---|
| 1 | Network boundary | Firewall zones, constrained listen addresses, centralized ingress | This page |
| 2 | Transport encryption | Local CA and TLS between components | Encrypted Communication |
| 3 | Authentication | HBA rules, SCRAM passwords, client certificates | Authentication |
| 4 | Access control | Role model, default privileges, database isolation | Access Control |
| 5 | Host security | SELinux, restricted sudo, dedicated OS users | This page |
| 6 | Data security | Checksums, backup and encryption, PITR, deletion safeguards | Data Security |
| 7 | Audit trail | DDL and connection logs, audit extensions, centralized logs | Data Security |
Layers 2, 3, 4, 6, and 7 have dedicated chapters. The following sections cover the network and host layers.
Network Boundaries
Pigsty enables a firewall during node provisioning (node_firewall_mode defaults to zone), using firewalld or ufw according to the operating system.
Intranet CIDRs (10.0.0.0/8, 172.16.0.0/12, and 192.168.0.0/16, defined by node_firewall_intranet) enter the trusted zone.
Public networks can reach only ports declared in node_firewall_public_port, which defaults to 22 for SSH and 80/443 for web traffic.
The default demo inventory,
pigsty.yml, also exposes port5432for local evaluation. Remove it in production. If direct database access is required, restrict sources to explicit CIDRs with security groups, host firewalls, and HBA.
PostgreSQL listens on all addresses by default (pg_listen: 0.0.0.0). The effective access boundary is the combination of listen addresses, firewall rules, and HBA. Stricter environments can constrain the listener:
The default firewall does not expose Grafana, VictoriaMetrics, or other web infrastructure directly to public networks. External web access normally enters through the Nginx portal. Database traffic enters through HAProxy service ports. Fewer entry points are easier to harden and audit.
Host Security
The central host-level rule is: each OS user receives only the privileges required for its job.
- The database superuser
postgres(pg_dbsu) has no password by default and can enter the database only through localidentauthentication.pg_dbsu_sudodefaults tolimit, allowing passwordlesssystemctloperations for database services and log viewing rather than unrestricted root access. - The administration user (
node_admin_username, defaultdba) is used by operators and playbooks and receives passwordless sudo (nopass) by default. Security-sensitive environments can setnode_admin_sudotoall, which requires a sudo password, orlimit, which restricts the command set. node_selinux_modedefaults SELinux topermissive: violations are logged but not blocked, providing a baseline before moving toenforcing.
Pigsty does not manage the SSH server configuration. Disabling password login, restricting remote root login, and similar operating-system hardening belong in your host security baseline.
Hardening Levels
Security does not have to jump to its final state in one step. Pigsty provides an upgrade path in which each level builds on the previous one:
Level 1: default baseline. Out-of-the-box controls include SCRAM passwords, data checksums, a local CA and component certificates, layered HBA, a four-tier role model, default backups, and firewall zones. This level suits development, testing, and evaluation on a trusted intranet. Production still requires credential review, network-boundary review, and client verification.
Level 2: randomized credentials. Default passwords are documented publicly and must be changed in every network-exposed deployment. Add -g when generating configuration to randomize built-in parameters and example credentials recognized by the configuration wizard:
This option does not replace the pgBackRest cipher_pass, every Silo example credential in ha/safe, or user-defined values. See the Default Credentials Checklist for the complete scope.
Level 3: policy hardening with the ha/safe template. conf/ha/safe.yml combines several controls into a starting point for further customization:
- TLS and certificate authentication: the main TCP HBA rules use
ssl, public administrator access uses a client certificate, PgBouncer usesrequire, and the Patroni API uses HTTPS. Localidentand selected localhost password rules remain. - Password policy:
passwordcheckis preloaded explicitly, and built-in users declareexpire_in. Example passwords in the template still require review and replacement. - Reduced attack surface: listen addresses are limited to
${ip},${vip},${lo}, and public connection-pool access by monitoring and administration accounts is denied explicitly. - Backup encryption: pgBackRest uses the remote
miniorepository preset with AES-256-CBC.pgBR.${pg_cluster}is a predictable example value and must be replaced. - Security extensions:
passwordcheck,credcheck,pgaudit,pgsodium,anonymizer, and related extensions are installed. Installation does not preload, create, or configure an extension.
Level 4: database hardening with the crit.yml parameter template. The safe template selects the CRIT parameter template for consistency-first workloads. Compared with the general oltp template, it:
- forces data checksums regardless of
pg_checksum; - enables strict synchronous replication (
synchronous_mode_strict), blocking writes that require synchronous acknowledgment when no synchronous replica is available; - logs connection and disconnection events; PostgreSQL 18 also separates connection receipt, authentication, and authorization stages;
- configures watchdog as
automatic, which activates only when a usable device exists.
Strict synchronous mode targets preservation of acknowledged transactions, but still depends on synchronous_commit, synchronous replica state, and failover eligibility. Validate RPO with failure exercises on the target topology.
You can also select individual controls instead of adopting the complete template:
Next
- 🔑 Authentication: HBA rules and password policy
- 👤 Access Control: roles and least privilege
- 🔐 Encrypted Communication: local CA and TLS
- 🔒 Data Security: integrity, backup, and audit
- ✅ Compliance: MLPS and SOC 2 mapping
3.7.2 - Authentication
PostgreSQL uses pg_hba.conf for Host-Based Authentication: who may connect, from where, to which database, and how they must prove their identity.
The mechanism is powerful, but expensive to maintain manually across a cluster. Primary and replica instances may require different rules, and every instance stores its own configuration in the data directory. Without a common declaration and refresh process, rules can drift between instances.
Pigsty applies the same declarative configuration model here: HBA rules are part of the inventory and are rendered and distributed consistently by playbooks.
HBA as Code
Cluster HBA policy combines two parameter groups: the global defaults in pg_default_hba_rules and cluster-specific additions in pg_hba_rules.
The PgBouncer connection pool has two independent counterparts: pgb_default_hba_rules and pgb_hba_rules.
A rule can use either of two forms. The recommended alias form keeps one semantic rule on one line:
The raw form supplies a literal pg_hba.conf line for cases the aliases cannot express.
In addition to user, address, database, and authentication method, each rule has two control fields:
order: render order. HBA uses first-match semantics, so order is priority. By convention,0-99is reserved for high-priority user rules,100-999for defaults, and rules withoutordercome last.role: instance-role filter.commonanddefaultapply to every instance;primary,replica,offline,standby, anddelayedapply only to matching instances. Arole: offlinerule is also rendered on instances marked withpg_offline_query. The same declaration therefore produces the appropriate rules for each instance role without maintaining primary and replica files manually.
After editing the declaration, apply it with the wrapper script. The rules are rendered again and reloaded:
pg_hba_rules appends rules; it does not automatically narrow broader defaults. To establish a stricter boundary, review pg_default_hba_rules as well, then inspect the generated pg_hba.conf on every instance.
Address and Authentication Aliases
The alias form gives common cases semantic names. Values in addr expand into concrete address blocks:
| Alias | Expands To | Meaning |
|---|---|---|
local | Unix socket | Local socket only |
localhost | Unix socket, 127.0.0.1/32, and ::1/128 | Local host |
admin | <admin_ip>/32 | Admin node |
infra | /32 address of each INFRA node | Infrastructure nodes |
cluster | /32 address of every cluster member | Cluster-internal traffic |
intra | 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 | Intranet CIDRs, customizable with node_firewall_intranet |
world | 0.0.0.0/0 and ::/0 | Any address |
| CIDR | Unchanged | Custom network |
Values in auth select the authentication method and whether TLS is mandatory:
| Alias | Authentication Method | Notes |
|---|---|---|
deny | reject | Explicit rejection |
trust | trust | Unconditional access; use with care |
pwd | scram-sha-256 or md5 | Follows pg_pwd_enc; SCRAM by default |
sha | scram-sha-256 | Force SCRAM |
md5 | md5 | Compatibility for legacy clients |
ssl | hostssl with password authentication | Password authentication over mandatory TLS |
ssl-sha | hostssl with scram-sha-256 | Mandatory TLS and SCRAM |
cert | hostssl with cert | Client certificate authentication |
ident, os | ident (peer in PgBouncer) | OS user mapping |
peer | peer | Local OS user |
The user field supports four placeholders, replaced with actual user names during rendering: ${dbsu} (superuser), ${repl} (replication user), ${monitor} (monitoring user), and ${admin} (administration user).
A +role prefix matches all members of that role.
Do not confuse transport enforcement with server verification: auth: ssl requires TLS but does not require the client to verify the server identity. Security-sensitive clients should also use sslmode=verify-full with a trusted CA; see Encrypted Communication.
Default Rules Explained
Pigsty’s default HBA policy follows a simple rule: the farther the source, the stronger the requirement. These are the PostgreSQL defaults from the source configuration:
Layer by layer:
- Local access is most trusted:
postgrescan enter only through a local Unix socket withident. No password is required, but remote login is impossible. This is why dbsu has no password by default. - The intranet comes next: replication and application accounts use SCRAM password authentication on the intranet. Remote monitoring and administration access primarily originates from INFRA nodes.
- Public sources are strictest: only the administrator may connect from any address by default, and the connection requires both a password and TLS.
PgBouncer defaults are more restrictive: public access for monitoring and administration accounts is explicitly denied, while application users are limited to localhost and intranet sources.
The default +dbrole_offline rule does not set role and therefore applies to every instance. To restrict offline users to pg_role: offline or instances with pg_offline_query: true, add role: offline explicitly to the corresponding HBA rule.
This default policy favors usability: application accounts can connect from the intranet with password authentication.
The ha/safe template changes the main TCP rules to ssl and requires administrators outside the intranet to present a client certificate (cert); local ident and selected localhost password rules remain.
Password Policy
Pigsty uses PostgreSQL’s recommended scram-sha-256 password storage by default (pg_pwd_enc). Downgrade to md5 only for legacy client compatibility.
Before executing ALTER USER ... PASSWORD, the password workflow temporarily disables statement logging (SET log_statement TO 'none') to keep passwords out of PostgreSQL logs.
Plaintext passwords still appear in the inventory, and rendered user SQL is written to /pg/tmp/pg-user-<name>.sql with mode 0640. The related Ansible tasks do not use no_log consistently. Restrict access to the admin node, configuration repository, and automation output, and avoid --diff on tasks containing credentials.
Password strength is not enforced by default. If required, preload passwordcheck or the more configurable credcheck:
The ha/safe template sets this pg_libs value explicitly. Selecting the CRIT parameter template alone does not load passwordcheck.
Declare account lifetime with expire_in (days after creation) or expire_at (absolute date), then combine it with the organization’s rotation process:
Certificate Authentication
Passwords can be phished, reused, or guessed. For privileged accounts such as administrators, use auth: cert in HBA to require client certificate authentication.
The client must present a certificate signed by the local CA whose CN matches the database user name. When the HBA rule accepts only cert, a leaked password alone cannot authenticate.
Issue client certificates with the built-in cert.yml playbook:
The certificate and key are stored in files/pki/misc/<cn>.crt and files/pki/misc/<cn>.key. Deliver the private key through a controlled channel. The client should still use verify-full to authenticate the database server; see Encrypted Communication.
Connection Pool and Component APIs
The database is not the only authenticated entry point.
The PgBouncer connection pool uses an independent HBA policy and user list. pgbouncer_auth_query is disabled by default, so only users declared with pgbouncer: true are written to userlist.txt and can authenticate through the pool. Re-evaluate the login scope before enabling dynamic authentication queries.
The Patroni REST API carries high-availability control operations such as restart, switchover, and configuration reload. Write operations require HTTP Basic authentication (patroni_username and patroni_password) and are restricted by source-address allowlists.
When patroni_ssl_enabled is enabled, the API uses HTTPS throughout.
Credentials for Grafana, the HAProxy administration interface, the object-storage backend selected by the MINIO module, etcd, and other components are also declared in the inventory. See the Default Credentials Checklist for the full list and update guidance.
Next
- 📖 Complete HBA reference: HBA Rules
- 👤 Access Control: authorization after authentication
- 🔐 Encrypted Communication: TLS and client certificate infrastructure
3.7.3 - Access Control
Authentication answers “Who are you?” Authorization answers “What may you do?”
Privilege failures rarely result from a lack of mechanisms—PostgreSQL GRANT and REVOKE are sufficiently precise. The usual problem is the absence of conventions that are applied by default:
an application account is made the owner at launch, temporary superuser access is not revoked after troubleshooting, or grants are missed when new tables are created and cause failures in production.
Pigsty provides an out-of-the-box access control model as a starting point: four role tiers, default privileges, and database isolation. It reduces per-database manual grants, but operators must still assign roles according to business boundaries and review effective privileges regularly.
Role System
Pigsty creates four business roles by default. They cannot log in and are used as privilege groups:
| Role | Attribute | Inherits | Purpose |
|---|---|---|---|
dbrole_readonly | NOLOGIN | — | Global read-only access |
dbrole_readwrite | NOLOGIN | dbrole_readonly | Global DML access; the default choice for application accounts |
dbrole_admin | NOLOGIN | dbrole_readwrite, pg_monitor | Object creation and DDL for administration and release workflows |
dbrole_offline | NOLOGIN | — | Independent read-only role that can be restricted to offline instances through HBA |
Pigsty also creates four system users, each with a specific responsibility:
| User | Attribute | Purpose |
|---|---|---|
postgres | SUPERUSER | Database superuser; no password and local ident login only |
replicator | REPLICATION | Streaming replication and backup, with pg_monitor and read-only privileges |
dbuser_dba | SUPERUSER | Routine administration user that inherits dbrole_admin |
dbuser_monitor | — | Monitoring user with only pg_monitor and read-only privileges |
Application accounts join role groups through the roles field and inherit their privileges:
The role system is itself declarative (pg_default_roles) and can be customized.
This parameter is a complete list. Preserve all required system users and default roles when changing it, and check references from HBA rules, default privileges, and scripts at the same time.
Default Privileges
Roles answer “Who receives a privilege?” The other half of the problem is: How do newly created objects receive the correct privileges automatically?
PostgreSQL provides ALTER DEFAULT PRIVILEGES. Pigsty declares these rules through pg_default_privileges:
The read-only role receives query and function execution privileges, the read-write role adds DML, and the administrator role adds the supporting privileges required for object management.
Ownership Convention
Default privileges have an often-missed prerequisite: they apply only to objects created by identities for which those defaults were configured. Pigsty configures default privileges for:
- the database OS user
pg_dbsu, which defaults topostgres; - the administration user
pg_admin_username, which defaults todbuser_dba; dbrole_admin;- each database owner declared in
pg_databases.
Application DDL should normally run as the declared database owner. Platform administration and release workflows can use dbuser_dba or first execute SET ROLE dbrole_admin. Objects created directly by other users do not enter this default privilege model unless ALTER DEFAULT PRIVILEGES is also configured for those users.
This is PostgreSQL behavior, not a Pigsty limitation: default privileges follow the object creator; they do not automatically propagate from the database or the session login name.
Database Isolation
PostgreSQL grants CONNECT on databases to PUBLIC by default. If HBA also permits a connection, a login role may enter a database it does not own. This default is particularly important to tighten when several applications share a cluster.
Set revokeconn in a database definition to revoke public connection access:
When enabled, CONNECT is revoked from PUBLIC and granted explicitly to the replication, monitoring, and administration users and to the database owner.
The owner receives GRANT OPTION and can decide who else may connect. Without additional grants or inherited roles, the app_a account cannot connect to app_b.
Cluster initialization also revokes CREATE from PUBLIC on the database and the public schema:
Ordinary users can no longer create objects freely in public databases or schemas, reducing risks from unsafe search_path settings and object shadowing.
PostgreSQL 15 tightened the default CREATE privilege on the public schema; Pigsty applies the same boundary consistently across all supported major versions.
Offline Role and Instance Isolation
dbrole_offline provides an independent set of read-only privileges for ETL, reporting, and ad hoc queries. The role controls object privileges only; it does not automatically restrict which instance a user may connect to.
In the current default HBA rules, the intranet rule for +dbrole_offline does not set role and therefore applies to every instance. To restrict it to a dedicated pg_role: offline instance, or to a regular replica marked with pg_offline_query: true, modify that rule in the complete pg_default_hba_rules list:
Defining pg_default_hba_rules replaces the entire default list; the example rule cannot be used alone. Expensive queries are limited to offline instances only when HBA filters by instance role and the user does not inherit another role allowed by broader rules. Resource isolation should also use a dedicated service endpoint, connection limits, and query resource controls.
Beyond the Database
Least privilege also applies at the host level:
- The
postgressuperuser has no password and can log in only through localident. Its sudo access defaults to a restricted set of database service and log commands (pg_dbsu_sudo:limit). - The monitoring user
dbuser_monitorholdspg_monitor, the read-only role, and privileges on the dedicatedmonitorschema; it cannot write business tables by default. - The replication user
replicatorreceives only the directory function privileges required for backup and recovery instead of broad superuser access.
Next
- 📖 Complete role and privilege reference: Access Control Configuration
- 🔑 Authentication: the first gate before authorization
- 🔒 Data Security: protection beyond privileges
3.7.4 - Encrypted Communication
TLS can provide three separate protections: transport encryption, server authentication, and client authentication. Each must be configured independently. Enabling server-side TLS does not mean the client verifies the server identity, nor does it mean the server requires a client certificate.
The main operational cost of TLS is not the encryption algorithm but certificate issuance, distribution, trust, and rotation. Without centralized management, internal services often encrypt traffic while skipping certificate verification—or remain on plaintext connections.
Pigsty brings PKI under declarative management. During deployment it creates a local self-signed CA, issues certificates for managed components, and distributes trust so TLS is ready for use after installation.
Local CA
During the first deployment, Pigsty checks for a CA on the admin node and creates one when required:
| File | Description | Permissions |
|---|---|---|
files/pki/ca/ca.key | CA private key and root of trust for the deployment; protect it carefully | 0600, with directory mode 0700 |
files/pki/ca/ca.crt | CA root certificate; safe to distribute | 0644 |
ca_createcontrols CA behavior. An existing private key and certificate are reused unchanged; if the certificate is missing but the private key exists, that key is used to issue a replacement certificate.ca_create: falseonly prevents creation of a missing CA private key. Deployment stops ifca.keyis absent, preventing an unexpected trust root. Always back up and restoreca.keyandca.crttogether.ca_cnsets the CA certificate CN, which defaults topigsty-ca. The key is RSA 4096.- The root CA is valid for 100 years, while component certificates default to 20 years (
cert_validity:7300d). The browser-facing Nginx certificate is an exception and currently defaults to 397 days.
Long default lifetimes reduce the initial maintenance burden for private infrastructure; they do not remove the need for production rotation. Organizations with an established certificate policy should shorten lifetimes and monitor expiration.
Trust Distribution
Issuing a certificate is only half of PKI. Every node must trust it. When a node is managed, Pigsty distributes the CA certificate to /etc/pki/ca.crt and links it into the operating system trust store:
- EL family (RHEL, Rocky, Alma): link under
/etc/pki/ca-trust/source/anchors/and runupdate-ca-trust - Debian and Ubuntu: link under
/usr/local/share/ca-certificates/and runupdate-ca-certificates
Clients that use the OS trust store, such as curl, can then verify certificates signed by the Pigsty CA.
The CA certificate is also published as ca.crt at the site root of the Nginx portal for browsers and external clients.
PostgreSQL libpq clients require special attention: by default they look for ~/.postgresql/root.crt and use sslmode=prefer, so they do not directly use the operating system trust store to verify the server identity.
Server Identity Verification
Security-sensitive PostgreSQL clients should use sslmode=verify-full and specify the Pigsty CA:
verify-full validates both the certificate chain and the connection host name. The DNS name or IP address used by the client must therefore appear in the server certificate SAN. External clients must install ca.crt or specify it with sslrootcert.
Certificate Matrix
The local CA issues certificates for the following components and places them under one trust chain:
| Component | Certificate Identity (CN) | Deployment Path | Encryption State |
|---|---|---|---|
| PostgreSQL | <cluster>-<sequence> | /pg/cert/server.{crt,key} | Server-side SSL enabled by default; HBA determines whether it is mandatory |
| PgBouncer | Reuses the PostgreSQL certificate | /pg/cert/ | TLS disabled by default (pgbouncer_sslmode) |
| Patroni | Reuses the PostgreSQL certificate | /pg/cert/ | API HTTPS disabled by default (patroni_ssl_enabled) |
| etcd | <instance-name> | /etc/etcd/server.{crt,key} | TLS for client and peer traffic |
| Silo | <node-name> | ~minio/.minio/certs/ | Silo HTTPS is enabled by default (minio_https) |
| Kafka | <cluster>-<sequence> | /etc/kafka/pki/kafka.pem | SASL_SSL/SSL with kafka_security: scram; defaults to plaintext |
| MySQL | <instance-name> | /etc/mysql/pki/server.{crt,key} | Secure transport enforced; clients and group replication verify the certificate chain |
| Nginx | pigsty, with portal domains in SAN | /etc/nginx/conf.d/cert/ | HTTPS enabled by default (nginx_sslmode) |
| INFRA node | <node-name> | /etc/pki/infra.{crt,key} | Available to infrastructure components |
The encryption-state column reflects deliberate defaults:
- Enabled at deployment: PostgreSQL accepts SSL connections; etcd uses TLS for client and peer traffic.
- Encrypted by default: Object-storage backup traffic through the MINIO module and Nginx web traffic use HTTPS.
- Disabled by default, available on demand: TLS for the Patroni REST API and PgBouncer is disabled by default, but certificates are already present. Enable it through the corresponding parameters; both are enabled in the
ha/safetemplate.
Keep three states distinct: server-side SSL support does not force clients to use SSL, and neither state proves that the client verifies the server identity.
HBA rules enforce encryption with auth: ssl or cert. Client sslmode and trust settings control server verification. The default rules require TLS only for administrator connections from arbitrary sources. The safe template changes the main TCP rules to ssl or cert while retaining local ident and selected localhost password rules.
Client Certificates
The built-in cert.yml playbook issues client certificates. The certificate CN represents the database user name for HBA cert authentication:
Results are stored in files/pki/misc/<cn>.key and files/pki/misc/<cn>.crt. Deliver private keys through a controlled channel and make them readable only by the corresponding user. The client certificate lets the server authenticate the client; the client must still use verify-full to authenticate the database server.
Using an Enterprise CA
If the organization already operates a PKI, Pigsty can issue certificates from that CA, or from an intermediate signed by the enterprise root. Place the certificate and private key at the expected paths; playbooks do not regenerate a CA when one already exists:
Also set ca_create: false. Deployment will then fail explicitly if the private key is missing instead of creating an unexpected trust root. This setting does not stop the role from reissuing the CA certificate when the private key exists but the certificate is missing, so verify and restore both files together.
Key Protection and Rotation
- The CA private key exists only on the admin node. Together with
pigsty.yml, it is one of the highest-trust assets in the deployment; see Trust Boundaries. Keep an offline backup. - If the CA private key is compromised, establish a new trust root and reissue every component and client certificate. Plan an overlap period in which both old and new CAs are trusted to avoid interrupting all connections at once.
- Component certificate sources are stored under
files/pki/<component>/on the admin node; node certificates are deployment copies. Deleting only a node copy restores the same certificate rather than issuing a new one. To rotate, update or remove the corresponding source on the admin node, rerun the relevant playbook, then reload or roll the component as required.
Next
- 🔑 Authentication: use HBA to decide who must use SSL or client certificates
- 🔒 Data Security: encryption for stored data and backups
- ✅ Compliance: evidence for certificate management
3.7.5 - Data Security
Network boundaries, authentication, and access control reduce the likelihood of an incident. When hardware fails, credentials leak, or an operator makes a mistake, data-layer controls must limit the impact and support recovery.
Data security answers four questions: Is the data intact? Can it be recovered? If copied, does it remain confidential? Can you determine what happened?
Integrity
Bad disk sectors, memory bit flips, and storage firmware defects can cause silent data corruption: the data is damaged without an immediate error.
Pigsty enables page checksums by default (pg_checksum: true).
The cluster is initialized with data-checksums, so PostgreSQL calculates a checksum when writing a page and verifies it when reading.
Page checksums primarily detect corruption in storage media, the I/O path, or pages after they were written. They do not detect every memory error, logical error, or incorrect application write, and they do not replace backups.
The CRIT parameter template goes further: checksums are mandatory regardless of the parameter, and strict synchronous replication (synchronous_mode_strict) blocks writes that require synchronous acknowledgment when no synchronous replica is available.
This mode targets preservation of acknowledged transactions, but it still assumes clients have not reduced synchronous_commit, a synchronous replica participates in the commit, and failover selects only a node containing the required WAL. Validate RPO through failure exercises on the target topology.
Recoverability
Replicas primarily handle node failures; backups handle accidental deletion, logical errors, cluster corruption, and broader disasters. High availability can shorten an interruption after primary failure, but replication also copies an accidental deletion to every replica. Backups are therefore indispensable.
Pigsty enables pgBackRest by default (pgbackrest_enabled).
Base backups plus continuous WAL archiving provide Point-in-Time Recovery (PITR), allowing recovery to a target time within the retained backup and WAL window.
Select the backup repository with pgbackrest_method:
| Repository | Location | Default Retention | Encryption |
|---|---|---|---|
local (default) | Local /pg/backup directory | Latest 2 full backups | None |
minio | Silo or external S3-compatible object storage | 14 days | AES-256-CBC |
Two additional controls reduce damage from accidental deletion:
- Delayed replica: declare a
pg_delay: 1hreplica for a critical cluster. Before an erroneous operation is replayed, pause replication and extract the required data. A delayed replica eventually catches up and does not replace a backup. - Removal safeguards: when
pg_safeguardoretcd_safeguardis enabled, the corresponding removal playbook refuses to run, reducing the risk of accidental cluster removal.
Having a backup is not the same as being able to restore. Recovery exercises should be routine; see Backup and Recovery for mechanisms and procedures.
Confidentiality
Protect data at rest at three layers:
Backup encryption. pgbackrest_method: minio denotes an S3-compatible repository. It can be provided by Silo deployed through the MINIO module, or independently managed MinIO, RustFS, and external S3 services. The preset uses AES-256-CBC by default, but the public pgBackRest passphrase must be changed in production.
The ha/safe template derives an example passphrase from the cluster name:
pgBR.${pg_cluster} is predictable, and configure -g does not replace it. Use a unique random passphrase in production and store it separately from the backup. Losing the passphrase makes the backup unrecoverable.
The local backup repository is not encrypted by default. Encryption reduces disclosure if backup files or media are copied separately, but offers limited protection when the key and backup remain on the same host.
Transport encryption. Backup uploads to Silo or external S3 services use HTTPS. PostgreSQL client and replication traffic can require SSL through HBA. Clients should also verify the server certificate; see Encrypted Communication.
Encryption at rest. Upstream PostgreSQL currently has no general built-in transparent data encryption (TDE). Pigsty provides two practical options:
use the pg_tde extension with Percona Distribution for PostgreSQL for table-level transparent encryption (see the pgtde configuration template);
or use security extensions such as pgsodium, pgcrypto, and anonymizer for column-level encryption and masking. The safe template installs this extension category.
Full-disk encryption such as LUKS or dm-crypt protects against stolen media at the operating-system layer and complements database-level controls.
Audit and Traceability
After an incident, you must be able to answer who did what and when. Pigsty provides layered logging:
Default baseline: all DDL is logged (log_statement: ddl), and statements taking longer than 100 ms are logged (log_min_duration_statement: 100).
PostgreSQL 18 and later also record connection authorization events.
CRIT template: connection and disconnection events are recorded with log_connections and log_disconnections. PostgreSQL 18 can distinguish connection receipt, authentication, and authorization stages.
pgaudit extension: for fine-grained statement auditing such as object reads and writes or role-based audit classes, install pgaudit and add it to pg_libs for preloading.
The safe template installs the extension, but loading and audit policy must be declared explicitly.
When INFRA logging is enabled and Vector is configured, PostgreSQL logs are sent to VictoriaLogs for centralized storage. The default retention is 15 days and can be adjusted for compliance. Logs and metrics support search, alerts, and incident reconstruction, but incident classification, response, and evidence preservation still require an operational process.
Next
- ⏰ Backup and Recovery: PITR principles and practice
- ♾️ High Availability: replicas and backups as complementary safeguards
- ✅ Compliance: audit logs as compliance evidence
3.7.6 - Compliance
Compliance is not a product you can buy. It is a state that must be demonstrated continuously through three elements:
- Configuration: whether security controls are enabled. Pigsty directly provides this part.
- Process: access approval, change management, recovery exercises, and related procedures. The organization must establish these.
- Evidence: records showing that configuration and process remain effective. Pigsty’s inventory, runtime logs, and monitoring system can provide part of this evidence.
This page begins with a pre-launch hardening checklist and then maps Pigsty security capabilities to common compliance frameworks. The mappings support architecture and gap analysis; they are not an MLPS assessment conclusion, a SOC 2 audit opinion, or legal advice.
Default Credentials Checklist
Pigsty default credentials are public in the documentation and source code. They are intended only for demonstrations and local development. Change every applicable default before any production or network-exposed deployment goes live:
| Scope | Example Default | configure -g |
|---|---|---|
| Grafana administrator and viewer | pigsty, DBUser.Viewer | Yes |
| HAProxy administration interface | pigsty | Yes |
| PostgreSQL administration, monitoring, and replication users | DBUser.DBA, DBUser.Monitor, DBUser.Replicator | Yes |
| Patroni REST API | Patroni.API | Yes |
| etcd root | Etcd.Root | Yes |
| MINIO module object-storage root | S3User.MinIO | Yes |
| Object-storage backup and example application users | S3User.Backup, S3User.Meta, S3User.Data | Yes |
| Example database users | DBUser.Meta, DBUser.Supa, Vibe.Coding | Yes |
| pgBackRest encryption passphrase | cipher_pass: pgBackRest | No |
Silo users and pgBR.${pg_cluster} in ha/safe | Template example values | No |
| User-defined credentials | Custom values | No |
Use -g while generating configuration to randomize built-in parameters and example strings recognized by the configuration wizard:
The wizard prints generated passwords to the terminal, so protect terminal history and automation logs as sensitive data. After generation, inspect the configuration and replace pgBackRest cipher_pass, MINIO module example values in ha/safe that were not covered, and all custom credentials.
Launch Hardening Checklist
Before deployment:
- Define the network boundary: do not expose database ports publicly, and remove the demo firewall exception for
5432 - Select a certificate policy: use the built-in CA or integrate enterprise PKI; see Using an Enterprise CA
- Plan client verification: configure database clients with
sslmode=verify-fulland a trusted CA - Design the account model: assign application accounts through the four-tier roles and declare
expire_in - Plan the backup repository, retention, encryption passphrase, and off-site copies
- Decide whether to use the
ha/safetemplate and the CRIT parameter template
After deployment:
- Confirm that credentials covered by
configure -gand uncovered backup, object-storage, and custom credentials have all been changed - Review the effective HBA rules in
/pg/data/pg_hba.confagainst the declaration and intended boundary - Query effective users, roles, default privileges, and database
CONNECTgrants, and compare them with the inventory - Run one full backup and a recovery exercise to validate the backup path
- Confirm log collection, monitoring alerts, and notification channels
Periodically:
- Audit privileges: compare
pg_usersdeclarations with effective grants, and remove expired or departed-user accounts - Rotate credentials and certificates
- Exercise recovery and failover
- Track security updates for Pigsty and upstream components
Compliance Evidence
Declarative configuration provides a stable starting point for audit evidence. Retain runtime state as well to show that the configuration was applied and remains effective.
| Evidence | Source |
|---|---|
| Security baseline and change history | The pigsty.yml inventory and Git history |
| Access-control matrix | pg_default_roles, pg_users, and pg_hba_rules declarations |
| Effective authentication policy | Rendered pg_hba.conf on each instance, compared with declarations to detect drift |
| Effective users and privileges | PostgreSQL catalogs, database ACLs, \du+, and \ddp+ |
| Operation and connection logs | PostgreSQL DDL, slow-query, and connection logs retained in VictoriaLogs |
| Backup records | pgBackRest information and monitoring dashboards |
| Security incidents and alerts | Monitoring alert history |
| Certificate inventory | files/pki/ and deployed component certificates |
MLPS Level 3 Mapping
The following maps database-related Pigsty capabilities to controls in the “secure computing environment” section of GB/T 22239-2019 Level 3:
| Control | Pigsty Capability | Additional Requirement |
|---|---|---|
| Unique identity | Independent accounts and SCRAM-SHA-256 password storage | Real-name account management process |
| Password complexity and rotation | passwordcheck, credcheck, and expire_in | Enable extensions and establish a rotation process |
| Login failure handling | Can be implemented with credcheck and related extensions | Enable and configure as required |
| Access control and least privilege | Four-tier roles, default privileges, and database isolation | Privilege approval workflow |
| Security audit | DDL, connection, and slow-query logs; pgaudit; centralized retention | CRIT or manual connection logging; required retention period |
| Communication confidentiality | Local CA and TLS; HBA-enforced ssl or cert | Enforce TLS, client verify-full, and certificate rotation |
| Data integrity | Page checksums by default and strict synchronous replication with CRIT | Storage protection, defined failure model, and exercises |
| Data confidentiality | AES-encrypted backup plus TDE and column-encryption options | Enable as required |
| Backup and recovery | pgBackRest, PITR, and a remote S3-compatible repository | Recovery exercise process |
| Residual information protection | — | Media destruction and erasure process |
MLPS also covers physical security, communication networks, and management systems beyond the scope of a database distribution. Pigsty can support database-related technical controls in a secure computing environment; facilities, network devices, and governance must be addressed in the overall system.
SOC 2 Mapping
Database-related controls in the SOC 2 Trust Services Criteria (TSC) include:
| Criterion | Pigsty Capability | Additional Requirement |
|---|---|---|
| CC6.1 Logical access security | HBA, RBAC, default privileges, and database isolation | Privilege design, approval, and periodic review |
| CC6.2 User registration and authorization | Declarative users, roles, and expiration | Joiner, mover, leaver, and identity-verification process |
| CC6.3 Access changes and revocation | pg_users, role changes, REVOKE, and expiration | Tickets, approval evidence, and timely revocation |
| CC6.6 External boundary threats | Firewalls, listen addresses, HBA, and restricted management ingress | Network architecture, boundary devices, and continuous validation |
| CC6.7 Information transmission and movement | TLS, client verification, and backup encryption | Policies for exports, media, and third-party transfer |
| CC7.2 System monitoring | Victoria observability stack with extensive metrics and alerts | Alert-response process |
| CC7.3 Incident traceability | Centralized logs and audit extensions | Log-review process |
| A1.2 Availability and recovery | High Availability and PITR | Exercise records and RTO/RPO objectives |
Supply Chain and Vulnerability Response
Compliance reviews increasingly cover the software supply chain. Pigsty provides the following distribution and response controls:
Package integrity: RPM and DEB packages in the Pigsty repositories (repo.pigsty.io and repo.pigsty.cc) are GPG-signed.
The public-key fingerprint is 9592 A7BC 7A68 2E73 3337 6E09 E793 5D8D B9BD 8B20 (B9BD8B20) and can be verified before trust is established. Repository definitions written during deployment and the local repository on the INFRA node do not enforce signature verification for every package by default; review package-manager repository trust and signature settings in production.
Vulnerability response: report security issues privately through GitHub private vulnerability reporting or email, as documented in SECURITY.md. The project targets acknowledgment within three business days and an initial assessment within seven days.
Version support: security fixes ship with the latest stable release. Staying current is the standard way to receive them. Users who must remain on a version for longer can obtain extended support through subscription services.
Next
- 🛡️ Security Model: from the default baseline to hardening levels
- 🔰 Security Recommendations: minimum hardening for quick-start deployments
- 📄
ha/safeTemplate: hardening configuration example
4 - About
4.1 - Features
“PostgreSQL In Great STYle”: Postgres, Infras, Graphics, Service, Toolbox, it’s all Yours.
—— Battery-included, local-first PostgreSQL distribution, open-source RDS alternative
Value Propositions
- Extensibility: Powerful extensions out of the box: deep integration of PostGIS, TimescaleDB, Citus, PGVector, 576 plugins, and 12 PG kernels.
- Reliability: Quickly create high-availability, self-healing PostgreSQL clusters with built-in point-in-time recovery, access control, a self-signed CA, and TLS.
- Observability: Based on Prometheus & Grafana modern observability stack, providing stunning monitoring best practices. Modular design, can be used independently: Gallery & Demo.
- Availability: Deliver stable, reliable, auto-routed, transaction-pooled, read-write separated high-performance database services, with flexible access modes via HAProxy, Pgbouncer, and VIP.
- Maintainability: Easy to use, Infrastructure as Code, Management SOPs, auto-tuning, local software repository, Vagrant sandbox and Terraform templates, zero-downtime migration solutions.
- Composability: Modular architecture design, reusable Infra, various optional modules: Redis, Silo object storage, ETCD, DuckDB, Docker, Supabase.

Overview
Pigsty is a better local open-source RDS for PostgreSQL alternative:
- Battery-Included RDS: From kernel to RDS distribution, providing production-grade PG database services for versions 14-18 on EL/Debian/Ubuntu.
- Rich Extensions: Providing unparalleled 576 extensions with out-of-the-box distributed, time-series, geospatial, graph, vector, multi-modal database capabilities.
- Flexible Modular Architecture: Compose Redis, Etcd, and Silo object-storage modules with PostgreSQL modes such as Mongo; monitor existing RDS, hosts, and databases independently.
- Stunning Observability: Based on modern observability stack Prometheus/Grafana, providing stunning, unparalleled database observability capabilities.
- Battle-Tested Reliability: Self-healing high-availability architecture: automatic failover on hardware failure, seamless traffic switching. With auto-configured PITR as safety net for accidental data deletion!
- Easy to Use and Maintain: Declarative API, GitOps ready, foolproof operation, Database/Infra-as-Code and management SOPs encapsulating management complexity!
- Solid Security Practices: HBA, ACL, TLS, backup, logging, and host-firewall foundations, with explicit default boundaries and production hardening requirements.
- Broad Application Scenarios: Low-code data application development, or use preset Docker Compose templates to spin up massive software using PostgreSQL with one click!
- Open-Source Free Software: Own better database services at less than 1/10 the cost of cloud databases! Truly “own” your data and achieve autonomy!
PostgreSQL integrates ecosystem tools and best practices:
- Out-of-the-box PostgreSQL distribution, deeply integrating 576 packaged extensions for geospatial, time-series, distributed, graph, vector, search, and AI!
- Runs on bare operating systems without container support, supporting mainstream operating systems: EL 8/9/10, Ubuntu 22.04/24.04/26.04, and Debian 12/13.
- Based on patroni, haproxy, and etcd, creating a self-healing high-availability architecture: automatic failover on hardware failure, seamless traffic switching.
- Combines pgBackRest with optional Silo object storage to provide out-of-the-box point-in-time recovery (PITR), protecting against software defects and accidental data deletion.
- Based on Ansible providing declarative APIs to abstract complexity, greatly simplifying daily operations management in a Database-as-Code manner.
- Pigsty has broad applications, can be used as complete application runtime, develop demo data/visualization applications, and massive software using PG can be spun up with Docker templates.
- Provides Vagrant-based local development and testing sandbox environment, and Terraform-based cloud auto-deployment solutions, keeping development, testing, and production environments consistent.
- Run PostgreSQL in Mongo-compatible mode with DocumentDB and the FerretDB Docker APP
Battery-Included RDS
Get production-grade PostgreSQL database services locally immediately!
PostgreSQL is a near-perfect database kernel, but it needs more tools and systems to become a good enough database service (RDS). Pigsty helps PostgreSQL make this leap. Pigsty solves various challenges you’ll encounter when using PostgreSQL: kernel extension installation, connection pooling, load balancing, service access, high availability / automatic failover, log collection, metrics monitoring, alerting, backup recovery, PITR, access control, parameter tuning, security encryption, certificate issuance, NTP, DNS, parameter tuning, configuration management, CMDB, management playbooks… You no longer need to worry about these details!
Pigsty supports PostgreSQL 14 ~ 18 mainline kernels and other compatible forks, running on EL / Debian / Ubuntu and compatible OS distributions, available on x86_64 and ARM64 chip architectures, without container support required. Besides database kernels and many out-of-the-box extension plugins, Pigsty also provides complete infrastructure and runtime required for database services, as well as local sandbox / production environment / cloud IaaS auto-deployment solutions.
Pigsty can bootstrap an entire environment from bare metal with one click, reaching the last mile of software delivery. Ordinary developers and operations engineers can quickly get started and manage databases part-time, building enterprise-grade RDS services without database experts!
Rich Extensions
Hyper-converged multi-modal, use PostgreSQL for everything, one PG to replace all databases!
PostgreSQL’s soul lies in its rich extension ecosystem, and Pigsty uniquely deeply integrates 576 extensions from the PostgreSQL ecosystem, providing you with an out-of-the-box hyper-converged multi-modal database!
Extensions can create synergistic effects, producing 1+1 far greater than 2 results. You can use PostGIS for geospatial data, TimescaleDB for time-series/event stream data analysis, and Citus to upgrade it in-place to a distributed geospatial-temporal database; You can use PGVector to store and search AI embeddings, ParadeDB for ElasticSearch-level full-text search, and simultaneously use precise SQL, full-text search, and fuzzy vector for hybrid search. You can also achieve dedicated OLAP database/data lakehouse analytical performance through pg_duckdb, pg_mooncake and other analytical extensions.
Using PostgreSQL as a single component to replace MySQL, Kafka, ElasticSearch, MongoDB, and big data analytics stacks has become a best practice — a single database choice can significantly reduce system complexity, greatly improve development efficiency and agility, achieving remarkable software/hardware and development/operations cost reduction and efficiency improvement.
Flexible Modular Architecture
Flexible composition, free extension, multi-database support, monitor existing RDS/hosts/databases
Components in Pigsty are abstracted as independently deployable modules, which can be freely combined to address varying requirements. The INFRA module comes with a complete modern monitoring stack, while the NODE module tunes nodes to desired state and brings them under management.
Installing the PGSQL module on multiple nodes automatically forms a high-availability database cluster based on primary-replica replication, while the ETCD module provides consensus and metadata storage for database high availability.
Beyond these four core modules, Pigsty also provides a series of optional feature modules: The MINIO module can deploy Silo to provide local object storage and serve as a centralized database backup repository.
The REDIS module can provide auxiliary services for databases in standalone primary-replica, sentinel, or native cluster modes. The DOCKER module can be used to spin up stateless application software.
Additionally, Pigsty provides PG-compatible / derivative kernel support. You can use Babelfish for MS SQL Server compatibility, IvorySQL for Oracle compatibility,
OpenHaloDB for MySQL compatibility, and OrioleDB for ultimate OLTP performance.
Furthermore, you can use PostgreSQL Mongo mode for MongoDB compatibility, Supabase for Firebase compatibility, and PolarDB to meet domestic compliance requirements.
Message queues are covered by the KAFKA module, which deploys Kafka 4.x dynamic KRaft clusters.
More professional/pilot modules will be continuously introduced to Pigsty, such as GPSQL, DUCKDB, TIGERBEETLE, KUBERNETES, CONSUL, GREENPLUM, CLOUDBERRY, MYSQL, …
Stunning Observability
Using modern open-source observability stack, providing unparalleled monitoring best practices!
Pigsty provides best practices for monitoring based on the open-source Grafana / Prometheus modern observability stack: Grafana for visualization, VictoriaMetrics for metrics collection, VictoriaLogs for log collection and querying, Alertmanager for alert notifications. Blackbox Exporter for checking service availability. The entire system is also designed for one-click deployment as the out-of-the-box INFRA module.
Pigsty automatically monitors every managed component: host nodes, HAProxy load balancers, PostgreSQL databases, PgBouncer connection pools, Etcd metadata stores, Redis-compatible caches, Silo object storage, and the monitoring infrastructure itself. Grafana dashboards and preset alert rules provide immediate operational visibility. The same stack can also monitor applications, existing database instances, and cloud RDS services.
Whether for failure analysis or slow query optimization, capacity assessment or resource planning, Pigsty provides comprehensive data support, truly achieving data-driven operations. In Pigsty, over three thousand types of monitoring metrics are used to describe all aspects of the entire system, and are further processed, aggregated, analyzed, refined, and presented in intuitive visualization modes. From global overview dashboards to CRUD details of individual objects (tables, indexes, functions) in a database instance, everything is visible at a glance. You can drill down, roll up, or jump horizontally freely, browsing current system status and historical trends, and predicting future evolution.
Additionally, Pigsty’s monitoring system module can be used independently — to monitor existing host nodes and database instances, or cloud RDS services. With just one connection string and one command, you can get the ultimate PostgreSQL observability experience.
Visit the Screenshot Gallery and Online Demo for more details.
Battle-Tested Reliability
Out-of-the-box high availability and point-in-time recovery capabilities ensure your database is rock-solid!
For table/database drops caused by software defects or human error, Pigsty provides out-of-the-box PITR point-in-time recovery capability, enabled by default without additional configuration. As long as storage space allows, base backups and WAL archiving based on pgBackRest let you quickly return to any point within the recovery window. You can use local directories/disks, Silo deployed by the MINIO module, or external S3-compatible object-storage services to retain longer recovery windows, according to your budget.
Pigsty provides a high-availability self-healing architecture based on Patroni, etcd, and HAProxy. When the node, network, quorum, and synchronous-replica assumptions hold, it can fail over the primary automatically. Actual RTO and RPO depend on replication mode, failure type, timeout settings, and client reconnection behavior.
Pigsty includes built-in HAProxy load balancers for automatic traffic switching, providing DNS/VIP/LVS and other access methods for clients. Failover and active switchover are almost imperceptible to the business side except for brief interruptions, and applications don’t need to modify connection strings or restart. The minimal maintenance window requirements bring great flexibility and convenience: you can perform rolling maintenance and upgrades on the entire cluster without application coordination. The feature that hardware failures can wait until the next day to handle lets developers, operations, and DBAs sleep well. Many large organizations and core institutions have been using Pigsty in production for extended periods. The largest deployment has 25K CPU cores and 200+ PostgreSQL ultra-large instances; in this deployment case, dozens of hardware failures and various incidents occurred over six to seven years, DBAs changed several times, but still maintained availability higher than 99.999%.
Easy to Use and Maintain
Infra as Code, Database as Code, declarative APIs encapsulate database management complexity.
Pigsty provides services through declarative interfaces, elevating system controllability to a new level: users tell Pigsty “what kind of database cluster I want” through configuration inventories, without worrying about how to do it. In effect, this is similar to CRDs and Operators in K8S, but Pigsty can be used for databases and infrastructure on any node: whether containers, virtual machines, or physical machines.
Whether creating/destroying clusters, adding/removing replicas, or creating new databases/users/services/extensions/whitelist rules, you only need to modify the configuration inventory and run the idempotent playbooks provided by Pigsty, and Pigsty adjusts the system to your desired state. Users don’t need to worry about configuration details — Pigsty automatically tunes based on machine hardware configuration. You only need to care about basics like cluster name, how many instances on which machines, what configuration template to use: transaction/analytics/critical/tiny — developers can also self-serve. But if you’re willing to dive into the rabbit hole, Pigsty also provides rich and fine-grained control parameters to meet the demanding customization needs of the most meticulous DBAs.
Beyond that, Pigsty’s own installation and deployment is also one-click foolproof, with all dependencies pre-packaged, requiring no internet access during installation. The machine resources needed for installation can also be automatically obtained through Vagrant or Terraform templates, allowing you to spin up a complete Pigsty deployment from scratch on a local laptop or cloud VM in about ten minutes. The local sandbox environment can run on a 1-core 2GB micro VM, providing the same functional simulation as production environments, usable for development, testing, demos, and learning.
Solid Security Practices
Pigsty provides the security foundations required for database deployment: layered HBA, built-in roles and default privileges, SCRAM-SHA-256, page checksums, a local CA, component certificates, backup, PITR, centralized logs, and firewall configuration.
The defaults target development, testing, and demonstrations on a trusted intranet. Production deployments must replace public credentials, review network boundaries, enforce TLS where required, configure server-certificate verification, and establish backup recovery, privilege review, and incident-response processes.
Security and Compliance documents each mechanism’s default state and boundary. Security Considerations provides production hardening guidance, and Compliance maps relevant controls to MLPS and SOC 2. Whether a deployment meets a specific requirement depends on scope, organizational process, continuous evidence, and the auditor’s conclusion.
Broad Application Scenarios
Use preset Docker templates to spin up massive software using PostgreSQL with one click!
In various data-intensive applications, the database is often the trickiest part. For example, the core difference between GitLab Enterprise and Community Edition is the underlying PostgreSQL database monitoring and high availability. If you already have a good enough local PG RDS, you can refuse to pay for software’s homemade database components.
Pigsty provides the Docker module and many out-of-the-box Compose templates. You can use Pigsty-managed high-availability PostgreSQL (as well as Redis and Silo) as backend storage, spinning up these software in stateless mode with one click: GitLab, Gitea, Wiki.js, NocoDB, Odoo, Jira, Confluence, Harbor, Mastodon, Discourse, KeyCloak, Mattermost, etc. If your application needs a reliable PostgreSQL database, Pigsty is perhaps the simplest way to get one.
Pigsty also provides application development toolsets closely related to PostgreSQL: PGAdmin4, PGWeb, ByteBase, PostgREST, Kong, as well as EdgeDB, FerretDB, Supabase — these “upper-layer databases” using PostgreSQL as storage. More wonderfully, you can build interactive data applications quickly in a low-code manner based on the Grafana and Postgres built into Pigsty, and even use Pigsty’s built-in ECharts panels to create more expressive interactive visualization works.
Pigsty provides a powerful runtime for your AI applications. Your agents can leverage PostgreSQL and the powerful capabilities of the observability world in this environment to quickly build data-driven intelligent agents.
Open-Source Free Software
Pigsty is free software open-sourced under Apache-2.0, watered by the passion of PostgreSQL-loving community members
Pigsty is completely open-source and free software, allowing you to run enterprise-grade PostgreSQL database services at nearly pure hardware cost without database experts. For comparison, database vendors’ “enterprise database services” and public cloud vendors’ RDS charge premiums several to over ten times the underlying hardware resources as “service fees.”
Many users choose the cloud precisely because they can’t handle databases themselves; many users use RDS because there’s no other choice. We will break cloud vendors’ monopoly, providing users with a cloud-neutral, better open-source RDS alternative: Pigsty follows PostgreSQL upstream closely, with no vendor lock-in, no annoying “licensing fees,” no node count limits, and no data collection. All your core assets — data — can be “autonomously controlled,” in your own hands.
Pigsty itself aims to replace tedious manual database operations with database autopilot software, but even the best software can’t solve all problems. There will always be some rare, low-frequency edge cases requiring expert intervention. This is why we also provide professional subscription services to provide safety nets for enterprise users who need them. Subscription consulting fees of tens of thousands are less than one-thirtieth of a top DBA’s annual salary, completely eliminating your concerns and putting costs where they really matter. For community users, we also contribute with love, providing free support and daily Q&A.
tooltip: { trigger: axis, formatter: $fn:ttfmt }
legend: { top: 4, itemGap: 16, data: [Oracle, Open-Source PG, Cloud RDS, Pigsty over IaaS, Pigsty over IDC ] }
grid: { left: 96, right: 36, bottom: 70, top: 50 }
xAxis:
type: category
name: CPU Cores
nameLocation: middle
nameGap: 36
boundaryGap: false
data: [2, 4, 8, 12, 16, 24, 32, 52, 64, 104, 128, 196, 256, 384, 512]
yAxis:
type: log
logBase: 10
min: 10
name: Monthly Cost (CNY)
axisLabel: { formatter: $fn:yfmt }
splitLine: { show: true, lineStyle: { type: dashed, opacity: 0.5 } }
series:
- { name: Oracle, type: line, symbolSize: 7, lineStyle: { width: 3 }, itemStyle: { color: "#d62728" }, data: [45000, 65000, 105000, 145000, 185000, 265000, 345000, 545000, 665000, 1065000, 1305000, 1985000, 2585000, 3865000, 5145000] }
- { name: Cloud RDS, type: line, symbolSize: 6, lineStyle: { width: 2 }, itemStyle: { color: "#ff7f0e" }, data: [800, 1600, 3200, 4800, 6400, 9600, 12800, 20800, 25600, 41600, 51200, 78400, 102400, 153600, 204800] }
- { name: Pigsty over IaaS, type: line, symbolSize: 6, lineStyle: { width: 2 }, itemStyle: { color: "#2ca02c" }, data: [360, 720, 1440, 2160, 2880, 4320, 5760, 9360, 11520, 18720, 23040, 35280, 46080, 69120, 92160] }
- { name: Pigsty over IDC, type: line, symbolSize: 6, lineStyle: { width: 2 }, itemStyle: { color: "#9467bd" }, data: [38, 76, 152, 228, 304, 456, 608, 988, 1216, 1976, 2432, 3724, 4864, 7296, 9728] }4.2 - History
Historical Origins
The Pigsty project began in 2018-2019, originating from Tantan. Tantan is an internet dating app — China’s Tinder, now acquired by Momo. Tantan was a Nordic-style startup with a Swedish engineering founding team.
Tantan had excellent technical taste, using PostgreSQL and Go as its core technology stack. The entire Tantan system architecture was modeled after Instagram, designed entirely around the PostgreSQL database. Up to several million daily active users, millions of TPS, and hundreds of TB of data, the data component used only PostgreSQL. Almost all business logic was implemented using PG stored procedures — even including 100ms recommendation algorithms! It was arguably the most complex PostgreSQL-at-scale use case in China at the time.
This atypical development model of deeply using PostgreSQL features placed extremely high demands on the capabilities of engineers and DBAs. And Pigsty is the open-source project we forged in this real-world large-scale, high-standard database cluster scenario — embodying our experience and best practices as top PostgreSQL experts.
Development Process
In the beginning, Pigsty did not have the vision, goals, and scope it has today. It started as a PostgreSQL monitoring system for our own use. We surveyed all available solutions — open-source, commercial, cloud-based, datadog, pgwatch, etc. — and none could meet our observability needs. So I decided to build one myself based on Grafana and Prometheus. This became Pigsty’s predecessor and prototype. Pigsty as a monitoring system was quite impressive, helping us solve countless management problems.
Subsequently, developers wanted such a monitoring system on their local development machines, so we used Ansible to write provisioning playbooks, transforming this system from a one-time construction task into reusable, replicable software. New versions allowed users to use Vagrant and Terraform, using Infrastructure as Code to quickly spin up local DevBox development machines or production environment servers, automatically completing PostgreSQL and monitoring system deployment.
Next, we redesigned the production environment PostgreSQL architecture, introducing Patroni and pgBackRest to solve database high availability and point-in-time recovery issues. We developed a zero-downtime migration solution based on logical replication, rolling upgrading two hundred production database clusters to the latest major version through blue-green deployment. And we incorporated these capabilities into Pigsty.
Pigsty is software we built for ourselves. The biggest benefit of “eating our own dog food” is that we are both developers and users — as client users, we know exactly what we need, do not cut corners, and never worry about automating ourselves out of jobs.
We solved problem after problem, depositing the solutions into Pigsty. Pigsty’s positioning also gradually evolved from a monitoring system into an out-of-the-box PostgreSQL database distribution. We then decided to open-source Pigsty and began a series of technical sharing and publicity, and external users from various industries began using Pigsty and providing feedback.
Full-Time Entrepreneurship
In 2022, the Pigsty project received seed funding from Miracle Plus, initiated by Dr. Qi Lu, allowing me to work on this full-time.
As an open-source project, Pigsty has developed quite well. In these years of full-time work, Pigsty’s GitHub stars grew from a few hundred to 5,213 as of 2026-07-11; it made the HN front page, and growth began snowballing. In November 2025, Pigsty won the Magneto Award at the PostgreSQL Ecosystem Conference. In 2026, Pigsty’s subproject PGEXT.CLOUD was selected for a PGCon.Dev 2026 talk. Pigsty became the first Chinese open-source project to appear on the stage of this core PostgreSQL ecosystem conference.
Previously, Pigsty could only run on CentOS 7, but now it covers all mainstream Linux distributions (EL, Debian, Ubuntu) across 16 operating system platforms. Supported PG major versions cover 14-18, and we maintain and integrate 576 extension plugins in the PG ecosystem. Among these, I personally maintain over half (360+) of the extension plugins, providing out-of-the-box RPM/DEB packages. Including Pigsty itself, “based on open source, giving back to open source,” this is our way of contributing to the PG ecosystem.
Pigsty’s positioning has also continuously evolved from a PostgreSQL database distribution to an open-source cloud database. It truly benchmarks against cloud vendors’ entire cloud database brands.
Rebel Against Public Clouds
Public cloud vendors like AWS, Azure, GCP, and Aliyun have provided many conveniences for startups, but they are closed-source and force users to rent infrastructure at exorbitant fees.
We believe that excellent database services, like excellent database kernels, should be accessible to every user, rather than requiring expensive rental from cyber lords.
Cloud computing’s agility and elasticity value proposition is strong, but it should be free, open-source, inclusive, and local-first — We believe the cloud computing universe needs a solution representing open-source values that returns infrastructure control to users without sacrificing the benefits of the cloud.
Therefore, we are also leading a movement and battle to exit the cloud, as rebels against public clouds, to reshape the industry’s values.
Our Vision
I hope that in the future world, everyone will have the de facto right to freely use excellent services, rather than being confined to a few cyber lord public cloud giants’ territories as cyber tenants or even cyber serfs.
This is exactly what Pigsty aims to do — a better, free and open-source RDS alternative. Allowing users to spin up database services better than cloud RDS anywhere (including cloud servers) with one click.
Pigsty is a complete complement to PostgreSQL, and a spicy mockery of cloud databases. It literally means “pigsty,” but it’s also an acronym for Postgres In Great STYle, meaning “PostgreSQL in its full glory.”
Pigsty itself is completely open-source and free software, so you can build a PostgreSQL service that scores 90 without database experts. We sustain operations by providing premium consulting services to take you from 90 to 100, with warranty, Q&A, and a safety net.
A well-built system may run for years without needing a “safety net,” but database problems, once they occur, are never small. Often, expert experience can turn decay into magic, and we provide such premium consulting — we believe this is a more just, reasonable, and sustainable model.
About the Team
I am Feng Ruohang, the author of Pigsty. Almost all of Pigsty’s code is developed by me alone.
Individual heroism still exists in the software field. Only unique individuals can create unique works — I hope Pigsty becomes such a work.
If you’re interested in me, here’s my personal homepage: https://vonng.com/
“Modb Interview with Feng Ruohang” (Chinese)
“Post-90s, Quit to Start Business, Says Will Crush Cloud Databases” (Chinese)
4.3 - News & Events
Recent News
2026-08-15: Pigsty v4.5.0 officially released: Kafka, MySQL, Valkey, Silo, and 575 extensions
- Release Blog: Pigsty v4.5 Release Article
- Release Notes: v4.5.0
- Highlights: Kafka KRaft and MySQL 8.4 pilot modules, Valkey in REDIS, Silo as the MINIO backend, 575 total extensions, cluster-identity-aware orchestration, and offline packages for all seven recommended OS versions.
2026-07-10: Pigsty v4.4.0 officially released: PG19 beta support and 531 extensions
- Release Notes: v4.4.0
- Highlights: PostgreSQL 18.4 / 19 beta support, 531 total extensions, kernel and package updates, and Pig CLI improvements.
2026-05-01: Pigsty v4.3.0 officially released: 510 extensions, Ubuntu 26 support
- Release Notes: v4.3.0
- Highlights: Infra / PGSQL / kernel package batch updates, Ubuntu 26.04 offline package coverage, and 510 total extensions.
2026-03-06: Pigsty v4.2.1 released! Drop PG13, 464 extensions
- Release Notes: v4.2.1
2026-02-28: Pigsty v4.2 is officially released! Seven kernel updates shipped together
- Release Blog: Pigsty v4.2 Release Article
- Release Notes: v4.2.0
2026-02-12: Pigsty v4.1 is officially released! First distribution batch with PostgreSQL 18.2 support
- Release Blog: Pigsty v4.1 Release Article
- Release Notes: v4.1.0
- Pigsty minor-release support is now available: 18.2…
2026-02-04: Extension for Everyone selected as a PGCon.Dev 2026 talk!
2026-02-03: Pigsty v4.0 Released! Entering the Agent era!
- PostgreSQL official news: “Pigsty v4.0 Released: Ready for the Agent Era”
- Victoria observability revolution, security hardening, new JUICE/VIBE modules, container support, license switched to Apache-2.0
- Release Notes: v4.0.0
- Release Blog: Pigsty v4.0: Entering the AI Era
2026-01-30: PIG v1.0 Released! Launched together with the PGEXT.CLOUD extension catalog
- PostgreSQL official news: “PIG v1.0 Released with PGEXT.CLOUD: 444 PG extensions on 14 Linux”
- PostgreSQL extension package manager pig v1.0 is GA, with PGEXT.CLOUD open extension infrastructure and 444 extensions
2025-12-02: Pigsty v3.7.0 Released! PG18 becomes default, 437 extensions, EL10/Debian13 support
- Release Notes: v3.7.0
2025-11-29: Pigsty won the PostgreSQL Magneto Award!
- The 8th Conference of PostgreSQL Ecosystem (Hangzhou, China)
- Topics: “A World-Grade Postgres Meta Distribution”, AI database considerations, PostgreSQL delivery best practices
2025-08-15: Pigsty v3.6.1 Released! Routine PG minor update, PGDG China regional mirrors
- Release Notes: v3.6.1
2025-08-04: Pigsty v3.6.0 Released! PostgreSQL meta-distribution
- PostgreSQL official news: “Pigsty 3.6, the meta-distribution for PostgreSQL”
- pgactive multi-primary replication, MinIO/ETCD improvements, simplified installation, configuration cleanup
- Release Notes: v3.6.0
2025-06-16: Pigsty v3.5.0 Released! PG18 beta support, 421 extensions, monitoring upgrade, code refactor
- Release Notes: v3.5.0
2025-04-21: Pigsty v3.4 Released! MySQL compatibility
- PostgreSQL official news: “Pigsty v3.4 Released, PG RDS with MySQL Compatibility”
- OpenHalo/OrioleDB support, better backups, automatic Certbot certificates, AGE extension
- Release Notes: v3.4.1 / v3.4.0
2025-03-07: Pigsty v3.3.0 Released! 404 extensions
- PostgreSQL official news: “Pigsty v3.3 Release: with 404 PostgreSQL Extensions”
- Odoo/Dify/Supabase app templates, DocumentDB support
- Release Notes: v3.3.0
2025-01: Pigsty v3.2.x release series (v3.2.0 ~ v3.2.2)
PostgreSQL Package Manager
pigReleased!2024-11: Pigsty v3.1.0 Released! PG17 default, self-hosted Supabase, ARM/Ubuntu24 support
- PostgreSQL official news: “Pigsty v3.1 Release: PG17, Duck Extensions, Self-hosting Supabase, ARM & Ubuntu24”
- Blog Post: “Pigsty v3.1: Self-hosted Supabase, PG17 Default, MinIO Improvements, ARM & Ubuntu24 Support”
- Release Notes: v3.1.0
2024-08 ~ 2024-10: Pigsty v3.0.x release series (v3.0.0 ~ v3.0.4)
- PostgreSQL official news: “Pigsty v3: 336 extensions and MSSQL/Oracle flavor PG kernels!”
- 333 extensions, replaceable kernels, MSSQL/Oracle/PolarDB compatibility, PG17 extensions
- Release Notes: v3.0.0 ~ v3.0.4
- Feature Introduction: Pigsty v3.0.0
2024-08: Pigsty supplementary repository provides 254 additional ready-to-use binary RPM/DEB extensions!
- PostgreSQL official news: “Pigsty Supplementary APT/YUM Repository with 254 additional PostgreSQL Extensions!”
2024-05: Pigsty v2.7 Released!
- PostgreSQL official news: “Pigsty v2.7 Released, free RDS PG with 255 extensions available”
- Pigsty Blog: Pigsty v2.7: The Great Integration
2024-02: Pigsty v2.6 Released!
- PostgreSQL official news: “Pigsty, Battery-included PostgreSQL Distro & Free RDS Alternative, v2.6 released!”
- Pigsty Blog: Pigsty v2.6: PG Challenges OLAP
Conferences & Talks
| Date | Type | Event | Topic |
|---|---|---|---|
| 2025-11-29 | Award&Talk | The 8th Conf of PG Ecosystem (Hangzhou) | PostgreSQL Magneto Award, A World-Grade Postgres Meta Distribution |
| 2025-05-16 | Lightning | PGConf.Dev 2025, Montreal | Extension Delivery: Make your PGEXT accessible to users |
| 2025-05-12 | Keynote | PGEXT.DAY, PGCon.Dev 2025 | The Missing Package Manager and Extension Repo for PostgreSQL Ecosystem |
| 2025-04-19 | Workshop | PostgreSQL Database Technology Summit | Using Pigsty to Deploy PG Ecosystem Partners: Dify, Odoo, Supabase |
| 2025-04-11 | Live Host | OSCHINA Data Intelligence Talk | Is the Viral MCP Hype or Revolutionary? |
| 2025-01-15 | Live Stream | Open Source Veterans & Newcomers Episode 4 | PostgreSQL Extensions Devouring DB World? PG Package Manager pig & Self-hosted RDS |
| 2025-01-09 | Award | OSCHINA 2024 Outstanding Contribution Expert | Outstanding Contribution Expert Award |
| 2025-01-06 | Panel | China PostgreSQL Database Ecosystem Conference | PostgreSQL Extensions are Devouring the Database World |
| 2024-11-23 | Podcast | Tech Hotpot Podcast | From the Linux Foundation: Why the Recent Focus on ‘Chokepoints’? |
| 2024-08-21 | Interview | Blue Tech Wave | Interview with Feng Ruohang: Simplifying PG Management |
| 2024-08-15 | Tech Summit | GOTC Global Open Source Technology Summit | PostgreSQL AI/ML/RAG Extension Ecosystem and Best Practices |
| 2024-07-12 | Keynote | 13th PG China Technical Conference | The Future of Database World: Extensions, Service, and Postgres |
| 2024-05-31 | Unconference | PGCon.Dev 2024 Global PG Developer Conference | Built-in Prometheus Metrics Exporter |
| 2024-05-28 | Seminar | PGCon.Dev 2024 Extension Summit | Extension in Core & Binary Packing |
| 2024-05-10 | Live Debate | Three-way Talk: Cloud Mudslide Series Episode 3 | Is Public Cloud a Scam? |
| 2024-04-17 | Live Debate | Three-way Talk: Cloud Mudslide Series Episode 2 | Are Cloud Databases a Tax on Intelligence? |
| 2024-04-16 | Panel | Cloudflare Immerse Shenzhen | Cyber Bodhisattva Panel Discussion |
| 2024-04-12 | Tech Summit | 2024 Data Technology Carnival | Pigsty: Solving PostgreSQL Operations Challenges |
| 2024-03-31 | Live Debate | Three-way Talk: Cloud Mudslide Series Episode 1 | Luo Selling Cloud While We’re Moving Off Cloud? |
| 2024-01-24 | Live Host | OSCHINA Open Source Talk Episode 9 | Will DBAs Be Eliminated by Cloud? |
| 2023-12-20 | Live Debate | Open Source Talk Episode 7 | To Cloud or Not: Cost Cutting or Value Creation? |
| 2023-11-24 | Tech Summit | Vector Databases in the LLM Era | Panel: New Future of Vector Databases in the AI Age |
| 2023-09-08 | Interview | Motianlun Feature Interview | Feng Ruohang: A Tech Enthusiast Who Makes Great Open Source Founders |
| 2023-08-16 | Tech Summit | DTCC 2023 | DBA Night: PostgreSQL vs MySQL Open Source License Issues |
| 2023-08-09 | Live Debate | Open Source Talk Episode 1 | MySQL vs PostgreSQL: Which is World’s No.1? |
| 2023-07-01 | Tech Summit | SACC 2023 | Workshop 8: FinOps Practice: Cloud Cost Management & Optimization |
| 2023-05-12 | Meetup | PostgreSQL China Wenzhou Meetup | PG With DB4AI: Vector Database PGVECTOR & AI4DB: Self-Driving Database Pigsty |
| 2023-04-08 | Tech Summit | Database Carnival 2023 | A Better Open Source RDS Alternative: Pigsty |
| 2023-04-01 | Tech Summit | PostgreSQL China Xi’an Meetup | PG High Availability & Disaster Recovery Best Practices |
| 2023-03-23 | Live Stream | Bytebase x Pigsty | Best Practices for Managing PostgreSQL: Bytebase x Pigsty |
| 2023-03-04 | Tech Summit | PostgreSQL China Conference | Challenging RDS, Pigsty v2.0 Release |
| 2023-02-01 | Tech Summit | DTCC 2022 | Open Source RDS Alternative: Battery-Included, Self-Driving Database Distro Pigsty |
| 2022-07-21 | Live Debate | Cloud Swallows Open Source | Can Open Source Strike Back Against Cloud? |
| 2022-07-04 | Interview | Creator’s Story | Post-90s Developer Quits to Start Up, Aiming to Challenge Cloud Databases |
| 2022-06-28 | Live Stream | Bass’s Roundtable | DBA’s Gospel: SQL Audit Best Practices |
| 2022-06-12 | Demo Day | MiraclePlus S22 Demo Day | User-Friendly Cost-Effective Database Distribution Pigsty |
| 2022-06-05 | Live Stream | PG Chinese Community Sharing | Pigsty v1.5 Quick Start, New Features & Production Cluster Setup |
4.4 - Roadmap
Release Strategy
Pigsty uses semantic versioning: <major>.<minor>.<patch>. Alpha/Beta/RC versions will have suffixes like -a1, -b1, -c1 appended to the version number.
Major version updates signify incompatible foundational changes and major new features; minor version updates typically indicate regular feature updates and small API changes; patch version updates mean bug fixes and package version updates.
Pigsty plans to release one major version update per year. Minor version updates usually follow PostgreSQL’s minor version update rhythm, catching up within a month at the latest after a new PostgreSQL version is released. Pigsty typically plans 4-6 minor versions per year. For complete release history, please refer to Release Notes.
Pigsty develops using the main trunk branch. Please always use Releases with version numbers.
Unless you know what you’re doing, do not use GitHub’s main branch. Always check out and use a specific version.
Features Under Consideration
- Agent Native CLI - PIG
- DBA Agent - basic integration
- Grafana dashboard improvements
- Boar management console
Here are our Active Issues and Roadmap.
Extensions and Packages
For the extension support roadmap, you can find it here: /ext/e/roadmap
Under Consideration
- PDU: https://github.com/wublabdubdub/PDU-PostgreSQLDataUnloader
- walminer https://gitee.com/movead/XLogMiner
- is_jsonb_valid https://github.com/furstenheim/is_jsonb_valid
- pg_kafka https://github.com/xstevens/pg_kafka
- pg_jieba https://github.com/jaiminpan/pg_jieba
- pg_paxos https://github.com/microsoft/pg_paxos
- OneSparse https://github.com/OneSparse/OneSparse
- PipelineDB https://github.com/pipelinedb/pipelinedb
- SQL Firewall https://github.com/uptimejp/sql_firewall
- zcurve https://github.com/bmuratshin/zcurve
- PG dot net https://github.com/Brick-Abode/pldotnet/releases
- pg_scws: https://github.com/jaiminpan/pg_scws
- themsis: https://github.com/cossacklabs/pg_themis
- pgspeck https://github.com/johto/pgspeck
- lsm3 https://github.com/postgrespro/lsm3
- monq https://github.com/postgrespro/monq
- pg_badplan https://github.com/trustly/pg_badplan
- pg_recall https://github.com/mreithub/pg_recall
- pgfsm https://github.com/michelp/pgfsm
- pg_trgm pro https://github.com/postgrespro/pg_trgm_pro
- pgsql-fio: https://github.com/csimsek/pgsql-fio
Not Considering for Now
- pg_tier: not ready due to incomplete dep parquet_s3_fdw
- parquet_s3_fdw: not ready due to compiler version
- pg_top: not ready due to cmake error
- timestamp9: not ready due to compiler error
- pg_tier obsolete
- pg_timeseries, we already have timescaledb
- pg_quack, we already have a pg_lakehouse
- pg_telemetry, we already have better observability
- pgx_ulid, https://github.com/pksunkara/pgx_ulid, already covered by pg_idkit (MIT, but RUST)
- embedding: obsolete
- FEAT zson https://github.com/postgrespro/zson MIT C (too old)
- GIS pghydro https://github.com/pghydro/pghydro C GPL-2.0 6.6 (no makefile)
- https://github.com/Zeleo/pg_natural_sort_order (too old)
- https://github.com/postgrespro/pg_query_state
- https://github.com/no0p/pgsampler
- pg_lz4 https://github.com/zilder/pg_lz4
- pg_amqp https://github.com/omniti-labs/pg_amqp
- tinyint https://github.com/umitanuki/tinyint-postgresql
- pg_blkchain https://github.com/blkchain/pg_blkchain
- hashtypes https://github.com/pandrewhk/hashtypes
- foreign_table_exposer https://github.com/komamitsu/foreign_table_exposer
- ldap_fdw https://github.com/guedes/ldap_fdw
- pg_backtrace https://github.com/postgrespro/pg_backtrace
- connection_limits https://github.com/tvondra/connection_limits
- fixeddecimal https://github.com/2ndQuadrant/fixeddecimal
4.5 - Join the Community
GitHub
Our GitHub repository is: https://github.com/pgsty/pigsty. Please give us a ⭐️ star!
We welcome anyone to submit new Issues or create Pull Requests, propose feature suggestions, and contribute to Pigsty.
Please note that for issues related to Pigsty documentation, please submit Issues in the github.com/pgsty/pigsty.cc repository.
Press ⌘ with K on macOS, or Ctrl with K, to search the documentation, extension catalog, and blog directly.
Maintainers
Pigsty is built by its maintainers and community.
WeChat Groups
Chinese users are mainly active in WeChat groups. Currently, there are seven active groups. Groups 1-4 are full; for other groups, you need to add the assistant’s WeChat to be invited.
To join the WeChat community, search for “Pigsty小助手” (WeChat ID: pigsty-cc), note or send “加群” (join group), and the assistant will invite you to the group.

International Community
Telegram: https://t.me/joinchat/gV9zfZraNPM3YjFh
Discord: https://discord.gg/j5pG8qfKxU
You can also contact me via email: [email protected]
Community Help
When you encounter problems using Pigsty, you can seek help from the community. The more information you provide, the more likely you are to get help from the community.
Please refer to the Community Help Guide and provide as much information as possible so that community members can help you solve the problem. Here is a reference template for asking for help:
What happened? (Required)
Pigsty version and OS version (Required)
Some cloud providers have customized standard OS distributions. You can tell us which cloud provider’s OS image you are using. If you have customized and modified the environment after installing the OS, or if there are specific security rules and firewall configurations in your LAN, please also inform us when asking questions.
Pigsty configuration file
Please don’t forget to redact any sensitive information: passwords, internal keys, sensitive configurations, etc.
What did you expect to happen?
Please describe what should happen under normal circumstances, and how the actual situation differs from expectations.
How to reproduce this issue?
Please tell us in as much detail as possible how to reproduce this issue.
Monitoring screenshots
If you are using the monitoring system provided by Pigsty, you can provide relevant screenshots.
Error logs
Please provide logs related to the error as much as possible. Please do not paste content like “Failed to start xxx service” that has no informational value.
You can query logs from Grafana / VictoriaLogs, or get logs from the following locations:
- Syslog:
/var/log/messages(rhel) or/var/log/syslog(debian) - Postgres:
/pg/log/postgres/* - Patroni:
/pg/log/patroni/* - Pgbouncer:
/pg/log/pgbouncer/* - Pgbackrest:
/pg/log/pgbackrest/*
Have you searched Issues/Website/FAQ?
In the FAQ, we provide answers to many common questions. Please check before asking.
You can also search for related issues from GitHub Issues and Discussions:
Is there any other information we need to know?
The more information and context you provide, the more likely we can help you solve the problem.
4.6 - Privacy Policy
Pigsty Software
When you install Pigsty software, if you use offline package installation in a network-isolated environment, we will not receive any data about you.
If you choose online installation, when downloading related packages, our servers or cloud provider servers will automatically log the visiting machine’s IP address and/or hostname in the logs, along with the package names you downloaded.
We will not share this information with other organizations unless required by law. (Honestly, we’d have to be really bored to look at this stuff.)
Pigsty’s primary domain is: pigsty.io. For mainland China, please use the registered mirror site pigsty.cc.
Pigsty Website
When you visit our website, our servers will automatically log your IP address and/or hostname in Nginx logs.
We will only store information such as your email address, name, and location when you decide to send us such information by completing a survey or registering as a user on one of our websites.
We collect this information to help us improve website content, customize web page layouts, and contact people for technical and support purposes. We will not share your email address with other organizations unless required by law.
This website uses Google Analytics, a web analytics service provided by Google, Inc. (“Google”). Google Analytics uses “cookies,” which are text files placed on your computer to help the website analyze how users use the site.
The information generated by the cookie about your use of the website (including your IP address) will be transmitted to and stored by Google on servers in the United States. Google will use this information to evaluate your use of the website, compile reports on website activity for website operators, and provide other services related to website activity and internet usage. Google may also transfer this information to third parties if required by law or where such third parties process the information on Google’s behalf. Google will not associate your IP address with any other data held by Google. You may refuse the use of cookies by selecting the appropriate settings on your browser, however, please note that if you do this, you may not be able to use the full functionality of this website. By using this website, you consent to the processing of data about you by Google in the manner and for the purposes set out above.
If you have any questions or comments about this policy, or request deletion of personal data, you can contact us by sending an email to [email protected]
4.7 - License
License Summary
Pigsty core uses Apache-2.0; documentation uses CC BY 4.0.
Official License: https://github.com/pgsty/pigsty/blob/main/LICENSE
Pigsty Core
The Pigsty core is licensed under Apache License 2.0.
Apache-2.0 is a permissive open-source license. You may freely use, modify, and distribute the software for commercial purposes without opening your own source code or adopting the same license.
| What This License Grants | What This License Does NOT Grant | License Conditions |
|---|---|---|
| Commercial use | Trademark use | Include license and copyright notice |
| Modification | Liability & warranty | State changes |
| Distribution | ||
| Patent grant | ||
| Private use |
Pigsty Documentation
Pigsty documentation sites (pigsty.cc, pigsty.io, pgsty.com) use Creative Commons Attribution 4.0 International (CC BY 4.0).
CC BY 4.0 permits free sharing and adaptation with appropriate credit, a license link, and indication of changes.
| What This License Grants | What This License Does NOT Grant | License Conditions |
|---|---|---|
| Commercial use | Trademark use | Attribution |
| Modification | Liability & warranty | Indicate changes |
| Distribution | Patent grant | Provide license link |
| Private use |
SBOM Inventory
Open-source software used or related to the Pigsty project.
For 576 PostgreSQL extension plugin licenses, refer to PostgreSQL Extension License List.
| Module | Software Name | License | Purpose & Description | Necessity |
|---|---|---|---|---|
| PGSQL | PostgreSQL | PostgreSQL License | PostgreSQL kernel | Required |
| PGSQL | patroni | MIT License | PostgreSQL high availability | Required |
| ETCD | etcd | Apache License 2.0 | HA consensus and distributed config storage | Required |
| INFRA | Ansible | GPLv3 | Executes playbooks and management commands | Required |
| INFRA | Nginx | BSD-2 | Exposes Web UI and serves local repo | Recommended |
| PGSQL | pgbackrest | MIT License | PITR backup/recovery management | Recommended |
| PGSQL | pgbouncer | ISC License | PostgreSQL connection pooling | Recommended |
| PGSQL | vip-manager | BSD 2-Clause License | Automatic L2 VIP binding to PG primary | Recommended |
| PGSQL | pg_exporter | Apache License 2.0 | PostgreSQL and PgBouncer monitoring | Recommended |
| NODE | node_exporter | Apache License 2.0 | Host node monitoring metrics | Recommended |
| NODE | haproxy | HAPROXY’s License (GPLv2) | Load balancing and service exposure | Recommended |
| INFRA | Grafana | AGPLv3 | Database visualization platform | Recommended |
| INFRA | VictoriaMetrics | Apache License 2.0 | TSDB, metric collection, alerting | Recommended |
| INFRA | VictoriaLogs | Apache License 2.0 | Centralized log collection, storage, query | Recommended |
| INFRA | DNSMASQ | GPLv2 / GPLv3 | DNS resolution and cluster name lookup | Recommended |
| MINIO | Silo | AGPLv3 | The only object-storage service supported by the current MINIO module | Optional |
| INFRA | Historical MinIO branch | AGPLv3 | Historical/repository package; not a v4.5 MINIO backend | Optional |
| INFRA | RustFS | Apache License 2.0 | Repository-retained package; not a v4.5 MINIO backend | Optional |
| NODE | keepalived | MIT License | VIP binding on node clusters | Optional |
| REDIS | Redis | BSD 3-Clause | Default cache engine, using the Redis 7.2 BSD branch | Optional |
| REDIS | Valkey | BSD 3-Clause | Cache engine selected with redis_type: valkey | Optional |
| REDIS | Redis Exporter | MIT License | Redis monitoring | Optional |
| MONGO | FerretDB | Apache License 2.0 | MongoDB compatibility over PostgreSQL | Optional |
| DOCKER | docker-ce | Apache License 2.0 | Container management | Optional |
| CLOUD | SealOS | Apache License 2.0 | Fast K8S cluster deployment and packaging | Optional |
| DUCKDB | DuckDB | MIT | High-performance analytics | Optional |
| External | Vagrant | Business Source License 1.1 | Local test environment VMs | Optional |
| External | Terraform | Business Source License 1.1 | One-click cloud resource provisioning | Optional |
| External | Virtualbox | GPLv2 | Virtual machine management software | Optional |
Necessity Levels:
- Required: Essential core capabilities, no option to disable
- Recommended: Enabled by default, can be disabled via configuration
- Optional: Not enabled by default, can be enabled via configuration
Apache-2.0 License Text
4.8 - Sponsor Us
Sponsor Us
Pigsty is a free and open-source software, passionately developed by PostgreSQL community members, aiming to integrate the power of the PostgreSQL ecosystem and promote the widespread adoption of PostgreSQL. If our work has helped you, please consider sponsoring or supporting our project:
- Sponsor us directly with financial support - express your sincere support in the most direct and powerful way!
- Consider purchasing our Technical Support Services. We can provide professional PostgreSQL high-availability cluster deployment and maintenance services, making your budget worthwhile!
- Share your Pigsty use cases and experiences through articles, talks, and videos.
- Allow us to mention your organization in “Users of Pigsty.”
- Recommend/refer our project and services to friends, colleagues, and clients in need.
- Follow our WeChat Official Account and share relevant technical articles to groups and your social media.
Angel Investors
Pigsty is a project invested by Miracle Plus (formerly YC China) S22. We thank Miracle Plus and Dr. Qi Lu for their support of this project!
Sponsors
Special thanks to Vercel for sponsoring pigsty and hosting the Pigsty website.
Special thanks to JetBrains for sponsoring Pigsty with JetBrains Open Source License
4.9 - User Cases
According to Google Analytics PV and download statistics, Pigsty currently has approximately 100,000 users, with half from mainland China and half from other regions globally. They span across multiple industries including internet, cloud computing, finance, autonomous driving, manufacturing, tech innovation, ISV, and defense. If you are using Pigsty and are willing to share your case and Logo with us, please contact us - we offer one free consultation session as a token of appreciation.
Internet
Tantan: 200+ physical machines for PostgreSQL and Redis services
Bilibili: Supporting PostgreSQL innovative business
Cloud Vendors
Bitdeer: Providing PG DBaaS
Oracle OCI: Using Pigsty to deliver PostgreSQL clusters
Finance
AirWallex: Monitoring 200+ GCP PostgreSQL databases
Media & Entertainment
Media Storm: Self-hosted PG RDS / Victoria Metrics
Autonomous Driving
Momenta: Autonomous driving, managing self-hosted PostgreSQL clusters
Manufacturing
Huafon Group: Using Pigsty to deliver PostgreSQL clusters as chemical industry time-series data warehouse
Tech Innovation
Beijing Lingwu Technology: Migrating PostgreSQL from cloud to self-hosted
Motphys: Self-hosted PostgreSQL supporting GitLab
Sailong Biotech: Self-hosted Supabase
Hangzhou Lingma Technology: Self-hosted PostgreSQL
ISV
Inner Mongolia Haode Tianmu Technology Co., Ltd.
Shanghai Yuanfang
DSG
4.10 - Subscription
Pigsty aims to unite the power of the PostgreSQL ecosystem and help users make the most of the world’s most popular database, PostgreSQL, with self-driving database management software.
While Pigsty itself has already resolved many issues in PostgreSQL usage, achieving truly enterprise-grade service quality requires expert support and comprehensive coverage from the original provider. We deeply understand the importance of professional commercial support for enterprise customers. Therefore, Pigsty Enterprise Edition provides a series of value-added services on top of the open-source version, helping users better utilize PostgreSQL and Pigsty for customers to choose according to their needs.
If you have any of the following needs, please consider Pigsty subscription service:
- Running databases in critical scenarios requiring strict SLA guarantees and comprehensive coverage.
- Need comprehensive support for complex issues related to Pigsty and PostgreSQL.
- Seeking guidance on PostgreSQL/Pigsty production environment best practices.
- Want experts to help interpret monitoring dashboards, analyze and identify performance bottlenecks and fault root causes, and provide recommendations.
- Need to plan database architectures that meet security/disaster recovery/compliance requirements based on existing resources and business needs.
- Need to migrate from other databases to PostgreSQL, or migrate and transform legacy instances.
- Building an observability system, data dashboards, and visualization applications based on the Victoria/Grafana technology stack.
- Migrating off cloud and seeking open-source alternatives to RDS for PostgreSQL - cloud-neutral, vendor lock-in-free solutions.
- Want professional support for Redis/ETCD/Silo, as well as extensions like TimescaleDB/Citus.
- Want to perform secondary development and OEM branding with explicit commercial authorization.
- Want to sell Pigsty as SaaS/PaaS/DBaaS, or provide technical services/consulting/cloud services based on this distribution.
Subscription Plans
In addition to the Open Source Edition, Pigsty offers two different subscription service tiers: Professional Edition and Enterprise Edition, which you can choose based on your actual situation and needs.
Note on
/price: The/pricepage is a simplified global pricing landing page (USD pricing, includes theStandardtier and node-cap presets). This page is the detailed subscription reference (CNY pricing, delivery scope, and OS/PG compatibility matrix). For technical compatibility boundaries, this page and Supported Linux prevail.
No scale limit, no warranty
License: Apache-2.0
PG Support: 18 (default), 14 - 18 available
Architecture Support: x86_64, Arm64
OS Support: Latest minor versions of three families
- EL 9.8 / 10.2
- Debian 12.15 / 13.6
- Ubuntu 22.04.5 / 24.04.4 / 26.04.0
Features: Core Modules
SLA: No SLA commitment
Community support Q&A:
Support: No person-day support option
Repository: Global Cloudflare hosted repository
Self-sufficient open source veterans
Default choice for regular users
License: Commercial License
PG Support: 14 - 18
Architecture Support: x86_64, Arm64
OS Support: Mainstream OS major/minor versions
- EL 8 / 9 / 10 compatible
- Debian 12 / 13
- Ubuntu 22 / 24 / 26
Features: All Modules (except domestic innovation kernels)
SLA: Response within business hours
Expert consulting services:
- Software bug fixes
- Complex issue analysis
- Expert ticket support
Support: 1 person-day included per year
Delivery: Standard offline software package
Repository: China mainland mirror sites
Default choice for regular users
Critical scenarios with strict SLA
License: Commercial License
PG Support: 14 - 18+ (legacy versions on request)
Architecture Support: x86_64, Arm64
OS Support: Customized on demand
- EL, Debian, Ubuntu
- Cloud Linux operating systems
- Domestic OS and ARM
Features: All Modules
SLA: 7 x 24 (< 1h)
Enterprise-level expert consulting services:
- Software bug fixes
- Complex issue analysis
- Expert Q&A support
- Backup compliance advice
- Upgrade path support
- Performance bottleneck identification
- Annual architecture review
- Extension plugin integration
- DBaaS & OEM use cases
Support: 2 person-days included per year
Repository: China mainland mirror sites
Delivery: Customized offline software package
Domestic Innovation: PolarDB-O support
Critical scenarios with strict SLA
Pigsty Open Source Edition (OSS)
Pigsty Open Source Edition uses the Apache-2.0 license, provides complete core functionality, requires no fees, but does not guarantee any warranty service. If you find defects in Pigsty, we welcome you to submit an Issue on Github.
Pigsty Open Source supports seven currently validated baselines: EL 9.8 / 10.2, Debian 12.15 / 13.6, and Ubuntu 22.04.5 / 24.04.4 / 26.04.0, across both x86_64 and aarch64.
v4.5.0 publishes a dual-architecture offline bundle for each of those seven baselines, fourteen artifacts in total, all freely downloadable; see the offline installation guide.
Using the Pigsty open source version allows junior development/operations engineers to have 70%+ of the capabilities of professional DBAs. Even without database experts, they can easily set up a highly available, high-performance, easy-to-maintain, secure and reliable PostgreSQL database cluster.
| Code | OS Distribution Version | x86_64 | aarch64 | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|---|---|---|
| EL10 | RHEL 10 / Rocky10 / Alma10 | el10.x86_64 | el10.aarch64 | |||||
| EL9 | RHEL 9 / Rocky9 / Alma9 | el9.x86_64 | el9.aarch64 | |||||
| U26 | Ubuntu 26.04 (resolute) | u26.x86_64 | u26.aarch64 | |||||
| U24 | Ubuntu 24.04 (noble) | u24.x86_64 | u24.aarch64 | |||||
| U22 | Ubuntu 22.04 (jammy) | u22.x86_64 | u22.aarch64 | |||||
| D13 | Debian 13 (trixie) | d13.x86_64 | d13.aarch64 | |||||
| D12 | Debian 12 (bookworm) | d12.x86_64 | d12.aarch64 |
= Primary support, = Optional support
Pigsty Professional Edition (PRO)
Pigsty Professional Edition subscription provides complete functional modules and warranty for Pigsty itself. For defects in PostgreSQL itself and extension plugins, we will make our best efforts to provide feedback and fixes through the PostgreSQL global developer community.
Pigsty Professional Edition is built on the open source version, fully compatible with all open source features, and provides additional modules plus broader database/OS compatibility options: we provide build options for all minor versions of eight mainstream Linux releases (EL8/9/10, Debian 12/13, Ubuntu 22/24/26).
Pigsty Professional Edition includes support for PostgreSQL 14 - 18, and tracks upstream PostgreSQL minor updates continuously (for active majors, typically day-zero or near-day availability), ensuring smooth rolling upgrades to newer majors and minors.
Pigsty Professional Edition subscription allows you to use China mainland mirror site software repositories, accessible without VPN/proxy; we will also customize offline software installation packages for your exact operating system major/minor version, ensuring normal installation and delivery in air-gapped environments, achieving autonomous and controllable deployment.
Pigsty Professional Edition subscription provides standard expert consulting services, including complex issue analysis, DBA Q&A support, backup compliance advice, etc. We commit to responding to your issues within business hours (5x8), and provide 1 person-day support per year, with optional person-day add-on options.
Pigsty Professional Edition uses a commercial license, providing additional modules, technical support, and warranty services.
Pigsty Professional Edition starting price is ¥150,000 / year, equivalent to the annual fee for 9 vCPU AWS high-availability RDS PostgreSQL, or a junior operations engineer with a monthly salary of 10,000 yuan.
| Code | OS Distribution Version | x86_64 | aarch64 | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|---|---|---|
| EL10 | RHEL 10 / Rocky10 / Alma10 | el10.x86_64 | el10.aarch64 | |||||
| EL9 | RHEL 9 / Rocky9 / Alma9 | el9.x86_64 | el9.aarch64 | |||||
| EL8 | RHEL 8 / Rocky8 / Alma8 / Anolis8 | el8.x86_64 | el8.aarch64 | |||||
| U26 | Ubuntu 26.04 (resolute) | u26.x86_64 | u26.aarch64 | |||||
| U24 | Ubuntu 24.04 (noble) | u24.x86_64 | u24.aarch64 | |||||
| U22 | Ubuntu 22.04 (jammy) | u22.x86_64 | u22.aarch64 | |||||
| D13 | Debian 13 (trixie) | d13.x86_64 | d13.aarch64 | |||||
| D12 | Debian 12 (bookworm) | d12.x86_64 | d12.aarch64 |
Pigsty Enterprise Edition
Pigsty Enterprise Edition subscription includes all service content provided by the Pigsty Professional Edition subscription, plus the following value-added service items:
Pigsty Enterprise Edition subscription provides the broadest range of database/operating system version support, including extended support for EOL operating systems (EL7, D11), domestic operating systems, cloud vendor operating systems, and legacy PostgreSQL major versions (PG12+ on request), as well as full support for Arm64 architecture chips.
Pigsty Enterprise Edition subscription provides domestic innovation and localization solutions, allowing you to use PolarDB v2.0 (this kernel license needs to be purchased separately) kernel to replace the native PostgreSQL kernel and meet local compliance requirements.
Pigsty Enterprise Edition subscription provides higher-standard enterprise-level consulting services, committing to 7x24 with (< 1h) response time SLA, and can provide more types of consulting support: version upgrades, performance bottleneck identification, annual architecture review, extension plugin integration, etc.
Pigsty Enterprise Edition subscription includes 2 person-days of support per year, with optional person-day add-on options, for resolving more complex and time-consuming issues.
Pigsty Enterprise Edition allows you to use Pigsty for DBaaS purposes, building cloud database services for external sales.
Pigsty Enterprise Edition starting price is ¥400,000 / year, equivalent to the annual fee for 24 vCPU AWS high-availability RDS, or an operations expert with a monthly salary of 30,000 yuan.
| Code | OS Distribution Version | x86_64 | aarch64 | PG18 | PG17 | PG16 | PG15 | PG14 | PG13 | PG12 |
|---|---|---|---|---|---|---|---|---|---|---|
| EL10 | RHEL 10 / Rocky10 / Alma10 | el10.x86_64 | el10.aarch64 | |||||||
| EL9 | RHEL 9 / Rocky9 / Alma9 | el9.x86_64 | el9.aarch64 | |||||||
| EL8 | RHEL 8 / Rocky8 / Alma8 / Anolis8 | el8.x86_64 | el8.aarch64 | |||||||
| U26 | Ubuntu 26.04 (resolute) | u26.x86_64 | u26.aarch64 | |||||||
| U24 | Ubuntu 24.04 (noble) | u24.x86_64 | u24.aarch64 | |||||||
| U22 | Ubuntu 22.04 (jammy) | u22.x86_64 | u22.aarch64 | |||||||
| D13 | Debian 13 (trixie) | d13.x86_64 | d13.aarch64 | |||||||
| D12 | Debian 12 (bookworm) | d12.x86_64 | d12.aarch64 | |||||||
| D11 | Debian 11 (bullseye) | d11.x86_64 | d11.aarch64 | |||||||
| EL7 | RHEL7 / CentOS7 / UOS … | el7.x86_64 | - |
Pigsty Subscription Notes
Feature Differences
Pigsty Professional/Enterprise Edition includes the following additional features compared to the open source version:
- Command Line Management Tool: Unlock the full functionality of the Pigsty command line tool (
pig) - System Customization Capability: Provide pre-built offline installation packages for exact mainstream Linux operating system distribution major/minor versions
- Offline Installation Capability: Complete Pigsty installation in environments without Internet access (air-gapped environments)
- Multi-version PG Kernel: Allow users to freely specify and install PostgreSQL major versions within the lifecycle (14 - 18)
- Kernel Replacement Capability: Allow users to use other PostgreSQL-compatible kernels to replace the native PG kernel, and the ability to install these kernels offline
- Babelfish: Provides Microsoft SQL Server wire protocol-level compatibility
- IvorySQL: Based on PG, provides Oracle syntax/type/stored procedure compatibility
- PolarDB PG: Provides support for open-source PolarDB for PostgreSQL kernel
- PolarDB O: Domestic innovation database with Oracle-compatible kernel for local compliance requirements (Enterprise Edition subscription only)
- Extension Support Capability: Provides out-of-the-box installation for 576 available PG extensions for PG 14-18 on mainstream operating systems.
- Complete Functional Modules: Provides all functional modules:
- Supabase: Reliably self-host production-grade open-source Firebase
- Silo: Enterprise PB-level object storage planning and self-hosting
- DuckDB: Provides comprehensive DuckDB support, and PostgreSQL + DuckDB OLAP extension plugin support
- Kafka: Provides high-availability Kafka cluster deployment and monitoring
- Kubernetes, VictoriaMetrics & VictoriaLogs
- Domestic Operating System Support: Provides domestic innovation OS support options (Enterprise Edition subscription only)
- Domestic ARM Architecture Support: Provides domestic ARM64 architecture support options (Enterprise Edition subscription only)
- China Mainland Mirror Repository: Smooth installation without VPN, providing domestic YUM/APT repository mirrors and DockerHub access proxy.
- Chinese Interface Support: Monitoring system Chinese interface support (Beta)
Payment Model
Pigsty subscription uses an annual payment model. After signing the contract, the one-year validity period is calculated from the contract date. If payment is made before the subscription contract expires, it is considered automatic renewal. Consecutive subscriptions have discounts. The first renewal (second year) enjoys a 95% discount, the second and subsequent renewals enjoy a 90% discount on subscription fees, and one-time subscriptions for three years or more enjoy an overall 85% discount.
After the annual subscription contract terminates, you can choose not to renew the subscription service. Pigsty will no longer provide software updates, technical support, and consulting services, but you can continue to use the already installed version of Pigsty Professional Edition software. If you subscribed to Pigsty professional services and choose not to renew, when re-subscribing you do not need to make up for the subscription fees during the interruption period, but all discounts and benefits will be reset.
Pigsty’s pricing strategy ensures value for money - you can immediately get top DBA’s database architecture construction solutions and management best practices, with their consulting support and comprehensive coverage; while the cost is highly competitive compared to hiring database experts full-time or using cloud databases. Here are market references for enterprise-level database professional service pricing:
- AWS RDS for PostgreSQL High Availability Edition: ¥1,160 ~ ¥1,582 / (vCPU·month), equivalent to 14K ~ 19K/year (per vCPU)
- Alibaba Cloud RDS for PostgreSQL High Availability Edition: ¥270 ~ ¥432 / (vCPU·month), equivalent to 3K ~ 5K/year (per vCPU)
- EDB PostgreSQL Cloud Database Enterprise Edition: $183.3 / (vCPU·month), equivalent to 16K/year (per vCPU)
- Fujitsu Enterprise PostgreSQL Kubernetes: $3200 / (Core·year), equivalent to 12K/year (per vCPU)
- Oracle Annual Service Fee: (Enterprise $47,500 + Rac $23,000) * 22% per year, equivalent to 28K/year (per vCPU)
The fair price for decent database professional services is 10,000 ~ 20,000 yuan / year, with the billing unit being vCPU, i.e., one CPU thread (1 Intel core = 2 vCPU threads). Pigsty provides top-tier PostgreSQL expert services in China and adopts a per-node billing model. On commonly seen high-core-count server nodes, it brings users an unparalleled cost reduction and efficiency improvement experience.
Pigsty Expert Services
In addition to Pigsty subscription, Pigsty also provides on-demand Pigsty x PostgreSQL expert services - industry-leading database experts available for consultation.
Within three years, provides 10 complex case handling sessions related to PostgreSQL and Pigsty, and unlimited Q&A.
Industry-leading expert on-site support, available for architecture consultation, fault analysis, problem troubleshooting, database health checks, monitoring interpretation, migration assessment, teaching and training, cloud migration/de-cloud consultation, and other continuous time-consuming scenarios.
Consult on any questions you want to know about Pigsty, PostgreSQL, databases, cloud computing, AI…
Database veterans, cloud computing maverick sharing industry-leading insights, cognition, and judgment.
Get a quick diagnostic opinion and response to questions related to PostgreSQL / Pigsty / databases, not exceeding 5 minutes.
Contact Information
Please send an email to [email protected]. Users in mainland China are welcome to add WeChat ID RuohangFeng.
4.11 - FAQ
What is Pigsty, and what is it not?
Pigsty is a PostgreSQL database distribution, a local-first open-source RDS cloud database solution. Pigsty is not a Database Management System (DBMS), but rather a tool, distribution, solution, and best practice for managing DBMS.
Analogy: The database is the car, then the DBA is the driver, RDS is the taxi service, and Pigsty is the autonomous driving software.
What problem does Pigsty solve?
The ability to use databases well is extremely scarce: either hire database experts at high cost to self-build (hire drivers), or rent RDS from cloud vendors at sky-high prices (hail a taxi), but now you have a new option: Pigsty (autonomous driving). Pigsty helps users use databases well: allowing users to self-build higher-quality and more efficient local cloud database services at less than 1/10 the cost of RDS, without a DBA!
Who are Pigsty’s target users?
Pigsty has two typical target user groups. The foundation is medium to large companies building ultra-large-scale enterprise/production-grade PostgreSQL RDS / DBaaS services. Through extreme customizability, Pigsty can meet the most demanding database management needs and provide enterprise-level support and service guarantees.
At the same time, Pigsty also provides “out-of-the-box” PG RDS self-building solutions for individual developers, small and medium enterprises lacking DBA capabilities, and the open-source community.
Why can Pigsty help you use databases well?
Pigsty embodies the experience and best practices of top experts refined in the most complex and largest-scale client PostgreSQL scenarios, productized into replicable software: Solving extension installation, high availability, connection pooling, monitoring, backup and recovery, parameter optimization, IaC batch management, one-click installation, automated operations, and many other issues at once. Avoiding many pitfalls in advance and preventing repeated mistakes.
Why is Pigsty better than RDS?
Pigsty provides a feature set and infrastructure support far beyond RDS, including 576 extension plugins and 12+ kernel support. Pigsty provides a unique professional-grade monitoring system in the PG ecosystem, along with architectural best practices battle-tested in complex scenarios, simple and easy to use.
Moreover, forged in top-tier client scenarios like Tantan, Apple, and Alibaba, continuously nurtured with passion and love, its depth and maturity are incomparable to RDS’s one-size-fits-all approach.
Why is Pigsty cheaper than RDS?
Pigsty allows you to use 10 ¥/core·month pure hardware resources to run 400¥-1400¥/core·month RDS cloud databases, and save the DBA’s salary. Typically, the total cost of ownership (TCO) of a large-scale Pigsty deployment can be over 90% lower than RDS.
Pigsty can simultaneously reduce software licensing/services/labor costs. Self-building requires no additional staff, allowing you to spend costs where it matters most.
How does Pigsty help developers?
Pigsty integrates the most comprehensive extensions in the PG ecosystem (576), providing an All-in-PG solution: a single component replacing specialized components like Redis, Kafka, MySQL, ES, vector databases, OLAP / big data analytics.
Greatly improving R&D efficiency and agility while reducing complexity costs, and developers can achieve self-service management and autonomous DevOps with Pigsty’s support, without needing a DBA.
How does Pigsty help operations?
Pigsty’s self-healing high-availability architecture ensures hardware failures don’t need immediate handling, letting ops and DBAs sleep well; monitoring aids problem analysis and performance optimization; IaC enables automated management of ultra-large-scale clusters.
Operations can moonlight as DBAs with Pigsty’s support, while DBAs can skip the system building phase, saving significant work hours and focusing on high-value work, or relaxing, learning PG.
Who is the author of Pigsty?
Pigsty is primarily developed by Feng Ruohang alone, an open-source contributor, database expert, and evangelist who has focused on PostgreSQL for 10 years, formerly at Alibaba, Tantan, and Apple, a full-stack expert. Now the founder of a one-person company, providing professional consulting services.
He is also a tech KOL, the founder of the top WeChat database personal account “非法加冯” (Illegally Add Feng), with 60,000+ followers across all platforms.
What is Pigsty’s ecosystem position and influence?
Pigsty is the most influential Chinese open-source project in the global PostgreSQL ecosystem, with about 100,000 users, half from overseas. Pigsty is also one of the most active open-source projects in the PostgreSQL ecosystem, currently dominating in extension distribution and monitoring systems.
PGEXT.Cloud is a PostgreSQL extension repository maintained by Pigsty, with the world’s largest PostgreSQL extension distribution volume. It has become an upstream software supply chain for multiple international PostgreSQL vendors.
Pigsty is currently one of the major distributions in the PostgreSQL ecosystem and a challenger to cloud vendor RDS, now widely used in defense, government, healthcare, internet, finance, manufacturing, and other industries.
What scale of customers is Pigsty suitable for?
Pigsty originated from the need for ultra-large-scale PostgreSQL automated management but has been deeply optimized for ease of use. Individual developers and small-medium enterprises lacking professional DBA capabilities can also easily get started.
The largest deployment is 25K vCPU, 4.5 million QPS, 6+ years; the smallest deployment can run completely on a 1c1g VM for Demo / Devbox use.
What capabilities does Pigsty provide?
Pigsty focuses on integrating the PostgreSQL ecosystem and providing PostgreSQL best practices, but also supports a series of open-source software that works well with PostgreSQL. For example:
- Etcd, Redis, Silo, DuckDB, Prometheus
- FerretDB, Babelfish, IvorySQL, PolarDB, OrioleDB
- OpenHalo, Supabase, Greenplum, Dify, Odoo, …
What scenarios is Pigsty suitable for?
- Running large-scale PostgreSQL clusters for business
- Self-building RDS, object storage, cache, data warehouse, Supabase, …
- Self-building enterprise applications like Odoo, Dify, Wiki, GitLab
- Running monitoring infrastructure, monitoring existing databases and hosts
- Using multiple PG extensions in combination
- Dashboard development and interactive data application demos, data visualization, web building
Is Pigsty open source and free?
Pigsty is 100% open-source software + free software. Under the premise of complying with the open-source license, you can use it freely and for various commercial purposes.
We value software freedom. Pigsty uses the Apache-2.0 license. Please see the license for details.
Does Pigsty provide commercial support?
Pigsty software itself is open-source and free, and provides commercial subscriptions for all budgets, providing quality assurance for Pigsty & PostgreSQL. Subscriptions provide broader OS/PG/chip architecture support ranges, as well as expert consulting and support. Pigsty commercial subscriptions deliver industry-leading management/technical experience/solutions, helping you save valuable time, shouldering risks for you, and providing a safety net for difficult problems.
Does Pigsty support domestic innovation (信创)?
Pigsty software itself is not a database and is not subject to domestic innovation catalog restrictions, and already has multiple military use cases. However, the Pigsty open-source edition does not provide any form of domestic innovation support. Commercial subscription provides domestic innovation solutions in cooperation with Alibaba Cloud, supporting the use of PolarDB-O with domestic innovation qualifications (requires separate purchase) as the RDS kernel, capable of running on domestic innovation OS/chip environments.
Can Pigsty run as a multi-tenant DBaaS?
Pigsty uses the Apache-2.0 license. You may use it for DBaaS purposes under the license terms. For explicit commercial authorization, consider the Pigsty Enterprise subscription.
Can Pigsty’s Logo be rebranded as your own product?
When redistributing Pigsty, you must retain copyright notices, patent notices, trademark notices, and attribution notices from the original work, and attach prominent change descriptions in modified files while preserving the content of the LICENSE file. Under these premises, you can replace PIGSTY’s Logo and trademark, but you must not promote it as “your own original work.” We provide commercial licensing support for OEM and rebranding in the enterprise edition.
Pigsty’s Business Entity
Pigsty is a project invested by Miracle Plus S22. The original entity Panji Cloud Data (Beijing) Technology Co., Ltd. has been liquidated and divested of the Pigsty business.
Pigsty is currently independently operated and maintained by author Feng Ruohang. The business entities are:
- Hainan Zhuxia Cloud Data Co., Ltd. / 91460000MAE6L87B94
- Haikou Longhua Piji Data Center / 92460000MAG0XJ569B
- Haikou Longhua Yuehang Technology Center / 92460000MACCYGBQ1N
PIGSTY® and PGSTY® are registered trademarks of Haikou Longhua Yuehang Technology Center.
4.12 - Release Note
The latest Pigsty release is v4.5.0.
| Version | Release Date | Summary | Release Page |
|---|---|---|---|
| v4.5.0 | 2026-08-15 | Silo, Kafka, MySQL, Valkey, 575 extensions, and safer orchestration | v4.5.0 |
| v4.4.0 | 2026-07-10 | PG 19 beta support, 531 extensions, kernel updates, pig CLI improvements | v4.4.0 |
| v4.3.0 | 2026-05-01 | 510 extensions, batch Infra / PGSQL / kernel package updates, Ubuntu 26 support | v4.3.0 |
| v4.2.2 | 2026-03-23 | Insforge template, pdu, pgdog, tigerfs, ivorysql 5.3 | v4.2.2 |
| v4.2.1 | 2026-03-06 | Maintenance release: 3 new extensions, drop PG13, bug fixes | v4.2.1 |
| v4.2.0 | 2026-02-28 | Routine minor release with six PG kernel updates | v4.2.0 |
| v4.1.0 | 2026-02-12 | Major/minor upgrade support, Agent-Native CLI, stricter default firewall policy | v4.1.0 |
| v4.0.0 | 2026-01-28 | Observability revolution, security hardening, JUICE/VIBE modules, Apache-2.0 | v4.0.0 |
| v3.7.0 | 2025-12-02 | PG18 default, 437 extensions, EL10 & Debian 13 support, PGEXT.CLOUD | v3.7.0 |
| v3.6.1 | 2025-08-15 | Routine PG minor updates, PGDG China mirror, EL10/D13 stubs | v3.6.1 |
| v3.6.0 | 2025-07-30 | pgactive, MinIO/ETCD improvements, simplified install, config cleanup | v3.6.0 |
| v3.5.0 | 2025-06-16 | PG18 beta, 421 extensions, monitoring upgrade, code refactor | v3.5.0 |
| v3.4.1 | 2025-04-05 | OpenHalo & OrioleDB, MySQL compatibility, pgAdmin improvements | v3.4.1 |
| v3.4.0 | 2025-03-30 | Backup improvements, auto certs, AGE, IvorySQL all platforms | v3.4.0 |
| v3.3.0 | 2025-02-24 | 404 extensions, extension directory, App playbook, Nginx customization | v3.3.0 |
| v3.2.2 | 2025-01-23 | 390 extensions, Omnigres, Mooncake, Citus 13 & PG17 support | v3.2.2 |
| v3.2.1 | 2025-01-12 | 350 extensions, Ivory4, Citus enhancements, Odoo template | v3.2.1 |
| v3.2.0 | 2024-12-24 | Extension CLI, Grafana enhancements, ARM64 extension completion | v3.2.0 |
| v3.1.0 | 2024-11-24 | PG17 default, config simplification, Ubuntu24 & ARM support | v3.1.0 |
| v3.0.4 | 2024-10-30 | PG17 extensions, OLAP suite, pg_duckdb | v3.0.4 |
| v3.0.3 | 2024-09-27 | PostgreSQL 17, Etcd improvements, IvorySQL 3.4, PostGIS 3.5 | v3.0.3 |
| v3.0.2 | 2024-09-07 | Mini install mode, PolarDB 15 support, monitoring view updates | v3.0.2 |
| v3.0.1 | 2024-08-31 | Routine bug fixes, Patroni 4 support, Oracle compatibility improvements | v3.0.1 |
| v3.0.0 | 2024-08-25 | 333 extensions, pluggable kernels, MSSQL/Oracle/PolarDB compatibility | v3.0.0 |
| v2.7.0 | 2024-05-20 | Extension explosion, 20+ new powerful extensions, Docker apps | v2.7.0 |
| v2.6.0 | 2024-02-28 | PG16 as default, ParadeDB & DuckDB extensions introduced | v2.6.0 |
| v2.5.1 | 2023-12-01 | Routine minor update, PG16 key extension support | v2.5.1 |
| v2.5.0 | 2023-09-24 | Ubuntu/Debian support: bullseye, bookworm, jammy, focal | v2.5.0 |
| v2.4.1 | 2023-09-24 | Supabase/PostgresML support with graphql, jwt, pg_net, vault | v2.4.1 |
| v2.4.0 | 2023-09-14 | PG16, RDS monitoring, new extensions: FTS/graph/HTTP/embedding | v2.4.0 |
| v2.3.1 | 2023-09-01 | PGVector with HNSW, PG16 RC1, doc refresh, Chinese docs, bug fixes | v2.3.1 |
| v2.3.0 | 2023-08-20 | Node VIP, FerretDB, NocoDB, MySQL stub, CVE fixes | v2.3.0 |
| v2.2.0 | 2023-08-04 | Dashboard & provisioning overhaul, UOS compatibility | v2.2.0 |
| v2.1.0 | 2023-06-10 | PostgreSQL 12-16beta support | v2.1.0 |
| v2.0.2 | 2023-03-31 | Added pgvector support, fixed MinIO CVE | v2.0.2 |
| v2.0.1 | 2023-03-21 | v2 bug fixes, security enhancements, Grafana upgrade | v2.0.1 |
| v2.0.0 | 2023-02-28 | Major architecture upgrade, compatibility/security/maintainability | v2.0.0 |
| v1.5.1 | 2022-06-18 | Grafana security hotfix | v1.5.1 |
| v1.5.0 | 2022-05-31 | Docker application support | v1.5.0 |
| v1.4.1 | 2022-04-20 | Bug fixes & full English documentation translation | v1.4.1 |
| v1.4.0 | 2022-03-31 | MatrixDB support, separated INFRA/NODES/PGSQL/REDIS modules | v1.4.0 |
| v1.3.0 | 2021-11-30 | PGCAT overhaul & PGSQL enhancement & Redis beta support | v1.3.0 |
| v1.2.0 | 2021-11-03 | Default PGSQL version upgraded to 14 | v1.2.0 |
| v1.1.0 | 2021-10-12 | Homepage, JupyterLab, PGWEB, Pev2 & pgbadger | v1.1.0 |
| v1.0.0 | 2021-07-26 | v1 GA, Monitoring System Overhaul | v1.0.0 |
| v0.9.0 | 2021-04-04 | Pigsty GUI, CLI, Logging Integration | v0.9.0 |
| v0.8.0 | 2021-03-28 | Service Provision | v0.8.0 |
| v0.7.0 | 2021-03-01 | Monitor only deployment | v0.7.0 |
| v0.6.0 | 2021-02-19 | Architecture Enhancement | v0.6.0 |
| v0.5.0 | 2021-01-07 | Database Customize Template | v0.5.0 |
| v0.4.0 | 2020-12-14 | PostgreSQL 13 Support, Official Documentation | v0.4.0 |
| v0.3.0 | 2020-10-22 | Provisioning Solution GA | v0.3.0 |
| v0.2.0 | 2020-07-10 | PGSQL Monitoring v6 GA | v0.2.0 |
| v0.1.0 | 2020-06-20 | Validation on Testing Environment | v0.1.0 |
| v0.0.5 | 2020-08-19 | Offline Installation Mode | v0.0.5 |
| v0.0.4 | 2020-07-27 | Refactor playbooks into Ansible roles | v0.0.4 |
| v0.0.3 | 2020-06-22 | Interface enhancement | v0.0.3 |
| v0.0.2 | 2020-04-30 | First Commit | v0.0.2 |
| v0.0.1 | 2019-05-15 | POC | v0.0.1 |
v4.5.0
Pigsty v4.5.0 is a feature release focused on new pilot modules, replaceable data services, cluster-identity-aware orchestration, observability, and the software supply chain. It introduces Kafka KRaft and MySQL 8.4 modules, adds Valkey to REDIS, converges the MINIO module on Silo, and expands the packaged extension catalog from 531 to 575 extensions. Released on 2026-08-15. See the GitHub release and the complete source comparison at v4.4.0...v4.5.0.
Highlights
- 575 extensions: Compared with v4.4.0’s 531 entries, the current catalog adds 46 and removes 2, for a net gain of 44. It now contains 575 extensions across 406 non-contrib package families, with RPM/DEB coverage tracked per platform.
- Kafka KRaft module: Adds native Pigsty orchestration for Kafka, with multi-cluster support, dynamic member enrollment and retirement, SCRAM/TLS, secure credential rotation, monitoring metrics, and Grafana dashboards.
- MySQL 8.4 module: Adds standalone and three-node InnoDB Cluster deployments, MySQL Router, XtraBackup, user and database provisioning, monitoring and alerting, and idempotent reconciliation.
- Valkey and Silo: REDIS adds
redis_type: valkey; the final MINIO source accepts onlyminio_type: silo. The RustFS integration developed during this cycle was fully withdrawn before the candidate baseline. - 51 standalone configuration templates: Adds
demo/kafka,demo/mysql, and the eight-nodeha/octosimulation template to the 48 standalone templates in v4.4.0. The compatibility symlinkconf/app/supa.yml→../supabase.ymlremains available. - Safer cluster-identity orchestration: PGSQL, REDIS, MINIO, KAFKA, and MYSQL initialization playbooks, plus every corresponding removal playbook except
mysql-rm.yml, skip unrelated hosts by explicit cluster identity.mysql-rm.ymlinstead fails closed for any wrongly selected host. etcd delegation and DBSU key exchange now use actual cluster members as well. - Observability and supply chain: Re-exports Grafana dashboards to Dashboard API v2, moves MinIO/Silo collection to Metrics V3, and generates local repositories atomically with SOW instead of synthetic ModuleMD metadata.
- Kernel and toolchain updates: Completes pgBackRest support for PostgreSQL 19 beta2, enables cluster mode for Percona PostgreSQL TDE, fixes IvorySQL initialization and WAL compression, and refreshes extension package maps, exporters, and build tooling.
New Modules and Data Services
- The Kafka module uses node state as the source of truth for dynamic KRaft orchestration. It manages one or more clusters in one inventory and also supports an unbounded
kafka.ymlrun; partial--limitselections are rejected. The destructivekafka-rm.ymlinstead requires a non-empty-l/--limitand validates a safe absolute data path plus surviving broker/controller anchors before any partial retirement can stop services. Nodes retain authoritative manifests and secrets, with dynamic controller joins, broker admission, member retirement, three-step dead-node replacement, SCRAM-SHA-512/TLS, credential and certificate rotation, and self-tested partition health gates. - The MySQL pilot module targets a fixed MySQL 8.4 LTS platform and accepts either a standalone node or a three-node InnoDB Cluster. It includes MySQL Shell and Router, scheduled full XtraBackup backups, TLS, account and database provisioning, primary-key policy checks, conservative member removal, and idempotent reconciliation.
- The REDIS module retains
redisas its default engine and can deploy Valkey withredis_type: valkey. Service units now useType=notifywith a 1,800-second startup timeout, plus stronger topology validation, password handling, tag-scoped removal semantics, and rebuild protection. - The MINIO module now deploys Silo and only Silo.
minio_typeremains an extension point, butsilois the sole accepted value in this release. Startup checks the systemd Invocation ID andActiveState=activefor the current restart, waits about 600 seconds by default, and then runs Silo’s cluster health check. The Infra package line addssiloandmcliwhile preserving the S3/Admin APIs,/minio/*routes,MINIO_*environment variables, and disk format. - Object-storage topology is grouped by
minio_cluster; its inventory group name may differ, and one inventory may declare multiple object-storage clusters. Use distinctminio_alias,minio_domain, andminio_endpointvalues for each to avoid overwriting shared client aliases on INFRA nodes.demo/minionow selects Silo explicitly and trims its local repository to theinfra,nodemodules. - The standalone FERRET module is replaced by PostgreSQL Mongo mode and the FerretDB Docker APP. PostgreSQL provides the DocumentDB data layer, while Docker Compose provides the FerretDB protocol layer.
Orchestration, Security, and Tooling
deploy.yml,slim.yml, and the PGSQL, REDIS, MINIO, KAFKA, and MYSQL initialization playbooks now skip unrelated hosts according to the corresponding*_clusteridentity. The PGSQL, REDIS, MINIO, and KAFKA removal playbooks do the same. MySQL removal is intentionally different:mysql-rm.ymldoes not skip hosts without identity and instead fails closed inmysql_rm_check. Every host that enters a role still receives an internal identity check.- PGSQL configuration, PITR, and removal workflows delegate only when the canonical
etcdgroup exists and has at least one member; they no longer silently fall back to localhost when no etcd target exists. DBSU SSH keys are exchanged through the actualpg_cluster_members, correctly covering cross-inventory-group topologies such as Citus. - PGSQL PITR and removal now delete only the etcd subtree bounded by
/<cluster>/, avoiding adjacent clusters whose names share a prefix. The initial pgBackRest marker/etc/pgbackrest/initial.doneis written only after the backup command succeeds. - HAProxy uses the fixed
/etc/haproxy/haproxy.cfgand/etc/haproxy/conf.dlayout, upstream master-worker mode, a master socket, andType=notify. dnsmasq now binds dynamically, answers private reverse lookups locally, and handles node addresses added after INFRA initialization. - Rendered systemd units managed by Pigsty are consistently placed under
/etc/systemd/system; permissions on sensitive configuration and privileged files are tightened further. Removal workflows stop services before entering the data-cleanup phase. - The REPO and CACHE roles now use
sow create --pigstyto atomically generate RPM/APT metadata and the SHA-256repo_completemarker, and no longer generate synthetic ModuleMD metadata.pg_idalso compares cluster size as an explicit integer for older Ansible releases. - RPM exporter package names move from underscores to hyphens, for example
node_exporter→node-exporter. Debian repository naming and PGDG YUM extension package mappings are corrected as well. - Tuned profiles now use the OS-specific directory:
/etc/tuned/profileson EL 10, Debian 13, and Ubuntu 26, and/etc/tunedon EL 8/9, Debian 12, and Ubuntu 22/24. Debian/Ubuntu package installation also suppresses premature starts of Silo, Redis/Valkey, and legacy log services. - China-region repository routing receives a systematic refresh. OS, Docker, Grafana, Percona, supported MongoDB APT, and uv/PyPI paths prefer Tencent Cloud; EL and Docker entries retain Huawei Cloud and Aliyun fallbacks where appropriate. MySQL and Kubernetes use USTC mirrors, and ClickHouse uses Huawei Cloud. MongoDB RPM no longer advertises an unavailable China-region alternative. The final per-platform choices remain defined in
roles/node_id/vars/<os>.<arch>.yml. - The Docker image moves to Debian 13.6 and Pigsty v4.5.0. Vagrant enforces a 32 GiB root disk, accepts pinned box versions, and adds the eight-node
ha/octolab.docker/Makefilefixes its data directory at./data, andmake purgedeletes that directory directly. - GitHub Actions for checkout, CodeQL, Docker build/login, and Cosign are upgraded in one batch. Release, bootstrap, install, and validation scripts also tighten file and argument handling. Release archives now derive top-level
pigsty.ymlfromconf/meta.yml, include the Kafka/MySQL playbooks, and drop the legacy Mongo playbook. - The release-signing workflow must be dispatched from
mainand signs only thepigsty-<tag>.tgzsource archive; multi-gigabyte offline bundles are outside that workflow. The package-build bootstrap matrix now matchesconf/build/oss.yml: EL 9/10, Debian 12/13, and Ubuntu 22/24/26.
Observability
- Re-exports the dashboard set through the Pig/Grafana tooling to Dashboard API v2. Adds four Kafka and five MySQL dashboards, and refreshes links, variables, and layouts across Node, PostgreSQL, Redis, and Infra dashboards.
- Migrates the MinIO/Silo Overview and Instance dashboards to Metrics V3. Victoria scrapes the
/minio/metrics/v3root endpoint and drops high-cardinality samples carrying a non-emptybucketlabel. - Updates the
pg_exporterconfiguration to 1.4.0 and fixes duplicate time series from the 1.4.1pg_subrelquery. For PG19 it addspg_sub_19,pg_recovery_state,pg_wal_19,pg_lock_stat, andpg_vacuum_score; PG10+ gains thepg_xact_agetransaction-age histogram, and replication-slotidle_timeoutplus WAL Receiverconnectingstate encoding are covered. Kafka JMX/protocol exporters and the MySQL exporter also join the standard target and alert pipelines.
PostgreSQL Kernels and Extension Packages
PostgreSQL 19 beta3 templates now include pgBackRest packages and backup support.
All four standard Patroni templates add the PostgreSQL 18.6 logical-decoding allowlist
output_plugin_libraries: 'pgoutput, test_decoding, wal2json'; Patroni filters it on older PostgreSQL versions that do not support the setting.Percona PostgreSQL 18 TDE now uses cluster mode and retains Pigsty-prefixed packages to avoid conflicts with native PostgreSQL packages.
IvorySQL now initializes its default database correctly and enables compatible WAL compression in workload templates.
The PostgreSQL fact loader, per-platform
package_map, and default extension groups are refreshed to fill package gaps and correct PGDG/YUM naming. Comparing names between the v4.4.0 PIG v1.5.1 catalog and the current catalog yields 46 additions and 2 removals:- 32 new primary extensions:
argm,cat_tools,cron_utils,fbsql,oidc_validator,online_advisor,pg_cjk_parser,pg_column_tetris,pg_describe,pg_disorder,pg_fts,pg_jieba,pg_kpart,pg_lake,pg_local_cache,pg_mentat,pg_oidc_validator,pg_policy,pg_roast,pg_tiktoken_c,pg_turbovec,pg_vault_tde,pgcontext,pgfr_record,pgmemento,pgmonitor,pgsqlmock,pgwasm,plruby,plx,postbis, andqdgc. - 13 child extensions from those package families:
hstore_plruby,jsonb_plruby,ltree_plruby,pg_extension_base,pg_extension_updater,pg_lake_copy,pg_lake_engine,pg_lake_iceberg,pg_lake_table,pg_map,pgcontext_pgvector,pgfr_analyze, andqdgc_postgis. - One new PGDG extension,
pg_statviz. Its package is hidden from the default install group, but the extension remains in the online catalog. - Two catalog removals:
pg_analyticsandspat. The total therefore rises from 531 to 575, a net gain of 44.
- 32 new primary extensions:
Cumulative notable upgrades include
citus14.2.0,pg_search0.25.2,timescaledb2.29.1,vector0.8.6,documentdb0.114,pg_partman5.5.0,pgmnemo0.16.1,plpgsql_check2.10.4,provsql1.12.0, andpgbson2.1.0, plus a broad pgrx 0.19.1 rebuild.Full build records and platform differences appear in the merged table below and the original RPM changelog and DEB changelog. New catalog entries include
pg_local_cacheandpg_policy. Changelog dates identify package batches and should not be equated one-for-one with the current CSVmtime.pg_statvizis excluded only from the default install group indb/reload.sql; its detail page, platform coverage, and package-name differences remain in the online catalog.
Extension Package Update Log
The table below merges the RPM changelog and DEB changelog after v4.4.0, with 231 rows aligned by batch and extension name. Records that are identical in RPM and DEB are merged; version or note differences are shown separately. An unchanged version still indicates a rebuild, package-name change, license-metadata change, or platform-coverage change.
The first extension batch after July 10 is July 24. That original batch covers July 7–24 without per-item dates, so it is included in full to avoid omitting post-release pgrx rebuilds and package-matrix fixes. “RPM only” or “DEB only” means only that the other changelog has no same-batch row for that extension.
| Batch | Extension | Version Change | Notes |
|---|---|---|---|
| 2026-08-14 | asn1oid | RPM only: 1.6 → 1.6 | License metadata: GPL-3.0-or-later; r2; PG14-18 |
| 2026-08-14 | emailaddr | 0 → 0 | License metadata: LicenseRef-Upstream-No-License; r3; PG14-18 |
| 2026-08-14 | explain_ui | 0.0.2 → 0.0.2 | License metadata: LicenseRef-Upstream-No-License; r4; PG14-18 |
| 2026-08-14 | numeral | RPM only: 1.3 → 1.3 | License metadata: GPL-2.0-or-later; r6; PG14-18 |
| 2026-08-14 | oidc_validator | 0.1.0 → 0.1.0 | Rust module; LicenseRef-Upstream-No-License; r2; PG18 |
| 2026-08-14 | pg_failover_slots | 1.2.1 → 1.2.1 | License metadata: PostgreSQL; r2; preload; PG14-18 |
| 2026-08-14 | pg_geohash | 1.0 → 1.0 | License metadata: MIT; r4; fix SQL filename and target-PG ABI; PG14-18 |
| 2026-08-14 | pg_oidc_validator | 0.2 → 1.1.0 | RPM: PG18 OAuth validator module; add discovery_url_override; EL10 onlyDEB: PG18 OAuth validator module; add discovery_url_override and GSSAPI build dependency |
| 2026-08-14 | pg_relation_sql | - → 0.2.2 | RPM: Standalone SQL; no CREATE EXTENSION; noarch; PG14-18DEB: Standalone SQL; no CREATE EXTENSION; Architecture: all; PG14-18 |
| 2026-08-14 | pg_summarize | 0.0.1 → 0.0.1 | License metadata: LicenseRef-Upstream-No-License; r6; PG14-18 |
| 2026-08-14 | pg_when | 0.1.9 → 0.1.10 | GitHub/PGXN release; upstream pgrx 0.18.1, packaged with 0.19.1; PG14-18 |
| 2026-08-14 | pre_prepare | RPM only: 0.9 → 0.9 | License metadata: PostgreSQL; r2; PG14-18 |
| 2026-08-14 | smlar | 1.0 → 1.0 | License metadata: LicenseRef-Upstream-No-License; r2; PG14-18 |
| 2026-08-14 | unit | 7.10 → 7.10 | License metadata: GPL-3.0-or-later; r7; PG14-18 |
| 2026-08-12 | biscuit | 2.4.3 → 3.0.0 | PG16-18; 2.x indexes require REINDEX |
| 2026-08-12 | cat_tools | - → 0.3.0 | SQL-only; PG14-18 |
| 2026-08-12 | citus | 14.1.0 → 14.2.0 | Includes citus_columnar; PG16-18 |
| 2026-08-12 | pg_clickhouse | 0.3.2 → 0.10.0 | PG14-18 |
| 2026-08-12 | pg_describe | - → 1.0.0 | PG17-18 |
| 2026-08-12 | pg_disorder | - → 0.1.0 | PG14-18 |
| 2026-08-12 | pg_local_cache | - → 1.3.0 | PG14-18; preload; single-primary |
| 2026-08-12 | pg_mentat | - → 1.5.7 | PG14-18 |
| 2026-08-12 | pg_policy | - → 0.1.0 | SQL-only; PG14-18 |
| 2026-08-12 | pg_rational | 0.0.2 → 0.0.3 | RPM: PIGSTY; PG14-18 DEB: PGDG; PG14-18 |
| 2026-08-12 | pg_readme | 0.7.0 → 0.7.1 | RPM: Catalog 0.7.1; RPM remains PGDG 0.7.0 DEB: Includes pg_readme_test_extension; PG14-18 |
| 2026-08-12 | pg_search | 0.25.0 → 0.25.2 | PG15-18; pgrx 0.19.1; preload |
| 2026-08-12 | pg_squeeze | 1.9.2 → 1.9.4 | PGDG; PG14-18 |
| 2026-08-12 | pg_statviz | RPM: - → 0.9DEB: - → 1.1 | RPM: PGDG; PG14-16 and EL10 PG18; no PG17; not in default groups DEB: PGDG; PG14-18 except Ubuntu 22.04; not in default groups |
| 2026-08-12 | pg_turbovec | - → 1.29.0 | PG14-18; pgrx 0.19.1 |
| 2026-08-12 | pg_uuid_v8 | 1.0.0 → 1.1.0 | PG14-18; includes 1.0-to-1.1 upgrade script |
| 2026-08-12 | pg_vault_tde | - → 1.7.0 | RPM: PG17-18; EL9/10; preload DEB: PG17-18; preload |
| 2026-08-12 | pgbson | 2.0.4 → 2.1.0 | RPM: RPM package postgresbson; PG14-18 DEB: Source package postgresbson; PG14-18 |
| 2026-08-12 | pgmnemo | 0.15.0 → 0.16.1 | PG17-18 |
| 2026-08-12 | plpgsql_check | 2.10.3 → 2.10.4 | PG14-18 |
| 2026-08-12 | plruby | - → 2.5.0 | Includes jsonb_plruby, hstore_plruby, ltree_plruby; PG14-18 |
| 2026-08-12 | polardb-17 | 17.10.1.0-1PIGSTY → 17.10.1.0-2PGSTY | Rebuild; PG17 |
| 2026-08-12 | polarstore | 1.2.42-1PIGSTY → 1.2.42-2PGSTY | Rebuild |
| 2026-08-12 | provsql | 1.11.0 → 1.12.0 | PG14-18 |
| 2026-08-12 | q3c | RPM: 2.0.2 → 2.0.5DEB: 2.0.4 → 2.0.5 | RPM: PGDG; PIGSTY remains 2.0.2; PG14-18 DEB: PGDG; PG14-18 |
| 2026-08-12 | timescaledb | 2.29.0 → 2.29.1 | PG16-18 |
| 2026-08-12 | vector | 0.8.6 → 0.8.6 | PGDG repository refresh; PG14-18 |
| 2026-08-12 | zlog | 1.2.18-1PIGSTY → 1.2.18-2PGSTY | Rebuild |
| 2026-07-30 | emaj | RPM: - → 5.0.0DEB: 4.7.1 → 5.0.0 | RPM: Renamed to e-maj; Provides/Obsoletes emaj; r2DEB: PG14-18 |
| 2026-07-30 | graph | 0.1.8 → 1.0.0 | pggraph; PG14-18; pgrx 0.19.1 |
| 2026-07-30 | nominatim_fdw | 2.0.0 → 2.1.0 | PG14-18 |
| 2026-07-30 | numeral | RPM only: 1.3 → 1.3 | Renamed to postgresql-numeral; Provides/Obsoletes numeral; r3 |
| 2026-07-30 | pg_ai_query | RPM only: 0.1.1 → 0.1.1 | EL9/10 only (GCC 13/OpenSSL 3); r2 not indexed |
| 2026-07-30 | pg_column_tetris | - → 0.1.0 | SQL-only; PG14-18 |
| 2026-07-30 | pg_net | 0.20.5 → 0.20.5 | RPM: EL8/9: 0.9.2; EL10: 0.20.5; r3 not indexed DEB: D12/D13/U24/U26: 0.20.5; U22: 0.9.2; r2 not indexed |
| 2026-07-30 | pg_partman | RPM: 5.4.0 → 5.5.0DEB: 5.4.2 → 5.5.0 | RPM: PG14-18 DEB: Use postgresql-PGVERSION-partman package name |
| 2026-07-30 | pg_search | 0.24.3 → 0.25.0 | PG15-18; pgrx 0.19.1; add pgvector/OpenBLAS dependencies |
| 2026-07-30 | pgcontext | - → 0.2.0 | PG17-18; pgrx 0.19.1; optional pgvector bridge |
| 2026-07-30 | pgedge | RPM only: 18.4 → 18.4 | PG15-18 ABI fix; r2 not indexed |
| 2026-07-30 | pgmnemo | 0.13.0 → 0.15.0 | PG17-18; requires pgvector >= 0.7.0 |
| 2026-07-30 | pgmp | - → 1.0.6 | PG14-18; GMP dependency |
| 2026-07-30 | pgpcre | RPM only: 0.20190509 → 0.20190509 | EL8/9 only; r2 not indexed |
| 2026-07-30 | pgwasm | - → 0.1.0 | PG14-18 |
| 2026-07-30 | plpgsql_check | 2.10.1 → 2.10.3 | PG14-18; optional preload |
| 2026-07-30 | postbis | - → 1.0 | PG14-18 compatibility patch; r2 |
| 2026-07-30 | qdgc | - → 0.1.0 | PG14-18; includes qdgc_postgis |
| 2026-07-30 | rdf_fdw | 2.6.0 → 2.7.0 | PG14-18 |
| 2026-07-30 | timescaledb | 2.28.3 → 2.29.0 | PG16-18 |
| 2026-07-30 | uri | RPM only: 1.20251029 → 1.20251029 | Renamed to pguri; Provides/Obsoletes pg_uri; r2 |
| 2026-07-30 | vector | 0.8.5 → 0.8.6 | PG14-18; 0.8.6 not indexed |
| 2026-07-30 | pg_rewrite | DEB only: 2.0.0 → 2.2 | Renamed to postgresql-PGVERSION-pg-rewrite; PG14-18 |
| 2026-07-30 | pgactive | DEB only: 2.1.7 → 2.1.7 | PG14-18 build fix; r2 not indexed |
| 2026-07-30 | pgzint | DEB only: - → 0.2.0 | D13/U26 only; requires Zint >= 2.14; not indexed |
| 2026-07-30 | timeseries | DEB only: 0.2.1 → 0.2.1 | Fix partman/cron Recommends and docs; r3 |
| 2026-07-24 | argm | - → 1.1.1 | PG14-18 |
| 2026-07-24 | cron_utils | - → 0.1.0 | SQL-only; PG14-18 |
| 2026-07-24 | fbsql | - → 0.1.0 | PL/R; PG16-18 |
| 2026-07-24 | oidc_validator | - → 0.1.0 | Rust OIDC; PG18 |
| 2026-07-24 | online_advisor | - → 1.0 | PG14-18 |
| 2026-07-24 | pg_cjk_parser | - → 0.1.0 | PG14-18 |
| 2026-07-24 | pg_extension_base | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_extension_updater | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_fts | - → 0.2.0 | PG17-18 |
| 2026-07-24 | pg_jieba | - → 1.1.0 | pkg 2.0.1; SQL 1.1.0; PG14-18 |
| 2026-07-24 | pg_kpart | - → 1.0 | PG14-18 |
| 2026-07-24 | pg_lake | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_lake_copy | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_lake_engine | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_lake_iceberg | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_lake_table | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_map | - → 3.4 | pg_lake 3.4; PG16-18; RPM EL9/10 |
| 2026-07-24 | pg_oidc_validator | - → 0.2 | Percona OIDC; PG18; DEB all, RPM EL10 |
| 2026-07-24 | pg_roast | - → 1.0 | PG14-18 |
| 2026-07-24 | pg_tiktoken_c | - → 1.1 | PG14-18 |
| 2026-07-24 | pgfr_analyze | - → 2.29.2 | pg_flight_recorder; PG15-18 |
| 2026-07-24 | pgfr_record | - → 2.29.2 | pg_flight_recorder; PG15-18 |
| 2026-07-24 | pgmemento | - → 0.7.4 | SQL-only; PG14-18 |
| 2026-07-24 | pgmonitor | - → 2.2.0 | PG14-18 |
| 2026-07-24 | pgsqlmock | - → 1.0.1 | PG14-18 |
| 2026-07-24 | plx | - → 1.3.1 | PG14-18 |
| 2026-07-24 | anon | 3.1.1 → 3.1.3 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | block_copy_command | 0.1.5 → 0.1.5 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | convert | 0.1.0 → 0.1.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | etcd_fdw | 0.0.1 → 0.0.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | explain_ui | 0.0.2 → 0.0.2 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | graph | 0.1.7 → 0.1.8 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | jsonschema | 0.1.9 → 0.1.9 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_base58 | 0.0.1 → 0.0.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_bestmatch | 0.0.2 → 0.0.2 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_cardano | 1.2.0 → 1.2.0 | pgrx 0.19.1; PG15-18 |
| 2026-07-24 | pg_command_fw | 0.1.0 → 0.1.0 | pgrx 0.19.1; PG15-18 |
| 2026-07-24 | pg_durable | 0.2.2 → 0.2.3 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_enigma | 0.5.0 → 0.5.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_eviltransform | 0.0.2 → 0.0.4 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_graphql | 1.6.1 → 1.6.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_idkit | 0.4.0 → 0.4.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_jsonschema | 0.3.4 → 0.3.4 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_kazsearch | 2.2.0 → 2.3.0 | pgrx 0.19.1; PG16-18 |
| 2026-07-24 | pg_later | 0.4.0 → 0.4.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_mooncake | 0.2.0 → 0.2.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_parquet | 0.5.1 → 0.5.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_pinyin | 0.0.4 → 0.0.5 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_polyline | 0.0.1 → 0.0.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_render | 0.1.3 → 0.1.3 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_rrf | 0.0.3 → 0.0.3 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_search | 0.24.0 → 0.24.3 | pgrx 0.19.1; PG15-18 |
| 2026-07-24 | pg_session_jwt | 0.5.0 → 0.5.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_smtp_client | 0.2.1 → 0.2.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_strict | 1.0.5 → 1.0.5 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_summarize | 0.0.1 → 0.0.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_tiktoken | 0.0.1 → 0.0.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_tokenizer | 0.1.1 → 0.1.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pg_trickle | 0.81.0 → 0.81.0 | pgrx 0.19.1; PG18 |
| 2026-07-24 | pg_when | 0.1.9 → 0.1.9 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pgdd | 0.6.1 → 0.6.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pglinter | 2.0.0 → 2.0.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pglite_fusion | 0.0.6 → 0.0.6 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pgmqtt | 0.3.0 → 0.4.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pgrdf | 0.6.4 → 0.6.20 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pgsmcrypto | 0.1.1 → 0.1.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | pgx_ulid | 0.2.3 → 0.2.3 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | plprql | 18.0.1 → 18.0.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | timescaledb_toolkit | 1.23.0 → 1.23.0 | pgrx 0.19.1; PG15-18 |
| 2026-07-24 | typeid | 0.3.0 → 0.3.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | tzf | 0.3.0 → 0.3.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | vchord | 1.1.1 → 1.1.1 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | vchord_bm25 | 0.3.0 → 0.3.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | vectorize | 0.26.2 → 0.26.2 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | vectorscale | 0.9.0 → 0.9.0 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | wrappers | 0.6.1 → 0.6.2 | pgrx 0.19.1; PG14-18 |
| 2026-07-24 | age | RPM only: 1.7.0 → 1.8.0 | PG18: 1.8.0-rc0; PG17: 1.7.0 |
| 2026-07-24 | babelfishpg_tsql | 5.5.0 → 5.4.0 | Catalog fix: 5.4.0; PG17-18 |
| 2026-07-24 | biscuit | 2.4.1 → 2.4.3 | pkg 2.4.3; SQL 2.4.1; PG16-18 |
| 2026-07-24 | decoderbufs | 3.5.0 → 3.6.0 | DEB 3.6.0; RPM 3.5.0; PG14-18 |
| 2026-07-24 | documentdb | 0.113 → 0.114 | PG15-18; 16 targets |
| 2026-07-24 | documentdb_core | 0.113 → 0.114 | PG15-18; 16 targets |
| 2026-07-24 | documentdb_distributed | 0.113 → 0.114 | PG15-18; 16 targets |
| 2026-07-24 | documentdb_extended_rum | 0.113 → 0.114 | PG15-18; 16 targets |
| 2026-07-24 | http | 1.7.1 → 1.7.2 | PG14-18 |
| 2026-07-24 | jdbc_fdw | 0.4.0 → 0.5.0 | pkg 0.5.0; SQL 1.2; PG14-18; 16 targets |
| 2026-07-24 | nominatim_fdw | 1.3 → 2.0.0 | PG14-18; 16 targets |
| 2026-07-24 | odbc_fdw | 0.5.1 → 0.6.1 | pkg 0.6.1; SQL 0.5.2; PG14-18 |
| 2026-07-24 | ogr_fdw | 1.1.8 → 1.1.9 | PG14-18 |
| 2026-07-24 | pg_csv | RPM only: 1.0.1 → 1.0.2 | +RPM; pkg 1.0.2; SQL 1.0.1; PG14-18 |
| 2026-07-24 | pg_dbms_errlog | 2.2 → 2.4 | PG14-18 |
| 2026-07-24 | pg_ivm | 1.14 → 1.15 | PG14-18 |
| 2026-07-24 | pg_net | 0.20.3 → 0.20.5 | RPM: pkg 0.20.5; SQL 0.20.4; PG14-18; RPM EL10 DEB: D12/D13/U24/U26: 0.20.5; U22: 0.9.2 (libcurl); PG14-18 |
| 2026-07-24 | pg_rewrite | RPM only: 2.0.0 → 2.2 | PG14-18 |
| 2026-07-24 | pg_statement_rollback | 1.5 → 1.6 | PG14-18 |
| 2026-07-24 | pg_tde | 2.1 → 2.2 | Percona; PG17-18 |
| 2026-07-24 | pgnodemx | RPM only: 1.7 → 2.0.1 | pkg 2.0.1; SQL 2.0; PG14-18; cgroup-safe |
| 2026-07-24 | pgauditlogtofile | 1.8.4 → 1.8.5 | PG14-18 |
| 2026-07-24 | pgbson | 2.0.2 → 2.0.4 | pkg 2.0.4; SQL 2.0; PG14-18 |
| 2026-07-24 | pgclone | 4.3.2 → 4.4.2 | PG14-18 |
| 2026-07-24 | pgextwlist | 1.19 → 1.20 | PG14-18 |
| 2026-07-24 | pgmnemo | 0.12.1 → 0.13.0 | PG17-18 |
| 2026-07-24 | pgmq | 1.11.1 → 1.12.0 | PG14-18 |
| 2026-07-24 | pgsentinel | 1.4.1 → 1.4.2 | RPM 1.4.2; DEB 1.4.0; U26 1.4.1; PG14-18 |
| 2026-07-24 | plpgsql_check | 2.9.2 → 2.10.1 | PG14-18 |
| 2026-07-24 | plproxy | 2.11.0 → 2.12.0 | PG14-18 |
| 2026-07-24 | powa | 5.1.2 → 5.2.0 | DEB 5.2.0; RPM 5.1.0; PG14-18 |
| 2026-07-24 | provsql | 1.10.0 → 1.11.0 | PG14-18 |
| 2026-07-24 | re2 | 0.3.0 → 0.4.1 | PG16-18 |
| 2026-07-24 | snowflake | 2.4 → 2.5.0 | pgEdge; PG15-18 |
| 2026-07-24 | spock | 5.0.6 → 5.0.10 | pgEdge; PG15-18 |
| 2026-07-24 | tdigest | 1.4.3 → 1.4.4 | PG14-18 |
| 2026-07-24 | timescaledb | 2.28.2 → 2.28.3 | PG15-18: 2.28.3; PG14: 2.19.3; 6 EL |
| 2026-07-24 | vector | 0.8.4 → 0.8.5 | PG14-18 |
| 2026-07-24 | babelfishpg_money | 1.1.0 → 1.1.0 | Babelfish: +PG18 |
| 2026-07-24 | babelfishpg_tds | 1.0.0 → 1.0.0 | Babelfish: +PG18 |
| 2026-07-24 | citus | 14.1.0 → 14.1.0 | Citus 13.0.0; EL10 RPM PG14, 2 arch |
| 2026-07-24 | dbt2 | 0.61.7 → 0.61.7 | +DEB PG14-18; +EL8 RPM PG17-18, 2 arch |
| 2026-07-24 | decoder_raw | 1.0 → 1.0 | EL10/D13; PG14-16; 2 arch |
| 2026-07-24 | faker | 0.5.3 → 0.5.3 | RPM: +DEB PG14-18 DEB: +DEB PG14-18; D12/U22: python3-fake-factory 22.0.0 |
| 2026-07-24 | gb18030_2022 | 1.0 → 1.0 | IvorySQL 5.4; PG18; 16 targets |
| 2026-07-24 | h3 | 4.2.3 → 4.2.3 | EL8 x86_64 RPM PG17-18 |
| 2026-07-24 | hdfs_fdw | 2.3.3 → 2.3.3 | +DEB PG14-18 |
| 2026-07-24 | hstore_pllua | 2.0.12 → 2.0.12 | +RPM 6 EL PG14-18 |
| 2026-07-24 | hstore_plluau | 2.0.12 → 2.0.12 | +RPM 6 EL PG14-18 |
| 2026-07-24 | hunspell_cs_cz | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_de_de | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_en_us | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_fr | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_ne_np | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_nl_nl | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_nn_no | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_pt_pt | 1.0 → 1.0 | 16 targets; pt_pt.stop avoids core conflict |
| 2026-07-24 | hunspell_ru_ru | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | hunspell_ru_ru_aot | 1.0 → 1.0 | hunspell bundle; 10 dictionaries; 16 targets; PG14-18 |
| 2026-07-24 | imgsmlr | 1.0 → 1.0 | EL10/D13; PG14-18; 2 arch |
| 2026-07-24 | ivorysql_ora | 1.0 → 1.0 | IvorySQL 5.4; PG18; 16 targets |
| 2026-07-24 | mobilitydb | 1.3.0 → 1.3.0 | +RPM 6 EL PG14-18; +U22 DEB PG18 |
| 2026-07-24 | mobilitydb_datagen | 1.3.0 → 1.3.0 | mobilitydb bundle; +RPM 6 EL; +U22 DEB PG18 |
| 2026-07-24 | omni | 0.2.14 → 0.2.14 | omnigres 20251108; EL10 PG14-18; EL8/9,D12/U22 PG18 |
| 2026-07-24 | ora_btree_gin | 1.0 → 1.0 | IvorySQL 5.4; PG18; 16 targets |
| 2026-07-24 | ora_btree_gist | 1.0 → 1.0 | IvorySQL 5.4; PG18; 16 targets |
| 2026-07-24 | pg_dbms_job | 2.0 → 2.0 | +DEB PG14-18 |
| 2026-07-24 | pg_dbms_lock | 2.0 → 2.0 | +DEB PG14-18 |
| 2026-07-24 | pg_dbms_metadata | 1.0.0 → 1.0.0 | +DEB PG14-18; +EL8 aarch64 RPM PG15 |
| 2026-07-24 | pg_fact_loader | 2.0.1 → 2.0.1 | U26 DEB PG14-18 |
| 2026-07-24 | pg_get_functiondef | 1.0 → 1.0 | IvorySQL 5.4; PG18; 16 targets |
| 2026-07-24 | pg_strom | 6.1 → 6.1 | pg_strom 3.5; EL10 x86_64 PG14 |
| 2026-07-24 | pgautofailover | 2.2 → 2.2 | 6 EL RPM: +PG18 |
| 2026-07-24 | pgbouncer_fdw | 1.4.0 → 1.4.0 | +DEB PG14-18 |
| 2026-07-24 | pg_wait_sampling | RPM only: 1.1.11 → 1.1.11 | +RPM PG14-18; SQL 1.1 |
| 2026-07-24 | pgl_ddl_deploy | 2.2.1 → 2.2.1 | RPM: +RPM PG14-18; +U26 DEB PG14-17 DEB: 10 DEB: +PG18; U26 PG14-17 |
| 2026-07-24 | pglogical_ticker | 1.4.1 → 1.4.1 | 6 EL RPM PG14-17 |
| 2026-07-24 | pgmemcache | 2.3.0 → 2.3.0 | EL8 aarch64 RPM PG14-15 |
| 2026-07-24 | pgml | 2.10.0 → 2.10.0 | EL10/D13/U26; PG14-17; 2 arch |
| 2026-07-24 | pgspider_ext | 1.3.0 → 1.3.0 | RPM: +RPM PG14-18; PG18 compatible DEB: 10 DEB: +PG18; PG15-18 |
| 2026-07-24 | plisql | 1.0 → 1.0 | IvorySQL 5.4; PG18; 16 targets |
| 2026-07-24 | pllua | 2.0.12 → 2.0.12 | 6 EL: +PG18; EL8 aarch64: +PG14-15 |
| 2026-07-24 | rdkit | 202503.6 → 202503.6 | RPM: 202303.3; EL8/9, D12/U22; PG14-18 DEB: D12/U22 PG17-18: 202303.3; U26 PG14-17: 202503.6; runtimes unchanged |
| 2026-07-24 | sqlite_fdw | 2.5.0 → 2.5.0 | RPM: RPM r3: +PG18, EL8 SQLite; PG14-18 DEB: 10 DEB: +PG18; PG14-18 |
| 2026-07-24 | sslutils | 1.4 → 1.4 | EL8 RPM PG18, 2 arch |
| 2026-07-24 | wal2mongo | 1.0.7 → 1.0.7 | RPM: +RPM PG14-18; PG17-18 compatible DEB: 10 DEB: +PG17-18; PG14-18 |
| 2026-07-24 | system_stats | DEB only: 4.0 → 4.1 | PG14-18; 10 DEB targets |
Infrastructure Package Update Log
The following table contains all 144 Infra log records after v4.4.0, from 2026-07-16 through the latest 2026-08-12 batch. It also includes the ferretdb2 rebuild and RPM exporter package-name migration recorded in the changelog prose. Consecutive upgrades of the same package are retained as separate batch entries.
Build, download, and verification status follows the wording of the original log; it does not establish repository indexing, signing, synchronization, or offline-bundle acceptance. See the Infra changelog for full context.
| Batch | Package | Old Version | New Version | Notes |
|---|---|---|---|---|
| 2026-08-12 | claude | 2.1.226 | 2.1.227 | Official manifest verified via proxy; dual-arch RPM/DEB built |
| 2026-08-12 | code-server | 4.131.0 | 4.132.0 | Official dual-architecture RPM/DEB downloaded and verified |
| 2026-08-12 | grafana-infinity-ds | 3.11.2 | 3.11.3 | Built as dual-architecture RPM/DEB |
| 2026-08-12 | mtail | 3.4.6 | 3.4.7 | Built as dual-architecture RPM/DEB |
| 2026-08-12 | opencode | 1.18.15 | 1.18.16 | Built as dual-architecture RPM/DEB |
| 2026-08-12 | pg-hardstorage | 1.1.1 | 1.2.1 | Official dual-architecture RPM/DEB downloaded and verified |
| 2026-08-12 | pig | 1.6.1 | 1.8.0 | Official dual-architecture RPM/DEB downloaded and verified |
| 2026-08-12 | postgrest | 16.0 | 16.1 | Static dual-architecture RPM/DEB; requires PostgreSQL 14+ |
| 2026-08-12 | redis-exporter | 1.88.0 | 1.89.0 | Built as dual-architecture RPM/DEB |
| 2026-08-12 | sow | 0.2.0 | 0.3.0 | Official dual-architecture RPM/DEB downloaded and verified |
| 2026-08-12 | stalwart | 0.16.16 | 0.16.17 | Built as dual-architecture RPM/DEB |
| 2026-08-08 | claude | 2.1.223 | 2.1.226 | Official manifest verified via proxy; dual-arch built |
| 2026-08-08 | codex | 0.146.1 | 0.147.0 | Stable tag rust-v0.147.0; dual-arch built |
| 2026-08-08 | crush | 0.88.0 | 0.88.1 | Official tarballs repacked as 1PGSTY with license |
| 2026-08-08 | grafana | 13.1.2 | 13.1.3 | Official dual-architecture RPM/DEB artifacts |
| 2026-08-08 | opencode | 1.18.14 | 1.18.15 | Built as dual-architecture RPM/DEB |
| 2026-08-08 | postgrest | 14.16 | 16.0 | Static dual-architecture assets; requires PostgreSQL 14+ |
| 2026-08-08 | rainfrog | 0.4.2 | 0.4.3 | Built as dual-architecture RPM/DEB |
| 2026-08-08 | rustfs | 1.0.0-b12 | 1.0.0-rc1 | Upstream rc.1-preview.1; dual-arch RPM/DEB built |
| 2026-08-08 | uv | 0.12.2 | 0.12.3 | Built as dual-architecture RPM/DEB |
| 2026-08-07 | claude | 2.1.222 | 2.1.223 | Official manifest verified via proxy; built |
| 2026-08-07 | codex | 0.146.0 | 0.146.1 | Stable tag rust-v0.146.1; built |
| 2026-08-07 | code | 1.131.0 | 1.132.0 | Official dual-architecture RPM/DEB verified |
| 2026-08-07 | dblab | 0.47.2 | 0.47.4 | Built as dual-architecture RPM/DEB |
| 2026-08-07 | grafana-infinity-ds | 3.11.1 | 3.11.2 | Built as dual-architecture RPM/DEB |
| 2026-08-07 | grafana-victorialogs-ds | 0.30.1 | 0.31.0 | Built as dual-architecture RPM/DEB |
| 2026-08-07 | k3s | 1.36.2 | 1.36.3 | Official stable channel v1.36.3+k3s1; built |
| 2026-08-07 | k3s-images | 1.36.2 | 1.36.3 | Exact-match dual-architecture airgap images; built |
| 2026-08-07 | mcli | 20260804000000 | 20260806000000 | Official pgsty fork dual-architecture RPM/DEB verified |
| 2026-08-07 | opencode | 1.18.13 | 1.18.14 | Built as dual-architecture RPM/DEB |
| 2026-08-07 | pgschema | 1.12.1 | 1.12.2 | Official dual-architecture RPM/DEB verified |
| 2026-08-07 | seaweedfs | 4.40 | 4.41 | Built as dual-architecture RPM/DEB |
| 2026-08-07 | silo | minio 20260804000000 | 20260806000000 | Official replacement; dual-architecture RPM/DEB verified |
| 2026-08-07 | uv | 0.12.1 | 0.12.2 | Built as dual-architecture RPM/DEB |
| 2026-08-07 | victoria-metrics | 1.148.0 | 1.149.0 | Main, cluster, and vmutils packages built for both arches |
| 2026-08-07 | ferretdb2 | 2.7.0 | 2.7.0 | Rebuilt at the current version for dual-architecture RPM/DEB |
| 2026-08-05 | agentsview | 0.39.0 | 0.40.1 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | claude | 2.1.220 | 2.1.222 | Official manifest verified via proxy; built |
| 2026-08-05 | code-server | 4.130.0 | 4.131.0 | Official artifacts downloaded and verified |
| 2026-08-05 | crush | 0.87.0 | 0.88.0 | Official links only; redistribution blocked |
| 2026-08-05 | grafana | 13.1.1 | 13.1.2 | Official artifacts verified; security fix |
| 2026-08-05 | juicefs | 1.4.0 | 1.4.1 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | mcli | 20260417000000 | 20260804000000 | pgsty fork artifacts downloaded and verified |
| 2026-08-05 | minio | 20260618000000 | 20260804000000 | pgsty fork artifacts downloaded and verified |
| 2026-08-05 | mongodb-exporter | 0.51.0 | 0.52.0 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | mtail | 3.0.8 | 3.4.6 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | nodejs | 24.18.1 | 24.19.0 | Node.js 24.x LTS; built |
| 2026-08-05 | opencode | 1.18.9 | 1.18.13 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | pg-hardstorage | 1.0.17 | 1.1.1 | Official artifacts downloaded and verified |
| 2026-08-05 | pgbackrest-exporter | 0.23.0 | 0.24.0 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | pgstream | 1.2.5 | 1.3.1 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | rclone | 1.74.4 | 1.75.0 | Official artifacts downloaded and verified |
| 2026-08-05 | rustfs | 1.0.0-b11 | 1.0.0-b12 | Beta line; built as dual-architecture RPM/DEB |
| 2026-08-05 | stalwart | 0.16.15 | 0.16.16 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | uv | 0.12.0 | 0.12.1 | Built as dual-architecture RPM/DEB |
| 2026-08-05 | vray | 5.51.2 | 5.52.0 | Latest stable; built as dual-architecture RPM/DEB |
| 2026-08-05 | xray | 26.3.27 | 26.7.28 | Latest dated release; built as dual-architecture RPM/DEB |
| 2026-08-05 | prometheus | 3.13.1 | 3.13.2 | Security and stability release |
| 2026-08-05 | pig | 1.6.0 | 1.6.1 | Refreshed extension catalog |
| 2026-07-30 | agentsview | 0.38.1 | 0.39.0 | |
| 2026-07-30 | claude | 2.1.218 | 2.1.220 | |
| 2026-07-30 | cloudflared | 2026.7.2 | 2026.7.3 | |
| 2026-07-30 | code | 1.130.0 | 1.131.0 | |
| 2026-07-30 | code-server | 4.129.0 | 4.130.0 | |
| 2026-07-30 | codex | 0.145.0 | 0.146.0 | Release tag rust-v0.146.0 |
| 2026-07-30 | crush | 0.86.0 | 0.87.0 | |
| 2026-07-30 | dblab | 0.46.0 | 0.47.2 | |
| 2026-07-30 | etcd | 3.7.0 | 3.7.1 | |
| 2026-07-30 | genai-toolbox | 1.7.0 | 1.8.0 | Source build; Rocky 8/9 and Debian 12 verified |
| 2026-07-30 | headscale | 0.29.2 | 0.29.3 | |
| 2026-07-30 | nodejs | 24.18.0 | 24.18.1 | Security release |
| 2026-07-30 | opencode | 1.18.4 | 1.18.9 | |
| 2026-07-30 | pg-exporter | 1.4.0 | 1.4.1 | Official release artifacts |
| 2026-07-30 | pg-hardstorage | 1.0.13 | 1.0.17 | |
| 2026-07-30 | pgschema | 1.12.0 | 1.12.1 | |
| 2026-07-30 | pgstream | 1.2.2 | 1.2.5 | |
| 2026-07-30 | pig | 1.5.1 | 1.6.0 | |
| 2026-07-30 | postgrest | 14.15 | 14.16 | |
| 2026-07-30 | rainfrog | 0.3.20 | 0.4.2 | |
| 2026-07-30 | redis-exporter | 1.87.0 | 1.88.0 | |
| 2026-07-30 | rustfs | 1.0.0-beta.10 | 1.0.0-beta.11 | Preview releases excluded |
| 2026-07-30 | stalwart | 0.16.14 | 0.16.15 | |
| 2026-07-30 | uv | 0.11.31 | 0.12.0 | |
| 2026-07-30 | victoria-traces | 0.9.4 | 0.10.0 | |
| 2026-07-23 | claude | 2.1.215 | 2.1.218 | Verified against the official manifest via proxy |
| 2026-07-23 | codex | 0.144.6 | 0.145.0 | Release tag rust-v0.145.0 |
| 2026-07-23 | dblab | 0.44.1 | 0.46.0 | |
| 2026-07-23 | duckdb | 1.5.4 | 1.5.5 | |
| 2026-07-23 | grafana-infinity-ds | 3.8.0 | 3.11.1 | |
| 2026-07-23 | grafana-victorialogs-ds | 0.30.0 | 0.30.1 | |
| 2026-07-23 | opencode | 1.18.3 | 1.18.4 | |
| 2026-07-23 | pg-timetable | 6.3.0 | 7.0.0 | Major release |
| 2026-07-23 | pgstream | 1.2.0 | 1.2.2 | |
| 2026-07-23 | stalwart | 0.16.13 | 0.16.14 | |
| 2026-07-23 | uv | 0.11.29 | 0.11.31 | |
| 2026-07-23 | grafana | 13.1.0 | 13.1.1 | Direct-download artifacts |
| 2026-07-23 | pg-hardstorage | 1.0.12 | 1.0.13 | Direct-download artifacts |
| 2026-07-23 | crush | 0.85.0 | 0.86.0 | Direct-download artifacts |
| 2026-07-23 | code | 1.129.1 | 1.130.0 | Direct-download artifacts |
| 2026-07-20 | RPM exporter package names | xxx_exporter | xxx-exporter | Renamed underscore-style RPM packages to hyphenated names to match DEB naming |
| 2026-07-20 | pg-exporter | 1.3.0 | 1.4.0 | Repackaged from the upstream Linux tarball |
| 2026-07-20 | victoria-metrics | 1.147.0 | 1.148.0 | VictoriaMetrics main package |
| 2026-07-20 | victoria-metrics-cluster | 1.147.0 | 1.148.0 | VictoriaMetrics companion package |
| 2026-07-20 | vmutils | 1.147.0 | 1.148.0 | VictoriaMetrics companion package |
| 2026-07-20 | victoria-logs | 1.51.0 | 1.52.0 | VictoriaLogs main package |
| 2026-07-20 | vlogscli | 1.51.0 | 1.52.0 | VictoriaLogs companion package |
| 2026-07-20 | vlagent | 1.51.0 | 1.52.0 | VictoriaLogs companion package |
| 2026-07-20 | grafana-victorialogs-ds | 0.29.0 | 0.30.0 | |
| 2026-07-20 | seaweedfs | 4.39 | 4.40 | |
| 2026-07-20 | rustfs | 1.0.0-b9 | 1.0.0-b10 | Prerelease line; preview releases excluded |
| 2026-07-20 | sabiql | 1.14.0 | 1.15.1 | |
| 2026-07-20 | timescaledb-tools | 0.19.0-1 | 0.19.0-2 | Bundles timescaledb-parallel-copy 0.13.0 |
| 2026-07-20 | claude | 2.1.211 | 2.1.215 | Downloaded through the 8118 proxy and verified |
| 2026-07-20 | codex | 0.144.4 | 0.144.6 | Release tag rust-v0.144.6 |
| 2026-07-20 | genai-toolbox | 1.6.0 | 1.7.0 | External build from official GCS binary and arm64 container artifact |
| 2026-07-20 | opencode | 1.18.2 | 1.18.3 | |
| 2026-07-20 | pg-hardstorage | 1.0.10 | 1.0.12 | Direct-download artifacts |
| 2026-07-20 | code | 1.129.0 | 1.129.1 | Direct-download artifacts |
| 2026-07-20 | code-server | 4.128.0 | 4.129.0 | Direct-download artifacts |
| 2026-07-20 | pev2 | 1.22.0 | 1.23.0 | Noarch package |
| 2026-07-20 | k3s | - | 1.36.2 | Upstream v1.36.2+k3s1; amd64 and arm64 |
| 2026-07-20 | k3s-images | - | 1.36.2 | Exact-match system image package for both architectures |
| 2026-07-16 | jmx-exporter | - | 1.6.0 | New noarch package |
| 2026-07-16 | node_exporter | 1.11.1 | 1.12.1 | |
| 2026-07-16 | redis_exporter | 1.86.0 | 1.87.0 | |
| 2026-07-16 | etcd | 3.6.13 | 3.7.0 | |
| 2026-07-16 | dblab | 0.43.0 | 0.44.1 | |
| 2026-07-16 | pgstream | 1.1.1 | 1.2.0 | |
| 2026-07-16 | rainfrog | 0.3.19 | 0.3.20 | |
| 2026-07-16 | rustfs | 1.0.0-b8 | 1.0.0-b9 | Prerelease line |
| 2026-07-16 | agentsview | 0.37.5 | 0.38.1 | |
| 2026-07-16 | claude | 2.1.206 | 2.1.211 | Downloaded through the 8118 proxy and verified |
| 2026-07-16 | codex | 0.144.1 | 0.144.4 | Release tag rust-v0.144.4 |
| 2026-07-16 | stalwart | 0.16.12 | 0.16.13 | |
| 2026-07-16 | npgsqlrest | 3.20.0 | 3.21.0 | |
| 2026-07-16 | postgrest | 14.14 | 14.15 | |
| 2026-07-16 | opencode | 1.17.18 | 1.18.2 | |
| 2026-07-16 | uv | 0.11.28 | 0.11.29 | |
| 2026-07-16 | vector | 0.56.0 | 0.57.0 | Direct-download artifacts |
| 2026-07-16 | pg-hardstorage | 1.0.8 | 1.0.10 | Direct-download artifacts |
| 2026-07-16 | crush | 0.84.0 | 0.85.0 | Direct-download artifacts |
| 2026-07-16 | code | 1.128.0 | 1.129.0 | Direct-download artifacts |
| 2026-07-16 | code-server | 4.127.0 | 4.128.0 | Direct-download artifacts |
| 2026-07-16 | cloudflared | 2026.7.1 | 2026.7.2 | Direct-download artifacts |
Compatibility Changes and Upgrade Notes
- Existing FERRET deployments should remove the legacy
ferretdbsystemd service and redeploy the protocol layer withdocker.ymlandapp.yml. The oldmongo.ymlplaybook,mongo_*parameters, scrape job, and dedicated dashboard are no longer provided. - Pigsty no longer renders
/etc/default/haproxyfor the HAProxy unit, although the unit can read it when present. Use onlyEXTRAOPTSfor process arguments, notOPTIONS. AnyEXTRAOPTSoverride must retain-S /run/haproxy-master.sockand must not include-f. - New module playbooks require target hosts to define the corresponding
pg_cluster,redis_cluster,minio_cluster,kafka_cluster, ormysql_clusterexplicitly. Custom inventories that relied on fixed group names without cluster identity variables must add those identities first. - The MINIO role now accepts only
minio_type: silo;minioandrustfsfail during identity validation. Silo retains MinIO protocol and on-disk compatibility, but the package, binary, and systemd service names change. Back up existing object storage and validate in-place compatibility and rollback before upgrading; do not treat package replacement as a migration that has already passed acceptance. - Valkey remains opt-in.
redis_type: valkeyinstallsvalkey-serverandvalkey-cli, while configuration paths, service names, monitoring jobs, and other module-facing interfaces remain underredisfor compatibility. - Pigsty’s core REPO/CACHE roles require SOW and use
sow create --pigstyto generate local repositories. Older offline bundles or local repositories without SOW 0.3.0 must first install or refresh it from the Pigsty INFRA repository.pig repo createis a separate CLI path whose fallback behavior depends on its own version. - MySQL
mysql_databasesentries accept onlyname,encoding, andcollate, and databases are created withDEFAULT ENCRYPTION='N'.mysql_parameterscannot useloose_,skip_,disable_, orenable_prefixes to bypass platform-owned, replication, or TLS option protection. - Custom RPM repositories and external automation that still reference underscore names such as
node_exporterorredis_exportermust move to the hyphenatednode-exporterandredis-exporterpackage names. docker/Makefileno longer acceptsDATAto redirect the cleanup target.make purgedeletes repository-local./dataimmediately without a countdown; preserve any required data first.- KAFKA and MYSQL remain pilot modules. Kafka clients must resolve and reach each broker directly rather than putting the data plane behind HAProxy, a VIP, or an L4 load balancer. MySQL currently accepts exactly one or three members.
All 14 validated offline artifacts are published on GitHub for this release, one per recommended OS version and architecture, alongside a checksums manifest and a detached PGP signature (.asc) for every file.
Checksums
v4.4.0
Pigsty v4.4.0 is a maintenance release centered on PostgreSQL 18.4, PostgreSQL 19 beta readiness, 531 extensions, refreshed kernel variants, and broader platform coverage.
Released on 2026-07-10. See the GitHub release and all changes since v4.3.0.
Highlights
- PostgreSQL 18.4 / 19 beta: PostgreSQL 18.4 is now the production default, with a minimal PostgreSQL 19 beta template for evaluation.
- 531 extensions and refreshed kernels: The catalog adds 21 extensions and updates major PostgreSQL variants across the supported platform matrix.
- Safer operations with Pig 1.5.1: New clone, fork, and PITR workflows arrive alongside automatic VIP discovery, Zstandard pgBackRest compression, and dedicated Patroni log collection.
- Security, applications, and tooling: Secret handling and repository automation are hardened, with new app templates, a redesigned portal, and optional Codex support.
- Platform validation: All 14 offline deployment tests pass across seven OS baselines on both
x86_64andaarch64. - Offline artifacts: The Community Edition publishes six dual-architecture offline packages for Debian 13, EL 10, and Ubuntu 24.04 on GitHub. Prebuilt packages for the other validated baselines are available with the Professional Edition.
Upgrade Notes
- Generated pgBackRest configurations now use
compress-type=zst; preserve intentional local overrides before re-rendering them. #744 - Patroni logs now use
/pg/log/patroniandjob=patroni; update custom log queries and alert rules that use the old syslog selector. - VIP interfaces now default to
auto, dnsmasq records move to/etc/dnsmasq.d/pigsty, and Pigsty manages/etc/default/haproxy; preserve explicit network overrides where needed. - The default etcd backend quota drops from 16 GiB to 8 GiB; check existing backend usage before applying the new configuration.
pigautomation must use-y/--yesfor destructive commands, whilepig pb restoreandpig pitrrequire one explicit recovery target. See thepigv1.5 notes.- Supabase analytics moves to the
_supabasedatabase and_analyticsschema; existing deployments should create them before switching stacks.
Security and Operations
- The
pg-pitrwrapper adds safer target selection, timelines, dry runs, and stronger checks against unsafe recovery targets. - Application secrets are hidden from Ansible output, generated
.envfiles use mode0600, and Grafana no longer prints the administrator password. - The
dbsusudo policy gains controlled journal access, while the repository adds a security policy, CodeQL, Dependabot, pinned actions, and release-signing automation.
Applications and Tooling
- Added Immich, Maybe, and JumpServer templates; refreshed Supabase, Dify, InsForge, Registry, Jupyter, Kong, Odoo, Teable, Mattermost, and related launch helpers.
- Rebuilt the bilingual infrastructure portal and added opt-in Codex CLI support to the experimental VIBE module; Claude Code remains its default managed coding agent.
- Removed the legacy FerretDB Compose template; the FERRET module remains available.
Bug Fixes
- Fixed EL10 PostgreSQL/libpq provider conflicts, EPEL path handling, and PGDG minor-version repository rules. #752
- Reused an existing
/wwwdirectory during bootstrap and fixed Redis Sentinel HA password rendering. #753 #748 - Corrected RPM naming and package groups for
pg_http,pg_gzip,apache-age, andodbc_fdw. #750 - Prevented unexpected service starts during Debian and Ubuntu package installation, and improved EL9 aarch64 Patroni package handling.
- Fixed VirtualBox private-network routing and default NIC selection.
- Fixed shell portability and Vector log lifecycle issues, along with PG19
io_workers, Teable HBA, and application runtime defaults.
PostgreSQL and Extension Package Changes
The release adds 21 extensions, updates the PostgreSQL 18.4 package graph, introduces the PostgreSQL 19 beta template, and refreshes major kernel variants. Versions below are verified against final repository metadata and, where bundled, the v4.4.0 artifacts; PG major ranges describe catalog and repository coverage.
PostgreSQL RPM changes · PostgreSQL DEB changes · Infrastructure package changes
| Package | Old Version | New Version | Notes |
|---|---|---|---|
polardb-17 | 17.9.1.0 | 17.10.1.0 | PG 17; RPM added |
agensgraph-17 | 2.16.0 | 2.17.0 | PG 17.10 |
openhalodb-14 | 1.0-beta | 1.0-2 | OpenHaloDB |
babelfish-17 | 5.4.0 | 5.4.0 | PG 17.7; rebuild |
babelfish-18 | - | 6.0.0 | PG 18.3 |
pgedge | 17.9 / 18.3 | 15.18 / 16.14 / 17.10 / 18.4 | PG 15/16 added; PG 17/18 updated; Spock 5.0.10 |
ivorysql-18 | 5.0 | 5.4 | PG 18; RPM added |
cloudberry | 2.1.0-1 | 2.1.0-2 / 2.1.0-3 | DEB/RPM rebuild; RPM path /usr/cloudberry |
cloudberry-backup | 2.1.0-1 | 2.1.0-2 / 2.1.0-3 | backup subpackage |
cloudberry-pxf | 2.1.0-1 | 2.1.0-2 / 2.1.0-3 | PXF subpackage |
pg_ducklake | - | 1.0.0 | PG 14-18 |
psql_bm25s | - | 0.4.13 | BM25 retrieval; PG 17-18 |
mongo_fdw | 5.5.3 | 5.5.3 | new DEB packaging; existing PGDG RPM, PG 14-18 |
multicorn | 3.2 | 3.2 | new DEB packaging; existing PGDG RPM, PG 14-18 |
pg_orca | - | 1.0.0 | PG 18 only |
pg_sorted_heap | - | 0.14.0 | PG 16-18 |
pg_stl | - | 1.0.0 | PG 16-18 |
fsm_core | - | 1.1.0 | PG 15-18 |
pg_projection | - | 1.0.0 | PG 14-18 |
graph | - | 0.1.7 | PG 14-18 |
jsonschema | - | 0.1.9 | PG 14-18 |
pg_durable | - | 0.2.2 | PG 14-18 |
pg_stat_log | - | 0.1 | PG 18 only |
pg_stat_plans | - | 2.1.0 | PG 16-18 |
pg_task | 1.0.0 | 2.1.29 | PG 14-18, pcre2grep fix |
pg_stat_backtrace | - | 1.0.0 | PG 14-18; libunwind |
pg_mockable | - | 1.1.0 | PG 14-18 |
db2fce | - | 0.0.17 | PG 14-18 |
pg_uuid_v8 | - | 1.0.0 | PG 14-18 |
pg_extra_time | 2.0.0 | 2.1.0 | PG 14-18 |
pg_pinyin | 0.0.2 | 0.0.4 | PG 14-18 |
passwordpolicy | - | 2.0.5 | PG 14-18 |
pgdisablelogerror | - | 1.0 | PG 14-18 |
plpgsql_wrap | - | 1.0 | PG 14-18 |
timescaledb | 2.26.4 | 2.28.2 | PG 15-18 |
documentdb | 0.110 | 0.113 | PG 15-18 |
citus | 14.0.0-4 | 14.1.0 | PG 16-18 |
pgvector | 0.8.2 | 0.8.4 | PG 14-18 |
orioledb | 1.7-beta15 | 1.8-beta16 | Build for PG 16, 17, 18 |
pg_search | 0.23.1 | 0.24.0 | PG 15-18 |
pg_textsearch | 1.1.0 | 1.2.0 | BM25 full-text search, PG 17-18 |
storage_engine | 1.3.4 | 2.4.0 | PGXN 2.x bump, PG 15-18 |
pg_clickhouse | 0.2.0 | 0.3.2 | PGXN bump, ClickHouse integration |
provsql | 1.2.3 | 1.10.0 | PGXN bump, PG 14-18 |
pgclone | 4.0.0 | 4.3.2 | PGXN bump, PG 14-18 |
biscuit | 2.2.2 | 2.4.0 DEB / 2.4.1 RPM | PG 16-18 |
pgmnemo | 0.7.2 | 0.12.1 | PG 14-18 |
rdf_fdw | 2.5.0 | 2.6.0 | PG 14-18, libcurl compatibility patch |
roaringbitmap | 1.1.0 | 1.2.0-2 | PG 14-18, llvm-lto packaging fix |
plpgsql_check | 2.9.0 | 2.9.2 | PG 14-18 |
timescaledb_toolkit | 1.22.0 | 1.23.0 | PG 15-18, pgrx 0.18.1 |
wrappers | 0.6.0 | 0.6.1 | PG 14-18, pgrx 0.18.1 |
pgrdf | 0.5.0 | 0.6.4 | PG 14-17, pgrx 0.18.1 |
pg_graphql | 1.5.12 | 1.6.1 | PG 14-18, pgrx 0.18.1 |
pg_anon | 3.0.13 | 3.1.1 | PG 14-18, pgrx 0.18.1 |
pg_kazsearch | 2.0.0 | 2.2.0 | PG 16-18, pgrx 0.18.1 |
pg_session_jwt | 0.4.0 | 0.5.0 | PG 14-18, pgrx 0.18.1 |
pg_tzf | 0.2.4 | 0.3.0 | PG 14-18, pgrx 0.18.1 |
pg_vectorize | 0.26.1 | 0.26.2 | PG 14-18, pgrx 0.18.1 |
pglinter | 1.1.2 | 2.0.0 | PG 14-18, pgrx 0.18.1 |
pgmqtt | 0.1.0 | 0.3.0 | PG 14-18, pgrx 0.18.1 |
etcd_fdw | 0.0.0 | 0.0.1 | PG 14-18, pgrx 0.18.1 |
pg_http | 1.7.0 | 1.7.1 | PG 14-18, RPM rename to pgsql_http_$v |
pg_gzip | 1.0.0 | 1.1.0 | PG 14-18, RPM rename to pgsql_gzip_$v |
age | 1.7.0 | 1.7.0 | PG 17-18, RPM rename to age_$v |
pg_trickle | 0.40.0 | 0.81.0 | PG 18 only |
re2 | 0.1.1 | 0.4.0 | PG 16-18 |
pg_background | 1.9.2 | 2.0.2 DEB / 2.0 RPM | PG 14-18 |
firebird_fdw | 1.4.1 | 1.4.2 | PG 14-18 |
pg_net | 0.20.2 | 0.20.3 | DEB + EL10 RPM; EL8/9 RPM stays on 0.9.2 |
pg_dirtyread | 2.7 | 2.8 | PG 14-18 |
pg_stat_ch | 0.3.6 | 0.3.6 | PG 16-18, rebuild |
pggraph | 0.1.5 | 0.1.7 | PG 14-18 |
pgsql_tweaks | 1.0.2 | 1.0.5 | PG 14-18; PGDG RPM also carries 1.0.3 |
pgfincore | 1.3.1 | 1.4.0 | PG 14-18 |
toastinfo | 1.5 | 1.7 | PG 14-18 |
pg_ivm | 1.14 | 1.15 DEB / 1.14 RPM | PG 14-18 |
timeseries | 0.2.0 | 0.2.1 | PG 14-18 |
Infrastructure Package Changes
| Package | Old Version | New Version | Notes |
|---|---|---|---|
pig | 1.4.1 | 1.5.1 | |
pg_exporter | 1.2.2 | 1.3.0 | |
pgschema | 1.9.0 | 1.12.0 | |
pgstream | 1.0.1 | 1.1.1 | |
pg-hardstorage | - | 1.0.8 | |
codex | 0.125.0 | 0.144.1 | |
claude | 2.1.123 | 2.1.206 | |
opencode | 1.14.30 | 1.17.18 | |
agentsview | 0.26.0 | 0.37.5 | |
genai-toolbox | 1.1.0 | 1.6.0 | packaged as mcp-toolbox |
crush | 0.64.0 | 0.84.0 | |
code | 1.118.1 | 1.128.0 | |
code-server | 4.117.0 | 4.127.0 | |
victoria-metrics | 1.142.0 | 1.147.0 | |
victoria-metrics-cluster | 1.142.0 | 1.147.0 | |
vmutils | 1.142.0 | 1.147.0 | |
victoria-logs | 1.50.0 | 1.51.0 | |
vlagent | 1.50.0 | 1.51.0 | |
vlogscli | 1.50.0 | 1.51.0 | |
victoria-traces | 0.8.2 | 0.9.4 | |
prometheus | 3.11.3 | 3.13.1 | |
alertmanager | 0.32.1 | 0.33.1 | |
pushgateway | 1.11.2 | 1.11.3 | |
node_exporter | 1.11.1 | 1.11.1 | tarball cache; version metadata fix |
redis_exporter | 1.82.0 | 1.86.0 | |
mongodb_exporter | 0.50.0 | 0.51.0 | |
grafana | 13.0.1 | 13.1.0 | |
grafana-victorialogs-ds | 0.26.3 | 0.29.0 | |
grafana-victoriametrics-ds | 0.24.0 | 0.25.2 | |
vector | 0.55.0 | 0.56.0 | |
minio | 20260417000000 | 20260618000000 | |
seaweedfs | 4.22 | 4.39 | |
rustfs | 1.0.0-b1 | 1.0.0-b8 | prerelease line |
duckdb | 1.5.2 | 1.5.4 | |
kafka | 4.2.0 | 4.3.1 | |
etcd | 3.6.10 | 3.6.13 | |
restic | 0.18.1 | 0.19.1 | |
juicefs | 1.3.1 | 1.4.0 | |
tigerbeetle | 0.17.2 | 0.17.9 | |
tigerfs | 0.6.0 | 0.7.0 | |
caddy | 2.11.2 | 2.11.4 | |
cloudflared | 2026.2.0 | 2026.7.1 | |
headscale | 0.28.0 | 0.29.2 | |
v2ray | 5.48.0 | 5.51.2 | |
nodejs | 24.15.0 | 24.18.0 | |
golang | 1.26.2 | 1.26.5 | |
hugo | 0.161.1 | 0.164.0 | |
uv | 0.11.8 | 0.11.28 | |
rclone | 1.73.5 | 1.74.4 | |
asciinema | 3.2.0 | 3.2.1 | |
stalwart | 0.16.2 | 0.16.12 | |
maddy | 0.9.3 | 0.9.5 | |
dblab | 0.38.0 | 0.43.0 | |
npgsqlrest | 3.12.0 | 3.20.0 | |
postgrest | 14.10 | 14.14 | |
sabiql | 1.11.1 | 1.14.0 | |
pev2 | 1.21.0 | 1.22.0 | |
rainfrog | 0.3.18 | 0.3.19 |
The MD5 list below covers all 14 validated artifacts. Six Community Edition artifacts are published on GitHub, while the remaining eight are delivered with the Professional Edition. GitHub records SHA-256 digests for the uploaded Community Edition artifacts.
Checksums
v4.3.0
Highlights
- Added about 50 PostgreSQL extensions, bringing the total available extension count to 510.
- Added Ubuntu 26.04 x86_64/arm64 support, deprecated Ubuntu 20.04 support, and refreshed minor OS variants to Debian 13.4 / Ubuntu 24.04.4.
- Kernel updates: Supabase is updated to the latest version, pgEdge to PG 18, and PolarDB to PG 17.
- Grafana is updated to 13.0.1, and MinIO now uses the pgsty branch with CVE fixes.
- Vagrant templates now consistently use cloud-image series images.
Bug Fixes
- Relaxed PostgreSQL username validation to allow
@.-in usernames. - Fixed IPv6 nameserver parsing so DNS configuration is not limited to legacy IPv4 DNS server extraction.
- Changed the VictoriaTraces Grafana datasource path to
/select/jaeger. - Made Vagrant disk probing more robust and added
bin/el-fix, a guest-network fix script for EL Vagrant images.
PostgreSQL and Extension Package Changes
| Package | Old Version | New Version | Notes |
|---|---|---|---|
block_copy_command | - | 0.1.5 | New; PG 14-18; Rust/pgrx 0.17.0 |
cloudberry | 2.0.0 | 2.1.0 | Kernel package group; RPM release 2 fixes initdb errno issue |
cloudberry-backup | - | 2.1.0 | New Cloudberry backup tool package |
cloudberry-pxf | - | 2.1.0 | New Cloudberry PXF package |
credcheck | 4.6 | 4.7 | Upgrade; PG 14-18; PGDG |
datasketches | - | 1.7.0 | New; PG 14-18 |
ddl_historization | 0.0.7 | 0.2 | Upgrade |
documentdb | 0.109 | 0.110 | Upgraded to upstream version; PG 15-18 |
external_file | - | 1.2 | New; PG 14-18 |
logical_ddl | - | 0.1.0 | New; PG 14-18 |
nominatim_fdw | 1.1.0 | 1.2 | Upgrade |
onesparse | - | 1.0.0 | New; PG 18 only |
orioledb | beta15 1.7 | beta15 1.7 | Paired with OriolePG 17.18 |
oriolepg | 17.16 | 17.18 | Kernel patch set update |
parray_gin | - | 1.5.0 | Added, then upgraded; PG 14-18 |
pg_accumulator | - | 1.1.3 | New; PG 14-18 |
pg_anon | 3.0.1 | 3.0.13 | Upgrade; Rust/pgrx 0.16.1 -> 0.17.0 |
pg_background | 1.8 | 1.9.2 | DEB only |
pg_bikram_sambat | - | 0.1.0 | New; Bikram Sambat date type and AD/BS conversion functions |
pg_byteamagic | - | 0.2.4 | New; PG 14-18 |
pg_cardano | 1.1.1 | 1.2.0 | Upgrade; Rust/pgrx 0.17.0 |
pg_clickhouse | 0.1.5 | 0.2.0 | Upgrade |
pg_datasentinel | - | 1.0 | New; PG 15-18 |
pg_dbms_job | 1.5 | 2.0 | Upgrade; PG 14-18; PGDG |
pg_dispatch | - | 0.1.5 | New; PG 14-18 |
pg_failover_slots | 1.2.0 | 1.2.1 | Upgrade |
pg_fsql | - | 1.1.0 | New; PG 14-18 |
pg_incremental | 1.4.1 | 1.5.0 | Upgrade |
pg_isok | - | 1.4.1 | New; PG 14-18 |
pg_ivm | 1.13 | 1.14 | Upgrade; PG 14-18 |
pg_kazsearch | - | 2.0.0 | New; PG 16-18; Rust/pgrx 0.17.0 |
pg_liquid | - | 0.1.7 | New; PG 14-18 |
pg_pathcheck | - | 0.9.1 | New; PG 17-18; requires shared_preload_libraries |
pg_query_rewrite | - | 0.0.5 | New; PG 14-18 |
pg_regresql | - | 2.0.0 | New; PG 14-18 |
pg_rrf | - | 0.0.3 | New; PG 14-17; Rust/pgrx 0.16.1 -> 0.17.0 |
pg_savior | 0.0.1 | 0.1.0 | Upgrade; high-risk DDL/DML guard hook; requires preload or LOAD |
pg_search | 0.22.2 | 0.23.1 | Upgrade; PG 15-18; pgrx 0.18.0 |
pg_slug_gen | - | 1.0.0 | New; PG 15-18 |
pg_stat_ch | - | 0.3.6 | Added, then upgraded; PG 16-18; EL8 break |
pg_store_plans | 1.9 | 1.10 | Upgrade |
pg_strict | 1.0.3 | 1.0.5 | Upgrade; Rust/pgrx 0.16.1 -> 0.17.0 |
pg_text_semver | - | 1.2.1 | New; PG 14-18 |
pg_textsearch | 0.5.0 | 1.1.0 | Upgrade; PG 17-18; requires shared_preload_libraries |
pg_trickle | 0.16.0 | 0.40.0 | Upgrade; PG 18 only; pgrx 0.18.0 |
pg_tzf | 0.2.3 | 0.2.4 | Upgrade; Rust/pgrx 0.17.0 |
pg_vectorize | 0.26.0 | 0.26.1 | Upgrade; Rust/pgrx 0.16.1 -> 0.17.0 |
pg_variables | - | 1.2.5 | New; PG 14-18 |
pg_when | - | 0.1.9 | New; PG 14-18; Rust/pgrx 0.17.0 |
pgxicor | 0.1.0 | 0.1.1 | Upgrade |
pgcalendar | - | 1.1.0 | New; PG 14-18 |
pgclone | - | 4.0.0 | Added, then upgraded; PG 14-18 |
pgelog | - | 1.0.2 | New; PG 14-18 |
pglinter | 1.1.1 | 1.1.2 | Upgrade; Rust/pgrx 0.16.1 -> 0.17.0 |
pglock | - | 1.0.0 | New; PG 14-18 |
pgmq | 1.11.0 | 1.11.1 | Upgrade; PG 14-18 |
pgmqtt | - | 0.1.0 | New; PG 14-18; Rust/pgrx 0.16.1 -> 0.17.0 |
pgproto | - | 0.5.0 | Added, then upgraded; native Protobuf support |
pghydro | - | 6.6 | New; PG 14-18 |
pgx_ulid | 0.2.2 | 0.2.3 | Upgrade; Rust/pgrx 0.17.0 |
plv8 | 3.2.4 | 3.2.4-2 | RPM only; EL10 build fix |
PolarDB | 15.15 | 17.9.1.0 | PG 15 -> 17 |
postgresbson | - | 2.0.2 | New; PG 14-18 |
postgis | 3.6.2 | 3.6.3 | DEB only |
prefix | 1.2.10 | 1.2.11 | Upgrade; PG 14-18; PGDG |
provsql | - | 1.2.3 | New; PG 14-18 |
rdf_fdw | - | 2.5.0 | Added, then upgraded; PG 14-18 |
rdkit | - | 202503.6 | New; PG 14-18 |
re2 | - | 0.1.1 | New; PG 16-18 |
storage_engine | - | 1.3.4 | Added, then upgraded; columnar and row-compression table access methods |
supautils | 3.1.0 | 3.2.1 | Upgrade |
system_stats | 3.2 | 4.0 | Upgrade |
timescaledb | 2.25.2 | 2.26.4 | Upgrade; TSL minor update |
ulak | - | 0.0.2 | New; PG 14-18 |
wrappers | 0.5.7 | 0.6.0 | Upgrade; Rust/pgrx 0.16.1 -> 0.17.0 |
Infrastructure Package Updates
| Package | Old Version | New Version | Notes |
|---|---|---|---|
alertmanager | 0.31.1 | 0.32.1 | |
agentsview | 0.15.0 | 0.26.0 | |
claude | 2.1.81 | 2.1.123 | Downloaded through the 8118 proxy and verified |
code | 1.112.0 | 1.118.1 | Direct-link metadata update |
code-server | 4.112.0 | 4.117.0 | Direct-link metadata update |
codex | 0.116.0 | 0.125.0 | Moved from prerelease track to stable, then upgraded further |
crush | 0.51.2 | 0.64.0 | Direct-link metadata update |
dblab | 0.34.3 | 0.38.0 | |
duckdb | 1.5.0 | 1.5.2 | |
etcd | 3.6.9 | 3.6.10 | Unified package version |
garage | 2.2.0 | 2.3.0 | |
genai-toolbox | 0.27.0 | 1.1.0 | Upstream renamed to mcp-toolbox |
golang | 1.26.1 | 1.26.2 | |
grafana | 12.4.1 | 13.0.1 | Metadata refreshed after major upgrade |
grafana-infinity-ds | 3.7.4 | 3.8.0 | |
grafana-plugins | 12.3.0 | 13.0.0 | Noarch plugin bundle, manually collected |
grafana-victoriametrics-ds | 0.23.1 | 0.24.0 | |
hugo | 0.158.0 | 0.161.1 | |
maddy | 0.8.2 | 0.9.3 | |
mcli | 20260321000000 | 20260417000000 | pgsty branch, CVE fixed |
minio | 20260325000000 | 20260417000000 | pgsty branch, CVE fixed |
mongodb_exporter | 0.49.0 | 0.50.0 | |
node_exporter | 1.10.2 | 1.11.1 | |
nodejs | 24.14.0 | 24.15.0 | Stays on the 24.x policy line |
npgsqlrest | 3.11.1 | 3.12.0 | |
opencode | 1.2.27 | 1.14.30 | Switched to versioned cache and rebuilt |
pg_exporter | 1.2.1 | 1.2.2 | Direct-link metadata update |
pgflo | 0.0.15 | - | Removed |
pgschema | 1.7.4 | 1.9.0 | |
pig | 1.3.2 | 1.4.1 | Metadata only |
postgrest | 14.7 | 14.10 | |
prometheus | 3.10.0 | 3.11.3 | |
rainfrog | 0.3.17 | 0.3.18 | |
rclone | 1.73.2 | 1.73.5 | Direct-link metadata update |
rustfs | 1.0.0-alpha.89 | 1.0.0-b1 | Prerelease line |
sabiql | 1.8.2 | 1.11.1 | |
seaweedfs | 4.17 | 4.22 | |
sqlcmd | 1.9.0 | 1.10.0 | |
stalwart | 0.15.5 | 0.16.2 | |
tigerbeetle | 0.16.77 | 0.17.2 | |
tigerfs | 0.5.0 | 0.6.0 | |
timescaledb-tools | 0.18.2 | 0.19.0 | Rebuilt timescaledb-tune |
uv | 0.10.12 | 0.11.8 | |
victoria-logs | 1.48.0 | 1.50.0 | Main package |
victoria-metrics | 1.138.0 | 1.142.0 | |
victoria-metrics-cluster | 1.138.0 | 1.142.0 | VictoriaMetrics companion component |
victoria-traces | 0.8.0 | 0.8.2 | |
vip-manager | 4.0.0 | 4.2.0 | Direct-link metadata update |
vlagent | 1.48.0 | 1.50.0 | VictoriaLogs companion component |
vlogscli | 1.48.0 | 1.50.0 | VictoriaLogs companion component |
vmutils | 1.138.0 | 1.142.0 | VictoriaMetrics companion component |
vector | 0.54.0 | 0.55.0 | Direct-link metadata update |
v2ray | 5.47.0 | 5.48.0 | |
xray | 26.2.6 | 26.3.27 |
Checksums
v4.2.2
Highlights
- Insforge 2.0.1 self-hosted template
- Batch infra package updates, MinIO/MCLI updated to 20260321
- New infra packages: tigerfs, pgstream, sql-studio, rainfog, crush
- New PG tools: data recovery pdu, connection pooler pgdog
- Update PG extensions: pg_search, pgsentinel, pg_track_optimizer, pgcollection, pg_ttl_index, pg_clickhouse
- Update PG Kernel: ivorysql 5.1 -> 5.3
PostgreSQL Package Updates
| Name | Old Ver | New Ver | Note |
|---|---|---|---|
| pg_search | 0.21.12 | 0.22.2 | |
| pgsentinel | 1.4.0 | 1.4.1 | rpm only |
| pg_track_optimizer | 0.9.1 | 0.9.2 | |
| pgcollection | 1.0.0 | 2.0.0 | |
| pg_ttl_index | 2.0.0 | 3.0.0 | |
| pg_clickhouse | 0.1.4 | 0.1.5 | |
| pdu | 3.0.25.12 | new | |
| pgdog | 0.1.32 | new |
Infrastructure Package Updates
| Name | Old Ver | New Ver | Note |
|---|---|---|---|
grafana | 12.4.0 | 12.4.1 | |
pgbackrest_exporter | 0.22.0 | 0.23.0 | |
redis_exporter | 1.81.0 | 1.82.0 | |
victoria-logs | 1.47.0 | 1.48.0 | |
vlagent | 1.47.0 | 1.48.0 | |
vlogscli | 1.47.0 | 1.48.0 | |
victoria-traces | 0.7.1 | 0.8.0 | |
duckdb | 1.4.4 | 1.5.0 | |
pg_timetable | 6.2.0 | 6.3.0 | |
pgschema | 1.4.2 | 1.7.4 | |
pgstream | - | 1.0.1 | new |
tigerbeetle | 0.16.75 | 0.16.77 | |
grafana-victorialogs-ds | 0.26.2 | 0.26.3 | |
grafana-infinity-ds | 3.7.3 | 3.7.4 | |
caddy | 2.11.1 | 2.11.2 | |
npgsqlrest | 3.10.0 | 3.11.1 | |
postgrest | 14.5 | 14.7 | |
opencode | 1.2.17 | 1.2.27 | |
pev2 | 1.20.2 | 1.21.0 | |
golang | 1.26.0 | 1.26.1 | |
vector | 0.53.0 | 0.54.0 | |
rclone | 1.73.1 | 1.73.2 | |
code-server | 4.109.5 | 4.112.0 | |
code | 1.109.4 | 1.112.0 | |
seaweedfs | 4.15 | 4.17 | |
uv | 0.10.8 | 0.10.12 | |
codex | 0.110.0 | 0.116.0 | |
v2ray | 5.44.1 | 5.47.0 | |
sabiql | 1.6.2 | 1.8.2 | |
sql-studio | - | 0.1.51 | new |
rainfrog | - | 0.3.17 | new |
agentsview | 0.10.0 | 0.15.0 | |
crush | - | 0.51.2 | new |
tigerfs | - | 0.5.0 | new |
victoria-metrics | 1.137.0 | 1.138.0 | |
victoria-metrics-cluster | 1.137.0 | 1.138.0 | |
vmutils | 1.137.0 | 1.138.0 | |
hugo | 0.157.0 | 0.158.0 | |
rustfs | 1.0.0-alpha.85 | 1.0.0-alpha.89 | |
mysqld_exporter | 0.18.0 | 0.19.0 | |
pg_exporter | 1.2.0 | 1.2.1 | |
pig | 1.3.1 | 1.3.2 | |
minio | 20260214 | 20260321 | |
mcli | 20260213 | 20260321 | |
claude | 2.1.68 | 2.1.81 | |
ivroysql | 5.1 | 5.3 |
Checksums
v4.2.1
A maintenance release that adds 3 new extensions.
Major Changes
- New Extensions:
pg_eviltransformis added to the GIS package group,pg_pinyinto the FTS group, andpg_qosto the admin group — all for PG 14–18. - PG13 Removed: All
pgdg13,pgdg13-nonfreerepo entries and PG13 package aliases (pg13-*) are removed from every platform variant (EL7/8/9/10, Debian 12/13, Ubuntu 22/24/26, both x86_64 and aarch64). - Config templates (
fat.yml,pro.yml,dev.yml,el.yml,debian.yml) no longer reference PG13 packages or repos. Extension version comments are updated to reflect PG 14–18 coverage only. - Percona Repo: Origin URL updated from
ppg-18.1toppg-18.3to track the latest Percona PostgreSQL distribution. - Nginx Repo: Module tag for the Nginx upstream APT repo corrected from
infratonginxon Debian/Ubuntu platforms. - UV Venv Fix:
roles/node/tasks/pkg.ymlnow checks for an existing virtualenv before runninguv venv, preventing redundant re-creation and potential errors on re-provisioning. - Docker Image:
lessis added to the Pigsty Docker image base packages. - Demo Config: Default firewall rules in
el.ymlanddebian.ymldemo configs now include port5432for direct PostgreSQL access.
Compatibility Notes
PostgreSQL 13 reached its end of life on 2025-11-13. The PGDG YUM repository has archived and removed the pg13 / pg12 directories. If you install Pigsty on EL systems (even without using PG 13), repo access failures may cause installation or update errors.
You can either upgrade directly to Pigsty v4.2.1, or manually edit the repo_upstream_default variable in your corresponding OS file under roles/node_id/vars/ and remove the pg13 repo line.
Additionally, EL8 remains in the Pigsty compatible OS list, but starting from this release, offline packages for EL8 will no longer be published.
No other breaking API or configuration changes in this release.
7 commits, 84 files changed, +4,925 / -5,351 lines (v4.2.0..v4.2.1, 2026-03-04 ~ 2026-03-06)
PostgreSQL Package Updates
| Package | Old Version | New Version | Notes |
|---|---|---|---|
| timescaledb | 2.25.1 | 2.25.2 | |
| vchord | 1.1.0 | 1.1.1 | Added clang build dependency, bug fixes |
| vchord_bm25 | 0.3.0-1 | 0.3.0-2 | Fix the CI version injection issue |
| aggs_for_vecs | 1.4.0 | 1.4.1 | |
| pg_search | 0.21.9 | 0.21.12 | |
| pg_pinyin | - | 0.0.2 | New extension |
| pg_eviltransform | - | 0.0.2 | New extension |
| pg_qos | - | 1.0.0 | New extension, QoS resource governance |
Infrastructure Package Updates
| Name | Old Version | New Version | Notes |
|---|---|---|---|
asciinema | 3.1.0 | 3.2.0 | |
grafana-infinity-ds | 3.7.2 | 3.7.3 | |
victoria-metrics | 1.136.0 | 1.137.0 | |
victoria-metrics-cluster | 1.136.0 | 1.137.0 | |
vmutils | 1.136.0 | 1.137.0 | |
hugo | 0.155.3 | 0.157.0 | |
opencode | 1.2.15 | 1.2.17 | |
rustfs | 1.0.0-alpha.83 | 1.0.0-alpha.85 | |
seaweedfs | 4.13 | 4.15 | |
tigerbeetle | 0.16.74 | 0.16.75 | |
uv | 0.10.4 | 0.10.8 | |
codex | 0.105.0 | 0.110.0 | |
claude | 2.1.59 | 2.1.68 | |
xray | - | 26.2.6 | New |
gost | - | 2.12.0 | New |
sabiql | - | 1.6.2 | New |
agentsview | - | 0.10.0 | New |
Checksums
v4.2.0
Highlights
- Aligned with PostgreSQL out-of-band minor updates: 18.3, 17.9, 16.13, 15.17, 14.22.
- Total PostgreSQL extension coverage reaches 461 packages.
- Kernel updates across Babelfish, AgensGraph, pgEdge, OriolePG, OpenHalo, and Cloudberry.
- Babelfish template now uses a Pigsty-maintained PG17-compatible build, with no WiltonDB repo dependency.
- Supabase images and self-hosted templates are refreshed to the latest stack, using Pigsty-maintained pgsty/minio.
Major Changes
mssqlnow defaults to Babelfish PG17 (pg_version: 17,pg_packages: [babelfish, pgsql-common, sqlcmd]) and no longer requires an extramssqlrepo.- Kernel install paths are normalized in
pg_home_map:mssql -> /usr/babelfish-$v/,gpsql -> /usr/local/cloudberry. package_mapadds a dedicatedcloudberrymapping and fixesbabelfish*aliases to versioned RPM/DEB package names.- Redis data root default changes from
/datato/data/redis; deployment blocks legacy defaults, whileredis_removekeeps backward-compatible cleanup. configurenow supports absolute-ooutput paths with auto-created parent directories, tri-state region detection (CN/global/offline fallback), and a fix forbehind_gfw()hangs.- Debian/Ubuntu default repo URL mappings (
updates/backports/security) and China mirror components are corrected to prevent bootstrap package failures. - Supabase stack is updated (including PostgREST
14.5and Vector0.53.0) and now includes missing S3 protocol credential variables. - Rich/Sample templates explicitly define
dbuser_metadefaults;node.shsystemd completion is simplified. pgbackreststanza initialization now retries (2 attempts, 5-second interval) to reduce lock contention witharchive-push.- Vibe template now ships
@anthropic-ai/claude-code,@openai/codex, andhappy-coder, and includesagein the default example.
PG Software Updates
- PostgreSQL 18.3, 17.9, 16.13, 15.17, 14.22
- RPM Changelog 2026-02-27
- DEB Changelog 2026-02-27
- Core upgrades:
timescaledb 2.25.0 -> 2.25.1,citus 14.0.0-3 -> 14.0.0-4,pg_search -> 0.21.9 - New/rebuilt:
pgedge 17.9,spock 5.0.5,lolor 1.2.2,snowflake 2.4,babelfish 5.5.0,cloudberry 2.0.0 - Kernel-side updates:
oriolepg 17.11 -> 17.16,orioledb beta12 -> beta14,openhalo 14.10 -> 1.0(14.18)
| Package | Old Version | New Version | Notes |
|---|---|---|---|
timescaledb | 2.25.0 | 2.25.1 | |
citus | 14.0.0-3 | 14.0.0-4 | Rebuilt from the latest official release |
age | 1.7.0 | 1.7.0 | Added PG 17 support for version 1.7.0 |
pgmq | 1.10.0 | 1.10.1 | Package currently unavailable |
pg_search | 0.21.7 / 0.21.6 | 0.21.9 | Previous RPM/DEB versions differ |
oriolepg | 17.11 | 17.16 | OriolePG kernel update |
orioledb | beta12 | beta14 | Matches OriolePG 17.16 |
openhalo | 14.10 | 1.0 | Updated and renamed, based on 14.18 |
pgedge | - | 17.9 | New multi-master edge-distributed kernel |
spock | - | 5.0.5 | New core pgEdge extension |
lolor | - | 1.2.2 | New core pgEdge extension |
snowflake | - | 2.4 | New core pgEdge extension |
babelfishpg | - | 5.5.0 | New BabelfishPG package group |
babelfish | - | 5.5.0 | New Babelfish compatibility package |
antlr4-runtime413 | - | 4.13 | New runtime dependency for Babelfish |
cloudberry | - | 2.0.0 | RPM build only |
pg_background | - | 1.8 | DEB build only |
Infrastructure Software Updates
| Name | Old Version | New Version |
|---|---|---|
grafana | 12.3.2 | 12.4.0 |
prometheus | 3.9.1 | 3.10.0 |
mongodb_exporter | 0.47.2 | 0.49.0 |
victoria-metrics | 1.135.0 | 1.136.0 |
victoria-metrics-cluster | 1.135.0 | 1.136.0 |
vmutils | 1.135.0 | 1.136.0 |
victoria-logs | 1.45.0 | 1.47.0 |
vlagent | 1.45.0 | 1.47.0 |
vlogscli | 1.45.0 | 1.47.0 |
loki | 3.6.5 | 3.6.7 |
promtail | 3.6.5 | 3.6.7 |
logcli | 3.6.5 | 3.6.7 |
grafana-victorialogs-ds | 0.24.1 | 0.26.2 |
grafana-victoriametrics-ds | 0.21.0 | 0.23.1 |
grafana-infinity-ds | 3.7.0 | 3.7.2 |
redis_exporter | 1.80.2 | 1.81.0 |
etcd | 3.6.7 | 3.6.8 |
dblab | 0.34.2 | 0.34.3 |
tigerbeetle | 0.16.72 | 0.16.74 |
seaweedfs | 4.09 | 4.13 |
rustfs | 1.0.0-alpha.82 | 1.0.0-alpha.83 |
uv | 0.10.0 | 0.10.4 |
kafka | 4.1.1 | 4.2.0 |
npgsqlrest | 3.7.0 | 3.10.0 |
postgrest | 14.4 | 14.5 |
caddy | 2.10.2 | 2.11.1 |
rclone | 1.73.0 | 1.73.1 |
pev2 | 1.20.1 | 1.20.2 |
genai-toolbox | 0.25.0 | 0.27.0 |
opencode | 1.1.59 | 1.2.15 |
claude | 2.1.37 | 2.1.59 |
codex | 0.104.0 | 0.105.0 |
code | 1.109.2 | 1.109.4 |
code-server | 4.108.2 | 4.109.2 |
nodejs | 24.13.1 | 24.14.0 |
pig | 1.1.2 | 1.3.0 |
stalwart | - | 0.15.5 |
maddy | - | 0.8.2 |
API Changes
pg_modenow includesagensandpgedge.mssqldefaults are updated topg_version: 17andpg_packages: [babelfish, pgsql-common, sqlcmd].- Kernel/package alias mappings are updated in
pg_home_mapandpackage_map(Babelfish, OpenHalo, IvorySQL, Cloudberry, pgEdge family). redis_fs_mainnow defaults to/data/redis, with deployment guardrails and backward-compatible cleanup behavior.configureoutput path handling and region detection logic are updated, with offline fallback warnings and unified SSH probe timeouts.grafana.ini.j2is updated for Grafana 12.4 config changes and deprecations.
Compatibility Notes
- If existing Redis configs still use
redis_fs_main: /data, migrate to/data/redisbefore deployment. - Grafana 12.4 changes data link merge behavior. This release moves key links into field overrides; review custom dashboards accordingly.
26 commits, 122 files changed, +2,116 / -2,215 lines (v4.1.0..v4.2.0, 2026-02-15 ~ 2026-02-28)
Checksums
v4.1.0
72 commits, 252 files changed, +5,744 / -5,015 lines (v4.0.0..v4.1.0, 2026-02-02 ~ 2026-02-13)
Highlights
- PostgreSQL minor update: 18.2, 17.8, 16.12, 15.16, 14.21.
- Default EL minors updated to
9.7 / 10.1, Debian minors updated to12.13 / 13.3. - Added 7 new extensions, bringing total support to 451 extensions.
pigmoved from a traditional script interface to an Agent-Native CLI (1.0.0 -> 1.1.0), with explicit context and JSON/YAML output.pignow provides unified major/minor upgrade workflows for PostgreSQL and OS lifecycle updates.pg_exporterupgraded to v1.2.0 (1.1.2 -> 1.2.0), with PG17/18 metric pipeline and unit fixes.- Default firewall security policy updated:
node_firewall_modenow defaults tozone, andnode_firewall_public_portdefault changed from[22,80,443,5432]to[22,80,443]. - Focused PGSQL/PGCAT Grafana usability fixes: dynamic datasource
$dsn, schema-level drilldown, age metrics, link mapping consistency. - Added one-click Mattermost application template, including database/storage/portal and optional PGFS/JuiceFS options.
- Refactored
infra-rmuninstall flow with segmentedderegistercleanup for Victoria targets, Grafana datasources, and Vector logs. - Optimized default PostgreSQL autovacuum thresholds to reduce excessive vacuum/analyze on small tables.
- Fixed FD limit chain: added
fs.nr_open=8Mand unifiedLimitNOFILE=8Mto avoid startup failures from systemd/setrlimit. - Updated VIBE defaults: Jupyter disabled by default; Claude Code managed via npm package.
Version Updates
- Pigsty version:
v4.0.0 -> v4.1.0 pigCLI:1.0.0 -> 1.1.0(Agent-Native + major/minor upgrade support)pg_exporter:1.1.2 -> 1.2.0- Default EL minors:
9.6/10.0 -> 9.7/10.1 - Default Debian minors:
12.12/13.1 -> 12.13/13.3
Extension Updates
- RPM Changelog 2026-02-12
- DEB Changelog 2026-02-12
- timescaledb
2.24.0 -> 2.25.0 - pg_search
0.21.4 -> 0.21.7 - pgmq
1.9.0 -> 1.10.0 - pg_textsearch
0.4.0 -> 0.5.0 - pljs
1.0.4 -> 1.0.5 - pg_track_optimizer
0.9.1(new) - nominatim_fdw
1.1.0(new) - pg_utl_smtp
1.0.0(new) - pg_strict
1.0.2(new) - pgmb
1.0.0(new) - pg_pwhash (new support)
- informix_fdw (new support)
INFRA Component Versions
| Package | Version | Package | Version |
|---|---|---|---|
| victoria-metrics | 1.135.0 | victoria-logs | 1.45.0 |
| vector | 0.53.0 | grafana | 12.3.2 |
| alertmanager | 0.31.1 | etcd | 3.6.7 |
| duckdb | 1.4.4 | pg_exporter | 1.2.0 |
| pig | 1.1.0 | claude | 2.1.37 |
| opencode | 1.1.59 | uv | 0.10.0 |
| code-server | 4.108.2 | caddy | 2.10.2 |
| hugo | 0.155.2 | cloudflared | 2026.2.0 |
| headscale | 0.28.0 |
API Changes
- Corrected template guard for
io_method/io_workersfrompg_version >= 17topg_version >= 18. - Fixed PG18 guards for
idle_replication_slot_timeout/initdb --no-data-checksums. - Broadened
maintenance_io_concurrencyeffective range toPG13+. - Raised
autovacuum_vacuum_threshold:oltp/crit/tinyfrom 50 to 500,olapto 1000. - Raised
autovacuum_analyze_threshold:oltp/crit/tinyfrom 50 to 250,olapto 500. - Increased default
checkpoint_completion_targetfrom0.90to0.95. - Added
fs.nr_open=8388608in node tuned templates and alignedfs.file-max / fs.nr_open / LimitNOFILE. - Changed postgres/patroni/minio systemd
LimitNOFILEfrom16777216to8388608. - Added
fs.nr_open: 8388608into defaultnode_sysctl_params. - Changed
node_firewall_modedefault fromnonetozone: firewall enabled by default, intranet trusted, and onlynode_firewall_public_portexposed publicly; setnonefor fully self-managed firewall. - Changed
node_firewall_public_portdefault from[22,80,443,5432]to[22,80,443]; add5432explicitly only when public DB access is required. Firewall rules are add-only, so existing nodes that already exposed5432must remove it manually. Single-node experience templates (such asmeta/vibe) explicitly override and keep5432for remote usage. - Added
bin/validatechecks forpg_databases[*].parametersandpg_hba_rules[*].order; fixed HBA validation not returning failure properly. - Added segmented tags in
infra-rm.yml:deregister,config,env, etc. - Updated VIBE defaults:
jupyter_enabled=false,npm_packagesinclude@anthropic-ai/claude-codeandhappy-coder, plusCLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1. - PgBouncer alias cleanup:
pool_size_reserve -> pool_reserve,pool_max_db_conn -> pool_connlimit.
Compatibility Fixes (Deduplicated)
- Note: repeated regressions/re-fixes of the same issue are counted once and merged by problem domain below.
- Fixed Redis
replicaofempty-guard logic and systemd stop behavior. - Fixed schema/table/sequence qualification, identifier quoting, and logging format safety in
pg_migration. - Fixed restart targets and variable usage in pgsql role handlers.
- Fixed blackbox config filename cleanup item and pgAdmin pgpass file format.
- Made
pg_exporterstartup non-blocking to avoid slowing main flow when exporter fails. - Simplified VIP CIDR parsing: default mask
24when omitted. - Increased MinIO health-check retries from
3to5. - Switched node hostname setup to Ansible hostname module instead of shell calls.
- Fixed
.envformat forapp/electricandapp/pg_exporterto standardKEY=VALUE. - Fixed
pg_crontabsyntax error inpigsty.yml. - Updated ETCD docs to clarify default TLS vs optional mTLS semantics.
- Fixed
repo-addargument passing, Debian CN mirror component compatibility, andbin/psql.pyPython 3 compatibility. - Hardened redis-exporter credential file permissions.
pgsql-user.ymlnow masks credential logs (no_log) on sensitive steps.- Fixed gate conditions when
pg_monitorregisters Victoria targets. - Changed
pg_removebackup cleanup to cluster-level directory to avoid deleting other cluster backups.
Commit List (v4.0.0..v4.1.0, 72 commits, 2026-02-02 ~ 2026-02-13)
Thanks
- Thanks to @l2dy for many valuable suggestions and issues.
Checksums
v4.0.0
318 commits, 604 files changed, +118,655 / -327,552 lines
Highlights
- Observability Revolution: Prometheus → VictoriaMetrics (10x perf), Loki+Promtail → VictoriaLogs+Vector
- Security Hardening: Auto-generated passwords, etcd RBAC, firewall/SELinux modes, permission tightening, Nginx Basic Auth
- Docker Support: Run Pigsty in Docker containers with full systemd support (macOS & Linux)
- New Module: JUICE - Mount PostgreSQL as filesystem with PITR recovery capability
- New Module: VIBE - AI coding sandbox with Claude Code, JupyterLab, VS Code Server, Node.js
- Database Management:
pg_databasesstate (create/absent/recreate), instant clone withstrategy - PITR & Fork:
/pg/bin/pg-forkfor instant CoW cloning, enhancedpg-pitrwith pre-backup - HA Enhancement:
pg_rto_planwith 4 RTO presets (fast/norm/safe/wide),pg_crontabscheduled tasks - Multi-Cloud Terraform: AWS, Azure, GCP, Hetzner, DigitalOcean, Linode, Vultr, TencentCloud templates
- License Change: AGPL-3.0 → Apache-2.0
Infra Software Versions - MinIO now uses pgsty/minio fork RPM/DEB.
| Package | Version | Package | Version |
|---|---|---|---|
| victoria-metrics | 1.134.0 | victoria-logs | 1.43.1 |
| vector | 0.52.0 | grafana | 12.3.1 |
| alertmanager | 0.30.1 | etcd | 3.6.7 |
| duckdb | 1.4.4 | pg_exporter | 1.1.2 |
| pgbackrest_exporter | 0.22.0 | blackbox_exporter | 0.28.0 |
| node_exporter | 1.10.2 | minio | 20251203 |
| pig | 1.0.0 | claude | 2.1.19 |
| opencode | 1.1.34 | uv | 0.9.26 |
| asciinema | 3.1.0 | prometheus | 3.9.1 |
| pushgateway | 1.11.2 | juicefs | 1.4.0 |
| code-server | 4.100.2 | caddy | 2.10.2 |
| hugo | 0.154.5 | cloudflared | 2026.1.1 |
| headscale | 0.27.1 |
New Modules
- JUICE Module: JuiceFS distributed filesystem using PostgreSQL as metadata engine, supports PITR recovery for filesystem. Multiple storage backends (PG large objects, MinIO, S3), multi-instance deployment with Prometheus metrics, new
node-juicedashboard. - VIBE Module: AI coding sandbox with Code-Server (VS Code in browser), JupyterLab (interactive computing), Node.js (JavaScript runtime), Claude Code (AI coding assistant with OpenTelemetry observability). New
claude-codedashboard for usage monitoring.
PostgreSQL Extension Updates
Major extensions add PG 18 support: age, citus, documentdb, pg_search, timescaledb, pg_bulkload, rum, etc.
New: pg_textsearch 0.4.0, pg_clickhouse 0.1.3, pg_ai_query 0.1.1, etcd_fdw, pg_ttl_index 0.1.0, pljs 1.0.4, pg_retry 1.0.0, pg_weighted_statistics 1.0.0, pg_enigma 0.5.0, pglinter 1.0.1, documentdb_extended_rum 0.109, mobilitydb_datagen 1.3.0
Updated: timescaledb 2.24.0, pg_search 0.21.4, citus 14.0.0, documentdb 0.109, age 1.7.0, pg_duckdb 1.1.1, vchord 1.0.0, vchord_bm25 0.3.0, pg_biscuit 2.2.2, pg_anon 2.5.1, wrappers 0.5.7, pg_vectorize 0.26.0, pg_session_jwt 0.4.0, pg_partman 5.4.0, pgmq 1.9.0, pg_bulkload 3.1.23, pg_timeseries 0.2.0, pg_convert 0.1.0, pgBackRest 2.58
Breaking Changes
| Before | After |
|---|---|
| Prometheus | VictoriaMetrics |
| Loki + Promtail | VictoriaLogs + Vector |
node_disable_firewall | node_firewall_mode |
node_disable_selinux | node_selinux_mode |
pg_pwd_enc | removed (always scram-sha-256) |
infra_pip_packages | node_pip_packages |
grafana_clean default | true → false |
install.yml | renamed to deploy.yml |
Observability
- VictoriaMetrics replaces Prometheus — several times the performance with a fraction of the resources
- VictoriaLogs + Vector replaces Promtail + Loki for log collection
- Unified log format for all components, PG logs use UTC timestamp (log_timezone)
- PostgreSQL log rotation changed to weekly truncated rotation mode
- Added Vector parsing configs for Nginx/Syslog/PG CSV/Pgbackrest/Grafana/Redis/etcd/MinIO logs
- Datasource registration now runs on all Infra nodes, Victoria datasources auto-registered in Grafana
- New
grafana_pgurlparameter for using PG as Grafana backend storage - New
grafana_view_passwordparameter for Grafana Meta datasource password pg_exporterupdated to 1.1.2 with newpg_timelinecollector and numerous fixes- New dashboards:
node-vector,node-juice,claude-code
Interface Improvements
install.ymlplaybook renamed todeploy.yml, newvibe.ymlplaybook for VIBE modulepg_databases: addedstatefield (create/absent/recreate),strategyfor cloning, newer locale params supportpg_users: addedadminparameter withADMIN OPTION,setandinheritoptionspg_hba: supportorderfield for priority, IPv6 localhost access- New
node_crontabauto-restores original crontab onnode-rm
Parameter Optimization
pg_io_method: auto, sync, worker, io_uring options, default workerpg_rto_plan: RTO presets (fast/norm/safe/wide) integrating Patroni & HAProxy configpg_crontab: scheduled tasks for postgres dbsuidle_replication_slot_timeout: default 7d, crit template 3dfile_copy_method: set toclonefor PG18 instant database cloning- Crit template enables Patroni strict sync mode
- PITR default
archive_modechanged topreserve
Architecture Improvements
- Fixed
/infrasymlink pointing to/data/infraon Infra nodes - Local repo at
/data/nginx/pigsty,/wwwsymlinks to/data/nginx - New scripts:
/pg/bin/pg-fork(CoW cloning),/pg/bin/pg-drop-role,bin/pgsql-ext - Enhanced
/pg/bin/pg-pitrfor instance-level PITR with pre-backup - UV Python manager moved from
infratonodemodule withnode_uv_envparameter - Terraform templates: AWS, Azure, GCP, Hetzner, DigitalOcean, Linode, Vultr, TencentCloud
- Simu template simplified from 36 to 20 nodes, new 10-node and Citus templates
Security Improvements
configure -gauto-generates strong random passwords- Replaced
node_disable_firewallwithnode_firewall_mode(off/none/zone) - Replaced
node_disable_selinuxwithnode_selinux_mode(disabled/permissive/enforcing) - Nginx Basic Auth support for optional HTTP authentication
- Enabled etcd RBAC, each cluster can only manage its own PG cluster
- etcd root password stored in
/etc/etcd/etcd.pass, admin-readable only - New
node_admin_sudoparameter for admin sudo mode (all/nopass) - Fixed ownca certificate validity for Chrome recognition
Bug Fixes
- Fixed ownca certificate validity for Chrome compatibility
- Fixed Vector 0.52 syslog_raw parsing issue
- Fixed pg_pitr multiple replica clonefrom timing issues
- Fixed Ansible SELinux race condition in dnsmasq
- Fixed EL9 aarch64 patroni & llvmjit issues
- Fixed pgbouncer pid path (
/run/postgresql) - Fixed HAProxy service template variable path
- Fixed MinIO reload handler ineffective
- Fixed vmetrics_port default value to 8428
- Fixed pg-failover-callback for all Patroni callback events
New Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
node_firewall_mode | enum | none (v4.0) | Firewall mode: off/none/zone (default is zone since v4.1) |
node_selinux_mode | enum | permissive | SELinux mode |
node_admin_sudo | enum | nopass | Admin sudo privilege level |
pg_io_method | enum | worker | I/O method: auto/sync/worker/io_uring |
pg_rto_plan | dict | - | RTO presets: fast/norm/safe/wide |
pg_crontab | list | [] | postgres dbsu scheduled tasks |
grafana_view_password | string | DBUser.Viewer | Grafana Meta datasource password |
juice_cache | path | /data/juice | JuiceFS cache directory |
juice_instances | dict | {} | JuiceFS instance definitions |
vibe_data | path | /fs | VIBE workspace directory |
code_enabled | bool | true | Enable Code-Server |
code_password | string | Vibe.Coding | Code-Server password |
jupyter_enabled | bool | true | Enable JupyterLab |
jupyter_password | string | Vibe.Coding | JupyterLab access token |
claude_enabled | bool | true | Enable Claude Code configuration |
nodejs_enabled | bool | true | Enable Node.js installation |
nodejs_registry | string | '' | npm registry, auto china mirror |
node_uv_env | path | /data/venv | Node UV venv path, empty to skip |
node_pip_packages | string | '' | pip packages for UV venv |
Removed Parameters: node_disable_firewall, node_disable_selinux, infra_pip_packages, pg_pwd_enc, pgbackrest_clean, code_home, jupyter_home
Checksums
v3.7.0
Highlights
- PostgreSQL 18 Deep Support: Now the default major PG version, with full extension readiness!
- Expanded OS Support: Added EL10 and Debian 13, bringing the total supported operating systems to 14.
- Extension Growth: The PostgreSQL extension library now includes 437 entries.
- Ansible 2.19 Compatibility: Full support for Ansible 2.19 following its breaking changes.
- Kernel Updates: Latest versions for Supabase, PolarDB, IvorySQL, and Percona kernels.
- Optimized Tuning: Refined logic for default PG parameters to maximize resource utilization.
- PGEXT.CLOUD: Dedicated extension website open-sourced under Apache-2.0 license
Version Updates
- PostgreSQL 18.1, 17.7, 16.11, 15.15, 14.20, 13.23
- Patroni 4.1.0
- Pgbouncer 1.25.0
- pg_exporter 1.0.3
- pgbackrest 2.57.0
- Supabase 2025-11
- PolarDB 15.15.5.0
- FerretDB 2.7.0
- DuckDB 1.4.2
- Etcd 3.6.6
- pig 0.7.4
For detailed version changes, please refer to:
API Changes
- Implemented a refined optimization strategy for parallel execution parameters. See Tuning Guide.
- The
citusextension is no longer installed by default inrichandfulltemplates (PG 18 support pending). - Added
duckdbextension stubs to PostgreSQL parameter templates. - Capped
min_wal_size,max_wal_size, andmax_slot_wal_keep_sizeat 200 GB, 2000 GB, and 3000 GB, respectively. - Capped
temp_file_limitat 200 GB (2 TB for OLAP workloads). - Increased the default connection count for the connection pool.
- Added
prometheus_port(default:9058) to avoid conflicts with the EL10 RHEL Web Console port. - Changed
alertmanager_portdefault to9059to avoid potential conflicts with Kafka SSL ports. - Added a
pg_presubtask topg_pkg: removes conflicting LLVM packages (bpftool,python3-perf) on EL9+ prior to PG installation. - Added the
llvmmodule to the default repository definition for Debian/Ubuntu. - Fixed package removal logic in
infra-rm.yml.
Compatibility Fixes
- Ubuntu/Debian CA Trust: Fixed incorrect warning return codes when trusting Certificate Authorities.
- Ansible 2.19 Support: Resolved numerous compatibility issues introduced by Ansible 2.19 to ensure stability across versions:
- Added explicit
inttype casting for sequence variables. - Migrated
with_itemssyntax toloop. - Nested key exchange variables in lists to prevent character iteration on strings in newer versions.
- Explicitly cast
rangeusage tolist. - Renamed reserved variables such as
nameandport. - Replaced
play_hostswithansible_play_hosts. - Added string casting for specific variables to prevent runtime errors.
- Added explicit
- EL10 Adaptation:
- Fixed missing
ansible-collection-community-cryptopreventing key generation. - Fixed missing
ansiblelogic packages. - Removed
modulemd_tools,flamegraph, andtimescaledb-tool. - Replaced
java-17-openjdkwithjava-21-openjdk. - Resolved aarch64 YUM repository naming issues.
- Fixed missing
- Debian 13 Adaptation:
- Replaced
dnsutilswithbind9-dnsutils.
- Replaced
- Ubuntu 24 Fixes:
- Temporarily removed
tcpdumpdue to upstream dependency crashes.
- Temporarily removed
Checksums
v3.6.1
Highlights
- PostgreSQL 17.6, 16.10, 15.14, 14.19, 13.22, and 18 Beta 3 Released!
- PGDG APT/YUM mirror for Mainland China Users
- New home website https://pgsty.com
- Add el10, debian 13 stub, add el10 terraform images
Infra Package Updates
- Grafana 12.1.0
- pg_exporter 1.0.2
- pig 0.6.1
- vector 0.49.0
- redis_exporter 1.75.0
- mongo_exporter 0.47.0
- victoriametrics 1.123.0
- victorialogs: 1.28.0
- grafana-victoriametrics-ds 0.18.3
- grafana-victorialogs-ds 0.19.3
- grafana-infinity-ds 3.4.1
- etcd 3.6.4
- ferretdb 2.5.0
- tigerbeetle 0.16.54
- genai-toolbox 0.12.0
Extension Package Updates
- pg_search 0.17.3
API Changes
- remove
br_filterfrom defaultnode_kernel_modules - do not use OS minor version dir for pgdg yum repos
Checksums
v3.6.0
Highlights
- Brand-new documentation site: https://doc.pgsty.com
- Added
pgsql-pitrplaybook and backup/restore tutorial, improved PITR experience - Added kernel support: Percona PG TDE (PG17)
- Optimized self-hosted Supabase experience, updated to the latest version, and fixed issues with the official template
- Simplified installation steps, online install by default, bootstrap now part of install script
Improvements
- Refactored
ETCDmodule with dedicated remove playbook and bin utils - Refactored
MinIOmodule with plain HTTP mode, better bucket provisioning options. - Reorganized and streamlined all configuration templates for easier use
- Faster Docker Registry mirror for users in mainland China
- Optimized tuned OS parameter templates for modern hardware and NVMe disks
- Added extension
pgactivefor multi-master replication and sub-second failover - Adjusted default values for
pg_fs_main/pg_fs_backup, simplified file directory structure design
Bug Fixes
- Fixed pgbouncer configuration file error by @housei-zzy
- Fixed OrioleDB issues on Debian platform
- Fixed tuned shm configuration parameter issue
- Offline packages now use the PGDG source directly, avoiding out-of-sync mirror sites
- Fix ivorysql libxcrypt dependencies issues
- Fix Replace the slow and broken epel mirror
- Fix
haproxy_enabledflag not working
Infra Package Updates
Added Victoria Metrics / Victoria Logs related packages
- genai-toolbox 0.9.0 (new)
- victoriametrics 1.120.0 -> 1.121.0 (refactor)
- vmutils 1.121.0 (rename from victoria-metrics-utils)
- grafana-victoriametrics-ds 0.15.1 -> 0.17.0
- victorialogs 1.24.0 -> 1.25.1 (refactor)
- vslogcli 1.24.0 -> 1.25.1
- vlagent 1.25.1 (new)
- grafana-victorialogs-ds 0.16.3 -> 0.18.1
- prometheus 3.4.1 -> 3.5.0
- grafana 12.0.0 -> 12.0.2
- vector 0.47.0 -> 0.48.0
- grafana-infinity-ds 3.2.1 -> 3.3.0
- keepalived_exporter 1.7.0
- blackbox_exporter 0.26.0 -> 0.27.0
- redis_exporter 1.72.1 -> 1.77.0
- rclone 1.69.3 -> 1.70.3
Database Package Updates
- PostgreSQL 18 Beta2 update
- pg_exporter 1.0.1, updated to latest dependencies and provides Docker image
- pig 0.6.0, updated extension and repository list, with
pig installsubcommand - vip-manager 3.0.0 -> 4.0.0
- ferretdb 2.2.0 -> 2.3.1
- dblab 0.32.0 -> 0.33.0
- duckdb 1.3.1 -> 1.3.2
- etcd 3.6.1 -> 3.6.3
- ferretdb 2.2.0 -> 2.4.0
- juicefs 1.2.3 -> 1.3.0
- tigerbeetle 0.16.41 -> 0.16.50
- pev2 1.15.0 -> 1.16.0
Extension Package Updates
- OrioleDB 1.5 beta12
- OriolePG 17.11
- plv8 3.2.3 -> 3.2.4
- postgresql_anonymizer 2.1.1 -> 2.3.0
- pgvectorscale 0.7.1 -> 0.8.0
- wrappers 0.5.0 -> 0.5.3
- supautils 2.9.1 -> 2.10.0
- citus 13.0.3 -> 13.1.0
- timescaledb 2.20.0 -> 2.21.1
- vchord 0.3.0 -> 0.4.3
- pgactive 2.1.5 (new)
- documentdb 0.103.0 -> 0.105.0
- pg_search 0.17.0
API Changes
pg_fs_backup: Renamed topg_fs_backup, default value/data/backups.pg_rm_bkup: Renamed topg_rm_backup, default valuetrue.pg_fs_main: Default value adjusted to/data/postgres.nginx_cert_validity: New parameter to control Nginx self-signed certificate validity, default397d.minio_buckets: Default value adjusted to create three buckets namedpgsql,meta,data.minio_users: Removeddbauser, addeds3user_metaands3user_datausers formetaanddatabuckets respectively.minio_https: New parameter to allow MinIO to use HTTP mode.minio_provision: New parameter to allow skipping MinIO provisioning stage (skip bucket and user creation)minio_safeguard: New parameter, abortminio-rm.ymlwhen enabledminio_rm_data: New parameter, whether to remove minio data directory duringminio-rm.ymlminio_rm_pkg: New parameter, whether to uninstall minio package duringminio-rm.ymletcd_learner: New parameter to control whether to init etcd instance as learneretcd_rm_data: New parameter, whether to remove etcd data directory duringetcd-rm.ymletcd_rm_pkg: New parameter, whether to uninstall etcd package duringetcd-rm.yml
Checksums
v3.5.0
Highlights
- New website: https://pgsty.com
- PostgreSQL 18 (Beta) support: monitoring via
pg_exporter 1.0.0, installer alias viapig 0.4.2, and apg18template - 421 bundled extensions, now including OrioleDB and OpenHalo kernels on all platforms
pig doCLI replaces legacybin/scripts- Hardening for self-hosted Supabase (replication lag, key distribution, etc.)
- Code & architecture refactor — slimmer tasks, cleaner defaults for Postgres & PgBouncer
- Monitoring stack refresh — Grafana 12,
pg_exporter 1.0, new panels & plugins - Run vagrant on Apple Silicon
Module Changes
- Add PostgreSQL 18 support
- PG18 metrics support with pg_exporter 1.0.0+
- PG18 install support with pig 0.4.1+
- New config template
pg18.yml - Refactored
pgsqlmodule - Split monitoring into a new
pg_monitorrole; removedcleanlogic - Pruned duplicate tasks, dropped
dir/utilsblock, renamed templates (no.j2) - All extensions install in
extensionsschema (Supabase best-practice) - Added
SET search_path=''to every monitoring function - Tuned PgBouncer defaults (larger pool, cleanup query); new
pgbouncer_ignore_param - New
pg_keytask to generatepgsodiummaster keys - Enabled
sync_replication_slotsby default on PG 17 - Retagged subtasks for clearer structure
- Refactored
pg_removemodule - New flags
pg_rm_data,pg_rm_bkup,pg_rm_pkgcontrol what gets wiped - Clearer role layout & tagging
- Added new
pg_monitormodule - pgbouncer_exporter no longer shares configuration files with
pg_exporter - Added monitoring metrics for TimescaleDB and Citus
- Using
pg_exporter0.9.0 with updated replication slot metrics for PG16/17 - Using more compact, newly designed collector configuration files
- Supabase Enhancement (thanks @lawso017 for the contribution)
- update supabase containers and schemas to the latest version
- Support
pgsodiumserver key loading - fix logflare lag issue with
supa-kickcrontab - add
set search_pathclause for monitor functions - Added new
pig docommand to CLI, allowing command-line tool to replace Shell scripts inbin/
Infra Package Updates
- pig 0.4.2
- duckdb 1.3.0
- etcd 3.6.0
- vector 0.47.0
- minio 20250422221226
- mcli 20250416181326
- pev 1.5.0
- rclone 1.69.3
- mtail 3.0.8 (new)
Observability Package Updates
- grafana 12.0.0
- grafana-victorialogs-ds 0.16.3
- grafana-victoriametrics-ds 0.15.1
- grafana-infinity-ds 3.2.1
- grafana_plugins 12.0.0
- prometheus 3.4.0
- pushgateway 1.11.1
- nginx_exporter 1.4.2
- pg_exporter 1.0.0
- pgbackrest_exporter 0.20.0
- redis_exporter 1.72.1
- keepalived_exporter 1.6.2
- victoriametrics 1.117.1
- victoria_logs 1.22.2
Database Package Updates
- PostgreSQL 17.5, 16.9, 15.13, 14.18, 13.21
- PostgreSQL 18beta1 support
- pgbouncer 1.24.1
- pgbackrest 2.55
- pgbadger 13.1
Extension Package Updates
- spat 0.1.0a4 new extension
- pgsentinel 1.1.0 new extension
- pgdd 0.6.0 (pgrx 0.14.1) new extension add back
- convert 0.0.4 (pgrx 0.14.1) new extension
- pg_tokenizer.rs 0.1.0 (pgrx 0.13.1)
- pg_render 0.1.2 (pgrx 0.12.8)
- pgx_ulid 0.2.0 (pgrx 0.12.7)
- pg_idkit 0.3.0 (pgrx 0.14.1)
- pg_ivm 1.11.0
- orioledb 1.4.0 beta11 rpm & add debian/ubuntu support
- openhalo 14.10 add debian/ubuntu support
- omnigres 20250507 (miss on d12/u22)
- citus 12.0.3
- timescaledb 2.20.0 (DROP PG14 support)
- supautils 2.9.2
- pg_envvar 1.0.1
- pgcollection 1.0.0
- aggs_for_vecs 1.4.0
- pg_tracing 0.1.3
- pgmq 1.5.1
- tzf-pg 0.2.0 (pgrx 0.14.1)
- pg_search 0.15.18 (pgrx 0.14.1)
- anon 2.1.1 (pgrx 0.14.1)
- pg_parquet 0.4.0 (0.14.1)
- pg_cardano 1.0.5 (pgrx 0.12) -> 0.14.1
- pglite_fusion 0.0.5 (pgrx 0.12.8) -> 14.1
- vchord_bm25 0.2.1 (pgrx 0.13.1)
- vchord 0.3.0 (pgrx 0.13.1)
- pg_vectorize 0.22.1 (pgrx 0.13.1)
- wrappers 0.4.6 (pgrx 0.12.9)
- timescaledb-toolkit 1.21.0 (pgrx 0.12.9)
- pgvectorscale 0.7.1 (pgrx 0.12.9)
- pg_session_jwt 0.3.1 (pgrx 0.12.6) -> 0.12.9
- pg_timetable 5.13.0
- ferretdb 2.2.0
- documentdb 0.103.0 (+aarch64 support)
- pgml 2.10.0 (pgrx 0.12.9)
- sqlite_fdw 2.5.0 (fix pg17 deb)
- tzf 0.2.2 0.14.1 (rename src)
- pg_vectorize 0.22.2 (pgrx 0.13.1)
- wrappers 0.5.0 (pgrx 0.12.9)
Checksums
v3.4.1
GitHub Release Page: v3.4.1
- Added support for MySQL wire-compatible PostgreSQL kernel on EL systems: openHalo
- Added support for OLTP-enhanced PostgreSQL kernel on EL systems: orioledb
- Optimized pgAdmin 9.2 application template with automatic server list updates and pgpass password population
- Increased PG default max connections to 250, 500, 1000
- Removed the
mysql_fdwextension with dependency errors from EL8
Infra Updates
- pig 0.3.4
- etcd 3.5.21
- restic 0.18.0
- ferretdb 2.1.0
- tigerbeetle 0.16.34
- pg_exporter 0.8.1
- node_exporter 1.9.1
- grafana 11.6.0
- zfs_exporter 3.8.1
- mongodb_exporter 0.44.0
- victoriametrics 1.114.0
- minio 20250403145628
- mcli 20250403170756
Extension Update
- Bump pg_search to 0.15.13
- Bump citus to 13.0.3
- Bump timescaledb to 2.19.1
- Bump pgcollection RPM to 1.0.0
- Bump pg_vectorize RPM to 0.22.1
- Bump pglite_fusion RPM to 0.0.4
- Bump aggs_for_vecs RPM to 1.4.0
- Bump pg_tracing RPM to 0.1.3
- Bump pgmq RPM to 1.5.1
Checksums
v3.4.0
GitHub Release Page: v3.4.0
Introduction Blog: Pigsty v3.4 MySQL Compatibility and Overall Enhancements
New Features
- Added new pgBackRest backup monitoring metrics and dashboards
- Enhanced Nginx server configuration options, with support for automated Certbot issuance
- Now prioritizing PostgreSQL’s built-in
C/C.UTF-8locale settings - IvorySQL 4.4 is now fully supported across all platforms (RPM/DEB on x86/ARM)
- Added new software packages: Juicefs, Restic, TimescaleDB EventStreamer
- The Apache AGE graph database extension now fully supports PostgreSQL 13–17 on EL
- Improved the
app.ymlplaybook: launch standard Docker app without extra config - Bump Supabase, Dify, and Odoo app templates, bump to their latest versions
- Add electric app template, local-first PostgreSQL Sync Engine
Infra Packages
- +restic 0.17.3
- +juicefs 1.2.3
- +timescaledb-event-streamer 0.12.0
- Prometheus 3.2.1
- AlertManager 0.28.1
- blackbox_exporter 0.26.0
- node_exporter 1.9.0
- mysqld_exporter 0.17.2
- kafka_exporter 1.9.0
- redis_exporter 1.69.0
- pgbackrest_exporter 0.19.0-2
- DuckDB 1.2.1
- etcd 3.5.20
- FerretDB 2.0.0
- tigerbeetle 0.16.31
- vector 0.45.0
- VictoriaMetrics 1.113.0
- VictoriaLogs 1.17.0
- rclone 1.69.1
- pev2 1.14.0
- grafana-victorialogs-ds 0.16.0
- grafana-victoriametrics-ds 0.14.0
- grafana-infinity-ds 3.0.0
PostgreSQL Related
- Patroni 4.0.5
- PolarDB 15.12.3.0-e1e6d85b
- IvorySQL 4.4
- pgbackrest 2.54.2
- pev2 1.14
- Babelfish 13.17
PostgreSQL Extensions
- pgspider_ext 1.3.0 (new extension)
- apache age 13–17 el rpm (1.5.0)
- timescaledb 2.18.2 → 2.19.0
- citus 13.0.1 → 13.0.2
- documentdb 1.101-0 → 1.102-0
- pg_analytics 0.3.4 → 0.3.7
- pg_search 0.15.2 → 0.15.8
- pg_ivm 1.9 → 1.10
- emaj 4.4.0 → 4.6.0
- pgsql_tweaks 0.10.0 → 0.11.0
- pgvectorscale 0.4.0 → 0.6.0 (pgrx 0.12.5)
- pg_session_jwt 0.1.2 → 0.2.0 (pgrx 0.12.6)
- wrappers 0.4.4 → 0.4.5 (pgrx 0.12.9)
- pg_parquet 0.2.0 → 0.3.1 (pgrx 0.13.1)
- vchord 0.2.1 → 0.2.2 (pgrx 0.13.1)
- pg_tle 1.2.0 → 1.5.0
- supautils 2.5.0 → 2.6.0
- sslutils 1.3 → 1.4
- pg_profile 4.7 → 4.8
- pg_snakeoil 1.3 → 1.4
- pg_jsonschema 0.3.2 → 0.3.3
- pg_incremental 1.1.1 → 1.2.0
- pg_stat_monitor 2.1.0 → 2.1.1
- ddl_historization 0.7 → 0.0.7 (bug fix)
- pg_sqlog 3.1.7 → 1.6 (bug fix)
- pg_random removed development suffix (bug fix)
- asn1oid 1.5 → 1.6
- table_log 0.6.1 → 0.6.4
Interface Changes
- Added new Docker parameters:
docker_dataanddocker_storage_driver(#521 by @waitingsong) - Added new Infra parameter:
alertmanager_port, which lets you specify the AlertManager port - Added new Infra parameter:
certbot_sign, apply for cert during nginx init? (false by default) - Added new Infra parameter:
certbot_email, specifying the email used when requesting certificates via Certbot - Added new Infra parameter:
certbot_options, specifying additional parameters for Certbot - Updated IvorySQL to place its default binary under
/usr/ivory-4starting in IvorySQL 4.4 - Changed the default for
pg_lc_ctypeand other locale-related parameters fromen_US.UTF-8toC - For PostgreSQL 17, if using
UTF8encoding withCorC.UTF-8locales, PostgreSQL’s built-in localization rules now take priority configureautomatically detects whetherC.utf8is supported by both the PG version and the environment, and adjusts locale-related options accordingly- Set the default IvorySQL binary path to
/usr/ivory-4 - Updated the default value of
pg_packagestopgsql-main patroni pgbouncer pgbackrest pg_exporter pgbadger vip-manager - Updated the default value of
repo_packagesto[node-bootstrap, infra-package, infra-addons, node-package1, node-package2, pgsql-utility, extra-modules] - Removed
LANGandLC_ALLenvironment variable settings from/etc/profile.d/node.sh - Now using
bento/rockylinux-8andbento/rockylinux-9as the Vagrant box images for EL - Added a new alias,
extra_modules, which includes additional optional modules - Updated PostgreSQL aliases:
postgresql,pgsql-main,pgsql-core,pgsql-full - GitLab repositories are now included among available modules
- The Docker module has been merged into the Infra module
- The
node.ymlplaybook now includes anode_piptask to configure a pip mirror on each node - The
pgsql.ymlplaybook now includes apgbackrest_exportertask for collecting backup metrics - The
Makefilenow allows the use ofMETA/PKGenvironment variables - Added
/pg/spooldirectory as temporary storage for pgBackRest - Disabled pgBackRest’s
link-alloption by default - Enabled block-level incremental backups for MinIO repositories by default
Bug Fixes
- Fixed the exit status code in
pg-backup(#532 by @waitingsong) - In
pg-tune-hugepage, restricted PostgreSQL to use only large pages (#527 by @waitingsong) - Fixed logic errors in the
pg-roletask - Corrected type conversion for hugepage configuration parameters
- Fixed default value issues for
node_repo_modulesin theslimtemplate
Checksums
v3.3.0
- Total available extensions increased to 404!
- PostgreSQL February Minor Updates: 17.4, 16.8, 15.12, 14.17, 13.20
- New Feature:
app.ymlscript for auto-installing apps like Odoo, Supabase, Dify. - New Feature: Further Nginx configuration customization in
infra_portal. - New Feature: Added Certbot support for quick free HTTPS certificate requests.
- New Feature: Pure-text extension list now supported in
pg_default_extensions. - New Feature: Default repositories now include mongo, redis, groonga, haproxy, etc.
- New Parameter:
node_aliasesto add command aliases for Nodes. - Fix: Resolved default EPEL repo address issue in Bootstrap script.
- Improvement: Added Aliyun mirror for Debian Security repository.
- Improvement: pgBackRest backup support for IvorySQL kernel.
- Improvement: ARM64 and Debian/Ubuntu support for PolarDB.
- pg_exporter 0.8.0 now supports new metrics in pgbouncer 1.24.
- New Feature: Auto-completion for common commands like
git,docker,systemctl#506 #524 by @waitingsong. - Improvement: Refined
ignore_startup_parametersinpgbouncerconfig template #488 by @waitingsong. - New homepage design: Pigsty’s website now features a fresh new look.
- Extension Directory: Detailed information and download links for RPM/DEB binary packages.
- Extension Build:
pigCLI now auto-sets PostgreSQL extension build environment.
New Extensions
12 new PostgreSQL extensions added, bringing the total to 404 available extensions.
- documentdb 0.101-0
- VectorChord-bm25 (vchord_bm25) 0.1.0
- pg_tracing 0.1.2
- pg_curl 2.4
- pgxicor 0.1.0
- pgsparql 1.0
- pgjq 0.1.0
- hashtypes 0.1.5
- db_migrator 1.0.0
- pg_cooldown 0.1
- pgcollection 0.9.1
- pg_bzip 1.0.0
Bump Extension
- citus 13.0.0 -> 13.0.1
- pg_duckdb 0.2.0 -> 0.3.1
- pg_mooncake 0.1.0 -> 0.1.2
- timescaledb 2.17.2 -> 2.18.2
- supautils 2.5.0 -> 2.6.0
- supabase_vault 0.3.1 (become C)
- VectorChord 0.1.0 -> 0.2.1
- pg_bulkload 3.1.22 (+pg17)
- pg_store_plan 1.8 (+pg17)
- pg_search 0.14 -> 0.15.2
- pg_analytics 0.3.0 -> 0.3.4
- pgroonga 3.2.5 -> 4.0.0
- zhparser 2.2 -> 2.3
- pg_vectorize 0.20.0 -> 0.21.1
- pg_net 0.14.0
- pg_curl 2.4.2
- table_version 1.10.3 -> 1.11.0
- pg_duration 1.0.2
- pg_graphql 1.5.9 -> 1.5.11
- vchord 0.1.1 -> 0.2.1 ((+13))
- vchord_bm25 0.1.0 -> 0.1.1
- pg_mooncake 0.1.1 -> 0.1.2
- pgddl 0.29
- pgsql_tweaks 0.11.0
Infra Updates
- pig 0.1.3 -> 0.3.0
- pushgateway 1.10.0 -> 1.11.0
- alertmanager 0.27.0 -> 0.28.0
- nginx_exporter 1.4.0 -> 1.4.1
- pgbackrest_exporter 0.18.0 -> 0.19.0
- redis_exporter 1.66.0 -> 1.67.0
- mongodb_exporter 0.43.0 -> 0.43.1
- VictoriaMetrics 1.107.0 -> 1.111.0
- VictoriaLogs v1.3.2 -> 1.9.1
- DuckDB 1.1.3 -> 1.2.0
- Etcd 3.5.17 -> 3.5.18
- pg_timetable 5.10.0 -> 5.11.0
- FerretDB 1.24.0 -> 2.0.0-rc
- tigerbeetle 0.16.13 -> 0.16.27
- grafana 11.4.0 -> 11.5.2
- vector 0.43.1 -> 0.44.0
- minio 20241218131544 -> 20250218162555
- mcli 20241121172154 -> 20250215103616
- rclone 1.68.2 -> 1.69.0
- vray 5.23 -> 5.28
v3.2.2
- New Extension(s):
Omnigres33 extensions, postgres as platform - New Extension:
pg_mooncake: duckdb in postgres - New Extensions:
pg_xxhash - New Extension:
timescaledb_toolkit - New Extension:
pg_xenophile - New Extension:
pg_drop_events - New Extension:
pg_incremental - Bump
citusto 13.0.0 with PostgreSQL 17 support. - Bump
pgmlto 2.10.0 - Bump
pg_extra_timeto 2.0.0 - Bump
pg_vectorizeto 0.20.0
What’s Changed
- Bump IvorySQL to 4.2 (PostgreSQL 17.2)
- Add Arm64 and Debian support for PolarDB kernel
- Add certbot and certbot-nginx to default
infra_packages - Increase pgbouncer max_prepared_statements to 256
- remove
pgxxx-cituspackage alias - hide
pgxxx-olapcategory inpg_extensionsby default
v3.2.1
Highlights
- 351 PostgreSQL Extensions, including the powerful postgresql-anonymizer 2.0
- IvorySQL 4.0 support for EL 8/9
- Now use the Pigsty compiled Citus, TimescaleDB and pgroonga on all distros
- Add self-hosting Odoo template and support
Bump software versions
- pig CLI 0.1.2 self-updating capability
- prometheus 3.1.0
Add New Extension
- add pg_anon 2.0.0
- add omnisketch 1.0.2
- add ddsketch 1.0.1
- add pg_duration 1.0.1
- add ddl_historization 0.0.7
- add data_historization 1.1.0
- add schedoc 0.0.1
- add floatfile 1.3.1
- add pg_upless 0.0.3
- add pg_task 1.0.0
- add pg_readme 0.7.0
- add vasco 0.1.0
- add pg_xxhash 0.0.1
Update Extension
- lower_quantile 1.0.3
- quantile 1.1.8
- sequential_uuids 1.0.3
- pgmq 1.5.0 (subdir)
- floatvec 1.1.1
- pg_parquet 0.2.0
- wrappers 0.4.4
- pg_later 0.3.0
- topn fix for deb.arm64
- add age 17 on debian
- powa + pg17, 5.0.1
- h3 + pg17
- ogr_fdw + pg17
- age + pg17 1.5 on debian
- pgtap + pg17 1.3.3
- repmgr
- topn + pg17
- pg_partman 5.2.4
- credcheck 3.0
- ogr_fdw 1.1.5
- ddlx 0.29
- postgis 3.5.1
- tdigest 1.4.3
- pg_repack 1.5.2
v3.2.0
Highlights
- New CLI: Introducing the
pigcommand-line tool for managing extension plugins. - ARM64 Support: 390 extensions are now available for ARM64 across five major distributions.
- Supabase Update: Latest Supabase Release Week updates are now supported for self-hosting on all distributions.
- Grafana v11.4: Upgraded Grafana to version 11.4, featuring a new Infinity datasource.
Package Changes
- New Extensions
- Added
timescaledb,timescaledb-loader,timescaledb-toolkit, andtimescaledb-toolto the PIGSTY repository. - Added a custom-compiled pg_timescaledb for EL.
- Added pgroonga, custom-compiled for all EL variants.
- Added vchord 0.1.0.
- Added pg_bestmatch.rs 0.0.1.
- Added pglite_fusion 0.0.3.
- Added pgpdf 0.1.0.
- Updated Extensions
- pgvectorscale: 0.4.0 → 0.5.1
- pg_parquet: 0.1.0 → 0.1.1
- pg_polyline: 0.0.1
- pg_cardano: 1.0.2 → 1.0.3
- pg_vectorize: 0.20.0
- pg_duckdb: 0.1.0 → 0.2.0
- pg_search: 0.13.0 → 0.13.1
- aggs_for_vecs: 1.3.1 → 1.3.2
- Infrastructure
- Added promscale 0.17.0
- Added grafana-plugins 11.4
- Added grafana-infinity-plugins
- Added grafana-victoriametrics-ds
- Added grafana-victorialogs-ds
- vip-manager: 2.8.0 → 3.0.0
- vector: 0.42.0 → 0.43.0
- grafana: 11.3 → 11.4
- prometheus: 3.0.0 → 3.0.1 (package name changed from
prometheus2toprometheus) - nginx_exporter: 1.3.0 → 1.4.0
- mongodb_exporter: 0.41.2 → 0.43.0
- VictoriaMetrics: 1.106.1 → 1.107.0
- VictoriaLogs: 1.0.0 → 1.3.2
- pg_timetable: 5.9.0 → 5.10.0
- tigerbeetle: 0.16.13 → 0.16.17
- pg_export: 0.7.0 → 0.7.1
- New Docker App
- Add mattermost the open-source Slack alternative self-hosting template
- Bug Fixes
- Added
python3-cdiffforel8.aarch64to fix missing Patroni dependency. - Added
timescaledb-toolsforel9.aarch64to fix missing package in official repo. - Added
pg_filedumpforel9.aarch64to fix missing package in official repo. - Removed Extensions
- pg_mooncake: Removed due to conflicts with
pg_duckdb. - pg_top: Removed because of repeated version issues and quality concerns.
- hunspell_pt_pt: Removed because of conflict with official PG dictionary files.
- pgml: Disabled by default (no longer downloaded or installed).
API Changes
repo_url_packagesnow defaults to an empty array; packages are installed via OS package managers.grafana_plugin_cacheis deprecated; Grafana plugins are now installed via OS package managers.grafana_plugin_listis deprecated for the same reason.- The 36-node “production” template has been renamed to
simu. - Auto-generated code under
node_id/varsnow includesaarch64support. infra_packagesnow includes thepigCLI tool.- The
configurecommand now updates the version numbers ofpgsql-xxxaliases in auto-generated config files. - Update terraform templates with Makefile shortcuts and better provision experience
Bug Fix
- Fix pgbouncer dashboard selector issue #474
- Add
--arg valuesupport forpg-pitrby @waitingsong - Fix redis log message typo by @waitingsong
Checksums
v3.1.0
2024-11-24 : ARM64 & Ubuntu24, PG17 by Default, Better Supabase & MinIO
https://github.com/pgsty/pigsty/releases/tag/v3.1.0
v3.0.4
2024-10-28 : PostgreSQL 17 Extensions, Better self-hosting Supabase
https://github.com/pgsty/pigsty/releases/tag/v3.0.4
v3.0.3
2024-09-27 : PostgreSQL 17, Etcd Enhancement, IvorySQL 3.4, PostGIS 3.5
https://github.com/pgsty/pigsty/releases/tag/v3.0.3
v3.0.2
2024-09-07 : Mini Install, PolarDB 15, Bloat View Update
https://github.com/pgsty/pigsty/releases/tag/v3.0.2
v3.0.1
2024-08-31 : Oracle Compatibility, Patroni 4.0, Routine Bug Fix
https://github.com/pgsty/pigsty/releases/tag/v3.0.1
v3.0.0
2024-08-30 : Extension Exploding & Pluggable Kernels (MSSQL, Oracle)
https://github.com/pgsty/pigsty/releases/tag/v3.0.0
v2.7.0
2024-05-16 : Extension Overwhelming, new docker apps
https://github.com/pgsty/pigsty/releases/tag/v2.7.0
v2.6.0
2024-02-29 : PG 16 as default version, ParadeDB & DuckDB
https://github.com/pgsty/pigsty/releases/tag/v2.6.0
v2.5.1
2023-12-01 : Routine update, pg16 major extensions
https://github.com/pgsty/pigsty/releases/tag/v2.5.1
v2.5.0
2023-10-24 : Ubuntu/Debian Support: bullseye, bookworm, jammy, focal
https://github.com/pgsty/pigsty/releases/tag/v2.5.0
v2.4.1
2023-09-24 : Supabase/PostgresML support, graphql, jwt, pg_net, vault
https://github.com/pgsty/pigsty/releases/tag/v2.4.1
v2.4.0
2023-09-14 : PG16, RDS Monitor, New Extensions
https://github.com/pgsty/pigsty/releases/tag/v2.4.0
v2.3.1
2023-09-01 : PGVector with HNSW, PG16 RC1, Chinese Docs, Bug Fix
https://github.com/pgsty/pigsty/releases/tag/v2.3.1
v2.3.0
2023-08-20 : PGSQL/REDIS Update, NODE VIP, Mongo/FerretDB, MYSQL Stub
https://github.com/pgsty/pigsty/releases/tag/v2.3.0
v2.2.0
2023-08-04 : Dashboard & Provision overhaul, UOS compatibility
https://github.com/pgsty/pigsty/releases/tag/v2.2.0
v2.1.0
2023-06-10 : PostgreSQL 12 ~ 16beta support
https://github.com/pgsty/pigsty/releases/tag/v2.1.0
v2.0.2
2023-03-31 : Add pgvector support and fix MinIO CVE
https://github.com/pgsty/pigsty/releases/tag/v2.0.2
v2.0.1
2023-03-21 : v2 Bug Fix, security enhance and bump grafana version
https://github.com/pgsty/pigsty/releases/tag/v2.0.1
v2.0.0
2023-02-28 : Compatibility Security Maintainability Enhancement
https://github.com/pgsty/pigsty/releases/tag/v2.0.0
v1.5.1
2022-06-18 : Grafana Security Hotfix
https://github.com/pgsty/pigsty/releases/tag/v1.5.1
v1.5.0
2022-05-31 : Docker Applications
https://github.com/pgsty/pigsty/releases/tag/v1.5.0
v1.4.1
2022-04-20 : Bug fix & Full translation of English documents.
https://github.com/pgsty/pigsty/releases/tag/v1.4.1
v1.4.0
2022-03-31 : MatrixDB Support, Separated INFRA, NODES, PGSQL, REDIS
https://github.com/pgsty/pigsty/releases/tag/v1.4.0
v1.3.0
2021-11-30 : PGCAT Overhaul & PGSQL Enhancement & Redis Support Beta
https://github.com/pgsty/pigsty/releases/tag/v1.3.0
v1.2.0
2021-11-03 : Upgrade default Postgres to 14, monitoring existing pg
https://github.com/pgsty/pigsty/releases/tag/v1.2.0
v1.1.0
2021-10-12 : HomePage, JupyterLab, PGWEB, Pev2 & Pgbadger
https://github.com/pgsty/pigsty/releases/tag/v1.1.0
v1.0.0
2021-07-26 : v1 GA, Monitoring System Overhaul
https://github.com/pgsty/pigsty/releases/tag/v1.0.0
v0.9.0
2021-04-04 : Pigsty GUI, CLI, Logging Integration
https://github.com/pgsty/pigsty/releases/tag/v0.9.0
v0.8.0
2021-03-28 : Service Provision
https://github.com/pgsty/pigsty/releases/tag/v0.8.0
v0.7.0
2021-03-01 : Monitor only deployment
https://github.com/pgsty/pigsty/releases/tag/v0.7.0
v0.6.0
2021-02-19 : Architecture Enhancement
https://github.com/pgsty/pigsty/releases/tag/v0.6.0
v0.5.0
2021-01-07 : Database Customize Template
https://github.com/pgsty/pigsty/releases/tag/v0.5.0
v0.4.0
2020-12-14 : PostgreSQL 13 Support, Official Documentation
https://github.com/pgsty/pigsty/releases/tag/v0.4.0
v0.3.0
2020-10-22 : Provisioning Solution GA
https://github.com/pgsty/pigsty/releases/tag/v0.3.0
v0.2.0
2020-07-10 : PGSQL Monitoring v6 GA
https://github.com/pgsty/pigsty/commit/385e33a62a19817e8ba19997260e6b77d99fe2ba
v0.1.0
2020-06-20 : Validation on Testing Environment
https://github.com/pgsty/pigsty/commit/1cf2ea5ee91db071de00ec805032928ff582453b
v0.0.5
2020-08-19 : Offline Installation Mode
https://github.com/pgsty/pigsty/commit/0fe9e829b298fe5e56307de3f78c95071de28245
v0.0.4
2020-07-27 : Refactor playbooks into ansible roles
https://github.com/pgsty/pigsty/commit/90b44259818d2c71e37df5250fe8ed1078a883d0
v0.0.3
2020-06-22 : Interface enhancement
https://github.com/pgsty/pigsty/commit/4c5c68ccd57bc32a9e9c98aa3f264aa19f45c7ee
v0.0.2
2020-04-30 : First Commit
https://github.com/pgsty/pigsty/commit/dd646775624ddb33aef7884f4f030682bdc371f8
v0.0.1
2019-05-15 : POC
https://github.com/Vonng/pg/commit/fa2ade31f8e81093eeba9d966c20120054f0646b
4.13 - Comparison
Comparison with RDS
Pigsty is a local-first RDS alternative released under Apache-2.0, deployable on your own physical/virtual machines or cloud servers.
We’ve chosen Amazon AWS RDS for PostgreSQL (the global market leader) and Alibaba Cloud RDS for PostgreSQL (China’s market leader) as benchmarks for comparison.
Both Aliyun RDS and AWS RDS are closed-source cloud database services, available only through rental models on public clouds. The following cloud-vendor information is a February 2024 archive based on PostgreSQL 16 at that time. The Pigsty column in the Feature Comparison table is maintained against the current release, while the later Key Extensions version table remains a period snapshot.
Feature Comparison
| Feature | Pigsty | Aliyun RDS | AWS RDS |
|---|---|---|---|
| Major Version Support | 14 - 18 | 13 - 18 | 13 - 18 |
| Read Replicas | Supports unlimited read replicas | Standby instances not exposed to users | Standby instances not exposed to users |
| Read/Write Splitting | Port-based traffic separation | Separate paid component | Separate paid component |
| Fast/Slow Separation | Supports offline ETL instances | Not available | Not available |
| Cross-Region DR | Supports standby clusters | Multi-AZ deployment supported | Multi-AZ deployment supported |
| Delayed Replicas | Supports delayed instances | Not available | Not available |
| Load Balancing | HAProxy / LVS | Separate paid component | Separate paid component |
| Connection Pool | Pgbouncer | Separate paid component: RDS | Separate paid component: RDS Proxy |
| High Availability | Patroni / etcd | Requires HA edition | Requires HA edition |
| Point-in-Time Recovery | pgBackRest / Silo | Backup supported | Backup supported |
| Metrics Monitoring | VictoriaMetrics / Exporter | Free basic / Paid advanced | Free basic / Paid advanced |
| Log Collection | VictoriaLogs / Vector | Basic support | Basic support |
| Visualization | Grafana / Echarts | Basic monitoring | Basic monitoring |
| Alert Aggregation | AlertManager | Basic support | Basic support |
Key Extensions
This is a historical PostgreSQL 16 extension-support snapshot based on information visible on 2024-02-28. Its versions and projects—including pg_analytics, which was later archived and removed from the catalog—are not the current Pigsty v4.5.0 or cloud-provider support matrix. Use the extension catalog for current Pigsty coverage and recheck each provider’s documentation for its current service capabilities.
| Extension | Pigsty RDS / PGDG Official Repo | Aliyun RDS | AWS RDS |
|---|---|---|---|
| Install Extensions | Free to install | Not allowed | Not allowed |
| Geospatial | PostGIS 3.4.2 | PostGIS 3.3.4 / Ganos 6.1 | PostGIS 3.4.1 |
| Point Cloud | PG PointCloud 1.2.5 | Ganos PointCloud 6.1 | |
| Vector Embedding | PGVector 0.6.1 / Svector 0.5.6 | pase 0.0.1 | PGVector 0.6 |
| Machine Learning | PostgresML 2.8.1 | ||
| Time Series | TimescaleDB 2.14.2 | ||
| Horizontal Scaling | Citus 12.1 | ||
| Columnar Storage | Hydra 1.1.1 | ||
| Full Text Search | pg_bm25 0.5.6 | ||
| Graph Database | Apache AGE 1.5.0 | ||
| GraphQL | PG GraphQL 1.5.0 | ||
| OLAP | pg_analytics 0.5.6 | ||
| Message Queue | pgq 3.5.0 | ||
| DuckDB | duckdb_fdw 1.1 | ||
| Fuzzy Tokenization | zhparser 1.1 / pg_bigm 1.2 | zhparser 1.0 / pg_jieba | pg_bigm 1.2 |
| CDC Extraction | wal2json 2.5.3 | wal2json 2.5 | |
| Bloat Management | pg_repack 1.5.0 | pg_repack 1.4.8 | pg_repack 1.5.0 |
AWS RDS for PostgreSQL 16 available extensions (excluding PG built-in extensions)
| name | pg16 | pg15 | pg14 | pg13 | pg12 | pg11 | pg10 |
|---|---|---|---|---|---|---|---|
| amcheck | 1.3 | 1.3 | 1.3 | 1.2 | 1.2 | yes | 1 |
| auto_explain | yes | yes | yes | yes | yes | yes | yes |
| autoinc | 1 | 1 | 1 | 1 | null | null | null |
| bloom | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| bool_plperl | 1 | 1 | 1 | 1 | null | null | null |
| btree_gin | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.2 |
| btree_gist | 1.7 | 1.7 | 1.6 | 1.5 | 1.5 | 1.5 | 1.5 |
| citext | 1.6 | 1.6 | 1.6 | 1.6 | 1.6 | 1.5 | 1.4 |
| cube | 1.5 | 1.5 | 1.5 | 1.4 | 1.4 | 1.4 | 1.2 |
| dblink | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
| dict_int | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| dict_xsyn | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| earthdistance | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
| fuzzystrmatch | 1.2 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
| hstore | 1.8 | 1.8 | 1.8 | 1.7 | 1.6 | 1.5 | 1.4 |
| hstore_plperl | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| insert_username | 1 | 1 | 1 | 1 | null | null | null |
| intagg | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
| intarray | 1.5 | 1.5 | 1.5 | 1.3 | 1.2 | 1.2 | 1.2 |
| isn | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.1 |
| jsonb_plperl | 1 | 1 | 1 | 1 | 1 | null | null |
| lo | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
| ltree | 1.2 | 1.2 | 1.2 | 1.2 | 1.1 | 1.1 | 1.1 |
| moddatetime | 1 | 1 | 1 | 1 | null | null | null |
| old_snapshot | 1 | 1 | 1 | null | null | null | null |
| pageinspect | 1.12 | 1.11 | 1.9 | 1.8 | 1.7 | 1.7 | 1.6 |
| pg_buffercache | 1.4 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 |
| pg_freespacemap | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
| pg_prewarm | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.1 |
| pg_stat_statements | 1.1 | 1.1 | 1.9 | 1.8 | 1.7 | 1.6 | 1.6 |
| pg_trgm | 1.6 | 1.6 | 1.6 | 1.5 | 1.4 | 1.4 | 1.3 |
| pg_visibility | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
| pg_walinspect | 1.1 | 1 | null | null | null | null | null |
| pgcrypto | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 |
| pgrowlocks | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
| pgstattuple | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 |
| plperl | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| plpgsql | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| pltcl | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| postgres_fdw | 1.1 | 1.1 | 1.1 | 1 | 1 | 1 | 1 |
| refint | 1 | 1 | 1 | 1 | null | null | null |
| seg | 1.4 | 1.4 | 1.4 | 1.3 | 1.3 | 1.3 | 1.1 |
| sslinfo | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 |
| tablefunc | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| tcn | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| tsm_system_rows | 1 | 1 | 1 | 1 | 1 | 1 | 1.1 |
| tsm_system_time | 1 | 1 | 1 | 1 | 1 | 1 | 1.1 |
| unaccent | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
| uuid-ossp | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 |
Aliyun RDS for PostgreSQL 16 available extensions (excluding PG built-in extensions)
| name | pg16 | pg15 | pg14 | pg13 | pg12 | pg11 | pg10 | description |
|---|---|---|---|---|---|---|---|---|
| bloom | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Provides a bloom filter-based index access method. |
| btree_gin | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.2 | Provides GIN operator class examples that implement B-tree equivalent behavior for multiple data types and all enum types. |
| btree_gist | 1.7 | 1.7 | 1.6 | 1.5 | 1.5 | 1.5 | 1.5 | Provides GiST operator class examples that implement B-tree equivalent behavior for multiple data types and all enum types. |
| citext | 1.6 | 1.6 | 1.6 | 1.6 | 1.6 | 1.5 | 1.4 | Provides a case-insensitive string type. |
| cube | 1.5 | 1.5 | 1.5 | 1.4 | 1.4 | 1.4 | 1.2 | Provides a data type for representing multi-dimensional cubes. |
| dblink | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | Cross-database table operations. |
| dict_int | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Additional full-text search dictionary template example. |
| earthdistance | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | Provides two different methods to calculate great circle distances on the Earth’s surface. |
| fuzzystrmatch | 1.2 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | Determines similarities and distances between strings. |
| hstore | 1.8 | 1.8 | 1.8 | 1.7 | 1.6 | 1.5 | 1.4 | Stores key-value pairs in a single PostgreSQL value. |
| intagg | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | Provides an integer aggregator and an enumerator. |
| intarray | 1.5 | 1.5 | 1.5 | 1.3 | 1.2 | 1.2 | 1.2 | Provides some useful functions and operators for manipulating null-free integer arrays. |
| isn | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.1 | Validates input according to a hard-coded prefix list, also used for concatenating numbers during output. |
| ltree | 1.2 | 1.2 | 1.2 | 1.2 | 1.1 | 1.1 | 1.1 | For representing labels of data stored in a hierarchical tree structure. |
| pg_buffercache | 1.4 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | Provides a way to examine the shared buffer cache in real time. |
| pg_freespacemap | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | Examines the free space map (FSM). |
| pg_prewarm | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.1 | Provides a convenient way to load data into the OS buffer or PostgreSQL buffer. |
| pg_stat_statements | 1.1 | 1.1 | 1.9 | 1.8 | 1.7 | 1.6 | 1.6 | Provides a means of tracking execution statistics of all SQL statements executed by a server. |
| pg_trgm | 1.6 | 1.6 | 1.6 | 1.5 | 1.4 | 1.4 | 1.3 | Provides functions and operators for alphanumeric text similarity, and index operator classes that support fast searching of similar strings. |
| pgcrypto | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | Provides cryptographic functions for PostgreSQL. |
| pgrowlocks | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | Provides a function to show row locking information for a specified table. |
| pgstattuple | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 | 1.5 | Provides multiple functions to obtain tuple-level statistics. |
| plperl | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Provides Perl procedural language. |
| plpgsql | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Provides SQL procedural language. |
| pltcl | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Provides Tcl procedural language. |
| postgres_fdw | 1.1 | 1.1 | 1.1 | 1 | 1 | 1 | 1 | Cross-database table operations. |
| sslinfo | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | Provides information about the SSL certificate provided by the current client. |
| tablefunc | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Contains multiple table-returning functions. |
| tsm_system_rows | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Provides the table sampling method SYSTEM_ROWS. |
| tsm_system_time | 1 | 1 | 1 | 1 | 1 | 1 | 1 | Provides the table sampling method SYSTEM_TIME. |
| unaccent | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | A text search dictionary that can remove accents (diacritics) from lexemes. |
| uuid-ossp | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | Provides functions to generate universally unique identifiers (UUIDs) using several standard algorithms. |
| xml2 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | Provides XPath queries and XSLT functionality. |
Performance Comparison
| Metric | Pigsty | Aliyun RDS | AWS RDS |
|---|---|---|---|
| Peak Performance | PGTPC on NVME SSD Benchmark sysbench oltp_rw | RDS PG Performance Whitepaper sysbench oltp scenario QPS 4000 ~ 8000 per core | |
| Storage Spec: Max Capacity | 32TB / NVME SSD | 32 TB / ESSD PL3 | 64 TB / io2 EBS Block Express |
| Storage Spec: Max IOPS | 4K Random Read: Max 3M, Random Write 2000~350K | 4K Random Read: Max 1M | 16K Random IOPS: 256K |
| Storage Spec: Max Latency | 4K Random Read: 75µs, Random Write: 15µs | 4K Random Read: 200µs | 500µs / Inferred as 16K random IO |
| Storage Spec: Max Reliability | UBER < 1e-18, equivalent to 18 nines MTBF: 2M hours 5DWPD, 3 years continuous | Reliability 9 nines, equivalent to UBER 1e-9 Storage and Data Reliability | Durability: 99.999%, 5 nines (0.001% annual failure rate) io2 specification |
| Storage Spec: Max Cost | ¥31.5/TB·month (5-year warranty amortized / 3.2T / Enterprise-grade / MLC) | ¥3200/TB·month (original ¥6400, monthly ¥4000) 50% off with 3-year prepaid | ¥1900/TB·month using max spec 65536GB / 256K IOPS best discount |
Observability
Pigsty provides nearly 3000 monitoring metrics and 50+ monitoring dashboards, covering database monitoring, host monitoring, connection pool monitoring, load balancer monitoring, and more, providing users with an unparalleled observability experience.

Pigsty provides 638 PostgreSQL-related monitoring metrics, while AWS RDS only has 99, and Aliyun RDS has only single-digit metrics:

Additionally, some projects provide PostgreSQL monitoring capabilities, but are relatively simple:
- pgwatch: 123 metric types
- pgmonitor: 156 metric types
- datadog: 69 metric types
- pgDash
- ClusterControl
- pganalyze
- Aliyun RDS: 8 metric types
- AWS RDS: 99 metric types
- Azure RDS
Maintainability
| Metric | Pigsty | Aliyun RDS | AWS RDS |
|---|---|---|---|
| System Usability | Simple | Simple | Simple |
| Configuration Management | Config files / CMDB based on Ansible Inventory | Can use Terraform | Can use Terraform |
| Change Method | Idempotent Playbooks based on Ansible Playbook | Console click operations | Console click operations |
| Parameter Tuning | Auto-adapts to node specs, Four preset templates: OLTP, OLAP, TINY, CRIT | ||
| Infra as Code | Natively supported | Can use Terraform | Can use Terraform |
| Customizable Parameters | Pigsty Parameters 283 parameters | ||
| Service & Support | Commercial subscription support available | After-sales ticket support | After-sales ticket support |
| Air-gapped Deployment | Offline installation supported | N/A | N/A |
| Database Migration | Playbooks for zero-downtime migration from existing v10+ PG instances to Pigsty managed instances via logical replication | Cloud migration assistance Aliyun RDS Data Sync |
Cost
Based on experience, RDS unit cost is 5-15 times that of self-hosted for software and hardware resources, with a rent-to-own ratio typically around one month. For details, see Cost Analysis.
| Factor | Metric | Pigsty | Aliyun RDS | AWS RDS |
|---|---|---|---|---|
| Cost | Software License/Service Fee | Free, hardware ~¥20-40/core·month | ¥200-400/core·month | ¥400-1300/core·month |
| Support Service Fee | Service ~¥100/core·month | Included in RDS cost |
Other On-Premises Database Management Software
Some software and vendors providing PostgreSQL management capabilities:
- Aiven: Closed-source commercial cloud-hosted solution
- Percona: Commercial consulting, simple PG distribution
- ClusterControl: Commercial database management software
Other Kubernetes Operators
Pigsty refuses to use Kubernetes for managing databases in production, so there are ecological differences with these solutions.
- PGO
- StackGres
- CloudNativePG
- TemboOperator
- PostgresOperator
- PerconaOperator
- Kubegres
- KubeDB
- KubeBlocks
For more information, see:
4.13.1 - Cost Reference
Overview
The cost data below is intended to illustrate order-of-magnitude differences. Cloud vendor pricing and discounts vary over time, region, instance size, and purchase model.
| EC2 | Core·Month | RDS | Core·Month |
|---|---|---|---|
| DHH Self-Hosted Core-Month Price (192C 384G) | 25.32 | Junior Open Source DB DBA Reference Salary | ¥15K/person·month |
| IDC Self-Hosted (Dedicated Physical: 64C384G) | 19.53 | Mid-Level Open Source DB DBA Reference Salary | ¥30K/person·month |
| IDC Self-Hosted (Container, 500% Oversold) | 7 | Senior Open Source DB DBA Reference Salary | ¥60K/person·month |
| UCloud Elastic VM (8C16G, Oversold) | 25 | ORACLE Database License | 10000 |
| Aliyun ECS 2x Memory (Dedicated, No Oversold) | 107 | Aliyun RDS PG 2x Memory (Dedicated) | 260 |
| Aliyun ECS 4x Memory (Dedicated, No Oversold) | 138 | Aliyun RDS PG 4x Memory (Dedicated) | 320 |
| Aliyun ECS 8x Memory (Dedicated, No Oversold) | 180 | Aliyun RDS PG 8x Memory (Dedicated) | 410 |
| AWS C5D.METAL 96C 200G (Monthly No Prepaid) | 100 | AWS RDS PostgreSQL db.T2 (2x) | 440 |
| AWS C5D.METAL 96C 200G (3-Year Prepaid) | 80 | AWS RDS PostgreSQL db.M5 (4x) | 611 |
| AWS C7A.METAL 192C 384G (3-Year Prepaid) | 104.8 | AWS RDS PostgreSQL db.R6G (8x) | 786 |
RDS Cost Reference
| Payment Model | Price | Annualized (¥10K) |
|---|---|---|
| IDC Self-Hosted (Single Physical Machine) | ¥75K / 5 years | 1.5 |
| IDC Self-Hosted (2-3 Machines for HA) | ¥150K / 5 years | 3.0 ~ 4.5 |
| Aliyun RDS On-Demand | ¥87.36/hour | 76.5 |
| Aliyun RDS Monthly (Baseline) | ¥42K / month | 50 |
| Aliyun RDS Annual (85% off) | ¥425,095 / year | 42.5 |
| Aliyun RDS 3-Year Prepaid (50% off) | ¥750,168 / 3 years | 25 |
| AWS On-Demand | $25,817 / month | 217 |
| AWS 1-Year No Prepaid | $22,827 / month | 191.7 |
| AWS 3-Year Full Prepaid | $120K + $17.5K/month | 175 |
| AWS China/Ningxia On-Demand | ¥197,489 / month | 237 |
| AWS China/Ningxia 1-Year No Prepaid | ¥143,176 / month | 171 |
| AWS China/Ningxia 3-Year Full Prepaid | ¥647K + ¥116K/month | 160.6 |
Here’s a comparison of self-hosted vs cloud database costs:
| Method | Annualized (¥10K) |
|---|---|
| IDC Hosted Server 64C / 384G / 3.2TB NVME SSD 660K IOPS (2-3 Machines) | 3.0 ~ 4.5 |
| Aliyun RDS PG HA Edition pg.x4m.8xlarge.2c, 64C / 256GB / 3.2TB ESSD PL3 | 25 ~ 50 |
| AWS RDS PG HA Edition db.m5.16xlarge, 64C / 256GB / 3.2TB io1 x 80k IOPS | 160 ~ 217 |
ECS Cost Reference
Pure Compute Price Comparison (Excluding NVMe SSD / ESSD PL3)
Using Aliyun as an example, the monthly pure compute price is 5-7x the self-hosted baseline, while 5-year prepaid is 2x self-hosted
| Payment Model | Unit Price (¥/Core·Month) | Relative to Standard | Self-Hosted Premium Multiple |
|---|---|---|---|
| On-Demand (1.5x) | ¥ 202 | 160 % | 9.2 ~ 11.2 |
| Monthly (Standard) | ¥ 126 | 100 % | 5.7 ~ 7.0 |
| 1-Year Prepaid (65% off) | ¥ 83.7 | 66 % | 3.8 ~ 4.7 |
| 2-Year Prepaid (55% off) | ¥ 70.6 | 56 % | 3.2 ~ 3.9 |
| 3-Year Prepaid (44% off) | ¥ 55.1 | 44 % | 2.5 ~ 3.1 |
| 4-Year Prepaid (35% off) | ¥ 45 | 35 % | 2.0 ~ 2.5 |
| 5-Year Prepaid (30% off) | ¥ 38.5 | 30 % | 1.8 ~ 2.1 |
| DHH @ 2023 | ¥ 22.0 | ||
| Tantan IDC Self-Hosted | ¥ 18.0 |
Equivalent Price Comparison Including NVMe SSD / ESSD PL3
Including common NVMe SSD specs, the monthly pure compute price is 11-14x the self-hosted baseline, while 5-year prepaid is about 9x.
| Payment Model | Unit Price (¥/Core·Month) | + 40GB ESSD PL3 | Self-Hosted Premium Multiple |
|---|---|---|---|
| On-Demand (1.5x) | ¥ 202 | ¥ 362 | 14.3 ~ 18.6 |
| Monthly (Standard) | ¥ 126 | ¥ 286 | 11.3 ~ 14.7 |
| 1-Year Prepaid (65% off) | ¥ 83.7 | ¥ 244 | 9.6 ~ 12.5 |
| 2-Year Prepaid (55% off) | ¥ 70.6 | ¥ 230 | 9.1 ~ 11.8 |
| 3-Year Prepaid (44% off) | ¥ 55.1 | ¥ 215 | 8.5 ~ 11.0 |
| 4-Year Prepaid (35% off) | ¥ 45 | ¥ 205 | 8.1 ~ 10.5 |
| 5-Year Prepaid (30% off) | ¥ 38.5 | ¥ 199 | 7.9 ~ 10.2 |
| DHH @ 2023 | ¥ 25.3 | ||
| Tantan IDC Self-Hosted | ¥ 19.5 |
DHH Case: 192 cores with 12.8TB Gen4 SSD (1c:66); Tantan Case: 64 cores with 3.2T Gen3 MLC SSD (1c:50).
Cloud prices calculated at 40GB ESSD PL3 per core (1 core:4x RAM:40x disk).
EBS Cost Reference
| Evaluation Factor | Local PCI-E NVME SSD | Aliyun ESSD PL3 | AWS io2 Block Express |
|---|---|---|---|
| Capacity | 32TB | 32 TB | 64 TB |
| IOPS | 4K Random Read: 600K ~ 1.1M, 4K Random Write: 200K ~ 350K | 4K Random Read: Max 1M | 16K Random IOPS: 256K |
| Latency | 4K Random Read: 75µs, 4K Random Write: 15µs | 4K Random Read: 200µs | Random IO: ~500µs (contextually inferred as 16K) |
| Reliability | UBER < 1e-18, equivalent to 18 nines, MTBF: 2M hours, 5DWPD for 3 years | Data Reliability 9 nines Storage and Data Reliability | Durability: 99.999%, 5 nines (0.001% annual failure rate) io2 Specification |
| Cost | ¥16/TB·month (5-year amortized / 3.2T MLC), 5-year warranty, ¥3000 retail | ¥3200/TB·month (original ¥6400, monthly ¥4000), 50% off with 3-year full prepaid | ¥1900/TB·month using max spec 65536GB 256K IOPS best discount |
| SLA | 5-year warranty, replacement on failure | Aliyun RDS SLA Availability 99.99%: 15% monthly fee, 99%: 30% monthly fee, 95%: 100% monthly fee | Amazon RDS SLA Availability 99.95%: 15% monthly fee, 99%: 25% monthly fee, 95%: 100% monthly fee |
S3 Cost Reference
| Date | $/GB·Month | ¥/TB·5Years | HDD ¥/TB | SSD ¥/TB |
|---|---|---|---|---|
| 2006.03 | 0.150 | 63000 | 2800 | |
| 2010.11 | 0.140 | 58800 | 1680 | |
| 2012.12 | 0.095 | 39900 | 420 | 15400 |
| 2014.04 | 0.030 | 12600 | 371 | 9051 |
| 2016.12 | 0.023 | 9660 | 245 | 3766 |
| 2023.12 | 0.023 | 9660 | 105 | 280 |
| Other References | High-Perf Storage | Top-Tier Discounted | vs Purchased NVMe SSD | Price Ref |
| S3 Express | 0.160 | 67200 | DHH 12T | 1400 |
| EBS io2 | 0.125 + IOPS | 114000 | Shannon 3.2T | 900 |
Cloud Exit Collection
There was a time when “moving to the cloud” was almost politically correct in tech circles, and an entire generation of app developers had their vision obscured by the cloud. Let’s use real data analysis and firsthand experience to explain the value and pitfalls of the public cloud rental model — for your reference in this era of cost reduction and efficiency improvement — please see “Cloud Computing Mudslide: Collection”
Cloud Infrastructure Basics
Exposing Object Storage: From Cost Reduction to Price Gouging
Garbage Tencent Cloud CDN: From Getting Started to Giving Up
Cloud Business Model
Cloud Exit Odyssey
Cloud Failure Post-Mortems
RDS Failures
Cloud Vendor Profiles
4.13.2 - Open-Source Impact
China PostgreSQL Ecosystem Projects
Sorted by GitHub stars in descending order. Last updated: 2026-08-13 (Beijing time).
| Project | Star | Author | Type | Summary |
|---|---|---|---|---|
pgsty/pigsty | 5521 | Ruohang Feng @ PGSTY | Distribution | Out-of-the-box PostgreSQL distribution |
polardb/PolarDB-for-PostgreSQL | 3191 | Alibaba Cloud | Kernel | Open-source PolarDB for PostgreSQL kernel |
tensorchord/pgvecto.rs | 2181 | TensorChord | Extension | Vector search extension written in Rust |
tensorchord/VectorChord | 1770 | TensorChord | Extension | Next-generation vector search extension |
Tencent/TBase | 1439 | Tencent Cloud | Kernel | Tencent distributed HTAP database kernel |
apache/cloudberry | 1315 | HashData | Kernel | Open-source MPP data warehouse kernel |
IvorySQL/IvorySQL | 1051 | HighGo | Kernel | Oracle-compatible PostgreSQL fork |
pgplex/pgschema | 995 | Chen Tianzhou | Tool | Declarative Postgres schema migration CLI |
amutu/zhparser | 869 | Jov | Extension | Chinese full-text parser based on SCWS |
opengauss-mirror/openGauss-server | 784 | Huawei | Kernel | Early PostgreSQL 9.2 kernel fork |
HaloTech-Co-Ltd/openHalo | 437 | HaloTech | Kernel | PostgreSQL kernel compatible with MySQL wire protocol |
jaiminpan/pg_jieba | 417 | Pan Jiamin | Extension | Chinese full-text search extension based on Jieba |
alitrack/duckdb_fdw | 409 | Li Hongyan | Extension | DuckDB foreign data wrapper |
tensorchord/VectorChord-bm25 | 375 | TensorChord | Extension | Native BM25 ranking index for PostgreSQL |
pgsty/pg_exporter | 359 | Ruohang Feng @ PGSTY | Tool | Metrics exporter for PostgreSQL and Pgbouncer |
ChenHuajun/pg_roaringbitmap | 286 | Chen Huajun @ Suning | Extension | PostgreSQL RoaringBitmap bitmap extension |
pgsty/pig | 199 | Ruohang Feng @ PGSTY | Tool | PostgreSQL extension package manager |
tensorchord/pg_bestmatch.rs | 101 | TensorChord | Extension | BM25 sparse-vector generation in PostgreSQL |
wublabdubdub/PDU-PostgreSQLDataUnloader | 101 | Zhang Chen | Tool | PostgreSQL database rescue and unloading tool |
tensorchord/pg_tokenizer.rs | 45 | TensorChord | Extension | Full-text search tokenizer extension |
jaiminpan/pg_scws | 41 | Pan Jiamin | Extension | Chinese tokenizer extension based on SCWS |
pgsty/pgext | 31 | Ruohang Feng @ PGSTY | Tool | PostgreSQL extension catalog and metadata tool |
tooltip:
trigger: axis
axisPointer: { type: shadow }
formatter: $fn:tipfmt
grid: { left: 320, right: 72, top: 20, bottom: 26 }
xAxis:
type: value
max: 5600
name: GitHub Stars
nameLocation: middle
nameGap: 24
axisLabel: { formatter: $fn:fnum }
splitLine: { show: true, lineStyle: { type: dashed, opacity: 0.45 } }
yAxis:
type: category
inverse: true
axisLabel:
align: right
margin: 8
width: 300
overflow: truncate
fontSize: 11
fontFamily: monospace
data:
- 'pgsty/pigsty'
- 'polardb/PolarDB-for-PostgreSQL'
- 'tensorchord/pgvecto.rs'
- 'tensorchord/VectorChord'
- 'Tencent/TBase'
- 'apache/cloudberry'
- 'IvorySQL/IvorySQL'
- 'pgplex/pgschema'
- 'amutu/zhparser'
- 'opengauss-mirror/openGauss-server'
- 'HaloTech-Co-Ltd/openHalo'
- 'jaiminpan/pg_jieba'
- 'alitrack/duckdb_fdw'
- 'tensorchord/VectorChord-bm25'
- 'pgsty/pg_exporter'
- 'ChenHuajun/pg_roaringbitmap'
- 'pgsty/pig'
- 'tensorchord/pg_bestmatch.rs'
- 'wublabdubdub/PDU-PostgreSQLDataUnloader'
- 'tensorchord/pg_tokenizer.rs'
- 'jaiminpan/pg_scws'
- 'pgsty/pgext'
series:
- name: Star
type: bar
barWidth: 20
showBackground: true
backgroundStyle: { color: "rgba(148, 163, 184, 0.16)" }
itemStyle:
color: $fn:barclr
borderRadius: [0, 5, 5, 0]
label:
show: true
position: right
formatter: $fn:labfmt
color: '#334155'
fontWeight: 600
data: [5521, 3191, 2181, 1770, 1439, 1315, 1051, 995, 869, 784, 437, 417, 409, 375, 359, 286, 199, 101, 101, 45, 41, 31]PostgreSQL Distribution Impact Metrics
Sorted by GitHub stars in descending order, with commercial products that do not publish stars listed last. Last updated: 2026-08-13 (Beijing time).
| Project | Star | Vendor | Type | License | Summary |
|---|---|---|---|---|---|
| CloudNativePG | 9133 | EDB | K8S Native | Apache-2.0 | Mainstream PG Operator without Patroni dependency |
| Pigsty | 5521 | PGSTY | Linux Native | Apache-2.0 | Ansible-driven integrated PostgreSQL distribution |
| Zalando Postgres Operator | 5222 | Zalando | K8S Native | MIT | Long-standing Patroni/Spilo architecture operator |
| PGO | 4436 | Crunchy Data | K8S Native | Apache-2.0 | Production-grade operator with backup and monitoring |
| Autobase | 4332 | vitabaks | Linux Native | MIT | Automated deployment for Patroni/etcd/Consul |
| KubeBlocks | 3102 | ApeCloud | K8S Native | AGPL-3.0 | Unified multi-database operator platform |
| StackGres | 1426 | OnGres | K8S Native | AGPL-3.0 | Integrated PG operator with CRD/CLI/Web UI |
| Kubegres | 1350 | Reactive Tech | K8S Native | Apache-2.0 | Minimal operator built on native streaming replication |
| Tembo Operator | 1263 | Tembo | K8S Native | Unspecified | Scenario-based stacks for PostgreSQL |
| pgEdge | 744 | pgEdge | Linux Native | PostgreSQL | Distributed PG distribution focused on Spock multi-master replication |
| KubeDB | 733 | AppsCode | K8S Native | ACL-1.0 | Multi-database operator with kubectl plugin |
| Percona Operator for PostgreSQL | 381 | Percona | K8S Native | Apache-2.0 | PostgreSQL operator in Percona ecosystem |
| EDB TPA | 86 | EDB | Linux Native | GPL-3.0 | EDB official Ansible delivery toolkit |
| Percona Distribution for PostgreSQL | - | Percona | Linux Native | Multi | Integrated PostgreSQL distribution bundle |
| ClusterControl | - | ServerNines | Linux Native | Commercial | Multi-database deploy, monitoring, backup, and failover platform |
| CYBERTEC PGEE | - | CYBERTEC | Linux Native | Commercial | Enterprise PostgreSQL distribution focused on security and performance |
| Crunchy Postgres for Ansible | - | Crunchy Data | Linux Native | Commercial | Crunchy bare-metal/VM automation solution |
| EDB Postgres Advanced Server (EPAS) | - | EDB | Linux Native | Commercial | EDB flagship distribution with Oracle-compatibility features |
Other Resources
- Map of GitHub: Pigsty
- DeepWiki: pgsty/pigsty
- OSS Insight:
pgsty/pigsty - OSS Insight: pgsty
5 - References
5.1 - Supported Linux
Pigsty runs on Linux, supporting amd64/x86_64 and arm64/aarch64 arch, plus 3 major distros: EL, Debian, Ubuntu.
Pigsty runs bare-metal without containers. Supports actively maintained mainstream releases across the 3 major distro families and both archs.
Overview
Recommended OS versions: Rocky Linux 9.8 / 10.2, Debian 12.15 / 13.6, Ubuntu 22.04.5 / 24.04.4 / 26.04.0.
| Distro | Arch | OS Code | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|---|---|
| RHEL / Rocky / Alma 10 | x86_64 | el10.x86_64 | |||||
| RHEL / Rocky / Alma 10 | aarch64 | el10.aarch64 | |||||
| RHEL / Rocky / Alma 9 | x86_64 | el9.x86_64 | |||||
| RHEL / Rocky / Alma 9 | aarch64 | el9.aarch64 | |||||
Ubuntu 26.04 (resolute) | x86_64 | u26.x86_64 | |||||
Ubuntu 26.04 (resolute) | aarch64 | u26.aarch64 | |||||
Ubuntu 24.04 (noble) | x86_64 | u24.x86_64 | |||||
Ubuntu 24.04 (noble) | aarch64 | u24.aarch64 | |||||
Ubuntu 22.04 (jammy) | x86_64 | u22.x86_64 | |||||
Ubuntu 22.04 (jammy) | aarch64 | u22.aarch64 | |||||
Debian 13 (trixie) | x86_64 | d13.x86_64 | |||||
Debian 13 (trixie) | aarch64 | d13.aarch64 | |||||
Debian 12 (bookworm) | x86_64 | d12.x86_64 | |||||
Debian 12 (bookworm) | aarch64 | d12.aarch64 |
These seven minor releases are the current validation baselines. The extension repository retains dual-architecture EL8 compatibility, so the complete package matrix covers 16 Linux platforms. EL8 is in its retirement transition and is no longer a recommended deployment baseline.
EL
Pigsty supports RHEL / Rocky / Alma / Anolis / CentOS 8, 9, 10.
| EL Distro | Arch | OS Code | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|---|---|
| RHEL10 / Rocky10 / Alma10 | x86_64 | el10.x86_64 | |||||
| RHEL10 / Rocky10 / Alma10 | aarch64 | el10.aarch64 | |||||
| RHEL9 / Rocky9 / Alma9 | x86_64 | el9.x86_64 | |||||
| RHEL9 / Rocky9 / Alma9 | aarch64 | el9.aarch64 | |||||
| RHEL8 / Rocky8 / Alma8 | x86_64 | el8.x86_64 | |||||
| RHEL8 / Rocky8 / Alma8 | aarch64 | el8.aarch64 | |||||
| RHEL7 / CentOS7 | x86_64 | el7.x86_64 | |||||
| RHEL7 / CentOS7 | aarch64 | - |
Rocky Linux 9.8 / 10.2 balances stability and fresh software. Recommended for EL users.
EL8 goes EOL in 2029. Plan upgrade ASAP. EL10 support is ready, EL8 will be dropped in next release.
RHEL 7 EOL since Jun 2024. PGDG stopped providing binary packages for PG 16/17/18 on EL7.
For extended support on legacy OS, consider Enterprise Subscription.
Ubuntu
Pigsty supports Ubuntu 26.04 / 24.04 / 22.04:
| Ubuntu Distro | Arch | OS Code | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|---|---|
Ubuntu 26.04 (resolute) | x86_64 | u26.x86_64 | |||||
Ubuntu 26.04 (resolute) | aarch64 | u26.aarch64 | |||||
Ubuntu 24.04 (noble) | x86_64 | u24.x86_64 | |||||
Ubuntu 24.04 (noble) | aarch64 | u24.aarch64 | |||||
Ubuntu 22.04 (jammy) | x86_64 | u22.x86_64 | |||||
Ubuntu 22.04 (jammy) | aarch64 | u22.aarch64 |
Ubuntu 26.04 provides the newest LTS baseline, while Ubuntu 24.04 remains the conservative default for Ubuntu users.
Debian
Pigsty supports Debian 12 / 13, latest Debian 13.6 recommended:
| Debian Distro | Arch | OS Code | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|---|---|
Debian 13 (trixie) | x86_64 | d13.x86_64 | |||||
Debian 13 (trixie) | aarch64 | d13.aarch64 | |||||
Debian 12 (bookworm) | x86_64 | d12.x86_64 | |||||
Debian 12 (bookworm) | aarch64 | d12.aarch64 | |||||
Debian 11 (bullseye) | x86_64 | d11.x86_64 (historical) | |||||
Debian 11 (bullseye) | aarch64 | - |
Debian 11 EOL since Jul 2024. For extended support on legacy OS, consider Enterprise Subscription.
Vagrant
For local VM deployment, use these Vagrant base images (same as used in Pigsty dev):
cloud-image/rocky-8: Rocky 8.10cloud-image/rocky-9: Rocky 9.8cloud-image/rocky-10: Rocky 10.2cloud-image/debian-12: Debian 12.15cloud-image/debian-13: Debian 13.6cloud-image/ubuntu-22.04: Ubuntu 22.04.5cloud-image/ubuntu-24.04: Ubuntu 24.04.4cloud-image/ubuntu-26.04: Ubuntu 26.04.0
Terraform
For cloud deployment, use these Terraform base image prefixes (Aliyun example):
| x86_64 | Aliyun Image Prefix |
|---|---|
| Rocky 8.10 | rockylinux_8_10_x64 |
| Rocky 9.8 | rockylinux_9_8_x64 |
| Rocky 10.2 | rockylinux_10_2_x64 |
| Ubuntu 22.04.5 | ubuntu_22_04_x64_20G |
| Ubuntu 24.04.4 | ubuntu_24_04_x64_20G |
| Ubuntu 26.04.0 | ubuntu_26_04_x64_20G |
| Debian 12.15 | debian_12_15_x64 |
| Debian 13.6 | debian_13_6_x64 |
| aarch64 | Aliyun Image Prefix |
|---|---|
| Rocky 8.10 | rockylinux_8_10_arm64 |
| Rocky 9.8 | rockylinux_9_8_arm64 |
| Rocky 10.2 | rockylinux_10_2_arm64 |
| Ubuntu 22.04.5 | ubuntu_22_04_arm64_20G |
| Ubuntu 24.04.4 | ubuntu_24_04_arm64_20G |
| Ubuntu 26.04.0 | ubuntu_26_04_arm64_20G |
| Debian 12.15 | debian_12_15_arm64 |
| Debian 13.6 | debian_13_6_arm64 |
5.2 - Modules
Official Modules
| Module | Category | Status | Docs Path | Summary |
|---|---|---|---|---|
PGSQL | Core | GA | /docs/pgsql | High-availability PostgreSQL clusters with built-in backup, monitoring, SOP, and extension ecosystem. |
INFRA | Core | GA | /docs/infra | Local software repository + VictoriaMetrics/Logs/Traces + Grafana infrastructure stack. |
NODE | Core | GA | /docs/node | Node initialization and convergence: system tuning, admin, HAProxy, Vector, Keepalived, etc. |
ETCD | Core | GA | /docs/etcd | DCS for PostgreSQL HA (service discovery, config, leader-election metadata). |
MINIO | Extension | GA | /docs/minio | Deploys Silo S3-compatible object storage, suitable for PostgreSQL backups. |
REDIS | Extension | GA | /docs/redis | Redis by default, or Valkey, in standalone, Sentinel, or native-cluster mode with monitoring. |
DOCKER | Extension | GA | /docs/docker | Docker daemon and the runtime capability for containerized apps. |
JUICE | Extension | BETA | /docs/juice | JuiceFS distributed file system using PostgreSQL as metadata engine. |
VIBE | Extension | BETA | /docs/vibe | Browser-based dev environment with Code-Server, JupyterLab, Node.js, Claude Code, and Codex CLI. |
KAFKA | Extension | BETA | /docs/kafka | Apache Kafka 4.x dynamic KRaft cluster deployment, security baseline, and monitoring. |
Core Modules
Pigsty provides four core modules that are important for delivering complete highly available PostgreSQL services:
PGSQL: Self-healing PostgreSQL clusters with HA, PITR, IaC, SOP, monitoring, and 576 extensions.INFRA: Local software repository, VictoriaMetrics, VictoriaLogs, VictoriaTraces, Grafana, Alertmanager, Blackbox Exporter…NODE: Node convergence for hostname, timezone, NTP, SSH, sudo, HAProxy, Vector, and Keepalived.ETCD: Distributed key-value store used as DCS for HA PostgreSQL clusters: consensus leader election/config management/service discovery.
Although these four modules are usually installed together, separate use is still feasible. In practice, only the NODE module is usually mandatory.
Extension Modules
Pigsty provides six extension modules. They are not mandatory for core functionality, but can enhance PostgreSQL capabilities:
MINIO: An S3-compatible object-storage module that deploys Silo and provides PostgreSQL backup integration and monitoring.REDIS: Redis server with standalone/sentinel/cluster production deployment and full monitoring support.DOCKER: Docker daemon service for one-click deployment of stateless software templates on Pigsty.JUICE: JuiceFS distributed filesystem module using PostgreSQL as metadata engine, providing shared POSIX storage.VIBE: Browser-based development environment with Code-Server, JupyterLab, Node.js, Claude Code, and Codex CLI.KAFKA: Apache Kafka 4.x dynamic KRaft clusters with TLS/SCRAM/ACL security baseline, declarative topics/users, and full monitoring.
Ecosystem Modules
The modules below are closely related to the PostgreSQL ecosystem. They are optional ecosystem capabilities and are not counted in the 10 official modules above:
SUPABASE,DUCKDB: peripheral ecosystem integration.MSSQL,IVORY,POLAR,CITUS,CLOUDBERRY,PGEDGE: kernel replacement, distributed, and MPP forms.MYSQL-compatible kernel (OpenHalo),ORIOLE,PGTDE,AGENS: protocol compatibility, storage engine, transparent encryption, and graph database kernels. Here,MYSQLmeans thepg_mode=mysqlPostgreSQL-compatible kernel, not a native MySQL service.GREENPLUM,NEON: historical docs retained, no longer default public capabilities.- Native
MYSQLpilot: the currentmysql.yml,mysql-rm.yml, androles/mysql*manage a fixed native MySQL 8.4 platform with either one node or a three-node single-primary InnoDB Cluster. It remains a PILOT and is not counted among the 10 official modules above. KUBE,VICTORIA,JUPYTER: other pilot modules, currently not open for public use.
5.3 - File Hierarchy
Pigsty FHS
Pigsty’s home directory is located at ~/pigsty by default. The file structure within this directory is as follows:
~/pigsty Source Tree
- app/
- Application template resources
- bin/
- Management and operations scripts
- files/
- victoria/
- Rules and operations scripts
- grafana/
- Grafana dashboards
- postgres/
- PostgreSQL management scripts
- migration/
- Data-migration task definitions
- pki/
- Self-signed CA and certificates
- victoria/
- roles/
- Ansible role implementations
- templates/
- Ansible templates
- vagrant/
- Vagrant sandbox definitions
- terraform/
- Terraform cloud-resource templates
- configure
- ansible.cfg
- pigsty.yml
- *.yml
/infra is a runtime symlink to /data/infra, which keeps observability data and generated configuration together:
CA FHS
Pigsty’s self-signed CA is located in files/pki/ under the Pigsty home directory.
You must keep the CA key file secure: files/pki/ca/ca.key. This key is generated by the ca role during deploy.yml or infra.yml execution.
Nodes managed by Pigsty will have the following certificate files installed:
All infra nodes will have the following certificates:
When your admin node fails, the files/pki directory and pigsty.yml file should be available on the backup admin node. You can use rsync to achieve this:
INFRA FHS
The infra role creates infra_data (default: /data/infra) and creates a symlink /infra -> /data/infra.
/data/infra permissions are root:infra 0771; subdirectories default to *:infra 0750 unless overridden:
This structure is created by: roles/infra/tasks/dir.yml, roles/infra/tasks/victoria.yml, roles/infra/tasks/register.yml, roles/infra/tasks/dns.yml, and roles/infra/tasks/env.yml.
NODE FHS
The node data directory is specified by node_data, defaulting to /data, owned by root:root with mode 0755.
Most core components place their default data directories here. Some pilot modules use fixed paths of their own; native MySQL 8.4 currently uses /var/lib/mysql.
HAProxy
Pigsty starts HAProxy with its own systemd unit and manages the main configuration separately from service fragments:
To append startup arguments in /etc/default/haproxy, use EXTRAOPTS and retain the default -S /run/haproxy-master.sock. The systemd unit already loads configuration with explicit -f arguments, so do not add another -f to EXTRAOPTS.
Victoria FHS
Monitoring config has moved from the legacy /etc/prometheus layout to the /infra runtime layout.
The main template is roles/infra/templates/victoria/prometheus.yml, rendered to /infra/prometheus.yml.
files/victoria/bin/* and files/victoria/rules/* are synced to /infra/bin/ and /infra/rules/, while each module registers FileSD targets under /infra/targets/*.
Pigsty-rendered INFRA units are consistently stored in /etc/systemd/system/, including vmetrics, vlogs, vtraces, vmalert, alertmanager, blackbox_exporter, nginx_exporter, and dnsmasq. Distribution package unit directories are not write targets for these roles.
PostgreSQL FHS
The following parameters and internal variables are related to PostgreSQL directory layout:
pg_dbsu_home: Postgres default user home directory, default:/var/lib/pgsqlpg_bin_dir: Postgres binary directory, default:/usr/pgsql/bin/pg_fs_main: Postgres primary data directory, default:/data/postgrespg_fs_backup: Postgres backup disk mount point, default:/data/backups(optional; can also be a subdirectory on primary disk)pg_data: Internal variable, fixed to the Postgres data-directory symlink/pg/datapg_cluster_dir: Derived variable,{{ pg_fs_main }}/{{ pg_cluster }}-{{ pg_version }}pg_backup_dir: Derived variable,{{ pg_fs_backup }}/{{ pg_cluster }}-{{ pg_version }}
Data File Structure
Binary File Structure
On EL-compatible distributions (using yum), PostgreSQL default installation location is:
Pigsty creates a symlink named /usr/pgsql pointing to the actual version specified by the pg_version parameter, for example:
Therefore, the default pg_bin_dir is /usr/pgsql/bin/, and this path is added to the system PATH environment variable, defined in: /etc/profile.d/pgsql.sh.
On Ubuntu/Debian, the default PostgreSQL Deb package installation location is:
Pigsty-rendered PostgreSQL runtime units are likewise stored in /etc/systemd/system/. They primarily include patroni.service, postgres.service, pgbouncer.service, pg_exporter.service, pgbackrest_exporter.service, pgbouncer_exporter.service, and vip-manager.service when VIP is enabled.
Pgbouncer FHS
Pgbouncer runs under the same user as {{ pg_dbsu }} (default postgres), with configs in /etc/pgbouncer.
pgbouncer.ini: main pool configuration (postgres:postgres 0640)database.txt: pooled database definitions (postgres:postgres 0600)useropts.txt: per-user connection options (postgres:postgres 0600)userlist.txt: password file maintained by/pg/bin/pgb-userpgb_hba.conf: access control file (postgres:postgres 0600)
Object Storage FHS
The MINIO module currently deploys only Silo, while retaining minio_* parameter and directory names for compatibility:
Silo certificates are stored in /home/minio/.minio/certs/. The module name, role parameters, data directory, and FileSD path retain the compatible MINIO / minio_* naming.
Redis FHS
Pigsty manages Redis or Valkey with the same directory layout and instance naming.
Service units call binaries according to redis_type (/bin/* is compatible with /usr/bin/* on most distributions):
For a Redis instance named redis-test-1-6379, the related resources are as follows:
Pigsty-rendered Redis/Valkey instance and exporter units are consistently stored in /etc/systemd/system/, and instance units use Type=notify. Package-provided units may still live in distribution directories, but those are not role write targets.
5.4 - Parameters
This is the parameter navigation page for Pigsty v4.x, without repeating full explanations for each parameter.
For parameter details, please read each module’s param page.
Cross-checked against the current source and parameter reference pages, the 10 official modules expose 373 public parameters. Native MySQL 8.4 remains a pilot module; its 13 public parameters are listed separately and are not included in the official-module total.



















