Skip to main content
Attach durable storage to a project so files survive restarts and redeployments. Without a persistent disk, anything your service writes to the filesystem is lost on every redeploy. The new container starts from a fresh image. Under the hood this uses a volume of type web. Same storage model, managed from the project Configuration tab.
Files written outside the mount path don’t persist. Only writes under the configured mount (e.g. /data) survive. Anything your service writes elsewhere, the working directory, /tmp, the home directory, is gone the moment the container restarts.
Use a persistent disk for:
  • SQLite databases (small apps, single-instance).
  • File uploads stored to disk before being moved to object storage.
  • Cache or state that’s expensive to rebuild on cold start.
  • Self-hosted tools that need a data directory (Plausible, Umami, n8n, WordPress content, and similar).
Do not use the disk as a place to store the whole application install unless you have a strong reason. Your image already provides the app; the disk should hold what users create.

Prerequisites

  • A project on a paid plan that includes persistent disks.
  • The project should be a single-container service. Persistent disks aren’t shared across containers; if you scale beyond one, only one container holds the data.

Enable a persistent disk

  1. Open the project.
  2. Go to Configuration.
  3. Scroll to Persistent disk and toggle it on.
  4. Set:
    • Mount path, the path inside the container to mount the disk at, for example /data.
    • Size, picked from the dropdown.
  5. Save.
The Persistent disk panel under Configuration, showing the toggle on, a mount-path input set to /data, and the size dropdown listing the 10-150

Persistent disk configuration on a project.

The next deployment provisions the volume and mounts it at the path you set.

Choose the mount path carefully

The mount path decides what lives on durable storage and what stays on the fast local disk of the container. Why this matters: persistent disks are durable and host-portable, but they are not as fast as local disk for huge numbers of small reads and writes. If you mount the volume over the full app root (for example /var/www/html for WordPress, or /app for a Node service), every request may pull framework files through storage. That can show up as slow first loads, install wizards timing out, or the proxy reporting that the app is unavailable while PHP or your runtime is still working. Rule of thumb: image = code; volume = user data and state.
Deploying a Docker image with a volume? Prefer the image’s documented data directory, not the image’s install root. See Volumes for more examples.

How persistent disks are stored

Brimble persistent disks (for projects and for sandboxes) use Brimble’s distributed object storage, not a local SSD on the host running your container. Practical consequences:
  • Your data survives host failure. If the host running your project goes down, the platform reschedules onto another host in the region and the volume reattaches. The disk follows the workload.
  • I/O is networked. Expect durable cloud-storage latency, not bare-metal disk speeds. SQLite, uploads, and modest caches are fine. Write-heavy databases belong on a managed database. Apps that load thousands of tiny files per request should keep those files on the image and only put mutable data on the disk.
The same model backs sandbox volumes. Volumes are typed: pick web for projects and sandbox for sandboxes so the volume shows up in the right attach picker.

Disk sizes and pricing

Disks are available in 10 GB steps from 10 GB up to 150 GB. The default is 10 GB. Storage bills at $0.25 per GB per month at the base rate. Some regions carry a small multiplier on top of the base rate; the exact monthly cost is shown next to each size in the dropdown. If you need more than 150 GB, contact support.

Use the disk

Anything your service writes to the mount path persists across deploys, restarts, and resizes.
The mount is empty on first attach. Initialize whatever directory structure your service needs on startup.

Resize a disk

Disks can grow but not shrink.
  1. Open Configuration → Persistent disk.
  2. Pick a larger size.
  3. Save.
The resize happens on the next deployment. The container restarts to pick up the new size; existing data is preserved.

Limits and constraints

  • Size caps at 150 GB per project on standard plans. For larger volumes, contact support.
  • One disk per project. You can’t mount multiple persistent disks at different paths.
  • One container per disk. A persistent disk is a local volume, not a network share. Don’t enable autoscaling on a project that depends on a persistent disk for state; only one container will see the data.
  • Region-bound. A persistent disk lives in the project’s region. Moving the project to a different region requires a fresh disk.
  • Backups are your responsibility. Brimble persists the disk across deployments and host moves but doesn’t snapshot it. For data that must survive disaster, copy critical files to object storage on a schedule.

When not to use a persistent disk

A persistent disk is the wrong choice when:
  • You need scale-out. Multiple containers reading and writing the same dataset want a managed database or object storage, not a local volume.
  • Your data must be backed up automatically. Use a managed database (PostgreSQL, MongoDB, etc.); Brimble snapshots those.
  • Your data is large. Beyond a hundred-ish GB, object storage with a small metadata DB scales better.
For most production apps, the right answer is “managed database for state, object storage for files, no persistent disk.” Persistent disks are best for self-hosted tools, prototypes, and edge cases where local files are genuinely the right model.

Troubleshooting

Mount path doesn’t exist after deploy. The toggle might be off. Re-check that Configuration → Persistent disk is enabled and the path is what you set. Files disappear on deploy anyway. Files written to a path outside the mount don’t persist. Confirm your code writes under the configured mount path (for example /data, not /var/data). App is very slow or times out only with a disk attached. The mount path may cover the whole application tree (for example /var/www/html or /app) so every request pays storage latency for core files. Remount only the data directory (for WordPress, /var/www/html/wp-content), redeploy, and keep the app itself on the image. “Permission denied” writing to the mount. Some images run as a non-root user that doesn’t own the mount. In your Dockerfile, ensure the user has access, for example RUN mkdir -p /data && chown myuser:myuser /data. Resize didn’t take effect. Resizes apply on the next deployment, not in place. Click Redeploy.

Next steps

  • Files, small config and secret files mounted at a path (not writable app data).
  • Volumes, lifecycle, types, and what belongs on a volume.
  • Deploy a database, for state that needs scale-out, backups, and queryability.
  • Deploy from a Docker image, when the image has its own data directory conventions.
  • Builds, for how the runtime container is built and started.
Last modified on August 23, 2026