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
- Go to Attachments > Volumes
- 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
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
- In the application form, find "Volumes" section
- Click "Add Volume"
- Select existing volume or create new
- Specify Mount Path
For Existing Applications
- Edit the application
- Navigate to "Volumes" section
- Attach volume and set mount path
- 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:
- Navigate to volume details
- Click "Expand Volume"
- Enter new size (must be larger than current)
- Confirm expansion
Expanding a volume may require restarting attached applications.
Deleting Volumes
To delete a volume:
- Detach from all applications first
- Navigate to volume details
- Click "Delete Volume"
- Confirm deletion
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
- Variable Sets - Configure environment variables
- Files - Manage configuration files
- Creating Applications - Use volumes in apps