DocsApplications
Mounts
Storing data that must survive between deploys, accessing a host path, or injecting a config file into an application or managed database container.
- Types
- Volume · Bind · File
- Effect
- Container recreated, no build
- Backup
- Volumes only (manual/scheduled, S3)
When do you need a mount?
A container's filesystem disappears on every deploy — the old container is removed, a new one is created from the image. Anything the application writes to disk needs to live in a mount if it should survive.
Three kinds of mount
| Kind | Source | Who | Notes |
|---|---|---|---|
| Volume | A Docker volume aoox_app_<app>_<name> | Any member | Data survives between deploys. Can be backed up. |
| Bind | A path on the host | Owner/admin | Equivalent to host filesystem access. Can't be backed up yet. |
| File | Text content stored in aoox | Any member | Always read-only. Good for config (nginx.conf, a static .env). |
Adding a mount
Open the Mount tab → Add mount
Pick a Kind, set the Container path (unique per application), then Volume name / Host path / File content depending on the kind.
Kind Container path Source Notes Volume /app/uploadsuploadsVolume aoox_app_shop_uploads Volume /datadataSQLite / cache Bind /srv/media/mnt/storage/mediaHost path, owner/admin File /etc/nginx/conf.d/app.conf(content in the textarea)Read-only The container is recreated automatically
Every add/edit/delete of a mount triggers a container recreate from the current image — no build. The application restarts briefly; env and domain are re-applied too.
Verify
The Deploy tab's container log shows the application restarting. To confirm the path is mounted, run a manual job
ls -la /app/uploadswith target In the container.
Mounts for managed databases
The database page also has a Mount tab with the same three kinds — usually for engine config files or an extra volume:
| Engine | Example container path | For what |
|---|---|---|
| PostgreSQL | /etc/postgresql/postgresql.conf | Tuning (shared_buffers, etc.) — adjust the image's command/entrypoint if it needs to point at that file. |
| MySQL / MariaDB | /etc/mysql/conf.d/custom.cnf | The conf.d folder is read automatically by the official image. |
| Redis | /usr/local/etc/redis/redis.conf | Custom configuration. |
- Any mount change reprovisions the database container (a brief restart; data stays in its volume).
- The same role rule applies: bind mounts are owner/admin only.
- Volume backup is only for application mounts; a database's own data volume is already covered by database backup.
File mounts
File contents are written directly in the Mount tab (a textarea), then Save & apply — handy for config that changes often without a repo commit.
server {
listen 80;
location / { proxy_pass http://127.0.0.1:3000; }
}- Under the hood, all of an application's files are written to one dedicated volume (
aoox_app_<app>_files) and then bind-mounted per path as read-only. - An application that needs to write to that file must use a volume instead of a file mount.
Deleting a mount
| Kind | What happens |
|---|---|
| Volume | A confirmation dialog with two choices: Detach the mount only (the data stays in Docker and can be reattached under the same name) or Detach and delete the volume (the data is lost permanently and can't be undone; this is the purge). |
| Bind | A confirmation dialog, then the mount is detached; the folder on the host is untouched. |
| File | A confirmation dialog, then the mount is detached and its content is deleted from aoox. |
Behavior & limitations
- PR previews get no mounts — don't share a production volume with an arbitrary branch.
- During blue/green, the two temporary containers share the same volume. Applications that lock files (SQLite without WAL) are better off with a host port so plain replace is used instead.
- A job with target Separate container inherits all of the application's mounts — good for migrations or data cleanup.
- Bind mounts are restricted to owner/admin since they're equivalent to host filesystem access.
Volume backup
The Volume backup section on the Mount tab: manual backups, a cron schedule, retention, and an S3 destination per application. Restore = stop the container → empty the volume → extract → start. Details in Backup & restore.
Next steps
Found a mistake? Edit this page on GitHub ↗