Skip to main content
A volume is a chunk of disk that lives outside any one Frame. Attach it, give it a mount path, and your app sees a normal folder there. Stop, redeploy, or rollback the Frame and the data stays exactly where you left it. Without a volume, a Frame’s disk is temporary: it resets to a clean slate on every deploy. That’s fine for the app’s code, but not for anything you need to keep. A volume is where the stuff that should outlive a deploy goes. A volume attaches to one Frame at a time, so to move data between Frames you detach it from one and attach it to another.
If all you need is a database, you probably don’t need to set up a volume yourself. A managed database comes with its own storage built in.

Create a volume

From the dashboard:
  1. Open any Project and click the Volumes tab (or use Quick actions → New volume).
  2. Pick a name and a size between 1 GiB and 2 TiB (2048 GiB). Your plan may cap it lower.
  3. Hit Create.
The volume shows up in the list immediately and is ready to attach. Via API:
curl -X POST https://shuttle.withnubo.com/v2/projects/<project_id>/volumes \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "space_id": "<space_id>",
    "name": "uploads",
    "size_gb": 20,
    "region": "us-east-01"
  }'

Attach a volume to a Frame

Open the Frame’s sidebar, scroll to the Volumes panel, and pick a volume from the list. Set the mount path your app expects (e.g. /data, /app/uploads, /srv/data) and save. The Frame rolls with the volume mounted on the next deploy.
curl -X POST https://shuttle.withnubo.com/v2/projects/<project_id>/volumes/<volume_id>/attach \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "frame_id": "<frame_id>",
    "mount_path": "/data"
  }'
Mount paths are validated. You can’t mount on a reserved system root or any of its subdirectories: /, /bin, /boot, /dev, /etc, /lib, /proc, /root, /run, /sbin, /sys, /usr, and /var.

Detach a volume

Detaching unmounts the volume from the Frame on the next reconcile. The data stays on the volume, so you can re-attach it later or move it to another Frame.
curl -X POST https://shuttle.withnubo.com/v2/projects/<project_id>/volumes/<volume_id>/detach \
  -H "Authorization: Bearer <your-token>"

Resize a volume

Running low on space? You can grow a volume to a bigger size without losing what’s on it. Resizing only goes up, never down, and the volume must be in the Ready state (not currently provisioning, resizing, detaching, or errored) when you do it. An attached, Ready volume can be resized.
curl -X POST https://shuttle.withnubo.com/v2/projects/<project_id>/volumes/<volume_id>/resize \
  -H "Authorization: Bearer <your-token>" \
  -H "Content-Type: application/json" \
  -d '{
    "size_gb": 50
  }'
The new space is available the next time the Frame rolls. Resizing applies to managed Nubo volumes; volumes on self-hosted agents stay at their original size for now.

Delete a volume

Deleting a volume erases its data. Detach it from every Frame first.
curl -X DELETE https://shuttle.withnubo.com/v2/projects/<project_id>/volumes/<volume_id> \
  -H "Authorization: Bearer <your-token>"

What’s it for

Anything that needs to stick around between deploys:
  • User uploads, generated assets, image caches.
  • A SQLite file or a database you’re running yourself in a Frame. (For Postgres, MySQL, MongoDB, or Redis, a managed database is usually less work.)
  • Long-running queues or job state.
  • Anything you’d normally put on a server’s disk.

Pricing

You pay by the provisioned size of a managed volume for as long as it exists, whether it’s attached or not. A 50 GiB volume costs half what a 100 GiB one does. Detaching does not stop the meter; delete the volume to stop the meter. Your plan caps the max size per volume, the total GiB you can hold, and how many volumes you can have at once. See Plans for the current limits.

Managed Nubo vs self-hosted agents

  • Managed Nubo: volumes are backed by replicated block storage. Provisioned-size billing applies as above.
  • Self-hosted agents: volumes are files on the agent’s own disk, attached as a loopback mount. There’s no extra charge from us, but the data lives on your hardware, so back it up.

Frames

Attach a volume from a Frame’s sidebar

Databases

Managed databases with storage built in

Plans

Volume size and count limits per plan