Volumes

A volume is a disk mounted into your app that survives deploys, restarts and crashes. Without one, your app's filesystem is scratch space: anything it writes is gone after the next deploy. Use a volume for user uploads, SQLite files, an n8n instance's workflows, an AI agent's memory, or anything else your app keeps as files.

Each app can have one volume, on any paid plan. An app with a volume can't move to the Free plan until the volume is deleted.

Add a volume

Open the app and go to the Volume tab, or click the disk card under the app on your project page. Choose:

  • Mount path, where the volume appears inside your app. /data unless you change it.
  • Limit, from 1 GB to 50 GB (10 GB unless you change it). This is the size of the volume and what you pay for.
  • Snapshots, how often they're taken and how long they're kept. Daily, kept 7 days, unless you change it.

We redeploy the app to mount the volume, unless you untick Redeploy now, in which case it's mounted on your next deploy.

From the CLI, inside a linked project or with --app <id>:

velixir volume create --path /data --limit 10

Add --snapshots weekly or --snapshots off, --keep 30 to keep snapshots longer, or --no-redeploy to mount it on your next deploy instead.

Use it from your app

We set VELIXIR_VOLUME_PATH to the mount path on every app with a volume. Read it rather than hard-coding the path, and fall back to a local folder when it isn't set, so the same code runs on your machine:

// Node.js
const dataDir = process.env.VELIXIR_VOLUME_PATH ?? './data';

// .NET
var dataDir = Environment.GetEnvironmentVariable("VELIXIR_VOLUME_PATH") ?? "data";

The volume starts empty, and it hides anything your build put at the same path. If your app ships default files there, copy them across on first start instead.

A mount path must be absolute and can only use letters, numbers, dots, dashes, underscores and slashes. Paths the system or your app's code need are refused: /, /app, /tmp, /var, /home and /root themselves, and anything under /proc, /sys, /dev, /etc, /bin, /sbin, /usr, /lib, /boot, /run or /nix. Something under them, like /app/data or /home/node/.n8n, is fine.

One replica, and deploys restart

A volume lives on the disk of one server, so an app with a volume runs as a single replica on that server. Adding a volume sets the app's scaling to one replica, minimum and maximum, and autoscaling can't add more.

Deploys work differently too. Normally a new version starts alongside the old one and traffic moves over when it's ready. With a volume, the old version stops first so the new one can take over the disk, so expect a few seconds of downtime on each deploy.

High-availability apps can't have a volume, because a warm standby on another server couldn't reach the disk. Turn HA off first (see Scaling and HA).

Pricing

€0.15 per GB a month for the limit you set, billed hourly like everything else. A 10 GB volume is €1.50 a month. The space is set aside for you on the server whether you fill it or not.

If the volume holds more than its limit (see below), you're billed for what it holds, rounded up to a whole GB, until it's back under.

Snapshots are billed separately, at €0.05 per GB a month on the compressed size actually held. There's more on that under Snapshots.

Change the limit

Change it on the Volume tab, or:

velixir volume limit 20

It takes effect straight away, with no redeploy. You can raise it to 50 GB, or lower it to anything above what the volume already holds. If the server holding your volume doesn't have room for a bigger limit, we'll tell you; open a support ticket and we'll move it.

When it fills up

We measure how much each volume holds every ten minutes. The Volume tab, the disk card and velixir volume show the latest reading. The team owner gets an email:

  • at 80% and again at 90% of the limit;
  • at 100%, saying when the app will be stopped, which is 24 hours later if the volume is still at or over its limit.

To keep it running, raise the limit or delete files. Usage has to drop below 75% before the 80% and 90% emails are sent again.

If the app is stopped, nothing is deleted. It starts again by itself at the next reading once the volume is back under its limit. To get there you can:

  • raise the limit, if there's room under 50 GB;
  • start the app for a two-hour clean-up (the button on the Volume tab, or velixir volume cleanup) and delete files. If it's still over when the two hours are up, it stops again;
  • restore an older, smaller snapshot.

While an app is stopped for its volume, deploys and redeploys are refused, so nothing restarts it by accident.

The 50 GB maximum

50 GB is the most any volume can hold. Volumes share each server's disk with other customers' apps, so whatever your limit:

  • past 50 GB, we email you and snapshots pause, because they'd be too big to take;
  • past 60 GB, the app is stopped straight away, with no 24-hour grace.

Snapshots

A snapshot is a compressed copy of everything on the volume, stored in object storage away from the server. Choose how often they're taken and how long they're kept on the Volume tab:

  • Frequency: daily (at about 02:30 UTC), weekly, or off.
  • Keep for: 7, 14, 30 or 90 days. Older snapshots are deleted automatically.
velixir volume snapshots --frequency weekly --keep 30
velixir volume snapshots
velixir volume snapshot

The last two list your snapshots and take one now (Snapshot now on the Volume tab does the same). A snapshot can only be taken once the volume has been mounted by a deploy.

Snapshots cost €0.05 per GB a month on the compressed size held, so what you pay depends on how compressible your files are, how often you take them, and how long you keep them. With snapshots off, you pay nothing for them.

Snapshots are taken while your app is running. A file your app is writing at that moment can be copied half-written, which is harmless for uploads and other files written once, but can corrupt a database file. Keep your data in managed Postgres, which has proper point-in-time backups, and use the volume for files.

Restore a snapshot

On the Volume tab, pick a snapshot and Restore, or:

velixir volume restore snap-20261006-023000.tar.gz

The app stops, everything on the volume is replaced with the snapshot, and the app starts again. Anything written since the snapshot is lost, so take a fresh snapshot first if you might want it back. An app that was asleep, paused for billing, or stopped for its volume stays stopped after the restore.

Delete a volume

Delete volume on the Volume tab, or velixir volume delete. The app redeploys without it, and the data on it is gone. Billing for the volume stops straight away. Deleting the app deletes its volume too.

Its snapshots are kept, free, for another 7 days, then deleted. If you deleted a volume by mistake, open a support ticket within that week and we can bring it back.

Templates

Some templates come with a volume: n8n, Hermes Agent and OpenClaw each ask for a 10 GB volume at /data. It's ticked when you deploy them on a paid plan, and you can untick it. On the Free plan they deploy without one.

If you write your own template, add "volume": { "mountPath": "/data", "limitGb": 10 } to its velixir.json.

API

Everything above is in the API, under /api/v1/apps/{id}/volume: GET to read it, POST to create, PATCH to change the limit or snapshot policy, DELETE to remove it, plus /snapshots, /restore and /cleanup. See the API reference.

What volumes aren't for

  • Databases. Use managed Postgres. A volume's snapshots can't promise a consistent copy of a database file.
  • More than one replica. One volume, one server, one replica.
  • Sharing files between apps. A volume belongs to one app. To share, have one app serve the files, or use external object storage.
  • The Free plan. Free apps sleep when idle, which is no place to keep data.
  • More than 50 GB. Use external object storage.