$ aoox

DocsStacks & databases

One-click templates

A catalog of ready-made applications, deployed as a compose stack in a few clicks.

Catalog
15 templates, bundled inside aoox
Result
A compose stack (source: template)
Secrets
Passwords/secrets generated automatically

Catalog

TemplateVersionWhat it's forRequiredService (port)
wordpress6.8CMS/blog + MySQL—wordpress :80
ghost5Publishing platformPublic URLghost :2368
n8n1.xWorkflow automationPublic host; protocol & timezone have defaultsn8n :5678
uptime-kuma1Uptime monitoring—uptime-kuma :3001
rustfs1.0S3 object storage (Apache-2.0) — can serve as a backup destination— (access and secret keys are generated); for a backup destination give it a domain on any serviceConsole :9001 · S3 API :9000
gitea1.24Lightweight Git hostingPublic URLgitea :3000
vaultwarden1.37Password manager (Bitwarden compatible)Public URL (HTTPS)vaultwarden :80
umami2.20Privacy-friendly web analytics + PostgreSQL—umami :3000
grafana13.0Metrics and log dashboardsPublic URLgrafana :3000
metabase0.63Business intelligence + PostgreSQLPublic URLmetabase :3000
directus12.4Headless CMS / data API + PostgreSQLPublic URL, admin emaildirectus :8055
mattermost11.11Team chat + PostgreSQLPublic URLmattermost :8065
nextcloud32Files and collaboration + PostgreSQL, Redis, cronDomainnextcloud :80
odoo19.0ERP / all-in-one business suite (Community) + PostgreSQL— (master password is generated)odoo :8069
excalidrawlatest (pinned by digest)Collaborative hand-drawn whiteboard / diagrams (open source, MIT)—excalidraw :80

The catalog is written into aoox's own code — it isn't fetched from the internet at runtime, so it still works offline and can't be swapped out by anyone else. All passwords, secrets, and keys are generated automatically (alphanumeric) when left blank.

Notes per template

Templates that need a database ship their own PostgreSQL inside the stack (not a managed database), with named volumes for the data and health checks so the app only starts once the database is ready. Image versions are pinned to a specific tag, not latest. Licenses differ per project; check the project website before using one commercially.

TemplateStack contents and what to know
vaultwardenOne container, data in SQLite. The web vault needs HTTPS (except on localhost), so enter the public URL as https://…. The /admin token is generated; turn sign-ups off (SIGNUPS_ALLOWED=false) once your account exists.
umamiUmami + PostgreSQL. Umami's built-in first login is admin / umami; change it right away.
grafanaOne container (built-in SQLite). The admin username and password are in the stack env.
metabaseMetabase + PostgreSQL for its own application data (not the data you analyse). It is a Java app, so the first start takes a few minutes and uses a fair amount of RAM. The credential encryption key is generated; do not change it once in use.
directusDirectus + PostgreSQL. The first admin account is created from the email you enter and the password in the stack env; KEY and SECRET are generated.
mattermostMattermost Team Edition + PostgreSQL. The first account is created on the web and becomes the system admin.
nextcloudNextcloud (Apache) + PostgreSQL + Redis (cache and file locking) + a separate cron container for background jobs. Enter the domain without https://. The public protocol defaults to https; use http only for local tests. The first install takes longer, and it is the heaviest template.
odooOdoo Community 19.0 (LGPLv3; no Enterprise modules, which are proprietary) + PostgreSQL 16. Open the site: the first page asks for the Master Password, a database name, an email and an admin password. The master password is generated; find it on the stack page, Settings tab, environment section, Show values (the MASTER_PASSWORD variable). It runs as a single process without workers (workers = 0), fine for small use; multiple workers with a separate websocket route are not set up. proxy_mode is on so the https scheme and redirects are right behind Traefik. The database list stays open so the first database can be created from the web; the master password guards creating, duplicating, backing up and deleting databases. Once the database exists, secure /web/database/manager: edit the stack compose (Settings tab), add list_db = False and dbfilter = ^db_name$ to the Odoo configuration part, and redeploy. The image uses a dated tag (19.0-20260926) so it does not move every night; for security updates, change the tag and redeploy. Data lives in the odoo_data volume (filestore) and the database.
excalidrawExcalidraw (MIT), a whiteboard for hand-drawn style sketches and diagrams. One static client container on port 80, no database and nothing to fill in. Drawings stay in the browser (local storage) and can be exported to PNG, SVG, or a file. Live collaboration is not included: it needs a separate collaboration server, which this template does not set up. The official image has no version tags (only a rolling latest), so it is pinned to an image digest; to update, replace the digest in the stack's compose file by hand.

