VPS Snaps

Database Backups

Your database, dumped and gone by 02:01

Point a job at PostgreSQL, MySQL, MariaDB or MongoDB and VPS Snaps runs the dump over SSH on the schedule you set — compressed on your machine, checksummed in flight, and written into a bucket you own.

Back up your first server free, forever. No credit card required.

We only use your email to create your account. See our Privacy Policy.

The exact command we run

No wrapper, no fork, no custom dump format. VPS Snaps builds a one-line shell command from the fields you filled in and runs it as your SSH user — the same command you would type yourself.

PostgreSQL

pg_dump

pg_dump -h HOST -p 5432 -U USER DBNAME | gzip

Plain-SQL format. pg_dump opens a repeatable-read snapshot for the length of the run, so the dump is internally consistent even while writes continue around it.

MySQL

mysqldump

mysqldump -h HOST -P 3306 -u USER -pPASSWORD DBNAME | gzip

Default flags — no --single-transaction. Each table is dumped consistently, but a busy InnoDB database is not frozen at a single instant across all of them.

MariaDB

mysqldump

mysqldump -h HOST -P 3306 -u USER -pPASSWORD DBNAME | gzip

The same invocation. On current MariaDB builds mysqldump is the mariadb-dump binary under its compatibility name, so nothing about the job changes.

MongoDB

mongodump

mongodump --host HOST --port 27017 -u USER -p PASSWORD --db DBNAME --archive --gzip

No pipe: mongodump compresses and writes the archive itself, so the exit status is its own rather than gzip's. The artifact is a BSON container named .archive.gz, not SQL — restore it with mongorestore. mongodump ships in mongodb-database-tools, a separate package, so a server running MongoDB often does not already have it.

One database per job, one file per run

Each run produces a single object named for the database and the moment it started — myapp-2026-09-03T02-00-14-118Z.sql.gz (a MongoDB job produces .archive.gz instead, because what is in it is not SQL). Backing up four databases on one server means four jobs, which is the point: they get their own schedules, their own retention, and their own failure alerts.

Nothing is staged. Nothing is kept.

The most common way a database backup leaks is a forgotten dump file sitting world-readable in /tmp. There is nothing to forget here, because no file is ever written.

01

The dump goes to stdout, not to disk. pg_dump writes into a pipe, gzip compresses it in that same pipe, and the compressed stream travels back over the SSH connection the job already opened. Your server never allocates space for the dump.

02

Our worker pipes it onward, in memory, as it arrives. Those bytes are hashed and fed straight into a multipart upload to your bucket. Nothing is written to disk on our side and nothing is retained once the upload finishes — what we store about a run is the object key, the byte count and the checksum.

03

Or cut us out of the path entirely. Run the identical job through the Agent and the dump and the upload both happen inside your own network. We send the instruction; the data never touches us.

The bucket is yours — Backblaze B2, Wasabi, Cloudflare R2, plain S3 or anything S3-compatible. You issue the keys, you set the policy, and you can revoke us in one click without asking anybody.

What a logical dump is, and what it is not

A .sql.gz is not a filesystem image and not a replication stream. Knowing the difference before an outage is worth more than any feature on this page.

In the file

  • Schema and data for the one database you named. On the SQL engines that is tables, indexes, constraints, views, sequences, triggers and stored routines written out as SQL statements; on MongoDB it is the collections, their documents and their indexes in a BSON archive.
  • A file that restores onto any host running the same engine. Different server, different provider, different cloud: it is text, gzipped.
  • Compression applied on your machine, before anything crosses the wire — so the compressed size is what you pay to transfer and to store.
  • An MD5 checksum and an exact byte count, computed as the stream passes and recorded against the run.

Not in the file

  • Cluster-level objects. pg_dump exports one database; roles, tablespaces and other globals live above it. Recreate your roles before you restore, or the GRANT statements will fail.
  • Point-in-time recovery. A dump is the state at the moment it ran, not a WAL or binlog stream. Your worst-case data loss is one schedule interval.
  • Anything outside the database. Uploaded files, /var/www, nginx config and TLS certs are not in a dump — pair this with a file backup job for those.
  • Cross-table consistency on MySQL and MariaDB under load, and cross-collection consistency on MongoDB. If that matters, dump from a replica or pick a quiet hour.

Restoring is three commands

