Bar chart of self-managed PostgreSQL chores timed on a 755 MB database on 31 October 2026: install PostgreSQL 18 66.5 s, install pgBackRest 5.2 s, turn on WAL archiving 2.3 s, full backup 4.2 s, incremental backup 3.7 s, point-in-time restore 14.1 s, restart for a minor update 3.4 s, pg_dump 5.7 s, major upgrade 17 to 18 12.4 s copy and 8.6 s link

Running PostgreSQL yourself on a VPS is cheaper than a managed database, and everyone knows it is "more work". How much more is the part nobody writes down. So we did every routine job on a fresh Ubuntu 24.04 box with a stopwatch: install, backups, a point-in-time restore after a bad DELETE, a minor-version restart, and a major upgrade from 17 to 18. Then we listed what has to happen every month to keep it safe, with the release calendar it follows.

Short version: the commands are fast. On a 755 MB database every chore finished in seconds, the slowest being the install at 66.5 s. The real cost is human: we put it at about 2 to 3 hours a month once it is set up, plus 3 to 5 hours to set it up properly, plus whoever answers when it breaks at night. A managed service sells you those hours.

The calendar you sign up for

PostgreSQL ships a minor release for every supported version at least once a quarter, on the second Thursday of February, May, August and November, with extra releases for urgent security fixes. Each major version gets 5 years of fixes. From the project's roadmap and versioning policy, checked 31 October 2026:

WhatDateWhat you do on your own server
Minor release (all versions)12 November 2026Read the notes, update packages, restart
PostgreSQL 14 end of life12 November 2026Still on 14? Plan a major upgrade now
Minor release11 February 2027Update, restart
Minor release13 May 2027Update, restart
Minor release12 August 2027Update, restart
PostgreSQL 15 end of life11 November 2027Major upgrade
PostgreSQL 18 end of life14 November 2030Major upgrade

That is at least four maintenance restarts a year, a major upgrade at least every five years (most teams move every one or two to get new features), and Ubuntu's own security updates every week in between.

What we timed

Setup: Docker container from the official ubuntu:24.04 image, 2 vCPUs, PostgreSQL 18.6 from the PostgreSQL apt repository (PGDG), pgBackRest 2.60 with zstd compression, a pgbench database at scale 50 (5 million rows, 755 MB). The backup repository was a local folder; on a real server it should be object storage or another machine, which only changes a few lines of configuration (below) and adds upload time. The scripts are short shell files, one command per step.

StepWall timeNotes
Add the PGDG repo and install PostgreSQL 1866.5 sMostly download; the cluster starts in 2.2 s
Install pgBackRest5.2 s
Turn on WAL archiving (needs a restart)2.3 sarchive_mode, archive_command
Create the backup stanza and check archiving0.4 s
Full backup4.2 s770 MB database, 36.5 MB in the repository (pgbench data compresses unusually well)
Incremental backup after 20 s of writes3.7 s37.4 MB stored
Point-in-time restore to just before a DELETE of 2.5 million rows14.1 sStop, restore with --delta, replay WAL, promote; 5,000,000 rows back
Restart (what a minor update costs in downtime)3.4 sConnections drop; apps must reconnect
pg_dump of the database5.7 s15 MB custom-format file
Major upgrade 17.11 to 18.6, pg_upgradecluster copy12.4 sDatabase down for the whole step
Major upgrade 17.11 to 18.6, link mode8.6 sFaster, but the old cluster can't be started again afterwards
Refresh planner statistics after the upgrade2.1 svacuumdb --all --analyze-in-stages

These times grow with the size of the database. Backups and restores scale with data and disk speed; a 50 GB database takes minutes, not seconds, which is why restores need practising before the day you need one. The major upgrade in link mode barely grows with size, because it hard-links data files instead of copying them.

Backups on your own server, step by step

This is the part that decides whether a self-hosted database is safe. With pgBackRest, the minimum that gives you daily backups and point-in-time restore looks like this:

#StepCommand or settingManaged service
1Install pgBackRestapt install pgbackrestDone for you
2Point it at off-server storagerepo1-type=s3, bucket, endpoint, keys in /etc/pgbackrest.confDone for you
3Archive every WAL segmentarchive_mode = on, archive_command = 'pgbackrest --stanza=main archive-push %p', restartDone for you
4Create and check the stanzapgbackrest --stanza=main stanza-create, then checkDone for you
5Schedule backupscron or a systemd timer: weekly --type=full, daily --type=incrDaily, automatic
6Keep a set numberrepo1-retention-full=2 (or by time)Fixed window, e.g. 7 days
7Alert when a backup or archive failsYour monitoring reads pgbackrest info or the exit codeProvider watches it
8Test a restorepgbackrest --stanza=main --delta --type=time --target=... restore on a spare boxRestore button; still worth testing

The configuration we used, with the S3 lines a real server needs:

