diff --git a/modules/umami/module.json b/modules/umami/module.json index aa341e7..b4b5d19 100644 --- a/modules/umami/module.json +++ b/modules/umami/module.json @@ -1,6 +1,10 @@ { "module": "umami", "version": "1", + "capabilities": [ + "container-runtime" + ], + "requires": [ "postgres-database" ], @@ -15,20 +19,37 @@ "secrets": { "postgres-database": "/var/lib/umami/database.secret" }, - "own-secrets": { - "app-secret": "/var/lib/umami/app.secret" - }, - "capabilities": [ - "container-runtime" + + "provides": [ + { + "name": "analytics", + "scope": "mesh" + } ], + "serves": { + "analytics": {} + }, + "receives": { + "analytics": "/var/lib/umami/grants/mesh.json" + }, + "grants": { + "analytics": "/var/lib/umami/grants" + }, + + "own-secrets": { + "app-secret": "/var/lib/umami/app.secret", + "admin": "/var/lib/umami/admin.secret" + }, + "listens": [ { "port": 3000, "protocol": "tcp", - "from": "mesh", - "why": "the analytics pages and the collection endpoint" + "from": "anywhere", + "why": "one port serves two surfaces: the dashboard (the proxy gates it to the mesh) and the public collection endpoint that the browsers of every tracked site POST to — so the port itself must be reachable from anywhere" } ], + "resources": [ { "id": "state", @@ -36,24 +57,57 @@ "path": "/var/lib/umami", "mode": "0700" }, + { + "id": "grants", + "type": "directory", + "path": "/var/lib/umami/grants", + "mode": "0700" + }, { "id": "server-env", "type": "file", "path": "/var/lib/umami/server.env", "mode": "0600", - "content": "DATABASE_URL=postgresql://${bound:postgres-database:as}:${secret:postgres-database}@${bound:postgres-database:at}:${bound:postgres-database:port}/umami\nAPP_SECRET=${secret:app-secret}\n" + "content": "DATABASE_URL=postgresql://${bound:postgres-database:as}:${secret:postgres-database}@${bound:postgres-database:at}:${bound:postgres-database:port}/umami\nDATABASE_TYPE=postgresql\nAPP_SECRET=${secret:app-secret}\n" + }, + { + "id": "provisioner-env", + "type": "file", + "path": "/var/lib/umami/provisioner.env", + "mode": "0600", + "content": "MESH_PROVISION_UMAMI_URL=http://umami:3000\nGRANTS=/var/lib/umami/grants\n" + }, + { + "id": "net", + "type": "network", + "name": "umami" }, { "id": "server", "type": "container", "name": "umami", "image": "ghcr.io/umami-software/umami@sha256:fa32d116cf20cad52cbc3fad9a63b46e7fa02299d8f967168eb453d49c476b4a", + "network": "umami", "env-file": [ "/var/lib/umami/server.env" ], "ports": [ "3000" ] + }, + { + "id": "provisioner", + "type": "container", + "name": "mesh-provision-umami-analytics", + "image": "mesh-provision-umami-analytics@sha256:0000000000000000000000000000000000000000000000000000000000000000", + "network": "umami", + "env-file": [ + "/var/lib/umami/provisioner.env" + ], + "volumes": [ + "/var/lib/umami/grants:/var/lib/umami/grants", + "/var/lib/umami/admin.secret:/run/secrets/admin:ro" + ] } ] }