skills/render-disks/SKILL.md
Attaches and manages persistent disks on Render services—mount paths, sizing, snapshots, file transfers, and single-instance constraints. Use when the user needs persistent storage, file uploads, a custom database on disk, CMS media storage, or needs to understand why their service can't scale horizontally or use zero-downtime deploys. Trigger terms: persistent disk, disk, storage, mount path, sizeGB, SSD, file uploads, snapshots, disk restore, ephemeral filesystem.
npx skillsauth add render-oss/skills render-disksInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Persistent disks are high-performance SSDs you attach to a Render service to preserve filesystem changes across deploys and restarts. Without a disk, services have an ephemeral filesystem—all local file changes are lost on every deploy.
For managed databases, prefer Render Postgres (render-postgres) or Key Value (render-keyvalue) over self-managed alternatives on disk.
These constraints affect architecture decisions. Understand them before attaching a disk:
| Constraint | Impact |
|------------|--------|
| Single instance only | Cannot scale horizontally (numInstances must be 1, autoscaling not available) |
| No zero-downtime deploys | Old instance stops before new instance starts (brief downtime on each deploy) |
| Runtime access only | Disk is not available during buildCommand or preDeployCommand (those run on separate compute) |
| Not accessible from other services | Only the attached service can read/write the disk |
| Not available on cron jobs | Attach to a web service, private service, or background worker instead |
| Not available on one-off jobs | One-off jobs run on separate compute without disk access |
| Can increase size, cannot decrease | Start small and grow as needed |
services:
- type: web
name: cms
runtime: node
plan: starter
region: oregon
buildCommand: npm ci && npm run build
startCommand: npm start
disk:
name: cms-data
mountPath: /var/data
sizeGB: 10
Only files written under the mount path are preserved. Everything else remains ephemeral.
| Runtime | Source code path | Example mount path |
|---------|------------------|--------------------|
| Node.js, Python, Ruby, Elixir, Rust | /opt/render/project/src | /opt/render/project/src/uploads |
| Go | /opt/render/project/go/src/github.com/<user>/<repo> | .../data |
| Docker | Dockerfile's WORKDIR (commonly /app) | /app/storage |
Cannot mount at: /, /opt, /opt/render, /opt/render/project, /opt/render/project/src, /home, /home/render, /etc, /etc/secrets.
Subdirectories of these paths are fine (e.g. /opt/render/project/src/uploads).
Do not restore snapshots for custom database recovery. Use database-native backup tools (mysqldump, mongodump) instead—disk snapshots may capture a corrupted database state.
# Download from service
scp -s [email protected]_REGION.render.com:/mount/path/file ./local-file
# Upload to service
scp -s ./local-file [email protected]_REGION.render.com:/mount/path/file
Requires SSH access enabled for the service.
Available on all native runtimes (install manually on Docker):
# On the service shell
wormhole send /mount/path/file
# On your local machine
wormhole receive
| Pattern | Service type | Mount path | Notes |
|---------|-------------|------------|-------|
| WordPress / Ghost / CMS | Web Service | /var/data or /app/content | Media uploads, SQLite |
| Self-managed MySQL | Private Service | /var/lib/mysql | Use mysqldump for backups, not disk snapshots |
| File upload API | Web Service | /opt/render/project/src/uploads | Single instance constraint |
| Elasticsearch | Private Service | /usr/share/elasticsearch/data | Stateful search infrastructure |
| Mistake | Fix |
|---------|-----|
| Expecting horizontal scaling with a disk | Not possible — disk services are single-instance only |
| Mounting at a disallowed path | Use a subdirectory (e.g. /opt/render/project/src/uploads not /opt/render/project/src) |
| Reading disk during build or pre-deploy | These run on separate compute — move logic to the start command |
| Restoring disk snapshot for a database | Use database-native backups instead |
| Starting with a large disk size | Start small — you can increase but never decrease |
| Document | Contents |
|----------|----------|
| references/sizing-and-snapshots.md | Sizing guidance, snapshot lifecycle, restore procedures, cost patterns |
disk field reference in render.yamldevelopment
Configures Render web services—port binding, TLS, health checks, custom domains, auto-deploy, PR previews, persistent disks, and deploy lifecycle. Use when the user needs to set up a web service, fix health check failures, add a custom domain, configure zero-downtime deploys, or troubleshoot port binding issues.
development
Deploys and configures static sites on Render's global CDN—build commands, publish paths, SPA routing, redirects, custom headers, and PR previews. Use when the user needs to deploy a static site, set up a React/Vue/Hugo/Gatsby frontend, configure SPA fallback routing, add redirect rules, customize response headers, or choose between a static site and a web service for their frontend. Trigger terms: static site, CDN, SPA, single-page app, React deploy, Vue deploy, Hugo, Gatsby, Docusaurus, Jekyll, staticPublishPath.
tools
Scales Render services—configures autoscaling targets, chooses instance types, sets manual instance counts, and optimizes cost. Use when the user needs to handle more traffic, set up autoscaling, pick the right instance type, reduce costs, or troubleshoot scaling behavior like slow scale-down or stuck instances.
development
Configures Render private services—internal-only apps that accept traffic exclusively from other Render services over the private network. Use when the user needs an internal API, microservice, gRPC server, sidecar, or any service that should not be publicly accessible. Also use when choosing between a private service and a background worker. Trigger terms: private service, pserv, internal service, internal API, microservice, gRPC, not public, private network service.