Following the abandon of Google Analytics and the beginning of umami usage (you can read the details in this post) I encountered in a little trouble: how to make a backup of the umami database, without having sFTP access to Heroku VPS, because of the free plan?

I’ve found a solution that is a bit tricky (compared to a normal backup) but it works.

It requires having Heroku CLI installed, can be done via

brew tap heroku/brew && brew install heroku

then run (replace ‘blog-stats’ with the name of your Heroku app)

heroku pg:backups:capture --app blog-stats

it will take a dozen of seconds and in the end it will display the number of your backup:

heroku pg:backups:capture --app blog-stats 
Starting backup of postgresql-deep-11593... done

Use Ctrl-C at any time to stop monitoring progress; the backup will continue running.
Use heroku pg:backups:info to check progress.
Stop a running backup with heroku pg:backups:cancel.

Backing up DATABASE to b005... done

b005 is the name/number of your backup. But having a backup on a remote server is not very useful if something breaks, (and the Heroku free plan delete the backups after every 2 of them), so in order to download it on your local machine/storage, just write:

heroku pg:backups:url b005 --app blog-stats

remember to change the number of backup ‘b005’ and ‘blog-stats’ to your backup number and app name. It will generate a temporary (60 mins) AWS link with the DB that can be easily downloaded and moved where you prefer.

Or you can download directly to your local folder using: heroku pg:backups:download --app blog-stats

Getting backup from ⬢ blog-stats... done, #5
Downloading latest.dump... ████████████████████████▏  100% 00:00 45.07KB   

That’s all. If you want to check when you’ve done the last backup, the name and size:

heroku pg:backups --app blog-stats
=== Backups
ID    Created at                 Status                               Size     Database
────  ─────────────────────────  ───────────────────────────────────  ───────  ────────
b005  2022-02-02 08:12:27 +0000  Completed 2022-02-02 08:12:37 +0000  45.07KB  DATABASE
b004  2022-02-02 07:03:31 +0000  Completed 2022-02-02 07:03:42 +0000  45.02KB  DATABASE

=== Restores
No restores found. Use heroku pg:backups:restore to restore a backup

=== Copies
ID    Started at                 Status                               Size     From       To
────  ─────────────────────────  ───────────────────────────────────  ───────  ─────────  ───────────
c003  2022-02-01 14:28:33 +0000  Completed 2022-02-01 14:29:29 +0000  44.28KB  From Name  Target Name
c002  2022-01-27 11:53:19 +0000  Completed 2022-01-27 11:53:57 +0000  28.70KB  From Name  Target Name

In order to restore the backup to your Heroku app:

heroku pg:backups:restore b005 --app blog-stats

Or if you want to restore the backup from your local machine, upload it somewhere (I used iCloud link), and write:

heroku pg:backups:restore 'https://www.icloud.com/iclouddrive/01f5jarFwjp8AUG...etcc...etc...' -a blog-stats

 ▸    WARNING: Destructive Action
 ▸    This command will affect the app blog-stats
 ▸    To proceed, type blog-stats or re-run this command with --confirm blog-stats

Hope this will help. For more options and info there’s an article here: Heroku PGBackups