Deploy on Juju storage

Charmed PostgreSQL uses the Juju storage abstraction to utilize data volume provided by different clouds while keeping the same UI/UX for end users.

Charmed PostgreSQL 14 supports a single storage: pgdata.

The legacy PostgreSQL charm in track latest/” does not support the Juju storage abstraction.

Check storage details

Check the metadata.yaml for find Juju storage name and tech details:

storage:
  pgdata:
    type: filesystem
    location: /var/snap/charmed-postgresql/common

Charmed PostgreSQL 14 supports single storage pgdata attaching it on juju deploy and mounted inside the Snap common folder /var/snap/charmed-postgresql/common.

Example of 'Juju storage'
> juju deploy postgresql --channel 14/stable

> juju storage
Unit          Storage ID  Type        Size  Status   Message
postgresql/0  pgdata/0    filesystem        pending  

> juju storage
Unit          Storage ID  Type        Pool    Size    Status    Message
postgresql/0  pgdata/0    filesystem  rootfs  97 GiB  attached  

> juju show-storage pgdata/0 
pgdata/0:
  kind: filesystem
  life: alive
  status:
    current: attached
    since: 01 May 2025 18:47:04+02:00
  persistent: false
  attachments:
    units:
      postgresql/0:
        machine: "0"
        location: /var/snap/charmed-postgresql/common
        life: alive

> juju ssh postgresql/0 mount | grep /var/snap/charmed-postgresql/common
/dev/sda1 on /var/snap/charmed-postgresql/common type ext4 (rw,relatime,discard,errors=remount-ro)

Deployment examples

Define the storage size

> juju deploy postgresql --channel 14/stable --storage pgdata=10G

> juju storage
Unit          Storage ID  Type        Pool  Size    Status    Message
postgresql/1  pgdata/1    filesystem  lxd   10 GiB  attached  

Define the storage location

Juju supports wide list of different storage pools:

> juju create-storage-pool mystoragepool lxd

> juju storage-pools | grep mystoragepool
mystoragepool  lxd       

> juju deploy postgresql --channel 14/stable --storage pgdata=5G,mystoragepool

> juju storage
Unit          Storage ID  Type        Pool           Size    Status    Message
postgresql/2  pgdata/2    filesystem  mystoragepool  5 GiB   attached  

Re-deploy detached storage (track 14)

To re-deploy the application with the old Juju storage, it is necessary to provide all charm/database credentials to the new charm or app.

Charmed PostgreSQL 14 uses the Juju action set-password to handle credentials:

# Note old passwords
> juju show-secret --reveal database-peers.postgresql.app

# Find old storage id:
> juju storage

# Re-deploy new app one unit only to set old passwords
> juju deploy postgresql --channel 14/stable -n 1

# Once deployed, set old passwords from old app Juju App secrets
juju run postgresql/leader set-password username=operator password=cpUJnNRJ6Qt2Hgli 
juju run postgresql/leader set-password username=patroni password=0N7pKAutKCstPuvx
juju run postgresql/leader set-password username=raft password=8xSZvTLfyHpglGfI
juju run postgresql/leader set-password username=replication password=5xN9gj9uu5Um3PWB 
juju run postgresql/leader set-password username=rewind password=wuEsPmsdpc6L8qhT 
juju run postgresql/leader set-password username=monitoring password=AgOxXzcRD5iohE6C

# Scale down to zero units byt removing all Juju units
> juju remove-unit postgresql/1 --destroy-storage=yes

# Scale up to one unit and attach the old Juju storage
> juju add-unit postgresql --attach-storage pgdata/x

# If no issues noticed, scale to HA (3 units total)
> juju add-unit postgresql -n 2