ini
[global]
repo1-type=s3
repo1-s3-bucket=my-db-backups
repo1-s3-endpoint=s3.example.com
repo1-s3-region=eu-central
repo1-s3-key=...
repo1-s3-key-secret=...
repo1-path=/pgbackrest
repo1-retention-full=2
repo1-cipher-type=aes-256-cbc
repo1-cipher-pass=...
compress-type=zst
process-max=2
start-fast=y

[main]
pg1-path=/var/lib/postgresql/18/main

And the restore we timed at 14.1 s, the one you want to have run at least once before you need it:

bash
sudo pg_ctlcluster 18 main stop
sudo -u postgres pgbackrest --stanza=main --delta --type=time \
  --target='2026-10-31 15:14:23+00' --target-action=promote restore
sudo pg_ctlcluster 18 main start

The monthly work, task by task

Machine time is small, so the table below is about people: how often each job comes up and the hands-on time we would budget for it on one small production database, once it is set up. These are our estimates from doing the steps above, not survey data; adjust for your own speed and risk.

TaskHow oftenOur estimate per monthOn a managed service
Ubuntu security updates (unattended-upgrades on, reboots for kernels)weekly check15 to 20 minProvider
PostgreSQL minor update: read notes, update, restart, check apps reconnect4 a year + urgent ones10 to 15 minProvider, in a maintenance window
Check backups ran and WAL archive keeps upweekly15 to 20 minProvider
Test a restore on a spare servermonthly30 to 45 minOptional (restore button)
Disk space, connections, slow queries, bloatweekly30 minGraphs given; the reading is still yours
Major version upgrade, tested with the app firstevery 1 to 5 years, 2 to 4 h each5 to 20 minUsually a button or a migration
Firewall, TLS certificate, pg_hba.conf, user changesas needed10 minProvider (you add IPs and users)
Totalabout 2 to 3 hoursquery and schema work only

Two things are not in that total. Setup: install, TLS, pg_hba.conf, firewall, backups to object storage with encryption, monitoring and alerts, and a first restore test came to 3 to 5 hours for us, done properly. And availability: a standby with automatic failover on your own servers is a project of its own (replication, a consensus store, fencing, failover drills), not an afternoon. If the database must survive losing a server without you waking up, that alone tends to settle the question.

What a managed service does not do

It does not design your schema, add your indexes, fix slow queries, or stop your app from opening too many connections. Those stay with you either way, which is why they are not in the table.

The money, worked out

Take a small app that needs a database with a couple of GB of RAM, and value your time at $50 an hour:

OptionServer or service / monthYour time / monthAt $50/hTotal / month
DigitalOcean Droplet, 1 vCPU / 2 GB, Postgres yourself$122 to 3 h$100 to $150$112 to $162
DigitalOcean managed PostgreSQL, 1 vCPU / 2 GiB$30.450$0$30.45
tport.cloud server, 4 vCPU / 8 GB, Postgres yourself$7.502 to 3 h$100 to $150$107.50 to $157.50
tport.cloud managed PostgreSQL, 6 vCPU / 12 GB$300$0$30

On DigitalOcean the managed database costs $18.45 a month more than the matching Droplet: that buys back your 2 to 3 hours if your time is worth more than about $6 to $9 an hour. On tport.cloud the gap is $22.50, so the break-even is about $7.50 to $11 an hour. For almost anyone running a business, managed wins on paper for one production database.

Self-hosting still makes sense when the hours are cheap or already paid for: a side project where a day of downtime is fine, a staging or analytics copy, a team that already runs servers and has the backups and alerts in place, or the database sits on the same server as the app to save a network hop and money. The RAM measurements in our sizing article show PostgreSQL fits next to a small app on 1 GB; on our $7.50 server with 8 GB it has room to cache the whole working set of most small apps.

If you go managed with us

tport.cloud's managed PostgreSQL 18 is $30 a month for a single node with 6 vCPU, 12 GB of RAM and 100 GB of NVMe, or $60 for a primary and a hot standby with automatic failover. Daily backups, 7-day point-in-time restore, PgBouncer on port 6432, TLS required, nothing open to the internet until you add your IPs. Every row of the backup table above is done for you. For how that compares with DigitalOcean's tiers and the standby change coming on 30 November 2026, see Managed PostgreSQL: tport.cloud vs DigitalOcean.

Sources

Our own timings, 31 October 2026: Ubuntu 24.04 container, 2 vCPU, PostgreSQL 18.6 and 17.11 from PGDG, pgBackRest 2.60, pgbench scale 50; the monthly hours are our estimates. PostgreSQL: roadmap (minor release dates), versioning policy, pg_upgrade. pgBackRest user guide. DigitalOcean: managed PostgreSQL features (daily backups, 7-day point-in-time restore, weekly maintenance window), managed database pricing and Droplet pricing, checked 30 October 2026. tport.cloud prices from tport.cloud/pricing, Germany.

PostgreSQL 18 with daily backups and 7-day point-in-time restore, 6 vCPU and 12 GB of RAM for $30 a month.

Managed PostgreSQL