Data
Volumes
A volume is a persistent disk for one service. Use it for database files, uploads, or anything that must survive restarts and redeploys.
Add a volume
On the canvas, choose Add, then Volume, and pick the service to mount
it in and a mount path such as /var/lib/postgresql/data. You can also
create a volume without mounting it and attach it later in the service's
Settings → Storage.
Volumes are staged like every change: release the environment to create and mount them.
Rules
- One volume per service. A service mounts at most one volume, at one path, and runs one replica.
- One server. A volume lives on the server where its service first deploys, and the service stays there. Volumes are not replicated.
- Not backed up. Mesh does not snapshot or back up volume data. Back up what you cannot lose.
- Grow, never shrink. You can make a volume larger, but not smaller.
- Restarts stop first. A deployment of a service with a volume stops the old replica before starting the new one, so expect a short interruption.
Sizes by plan
| Plan | Volumes per project | Size per volume | Grow |
|---|---|---|---|
| Trial | 1 | 512 MiB | No |
| Hobby | 10 | Up to 5 GiB (5 GiB default) | Yes |
| Pro | 20 | Up to 4 TiB (50 GiB default) | Yes |
You pay for the space in use, not the provisioned size. See Plans and billing.
Grow a volume
Change the size in the volume's settings. Mesh first tries to grow it while the service runs. If that is not possible, the volume reports that it needs an offline resize: confirm a restart of its service, and Mesh grows the volume while the service is stopped. A plain size change never restarts the service without that confirmation.
Through the API, repeat PATCH /v1/volumes/{volumeId} with the same
size_bytes and allow_offline_resize: true to confirm.
Move a volume
You can request a move to an eligible server in the same region on every plan. The service stops for the full copy and filesystem verification. For supported clean ext4 volumes, Mesh copies allocated data and metadata instead of all provisioned space. Unsupported formats use a full image copy. Mesh keeps the source until it verifies the destination copy. A failed move resumes the service on the source.
Call move_volume through MCP for a preview.
After you confirm the downtime, call it with confirm: true and the preview's target_agent_id.
The public API provides the same operation:
POST /v1/volumes/{volumeId}/move
Content-Type: application/json
{}The response contains the source, the destination, and a downtime notice.
To authorize the move, repeat the request with confirm: true and the returned target_agent_id.
Mesh checks capacity again before it stops the service.
The volume must have one attached service without pending changes or an active rollout.
You can move a volume from a server that is cordoned or under drain.
The destination must have current disk measurements and enough capacity for the volume and its service.
Pro volumes retain their full disk reservation.
Pro volumes move only after an explicit request. Trial and Hobby volumes can also move automatically when their server has insufficient free disk space. Mesh permits one active copy across the fleet.
Delete a volume
Detach the volume from its service first. Deleting a volume asks you to type its name. Its data is destroyed when the grace period ends and cannot be restored. See Deleting and restoring.