The test of a backup product is the hour you actually need it. Here is the whole procedure — no dashboard required, no export step, nothing to unlock.

01

Pull the object out of your bucket

The run detail page shows the exact key. Fetch it with whatever S3 client you already use — the AWS CLI, rclone, s3cmd, mc. No VPS Snaps account is required to read your own bucket.

aws s3 cp s3://acme-backups/8f3k2m71/myapp-2026-09-03T02-00-14-118Z.sql.gz .
02

Check it is the file you think it is

Every run stores the MD5 that was computed while the bytes were in flight. Hash the downloaded file and compare — if they match, what you have is byte-for-byte what your server produced.

md5sum myapp-2026-09-03T02-00-14-118Z.sql.gz
03

Pipe it back into the engine

There is no proprietary container, no index to rebuild and no restore agent to install. It is gzipped SQL, so the restore is a single pipe — and it stays that way whether or not VPS Snaps is still around.

gunzip -c myapp-2026-09-03T02-00-14-118Z.sql.gz | psql -U postgres -d myapp

For MySQL and MariaDB the last step is gunzip -c dump.sql.gz | mysql -u root -p myapp, and for MongoDB it is mongorestore --gzip --archive=dump.archive.gz --drop. Restore into a scratch database first and diff a row count or two — a backup you have never restored is a hypothesis, not a backup.

Postgres on a platform with no server to log into

Railway, Render and Coolify hand you a database rather than a machine, so there is nothing to SSH into and run pg_dump on. Each is connected with its own credential, and where the dump executes differs — which is worth knowing before you pick one.

Railway

Connect with
An account or workspace token from Railway → Account Settings → Tokens.
Where the dump runs
pg_dump runs on our infrastructure and is streamed to your bucket as it is produced — never written to a disk here, never retained.
Worth knowing
Postgres only, and the database needs public networking switched on. Railway's DATABASE_URL points at .railway.internal, which resolves only inside their network, so the public proxy URL is what a backup can actually reach. A project token will not work — those authenticate with a different header.

Render

Connect with
An API key from Render → Account Settings → API Keys.
Where the dump runs
Same path as Railway: the dump runs here and streams straight through to your storage, holding nothing.
Worth knowing
Postgres only, and the database must accept external connections. Render can restrict those to an IP allowlist under Access Control, which is the setting that otherwise turns a valid key into a run that fails at connect.

Coolify

Connect with
Your Coolify URL and an API token with the read:sensitive ability — without it Coolify redacts database passwords and the dump cannot authenticate.
Where the dump runs
On your own Coolify host. The API is used only to find the container and its credentials; the dump itself runs there over SSH via docker exec, so your data never passes through us.
Worth knowing
Postgres only, and the machine Coolify runs on has to be added under Servers with SSH access — that host is where the dump executes. Running pg_dump inside the database's own container also means the client version always matches the server.

Railway and Render are the only case anywhere in VPS Snaps where your backup data passes through our infrastructure, and it is because those platforms give you nowhere else to run the export. It is streamed rather than stored — never written to a disk here and never retained — and it is set out explicitly in section 4 of the DPA rather than buried in a general clause. Every other job type, Coolify included, writes straight from your infrastructure to your storage.

FAQs

Can’t find the answer you’re looking for? Reach out to our support team.

Can I back up a managed database, not just one running on the server?

Yes. The job has its own database host field, separate from the SSH host. Point the SSH connection at any server you have already added, then set the database host to your managed endpoint — the dump runs on that server and connects outward. Two requirements: the server must be able to reach the endpoint on its port, and the client binary must be installed there, at a version equal to or newer than the database being dumped.

How large can the database be?

There is no size limit in VPS Snaps. The dump is never staged as a file: pg_dump or mysqldump writes to stdout, gzip compresses it in the pipe, and those bytes are consumed by a multipart upload as fast as they arrive. Peak memory is bounded by the upload's part queue — tens of megabytes — whether the dump is 200 MB or 200 GB. What grows with size is the wall-clock run time, and on Postgres the length of the snapshot the dump holds open.

Where do my database credentials actually live?

The database password, the SSH key or password, and your storage access keys are each sealed with AES-256-GCM before they are written to our database. They are decrypted in the worker at the moment a run starts and handed to the dump process. Nothing is written to a file on your server, and a non-interactive SSH command does not land in that user's shell history.

