$ aoox

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.

Does data the app writes need to survive between deploys (uploads, SQLite, cache)? → Volume
Need to read/write a folder that already exists on the host? → Bind (owner/admin)
Just need to inject a single config file? → File

Three kinds of mount

KindSourceWhoNotes
VolumeA Docker volume aoox_app_<app>_<name>Any memberData survives between deploys. Can be backed up.
BindA path on the hostOwner/adminEquivalent to host filesystem access. Can't be backed up yet.
FileText content stored in aooxAny memberAlways read-only. Good for config (nginx.conf, a static .env).

Adding a mount

  1. 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.

    KindContainer pathSourceNotes
    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
  2. 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.

  3. Verify

    The Deploy tab's container log shows the application restarting. To confirm the path is mounted, run a manual job ls -la /app/uploads with 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:

EngineExample container pathFor what
PostgreSQL/etc/postgresql/postgresql.confTuning (shared_buffers, etc.) — adjust the image's command/entrypoint if it needs to point at that file.
MySQL / MariaDB/etc/mysql/conf.d/custom.cnfThe conf.d folder is read automatically by the official image.
Redis/usr/local/etc/redis/redis.confCustom 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.

Example: /etc/nginx/conf.d/app.conf
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

KindWhat happens
VolumeA 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).
BindA confirmation dialog, then the mount is detached; the folder on the host is untouched.
FileA 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.

Not available yet
Mounts for compose stacks (configured in the compose file) and previews; bind mount backups. Volume backup now also works for applications on a remote server.

Next steps

Found a mistake? Edit this page on GitHub ↗