Skip to main content

Volumes

Volumes provide persistent storage for your containerized applications. Data stored in volumes persists even when containers are restarted or redeployed.

What are Volumes?

Volumes are storage units that can be mounted into your containers. Unlike container filesystems, which are temporary, volumes preserve data across container lifecycles.

When to Use Volumes

Use volumes for:

  • Database storage: PostgreSQL, MySQL, MongoDB data
  • User uploads: Files uploaded by users
  • Application data: Persistent application state
  • Logs: Application and access logs
  • Shared data: Data shared between containers

Volume Types

Block Volumes

Block volumes behave like raw block devices with low-latency access. They can be mounted to one application at a time.

Use cases

  • Databases requiring consistent IOPS (PostgreSQL, MySQL, MongoDB)
  • Caches requiring warm storage (Valkey, Redis, Memcached)
  • High-performance workloads that manage files locally

NFS Volumes (Coming soon)

Network File System volumes provide shared, network-attached storage that multiple containers can mount simultaneously. Support for NFS is planned but not yet available; monitor release notes for availability.

Use cases

  • Collaborative applications needing shared read/write access
  • Media processing pipelines sharing large asset libraries
  • Legacy applications expecting a shared filesystem

Volumes Mount options

Available to all Applications

Volumes that persist data indefinitely.

Use Cases:

  • Production databases
  • User-generated content
  • Application state

Deleted with Applications

Volumes automatically deleted when the application is removed.

Use Cases:

  • Development environments
  • Caching
  • Temporary processing

Creating a Volume

Step 1: Navigate to Volumes

  1. Go to Attachments > Volumes
  2. Click "Create Volume"

Step 2: Configure Volume

Name

Unique identifier for the volume:

postgres-data
user-uploads
app-cache

Size

Storage capacity in GB:

Small: 1-10 GB
Medium: 10-50 GB
Large: 50-100+ GB
tip

Start with a smaller size and expand as needed.

Volume Type

  • Persistent: Data preserved permanently
  • Temporary: Deleted with application

Step 3: Save Volume

Click "Create Volume" to provision the storage.

Attaching Volumes to Applications

During Application Creation

  1. In the application form, find "Volumes" section
  2. Click "Add Volume"
  3. Select existing volume or create new
  4. Specify Mount Path

For Existing Applications

  1. Edit the application
  2. Navigate to "Volumes" section
  3. Attach volume and set mount path
  4. Redeploy application

Mount Paths

The mount path determines where the volume appears inside the container.

Common Mount Paths

Databases

PostgreSQL: /var/lib/postgresql/data
MySQL: /var/lib/mysql
MongoDB: /data/db
Redis: /data

Web Applications

Uploads: /app/uploads
Static files: /app/public
Data: /app/data

Logs

Application logs: /var/log/app
Access logs: /var/log/nginx

Best Practices

  • ✅ Use absolute paths (start with /)
  • ✅ Match application's expected paths
  • ✅ Document mount paths in application description
  • ❌ Don't mount to system directories (/etc, /bin, /usr)
  • ❌ Don't overlap mount paths

Volume Management

Viewing Volume Details

Click on a volume to see:

  • Size: Current and maximum capacity
  • Usage: How much space is used
  • Attached Applications: Which apps use this volume
  • Created: When the volume was created
  • Type: Persistent or temporary

Expanding Volumes

To increase volume size:

  1. Navigate to volume details
  2. Click "Expand Volume"
  3. Enter new size (must be larger than current)
  4. Confirm expansion
caution

Expanding a volume may require restarting attached applications.

Deleting Volumes

To delete a volume:

  1. Detach from all applications first
  2. Navigate to volume details
  3. Click "Delete Volume"
  4. Confirm deletion
danger

Deleting a volume permanently removes all data. This action cannot be undone!

Performance Considerations

Volume Size and Performance

  • Larger volumes may have better IOPS (Input/Output Operations Per Second)
  • Over-provisioning slightly can improve performance
  • Monitor usage and adjust accordingly

Monitoring Volumes

Storage Usage

Track volume utilization:

  • Used Space: Current data size
  • Available Space: Remaining capacity
  • Usage Percentage: Used/Total ratio

Common Patterns

Database Volume

Name: postgres-production
Size: 100 GB
Type: Persistent
Mount Path: /var/lib/postgresql/data
Backup: Daily, 30 days retention

File Upload Volume

Name: user-uploads
Size: 50 GB
Type: Persistent
Mount Path: /app/uploads
Backup: Daily, 7 days retention

Cache Volume

Name: redis-cache
Size: 10 GB
Type: Temporary
Mount Path: /data
Backup: None

Shared Configuration

Name: shared-config
Size: 1 GB
Type: Persistent
Mount Path: /etc/app/config
Read-only: true (for most applications)

Troubleshooting

Volume Full

Symptoms: Application errors, "No space left on device"

Solutions:

  • Expand volume size
  • Clean up old data
  • Check for log rotation
  • Verify application isn't leaking storage

Permission Denied

Symptoms: "Permission denied" when writing to volume

Solutions:

  • Check Dockerfile user/group IDs
  • Ensure application has write permissions

Mount Failed

Symptoms: Container won't start, mount errors

Solutions:

  • Verify mount path is valid
  • Review application logs

Data Loss

Symptoms: Data disappeared after restart

Solutions:

  • Ensure correct mount path
  • Contact support for recovery options

Best Practices

Naming

Use descriptive names indicating purpose:

  • postgres-production-data
  • api-upload-storage
  • volume1, data

Sizing

  • Start conservative, expand as needed
  • Monitor usage regularly
  • Plan for growth (use 70% rule)

Next Steps