PostgreSQL backup and recovery, without unnecessary complexity.

Acrynite is a command-line tool for managing PostgreSQL backup and recovery workflows. It brings together database registration, backup operations, storage configuration, scheduling and restoration.

What Acrynite does

You register PostgreSQL connection profiles and S3 destinations once. Acrynite then creates logical or physical backups, records a manifest for every run, and supports WAL-backed recovery in an isolated Docker container.

Supported database

PostgreSQL

Supported remote storage

S3 & S3-compatible

Restore target

Docker (physical) · registered profile (logical)
# public commands in the current release
acrynite database register | list | show | test-connection
acrynite storage register | list
acrynite backup run | list | show
acrynite schedule create | list
acrynite wal enable | status
acrynite recovery-points list
acrynite restore plan | run

Backup capabilities

Physical backups

Physical backups use PostgreSQL's own pg_basebackup to capture the whole database cluster for physical restoration. They are the base for point-in-time recovery.

  • pg_basebackup must be on your PATH.
  • You need a replication-capable PostgreSQL role and server-level access. An application role normally does not have these rights.
  • pg_hba.conf, wal_level, max_wal_senders and max_replication_slots must be compatible with physical backup and replication.
$acrynite backup run --database production --type physical --storage s3-prod-backups

Logical backups

Logical backups use pg_dump to export a database. They suit portability, migration and restoring into another environment. Logical backups are imported through psql into a registered target profile.

A logical backup is a snapshot of one database at the time of the dump. It does not provide the same recovery characteristics as a physical base backup with WAL replay, and it cannot be rolled forward to a point in time.

$acrynite backup run --database production --type logical --path ./backups/production

Manifests and the backup catalog

Every run gets a unique ID such as bkp_20261023_030000_a1b2. Its manifest records the type, status, timestamps, artifact size, actual destination, PostgreSQL version and cluster identifier when available, and the associated WAL destination for physical backups. Failed runs are catalogued with their error.

WAL archiving and point-in-time recovery

WAL files are PostgreSQL's write-ahead log: a record of every change, written before the change reaches the data files. Archiving those files preserves the history of changes made after a base backup.

Point-in-time recovery restores a compatible physical base backup, then replays archived WAL up to a target time. To recover to a given moment you need the base backup, every WAL segment from that backup up to the target, and a compatible PostgreSQL version.

What Acrynite automates today:

  • wal enable configures archive_command to call Acrynite's internal WAL uploader. It is set once per cluster, not per schedule.
  • wal status reports the archiving configuration.
  • recovery-points list shows known physical base backups and their configured WAL destination.
  • restore run --target-time downloads the base backup and WAL archive and starts recovery.

A configured WAL destination is not proof of a gap-free WAL chain. PostgreSQL validates WAL continuity during recovery and stops safely if it finds a gap or an incompatible timeline. Acrynite makes no recovery point or recovery time guarantee.

The Acrynite executable and its configuration must be available to the PostgreSQL server process. PostgreSQL may need a restart to activate archive_mode, and Acrynite reports that. Many managed PostgreSQL services do not permit ALTER SYSTEM or custom archive commands.

Storage

Available

S3 and S3-compatible

Registered storage profiles with a bucket, optional prefix, region and optional custom endpoint.

Available

Local directory

A one-off --path destination for a single run. It is not a registered provider.

$acrynite storage register s3-prod-backups --provider s3 --bucket company-backups --prefix acrynite/production --region eu-west-1
  • Credentials. The preferred method is the normal AWS credential chain: environment, shared profile or IAM role. Access and secret keys can be supplied at registration for local setups.
  • Association. Each backup run names its destination with --storage or --path, which are mutually exclusive. The manifest records where the artifact actually went.
  • Discoverability. A manifest is stored beside each backup artifact, so completed runs stay discoverable after a schedule changes.
  • Retention. Acrynite does not delete backup history. Use bucket lifecycle rules to manage retention, and keep base backups together with their matching WAL.

Automation

Schedules run backups on a fixed interval using Go duration syntax such as 6h, 24h or 168h. Creating a schedule starts Acrynite's scheduler daemon, which runs the same validated backup run flow when jobs are due.

$acrynite schedule create production-daily --database production --type physical --interval 24h --storage s3-prod-backups
$acrynite schedule list --status enabled

Each occurrence gets an independent backup ID and manifest. Schedules never own or delete earlier backup history.

Recovery is part of the backup process.

01

Select the backup

Pass a backup ID, use --latest, or let Acrynite choose a completed physical backup for the database.

02

Choose the target

Recover as far as available WAL permits, or to a UTC --target-time.

03

Preview the plan

restore plan shows what will happen before any artifact moves or Docker starts.

04

Retrieve and restore

Acrynite downloads the base backup and recorded WAL archive into a new local directory, creates recovery.signal and starts an isolated container.

05

Verify the data

Connect to the recovered server and check that it holds the data you expect.

$acrynite restore plan --database production --target-time "2026-10-23T14:30:00Z" --target docker
$acrynite restore run --backup-id bkp_20261022_030000_c3d4 --target docker --target-time "2026-10-23T14:30:00Z" --publish-port 55432

Docker restore today

  • Physical restores target Docker only. Docker must be running.
  • Acrynite uses postgres:<major> when the source version is known.
  • It never overwrites the source cluster and publishes no port unless you ask. --publish-port binds to 127.0.0.1 only.
  • Logical restores go into a registered target profile, and Acrynite rejects a restore into the backup's own source profile.
Planned

Restore targets other than Docker are future work and are not part of the current release.

Technical architecture

Everything on the left of the storage box runs in your environment. The only external service that receives backup files is the S3 or S3-compatible bucket you configure.

Backup · your environment → your storage
PostgreSQLyour server
Acrynite CLIpg_dump / pg_basebackup
Your storageS3 bucket · local dir
Restore · your storage → isolated recovery
Your storagebase + WAL
restore runlocal recovery dir
Dockerpostgres:<major>

See one full cycle.

Backup, WAL archiving and restore, traced message by message.

PostgreSQLproductionAcrynite CLIruns in your environmentS3S3 / S3-compatibles3-prod-backupsLocal storage--path · recovery dirtest-connection
message filebackup
event logstreaming
  • waiting for first event…