Skip to main content

A CLI tool to manage PostgreSQL databases running in separate Docker containers on top of ZFS

Project description

DBMan

DBMan is a CLI tool to manage PostgreSQL databases running in separate Docker containers. The content of the databases is obtained from pg_dumps of production databases.

It assigns each database to a unique ZFS dataset inside a predefined ZFS dataset. Database metadata is stored in ZFS properties. You can snapshot datasets, restore from snapshots, and clone or export/import databases between hosts.

Configuration

DBMan uses environment variables for configuration. Copy .env.example to .env and modify the values as needed:

# ZFS configuration
DBMAN_ZFS_DATASET=big/docker-postgres
DBMAN_ZFS_MOUNT_POINT=/mnt/big/docker-postgres
DBMAN_ZFS_COMPRESSION=lz4  # Default compression algorithm for new databases

# Docker configuration
DBMAN_DOCKER_IMAGE=postgres:latest

# PostgreSQL configuration
DBMAN_POSTGRES_USER=postgres
DBMAN_POSTGRES_PASSWORD=postgres

You can also override the ZFS compression algorithm using the -c or --compression command line option:

uv run dbman.py -c zstd create mydb dump.sql

Installation

  1. You need uv to run dbman. More info about installing it can be found here https://docs.astral.sh/uv/getting-started/installation/

  2. Copy .env.example to .env and configure your environment variables.

  3. Test it:

uv run dbman.py

Usage

The tool can be used to:

  • create new databases from pg_dumps - it will automatically create a new Docker container with the data from the dump. It will allow naming the container and the database. It will automatically assign a port to the container.

    # Create a database with default compression (inherited from parent ZFS dataset)
    uv run dbman.py create mydb dump.sql
    # or using the short command
    uv run dbman.py c mydb dump.sql
    
    # Create a database with specific compression
    uv run dbman.py create -c zstd mydb dump.sql
    # or using the short command
    uv run dbman.py c -c zstd mydb dump.sql
    
  • list all databases and their statuses

    uv run dbman.py list
    # or using the short command
    uv run dbman.py ls
    
  • create a snapshot of a database

    uv run dbman.py snapshot mydb mysnapshot
    # or using the short command
    uv run dbman.py snap mydb mysnapshot
    
  • restore a database from a snapshot

    uv run dbman.py restore mydb mysnapshot
    # or using the short command
    uv run dbman.py rest mydb mysnapshot
    
  • list all snapshots of a database

    uv run dbman.py list-snapshots mydb
    # or using the short command
    uv run dbman.py lss mydb
    
  • start a subshell with database environment variables

    uv run dbman.py shell mydb
    # or using the short command
    uv run dbman.py sh mydb
    
  • print database environment variables

    # Print variables
    uv run dbman.py env mydb
    # or using the short command
    uv run dbman.py e mydb
    
    # Export variables to the current shell
    eval $(uv run dbman.py env --export mydb)
    
    # Unset variables from the current shell
    eval $(uv run dbman.py env --clean mydb)
    
  • destroy a database

    uv run dbman.py destroy mydb
    # or using the short command
    uv run dbman.py del mydb
    
  • start, stop, or restart a database

    uv run dbman.py start mydb
    uv run dbman.py stop mydb
    uv run dbman.py restart mydb
    
  • clone a database from a snapshot

    uv run dbman.py clone mydb mysnapshot newdb
    
  • export a database to a ZFS send file (for transport between hosts)

    uv run dbman.py export mydb output.zfs
    # or: uv run dbman.py exp mydb -s snapshotname output.zfs
    
  • import a database from a ZFS send file

    uv run dbman.py import output.zfs newdb
    # or: uv run dbman.py imp output.zfs
    
  • list orphaned mountpoints (cleanup)

    uv run dbman.py cleanup
    
  • list or delete databases older than a given number of days

    uv run dbman.py delete_older_than 30
    uv run dbman.py delete_older_than 30 --do-it
    # or: uv run dbman.py dot 30
    

For detailed usage information, run:

uv run dbman.py --help

Note

This tool was also used as a proof-of-concept in creating code by using AI. I started with a docstring in dbman.py and asked Cursor to create an implementation for me. It created a functional ~250 lines of code which mostly did what I wanted. When I tweaked and improved it, I also extensively used AI to do the modifications, rather than coding it myself.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

postgres_dbman-0.1.2.tar.gz (19.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

postgres_dbman-0.1.2-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file postgres_dbman-0.1.2.tar.gz.

File metadata

  • Download URL: postgres_dbman-0.1.2.tar.gz
  • Upload date:
  • Size: 19.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.3

File hashes

Hashes for postgres_dbman-0.1.2.tar.gz
Algorithm Hash digest
SHA256 99dd91804b99c27b00950216aafba633480fd95d87ebda9165f5be1a197a0f1e
MD5 3c5b68b42da22f0497ad1a1cef5e7cd0
BLAKE2b-256 06d6d2de72b06baa3c300d9167e4c8d8529b0280a61737323d539f06152b0cd7

See more details on using hashes here.

File details

Details for the file postgres_dbman-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for postgres_dbman-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 c6666aa738bf9fad85c9e6f57fd4eb7d0e061d825c4cae35be9d526a13dedf6e
MD5 6f3617c353e9db8176c882b533e6131a
BLAKE2b-256 a3167174a72c47daa4ff4ee5cf8d918cb69b9b7b58c983c08eba9c5021e25988

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page