@r8s/umami 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,103 @@
1
+ import { type DatabaseProps } from '@r8s/recipes';
2
+ export interface UmamiProps {
3
+ /** Resource name (defaults to 'umami') */
4
+ name?: string;
5
+ /** Kubernetes namespace (inherited from <Platform> unless set) */
6
+ namespace?: string;
7
+ /**
8
+ * Umami image tag. PINNED by default ('postgresql-v2.17.0') — facit
9
+ * floated on `postgresql-latest` and schema migrations are
10
+ * forward-only, so a surprise major upgrade breaks the install.
11
+ * Pass `version` explicitly to upgrade; `latest` is rejected.
12
+ */
13
+ version?: string;
14
+ /** Public hostname (required), e.g. 'umami.berget.ai' */
15
+ host: string;
16
+ /**
17
+ * OpenID Connect SSO (Keycloak). The discovery URL may point at any
18
+ * realm — facit uses the Keycloak master realm. Client credentials
19
+ * (keys `client-id` / `client-secret` — hyphenated per the Keycloak
20
+ * convention) are provisioned through the Platform secrets backend
21
+ * unless `clientSecretRef` references a pre-created Secret.
22
+ */
23
+ sso?: {
24
+ /** Full .well-known/openid-configuration URL, e.g. https://keycloak.example.com/realms/master/.well-known/openid-configuration */
25
+ discoveryUrl: string;
26
+ /** OIDC client id, e.g. 'umami' */
27
+ clientId: string;
28
+ /** Backend path (defaults to `<provider.path>/<name>/keycloak-oidc`) */
29
+ path?: string;
30
+ /** Reference a pre-created OIDC Secret (keys: client-id, client-secret) instead of provisioning */
31
+ clientSecretRef?: string;
32
+ /** OAuth scope (defaults to 'openid email profile') */
33
+ scope?: string;
34
+ };
35
+ /** Reference a pre-created app-secret bundle (key: app-secret) instead of backend provisioning */
36
+ appSecretRef?: string;
37
+ /** CNPG cluster name (defaults to `<name>-db`) */
38
+ dbName?: string;
39
+ /** Number of CNPG instances (defaults to 2) */
40
+ dbInstances?: number;
41
+ /** CNPG data volume size (defaults to '20Gi') */
42
+ dbStorage?: string;
43
+ /** CNPG storage class (defaults to cluster default) */
44
+ dbStorageClass?: string;
45
+ /**
46
+ * CNPG backup configuration passed through to the Database recipe.
47
+ * Facit targets Scaleway S3 (https://s3.nl-ams.scw.cloud) — the
48
+ * endpoint is therefore a required part of the prop, not a constant.
49
+ */
50
+ backup?: DatabaseProps['backup'];
51
+ /** Number of app replicas (defaults to 1 — umami is not horizontally scaled in facit) */
52
+ replicas?: number;
53
+ /** App resources (defaults to facit: 256Mi/100m → 512Mi/500m) */
54
+ resources?: {
55
+ requests?: {
56
+ cpu?: string;
57
+ memory?: string;
58
+ };
59
+ limits?: {
60
+ cpu?: string;
61
+ memory?: string;
62
+ };
63
+ };
64
+ /**
65
+ * Extra Endpoint annotations merged over the default. NOTE:
66
+ * `nginx.ingress.kubernetes.io/configuration-snippet` is disabled by the
67
+ * ingress-nginx admin on this cluster — the package never emits it.
68
+ */
69
+ endpointAnnotations?: Record<string, string>;
70
+ /** TLS configuration (defaults to letsencrypt-prod cluster issuer) */
71
+ tls?: {
72
+ secretName: string;
73
+ clusterIssuer: string;
74
+ };
75
+ }
76
+ /**
77
+ * Umami — privacy-focused web analytics, facit-aligned.
78
+ *
79
+ * @title Umami
80
+ * @category Data & Analytics
81
+ *
82
+ * Composes:
83
+ * - Umami Deployment + Service (pinned image, `/api/heartbeat` probes with
84
+ * the app's slow-boot delays)
85
+ * - CNPG Postgres cluster with `credentialsMode: 'cnpg'` — DATABASE_URL
86
+ * references the operator-generated `<db>-app` secret's `fqdn-uri` key
87
+ * directly (no vault-stored DB credentials)
88
+ * - App secret + optional OIDC client credentials via the Platform
89
+ * secrets backend
90
+ * - Endpoint with TLS
91
+ *
92
+ * @example
93
+ * import { Platform } from '@r8s/recipes'
94
+ * import { Umami } from '@r8s/umami'
95
+ *
96
+ * export default (
97
+ * <Platform secrets={{ backend: 'openbao', mount: 'secret', path: 'umami' }}>
98
+ * <Umami host="umami.example.com" />
99
+ * </Platform>
100
+ * )
101
+ */
102
+ export declare function Umami(props: UmamiProps): import("@r8s/core").r8sElement;
103
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE;QACJ,kIAAkI;QAClI,YAAY,EAAE,MAAM,CAAA;QACpB,mCAAmC;QACnC,QAAQ,EAAE,MAAM,CAAA;QAChB,wEAAwE;QACxE,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,mGAAmG;QACnG,eAAe,CAAC,EAAE,MAAM,CAAA;QACxB,uDAAuD;QACvD,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,kGAAkG;IAClG,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,kDAAkD;IAClD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IAChC,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;QAC5C,MAAM,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAC3C,CAAA;IACD;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5C,sEAAsE;IACtE,GAAG,CAAC,EAAE;QACJ,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,kCA4JtC"}
package/dist/index.js ADDED
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Umami = Umami;
4
+ const core_1 = require("@r8s/core");
5
+ const defaults_1 = require("@r8s/core/defaults");
6
+ const recipes_1 = require("@r8s/recipes");
7
+ /**
8
+ * Umami — privacy-focused web analytics, facit-aligned.
9
+ *
10
+ * @title Umami
11
+ * @category Data & Analytics
12
+ *
13
+ * Composes:
14
+ * - Umami Deployment + Service (pinned image, `/api/heartbeat` probes with
15
+ * the app's slow-boot delays)
16
+ * - CNPG Postgres cluster with `credentialsMode: 'cnpg'` — DATABASE_URL
17
+ * references the operator-generated `<db>-app` secret's `fqdn-uri` key
18
+ * directly (no vault-stored DB credentials)
19
+ * - App secret + optional OIDC client credentials via the Platform
20
+ * secrets backend
21
+ * - Endpoint with TLS
22
+ *
23
+ * @example
24
+ * import { Platform } from '@r8s/recipes'
25
+ * import { Umami } from '@r8s/umami'
26
+ *
27
+ * export default (
28
+ * <Platform secrets={{ backend: 'openbao', mount: 'secret', path: 'umami' }}>
29
+ * <Umami host="umami.example.com" />
30
+ * </Platform>
31
+ * )
32
+ */
33
+ function Umami(props) {
34
+ const { name = 'umami', namespace: namespaceProp, version = 'postgresql-v2.17.0', host, sso, appSecretRef, dbName = `${name}-db`, dbInstances = 2, dbStorage = '20Gi', dbStorageClass, backup, replicas = 1, resources = {
35
+ requests: { memory: '256Mi', cpu: '100m' },
36
+ limits: { memory: '512Mi', cpu: '500m' },
37
+ }, endpointAnnotations = {}, tls = { secretName: `${name}-tls`, clusterIssuer: 'letsencrypt-prod' }, } = props;
38
+ const namespace = (0, defaults_1.useNamespace)(namespaceProp);
39
+ const secretProvider = (0, core_1.useContext)(defaults_1.SecretContext);
40
+ const resources_ = [];
41
+ if (version === 'latest' || version.endsWith('-latest')) {
42
+ throw new Error(`Umami "${name}" requires a pinned version.\n` +
43
+ `\n` +
44
+ `Facit floated on 'postgresql-latest' — umami schema migrations are\n` +
45
+ `forward-only, so a surprise major upgrade breaks the install.\n` +
46
+ `\n` +
47
+ `Fix: <Umami version="postgresql-v2.17.0" ... />`);
48
+ }
49
+ // --- App secret (session signing) -------------------------------------------
50
+ const appSecretsName = appSecretRef ?? `${name}-secrets`;
51
+ if (!appSecretRef) {
52
+ if (!(0, recipes_1.canProvisionSecrets)(secretProvider)) {
53
+ throw (0, recipes_1.secretsRequiredError)('Umami', name, 'an app secret (APP_SECRET) — it signs all sessions', { propName: 'appSecretRef', exampleValue: `${name}-secrets`, keys: ['app-secret'] });
54
+ }
55
+ resources_.push((0, core_1.jsx)(recipes_1.StaticSecret, {
56
+ name: `${name}-secrets`,
57
+ namespace,
58
+ path: `${secretProvider.path ?? name}/${name}/app`,
59
+ secretName: appSecretsName,
60
+ keys: ['app-secret'],
61
+ restart: [{ kind: 'Deployment', name }],
62
+ }));
63
+ }
64
+ // --- OIDC (Keycloak) ----------------------------------------------------------
65
+ const oidcSecretsName = sso?.clientSecretRef ?? `${name}-keycloak-oidc`;
66
+ if (sso && !sso.clientSecretRef) {
67
+ if (!(0, recipes_1.canProvisionSecrets)(secretProvider)) {
68
+ throw (0, recipes_1.secretsRequiredError)('Umami', name, 'OIDC client credentials (client-id, client-secret) because sso is configured', {
69
+ propName: 'sso.clientSecretRef',
70
+ exampleValue: `${name}-keycloak-oidc`,
71
+ keys: ['client-id', 'client-secret'],
72
+ });
73
+ }
74
+ resources_.push((0, core_1.jsx)(recipes_1.StaticSecret, {
75
+ name: `${name}-keycloak-oidc`,
76
+ namespace,
77
+ path: sso.path ?? `${secretProvider.path ?? name}/${name}/keycloak-oidc`,
78
+ secretName: oidcSecretsName,
79
+ keys: ['client-id', 'client-secret'],
80
+ restart: [{ kind: 'Deployment', name }],
81
+ }));
82
+ }
83
+ // --- Database (CNPG; CNPG-managed credentials incl. fqdn-uri) -----------------
84
+ resources_.push((0, core_1.jsx)(recipes_1.Database, {
85
+ name: dbName,
86
+ namespace,
87
+ instances: dbInstances,
88
+ storage: dbStorage,
89
+ ...(dbStorageClass ? { storageClass: dbStorageClass } : {}),
90
+ parameters: {
91
+ shared_buffers: '256MB',
92
+ max_connections: '100',
93
+ work_mem: '8MB',
94
+ maintenance_work_mem: '128MB',
95
+ effective_cache_size: '768MB',
96
+ },
97
+ credentialsMode: 'cnpg',
98
+ ...(backup ? { backup } : {}),
99
+ }));
100
+ // --- App -----------------------------------------------------------------------
101
+ resources_.push((0, core_1.jsx)(recipes_1.WebService, {
102
+ name,
103
+ namespace,
104
+ image: `ghcr.io/umami-software/umami:${version}`,
105
+ port: 3000,
106
+ replicas,
107
+ resources,
108
+ env: {
109
+ ...(sso
110
+ ? {
111
+ OAUTH_DISCOVERY_URL: sso.discoveryUrl,
112
+ OAUTH_REDIRECT_URL: `https://${host}/api/auth/callback/openid`,
113
+ OAUTH_SCOPE: sso.scope ?? 'openid email profile',
114
+ OAUTH_USERNAME_CLAIM: 'preferred_username',
115
+ OAUTH_EMAIL_CLAIM: 'email',
116
+ OAUTH_NAME_CLAIM: 'name',
117
+ }
118
+ : {}),
119
+ },
120
+ secrets: {
121
+ // CNPG-generated `<db>-app` carries fqdn-uri — use it directly
122
+ DATABASE_URL: { secret: `${dbName}-app`, key: 'fqdn-uri' },
123
+ APP_SECRET: { secret: appSecretsName, key: 'app-secret' },
124
+ ...(sso
125
+ ? {
126
+ OAUTH_CLIENT_ID: { secret: oidcSecretsName, key: 'client-id' },
127
+ OAUTH_CLIENT_SECRET: { secret: oidcSecretsName, key: 'client-secret' },
128
+ }
129
+ : {}),
130
+ },
131
+ probes: {
132
+ readiness: { path: '/api/heartbeat', initialDelaySeconds: 30, periodSeconds: 10 },
133
+ liveness: { path: '/api/heartbeat', initialDelaySeconds: 60, periodSeconds: 30 },
134
+ },
135
+ }), (0, core_1.jsx)(recipes_1.Endpoint, {
136
+ name: `${name}-endpoint`,
137
+ namespace,
138
+ host,
139
+ serviceName: name,
140
+ servicePort: 80,
141
+ annotations: endpointAnnotations,
142
+ tls,
143
+ }));
144
+ return (0, core_1.jsx)(core_1.Fragment, { children: resources_ });
145
+ }
146
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@r8s/umami",
3
+ "version": "0.2.1",
4
+ "description": "Umami web analytics — Postgres persistence, CNPG backups, Keycloak OIDC for r8s",
5
+ "license": "MIT",
6
+ "author": "Berget AI AB",
7
+ "homepage": "https://r8s.berget.ai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/berget-ai/r8s.git",
11
+ "directory": "packages/umami"
12
+ },
13
+ "bugs": "https://github.com/berget-ai/r8s/issues",
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "keywords": [
21
+ "umami"
22
+ ],
23
+ "r8s": {
24
+ "category": "Data & Analytics"
25
+ },
26
+ "main": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "scripts": {
29
+ "build": "tsc --build",
30
+ "test": "vitest run",
31
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
32
+ },
33
+ "dependencies": {
34
+ "@r8s/core": "^0.2.0",
35
+ "@r8s/crds": "^0.2.0",
36
+ "@r8s/k8s-types": "^0.2.0",
37
+ "@r8s/recipes": "^0.2.0"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^5.3.0",
41
+ "vitest": "^1.0.0"
42
+ }
43
+ }