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
| Template | Version | What it's for | Required | Service (port) |
|---|---|---|---|---|
wordpress | 6.8 | CMS/blog + MySQL | — | wordpress :80 |
ghost | 5 | Publishing platform | Public URL | ghost :2368 |
n8n | 1.x | Workflow automation | Public host; protocol & timezone have defaults | n8n :5678 |
uptime-kuma | 1 | Uptime monitoring | — | uptime-kuma :3001 |
rustfs | 1.0 | S3 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 service | Console :9001 · S3 API :9000 |
gitea | 1.24 | Lightweight Git hosting | Public URL | gitea :3000 |
vaultwarden | 1.37 | Password manager (Bitwarden compatible) | Public URL (HTTPS) | vaultwarden :80 |
umami | 2.20 | Privacy-friendly web analytics + PostgreSQL | — | umami :3000 |
grafana | 13.0 | Metrics and log dashboards | Public URL | grafana :3000 |
metabase | 0.63 | Business intelligence + PostgreSQL | Public URL | metabase :3000 |
directus | 12.4 | Headless CMS / data API + PostgreSQL | Public URL, admin email | directus :8055 |
mattermost | 11.11 | Team chat + PostgreSQL | Public URL | mattermost :8065 |
nextcloud | 32 | Files and collaboration + PostgreSQL, Redis, cron | Domain | nextcloud :80 |
odoo | 19.0 | ERP / all-in-one business suite (Community) + PostgreSQL | — (master password is generated) | odoo :8069 |
excalidraw | latest (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.
| Template | Stack contents and what to know |
|---|---|
| vaultwarden | One 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. |
| umami | Umami + PostgreSQL. Umami's built-in first login is admin / umami; change it right away. |
| grafana | One container (built-in SQLite). The admin username and password are in the stack env. |
| metabase | Metabase + 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. |
| directus | Directus + PostgreSQL. The first admin account is created from the email you enter and the password in the stack env; KEY and SECRET are generated. |
| mattermost | Mattermost Team Edition + PostgreSQL. The first account is created on the web and becomes the system admin. |
| nextcloud | Nextcloud (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. |
| odoo | Odoo 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. |
| excalidraw | Excalidraw (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
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.
Fill in the deploy dialog
Section Notes Project & Name The name becomes the stack's slug; the compose project = aoox-<slug>. Hostname per service + HTTPS One row per exposable service (e.g. RustFS has two: Console and API). Leave blank if you don't want a domain. Host port per service An alternative to a domain: the stack can then be opened at <server-ip>:<port>. Port clashes are rejected when saving — see Stack access.Variables Fields 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 domainGhost, 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.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.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
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
| Symptom | Cause & fix |
|---|---|
| 400: required variable is empty | The public URL/host/domain or the admin email (Directus) hasn't been filled in. |
| Admin links point to localhost / http | The public URL doesn't match the domain, or n8n's protocol is still http. Fix the stack env, redeploy. |
| Deploy stays in deploying | The first image pull. Wait, and check the Last action log for progress. |
| RustFS can't be used as a backup destination | Give 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. |
Next steps
Found a mistake? Edit this page on GitHub ↗