Documentation / Build and deploy
Databases and volumes
Persistent storage, database templates, and connection strings.
Database templates
Add a PostgreSQL, Redis, MySQL, or MongoDB service from a template. Templates provide the image, persistent mount, and connection variables. Keep the database on private networking and reference its connection string from the application.
For a service named postgres, an application's variable can be:
DATABASE_URL=${{postgres.DATABASE_URL}}
A database connection string is a secret. Do not put it in a browser bundle or public source file. These templates run containers on the current host; they do not provide a separate replicated managed database cluster or automatic failover.
Persistent volumes
A volume preserves files across replacement of the application container. Set the mount path to the exact location where the application writes persistent data. Files elsewhere in the container remain temporary. Attaching an empty volume does not import existing data from another host.
Use a dedicated persistent path for SQLite or uploaded files. Check permissions and confirm that new data remains after a redeployment. Removing a volume is a data deletion operation; keep a verified backup first.
Backups are a separate step
A volume is not an off-host backup. Connect R2 and inspect backup coverage. Supported PostgreSQL services are backed up with a logical dump. Other volumes use a file archive. A live archive of MySQL, MongoDB, Redis, or an actively written SQLite database is not a guarantee of application-consistent recovery. Use database-appropriate backup procedures or stop writers for a consistent final copy.
External databases and copied environments
An application can keep using an external provider, such as Supabase, when moving its runtime to Upferry. Upferry does not automatically back up a database just because its URL is in your variables. Configure backups with that provider.
Copying an environment creates empty volumes, not a clone of production data. Literal external database URLs are copied unchanged. Replace them before letting staging write to production.