From 3ab75036c7f2fe91fcd21ae98c68ff90bff853b9 Mon Sep 17 00:00:00 2001 From: Juan Cordero Pascual Date: Mon, 10 Aug 2026 11:04:44 +0200 Subject: [PATCH] feat(apps): add Umami app template Lightweight, privacy-focused website analytics, self-hostable via docker-compose. Umami doesn't exist in the upstream remote catalog, so this local entry won't be overridden by the remote-overlay merge. Host port pinned to 3009 to avoid colliding with other apps that default to 3000. Closes #532 --- apps/dashboard/src/components/AppLogo.tsx | 1 + packages/core/src/apps/catalog.json | 86 +++++++++++++++++++++++ packages/core/src/apps/catalog/umami.json | 65 +++++++++++++++++ 3 files changed, 152 insertions(+) create mode 100644 packages/core/src/apps/catalog/umami.json diff --git a/apps/dashboard/src/components/AppLogo.tsx b/apps/dashboard/src/components/AppLogo.tsx index 13ed76eba..4da774311 100644 --- a/apps/dashboard/src/components/AppLogo.tsx +++ b/apps/dashboard/src/components/AppLogo.tsx @@ -38,6 +38,7 @@ export const APP_LOGO: Record< freshrss: { slug: "freshrss" }, excalidraw: { slug: "excalidraw" }, qdrant: { slug: "qdrant" }, + umami: { slug: "umami" }, // Kafka's catalog id is "kafka"; its simpleicons brand slug is "apachekafka". // The mark is near-black (brand color #231F20), so it vanishes on the dark/dim // tiles — darkInvert flips it to near-white there (dark on light themes as-is). diff --git a/packages/core/src/apps/catalog.json b/packages/core/src/apps/catalog.json index f71348b63..ac5d715ac 100644 --- a/packages/core/src/apps/catalog.json +++ b/packages/core/src/apps/catalog.json @@ -1829,6 +1829,92 @@ } ] } + }, + { + "available": true, + "verified": true, + "id": "umami", + "name": "Umami", + "description": "Lightweight, privacy-focused website analytics without cookies or personal data collection.", + "kind": "template", + "logo": "umami", + "category": "analytics", + "tags": [ + "analytics", + "privacy", + "web" + ], + "framework": "docker-compose", + "services": [ + { + "name": "umami-db", + "image": "postgres:15-alpine", + "environment": { + "POSTGRES_DB": "umami", + "POSTGRES_USER": "umami" + }, + "secretEnv": [ + "POSTGRES_PASSWORD" + ], + "volumes": [ + "umami_db_data:/var/lib/postgresql/data" + ], + "restart": "unless-stopped" + }, + { + "name": "umami", + "image": "ghcr.io/umami-software/umami:postgresql-latest", + "ports": [ + "3009:3000" + ], + "exposedPort": 3000, + "exposed": true, + "dependsOn": [ + "umami-db" + ], + "environment": { + "DATABASE_URL": "postgresql://umami:{{config:POSTGRES_PASSWORD}}@umami-db:5432/umami" + }, + "secretEnv": [ + "APP_SECRET" + ], + "restart": "unless-stopped" + } + ], + "configFields": [ + { + "key": "POSTGRES_PASSWORD", + "service": "umami-db", + "label": "Database password", + "help": "Auto-generated. Shared with the umami service's DATABASE_URL.", + "generate": "secret", + "secret": true + }, + { + "key": "APP_SECRET", + "service": "umami", + "label": "App secret", + "help": "Auto-generated. Signs sessions.", + "generate": "secret", + "secret": true + } + ], + "connection": { + "title": "Open Umami", + "outputs": [ + { + "id": "url", + "label": "URL", + "source": "publicUrl:umami", + "kind": "url" + } + ], + "firstLogin": { + "username": "admin", + "password": "umami", + "note": "Change the admin password right after your first login." + } + } } ] } diff --git a/packages/core/src/apps/catalog/umami.json b/packages/core/src/apps/catalog/umami.json new file mode 100644 index 000000000..3cd9bc989 --- /dev/null +++ b/packages/core/src/apps/catalog/umami.json @@ -0,0 +1,65 @@ +{ + "available": true, + "verified": true, + "id": "umami", + "name": "Umami", + "description": "Lightweight, privacy-focused website analytics without cookies or personal data collection.", + "kind": "template", + "logo": "umami", + "category": "analytics", + "tags": ["analytics", "privacy", "web"], + "framework": "docker-compose", + "services": [ + { + "name": "umami-db", + "image": "postgres:15-alpine", + "environment": { + "POSTGRES_DB": "umami", + "POSTGRES_USER": "umami" + }, + "secretEnv": ["POSTGRES_PASSWORD"], + "volumes": ["umami_db_data:/var/lib/postgresql/data"], + "restart": "unless-stopped" + }, + { + "name": "umami", + "image": "ghcr.io/umami-software/umami:postgresql-latest", + "ports": ["3009:3000"], + "exposedPort": 3000, + "exposed": true, + "dependsOn": ["umami-db"], + "environment": { + "DATABASE_URL": "postgresql://umami:{{config:POSTGRES_PASSWORD}}@umami-db:5432/umami" + }, + "secretEnv": ["APP_SECRET"], + "restart": "unless-stopped" + } + ], + "configFields": [ + { + "key": "POSTGRES_PASSWORD", + "service": "umami-db", + "label": "Database password", + "help": "Auto-generated. Shared with the umami service's DATABASE_URL.", + "generate": "secret", + "secret": true + }, + { + "key": "APP_SECRET", + "service": "umami", + "label": "App secret", + "help": "Auto-generated. Signs sessions.", + "generate": "secret", + "secret": true + } + ], + "connection": { + "title": "Open Umami", + "outputs": [{ "id": "url", "label": "URL", "source": "publicUrl:umami", "kind": "url" }], + "firstLogin": { + "username": "admin", + "password": "umami", + "note": "Change the admin password right after your first login." + } + } +}