What happens when a run fails?

The dump command's exit code and its stderr are captured and stored on the run, so the failure tells you what the database said rather than just that something went wrong. The multipart upload makes a best-effort attempt to abort rather than commit — that catches the common case, though a failure right at the end of a very fast dump can occasionally land a partial object before the abort reaches it, which is why the run is still marked failed either way rather than trusted on exit code alone. Notifications go out on email, Slack, Microsoft Teams, Google Chat and Discord.

Do old dumps get deleted from my bucket automatically?

No. The retention setting controls how long VPS Snaps keeps run history. The .sql.gz objects themselves stay in your bucket until you remove them — nothing in a backup run deletes from your storage. If you want them expiring on a timer, an S3 lifecycle rule on the prefix does exactly that, and it keeps the delete decision on your side of the line.

Is MongoDB different from the others?

In two ways worth knowing before you set one up. First, the tooling: mongodump and mongorestore live in mongodb-database-tools, which is packaged separately from the MongoDB server, so a machine running MongoDB frequently does not have them — a backup job checks for mongodump before it runs, and restore preflight checks for mongorestore on the target, so a missing package is the reason you are given rather than an empty archive. Second, the shape of a restore: mongorestore is run with --drop, so each collection in the archive replaces the one on the target and a collection created since the backup is left alone. Before anything is dropped the same command is run with --dryRun, which reads the whole archive and authenticates against the target while writing nothing — a truncated or corrupt archive fails there rather than halfway through.

What is the authentication database field on a MongoDB job?

Where your user is defined, which is usually not the database being backed up. If the user was created in admin and granted rights elsewhere — the common setup — put admin there. If it was created in the database you are backing up, leave it blank and mongodump authenticates against that database, which is its default. Getting it wrong looks exactly like a wrong password, which is why it is a field rather than an assumption.

My database is not reachable from the internet. Now what?

Run the same job through the Agent instead of over SSH. The Agent is a Docker container you run inside your own network; it holds an outbound WebSocket to us, so nothing needs to be exposed inbound. It performs the dump locally and uploads to your bucket itself — the data never transits our infrastructure at all.

Powerful features to give you peace of mind

Rest easy knowing your data and your reputation are safe.

Bring your own storage
Backups land in your own S3-compatible bucket — Backblaze B2, Wasabi, Cloudflare R2, or plain S3. You hold the keys and the data.
Snapshots stay with your provider
Provider snapshots are created through the provider's own API and never leave your account. We store the snapshot ID, not the image.
Seven providers, one dashboard
DigitalOcean, Hetzner, Vultr, Linode, AWS EC2, Google Compute Engine and Microsoft Azure — scheduled and reviewed from the same place.
Schedules that fit your traffic
Hourly, daily, weekly, monthly, or a fixed interval in minutes — anchored to your timezone, so a 02:00 job stays at 02:00 across a DST change.
Retention that prunes itself
Set how many days to keep. Older snapshots and archives are cleaned up after each successful run, so storage bills stay flat.
Step-by-step run logs
Every run records what it did, in order, with warnings and errors kept in place — so a failure tells you which step broke.
Complete run history
Status, duration, byte size, and what triggered each run, kept per job. Proof the backup ran, long after the night it ran.
Checksummed on upload
Every archive is hashed as it streams to your bucket and the checksum is stored with the run, so you can verify what landed.
Run on demand
Trigger any job by hand before a migration or a risky deploy, without touching its schedule or its retention window.
Alerts on five channels
Email plus Slack, Microsoft Teams, Google Chat, and Discord — on success, on failure, and on a job that missed its schedule entirely.
Encrypted credentials
SSH keys, database passwords, and storage secrets are sealed with AES-256-GCM before they touch the database.
Team access with roles
Invite your team into a shared workspace as owner, admin, or member, so backups outlive whoever set them up.
View all features
Ryan Patel
I wanted reliable backups without building and maintaining another internal system. With VPS Snaps, our production database and application files are backed up automatically to storage we control, and retention is handled for us. It's one less piece of infrastructure I have to think about.
Ryan PatelSaaS Founder

Schedule your first dump tonight.

Add a server, name a database, pick an hour. The first run tells you whether your credentials, your client binaries and your bucket policy all actually work — which is a better thing to learn on a Tuesday than during an incident.

No credit card required. Cancel anytime.