Deploying a template

  1. Templates menu → pick a template

    Or, from a project page, click From template so the project is already selected. A search box is available for the catalog.

  2. Fill in the deploy dialog

    SectionNotes
    Project & NameThe name becomes the stack's slug; the compose project = aoox-<slug>.
    Hostname per service + HTTPSOne row per exposable service (e.g. RustFS has two: Console and API). Leave blank if you don't want a domain.
    Host port per serviceAn alternative to a domain: the stack can then be opened at <server-ip>:<port>. Port clashes are rejected when saving — see Stack access.
    VariablesFields with a label and hint from the template. Ones marked required must be filled in (e.g. Public URL for Ghost/Gitea, Public host for n8n). The rest: blank = default / generated.
    Public URL must match the domain
    Ghost, Gitea, n8n, Grafana, Metabase, Directus, Mattermost, Vaultwarden, and Nextcloud use the public URL/host to build their own links and webhooks. Fill it in exactly matching the hostname you've set up, scheme included (https://blog.example.com) — if it differs, the admin pages/links will point to the wrong place.
  3. Deploy

    You're taken to the new compose stack's page. The deploy runs in the background (the first image pull can take a few minutes); watch the Last action log until the status is running.

  4. Verify

    Open the hostname you set up. For the initial admin credentials (e.g. the RustFS access and secret keys, DB password), check the stack's env under the Settings tab — generated values are stored there.

Example: WordPress with a domain

Deploy dialog
Project     : shop
Name        : blog
Service     : wordpress → blog.example.com  [HTTPS ✓]
Variables   : DB_PASSWORD (blank → generated)
              DB_ROOT_PASSWORD (blank → generated)

Once it's running, open https://blog.example.com and finish the WordPress wizard. The MySQL database lives inside the stack (not a managed database) — backing it up is then up to a plugin/script of your own, or move it to a managed database by editing the compose file.

After deploying

  • The compose file is stored in aoox and can be edited under the stack's Settings tab (a textarea), then redeployed — e.g. to add a service, change an image tag, or point at a managed database.
  • The stack env holds the variable values (including generated ones); change it and redeploy if needed.
  • A domain per service can be added/changed via the Domain card; suggested services come from the catalog.
  • Stop / Start / Delete work the same as any other compose stack — Delete removes the volume data.

Common pitfalls

SymptomCause & fix
400: required variable is emptyThe public URL/host/domain or the admin email (Directus) hasn't been filled in.
Admin links point to localhost / httpThe public URL doesn't match the domain, or n8n's protocol is still http. Fix the stack env, redeploy.
Deploy stays in deployingThe first image pull. Wait, and check the Last action log for progress.
RustFS can't be used as a backup destinationGive the stack a domain on any service (the console is fine) so it joins the aoox network, then use http://<container name>:9000 as the endpoint (path-style on, bucket created first). A port bound to 127.0.0.1 is not reachable from containers; a public host port works but exposes S3 to the internet.
Not available yet
Templates from a custom repo/URL; upgrading the version of an already deployed template; offline template icons. The other compose stack limitations still apply — see Compose stacks.

Next steps

Found a mistake? Edit this page on GitHub ↗