@r8s/matrix 0.2.0

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,151 @@
1
+ export interface MatrixSSOProps {
2
+ /** Keycloak/OIDC issuer URL (e.g. https://keycloak.example.com/realms/berget) */
3
+ issuer: string;
4
+ /** OIDC client id registered in the realm */
5
+ clientId: string;
6
+ /**
7
+ * Name of an existing Secret containing key `clientSecret`. Required unless
8
+ * a secrets backend (openbao/vault) is configured on the surrounding
9
+ * Platform — the backend then provisions `${name}-keycloak-oidc`.
10
+ */
11
+ clientSecretRef?: string;
12
+ /** Display name on the MAS login button (default: 'SSO') */
13
+ humanName?: string;
14
+ /** OIDC scope (default: 'openid email profile') */
15
+ scope?: string;
16
+ }
17
+ export interface MatrixDatabaseProps {
18
+ /** CNPG instances (default: 2) */
19
+ replicas?: number;
20
+ /** Storage size per database (default: '20Gi') */
21
+ storage?: string;
22
+ /** StorageClass name (default: cluster default) */
23
+ storageClass?: string;
24
+ /**
25
+ * Backup configuration — barman object store + scheduled full backups.
26
+ * Set to false to disable. Defaults to off unless specified (explicit opt-in
27
+ * so you can't forget: a disk-full WAL incident is exactly what this prevents).
28
+ */
29
+ backup?: {
30
+ /** S3 destination path, e.g. s3://bucket/matrix-cnpg */
31
+ destinationPath: string;
32
+ /** S3 endpoint URL (e.g. https://s3.berget.cloud) */
33
+ endpointURL: string;
34
+ /** Existing Secret with keys `access-key-id` + `secret-access-key`. Provisioned by the secrets backend when not given. */
35
+ credentialsSecret?: string;
36
+ /** Retention policy (default: '30d') */
37
+ retention?: string;
38
+ /** Cron schedule for the daily full backup (default: '30 3 * * *') */
39
+ schedule?: string;
40
+ } | null;
41
+ }
42
+ export interface MatrixRTCProps {
43
+ /** Enable MatrixRTC / LiveKit SFU (default: true) */
44
+ enabled?: boolean;
45
+ /**
46
+ * External IP for the SFU LoadBalancer — LiveKit needs a real IP (not DNS)
47
+ * for ICE. Leave unset to rely on STUN discovery.
48
+ */
49
+ manualIP?: string;
50
+ /** TURN server port on the combined LoadBalancer (default: 30004, 0 disables) */
51
+ turnPort?: number;
52
+ /** Extra STUN servers for client NAT traversal */
53
+ stunServers?: string[];
54
+ /** LiveKit image tag (default: v1.10.1 — pinned for the IPv6 ICE URL regression) */
55
+ sfuVersion?: string;
56
+ }
57
+ export interface MatrixProps {
58
+ /** Resource name (defaults to 'matrix') */
59
+ name?: string;
60
+ /** Kubernetes namespace (inherited from Platform context when omitted) */
61
+ namespace?: string;
62
+ /** Base domain — derives the five public hosts (see `hosts`) */
63
+ domain: string;
64
+ /**
65
+ * Host overrides. Defaults:
66
+ * web: `element.<domain>`, synapse: `matrix.<domain>`,
67
+ * admin: `element-admin.<domain>`, account: `matrix-account.<domain>`,
68
+ * rtc: `matrix-rtc.<domain>`
69
+ */
70
+ hosts?: Partial<Record<'web' | 'synapse' | 'admin' | 'account' | 'rtc', string>>;
71
+ /** Replicas for the stateless web/admin/mas/haproxy-ish layers (default: 2; synapse and SFU stay at 1 until federation workers land) */
72
+ replicas?: number;
73
+ /** Matrix server name — becomes part of user IDs (@user:serverName). Defaults to `domain`. */
74
+ serverName?: string;
75
+ /** SSO/OIDC upstream for MAS (Keycloak). Password login disabled when set. */
76
+ sso?: MatrixSSOProps;
77
+ /** Per-database sizing + backup for synapse-db and mas-db */
78
+ database?: MatrixDatabaseProps;
79
+ /** MatrixRTC / LiveKit SFU (Element Call backend) */
80
+ rtc?: MatrixRTCProps;
81
+ /**
82
+ * Appservice registrations (hookshot, bots…). Each mounts one
83
+ * `registration.yaml` into Synapse's appservice directory.
84
+ *
85
+ * Two modes per entry:
86
+ * - `registration`: inline YAML data rendered as a **Secret** (never a
87
+ * ConfigMap — registrations carry as_token/hs_token). Use placeholders
88
+ * for the tokens and let GitOps fill them, or expect the
89
+ * noPlaintextSecrets guardrail to flag live token values.
90
+ * - `secretRef`: name of an existing Secret holding `registration.yaml`
91
+ * (key override via `key`). Nothing rendered — the preferred mode when
92
+ * the file lives in the secrets backend.
93
+ */
94
+ appservices?: ({
95
+ name: string;
96
+ registration: Record<string, unknown>;
97
+ secretRef?: never;
98
+ key?: never;
99
+ } | {
100
+ name: string;
101
+ secretRef: string;
102
+ key?: string;
103
+ registration?: never;
104
+ })[];
105
+ /**
106
+ * Version pinning per component (production: pin these — the defaults are
107
+ * already pinned for known upstream regressions):
108
+ * web: v1.12.15 (MSC4143 Authorization header fix),
109
+ * sfu: v1.10.1 (IPv6 ICE URL fix)
110
+ */
111
+ version?: {
112
+ synapse?: string;
113
+ mas?: string;
114
+ web?: string;
115
+ admin?: string;
116
+ sfu?: string;
117
+ };
118
+ /** Disable the URL-preview SSRF blacklist preset (default: enabled, hardened) */
119
+ urlPreview?: boolean;
120
+ }
121
+ /**
122
+ * Matrix — full Element Server Suite: Synapse homeserver, MAS with Keycloak
123
+ * OIDC, Element Web + Admin, MatrixRTC/LiveKit SFU.
124
+ *
125
+ * @title Matrix (Element Server Suite)
126
+ * @category Collaboration & Productivity
127
+ *
128
+ * Renders the whole suite with production HA defaults: two CNPG databases
129
+ * (optional barman backups), 60s node-failure tolerations + topology spread
130
+ * (learned from a real node-blip incident), SSRF-hardened URL previews, and
131
+ * pinned component versions.
132
+ *
133
+ * Secrets arrive via the Platform secrets backend (openbao/vault) or the
134
+ * `clientSecretRef`/`credentialsSecret` escape hatches — never inline.
135
+ *
136
+ * @example
137
+ * import { Platform } from '@r8s/recipes'
138
+ * import { Matrix } from '@r8s/matrix'
139
+ *
140
+ * export default (
141
+ * <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'matrix' }}>
142
+ * <Matrix
143
+ * domain="example.com"
144
+ * sso={{ issuer: 'https://keycloak.example.com/realms/berget', clientId: 'matrix' }}
145
+ * database={{ backup: { destinationPath: 's3://backups/matrix-cnpg', endpointURL: 'https://s3.example.com' } }}
146
+ * />
147
+ * </Platform>
148
+ * )
149
+ */
150
+ export declare function Matrix(props: MatrixProps): import("@r8s/core").r8sElement;
151
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,814 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Matrix = Matrix;
4
+ const core_1 = require("@r8s/core");
5
+ const defaults_1 = require("@r8s/core/defaults");
6
+ const crds_1 = require("@r8s/crds");
7
+ const postgresql_1 = require("@r8s/crds/postgresql");
8
+ const recipes_1 = require("@r8s/recipes");
9
+ /** HA scheduling defaults learned from a production node-blip incident:
10
+ * evict within 60s (instead of the 300s default) and spread replicas
11
+ * across nodes so one node loss never takes an entire component down. */
12
+ const HA_TOLERATIONS = [
13
+ {
14
+ key: 'node.kubernetes.io/unreachable',
15
+ operator: 'Exists',
16
+ effect: 'NoExecute',
17
+ tolerationSeconds: 60,
18
+ },
19
+ {
20
+ key: 'node.kubernetes.io/not-ready',
21
+ operator: 'Exists',
22
+ effect: 'NoExecute',
23
+ tolerationSeconds: 60,
24
+ },
25
+ ];
26
+ const haTopologySpread = (app) => [
27
+ {
28
+ maxSkew: 1,
29
+ topologyKey: 'kubernetes.io/hostname',
30
+ whenUnsatisfiable: 'ScheduleAnyway',
31
+ // Scope the skew calculation to this component's pods — a constraint
32
+ // without a selector matches every pod in the namespace.
33
+ labelSelector: { matchLabels: { app } },
34
+ },
35
+ ];
36
+ /** URL preview SSRF hardening — block internal/private ranges (production default) */
37
+ const URL_PREVIEW_BLACKLIST = {
38
+ url_preview_enabled: true,
39
+ max_spider_size: '10M',
40
+ url_preview_ip_range_blacklist: [
41
+ '0.0.0.0/8',
42
+ '127.0.0.0/8',
43
+ '10.0.0.0/8',
44
+ '172.16.0.0/12',
45
+ '192.168.0.0/16',
46
+ '100.64.0.0/10',
47
+ '192.0.0.0/24',
48
+ '192.0.2.0/24',
49
+ '198.51.100.0/24',
50
+ '203.0.113.0/24',
51
+ '224.0.0.0/4',
52
+ '240.0.0.0/4',
53
+ '::/128',
54
+ '::1/128',
55
+ 'fe80::/10',
56
+ 'fc00::/7',
57
+ '2001:db8::/32',
58
+ 'ff00::/8',
59
+ 'fec0::/10',
60
+ '169.254.0.0/16',
61
+ ],
62
+ };
63
+ /**
64
+ * Matrix — full Element Server Suite: Synapse homeserver, MAS with Keycloak
65
+ * OIDC, Element Web + Admin, MatrixRTC/LiveKit SFU.
66
+ *
67
+ * @title Matrix (Element Server Suite)
68
+ * @category Collaboration & Productivity
69
+ *
70
+ * Renders the whole suite with production HA defaults: two CNPG databases
71
+ * (optional barman backups), 60s node-failure tolerations + topology spread
72
+ * (learned from a real node-blip incident), SSRF-hardened URL previews, and
73
+ * pinned component versions.
74
+ *
75
+ * Secrets arrive via the Platform secrets backend (openbao/vault) or the
76
+ * `clientSecretRef`/`credentialsSecret` escape hatches — never inline.
77
+ *
78
+ * @example
79
+ * import { Platform } from '@r8s/recipes'
80
+ * import { Matrix } from '@r8s/matrix'
81
+ *
82
+ * export default (
83
+ * <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'matrix' }}>
84
+ * <Matrix
85
+ * domain="example.com"
86
+ * sso={{ issuer: 'https://keycloak.example.com/realms/berget', clientId: 'matrix' }}
87
+ * database={{ backup: { destinationPath: 's3://backups/matrix-cnpg', endpointURL: 'https://s3.example.com' } }}
88
+ * />
89
+ * </Platform>
90
+ * )
91
+ */
92
+ function Matrix(props) {
93
+ const { name = 'matrix', namespace: namespaceProp, domain, hosts, replicas = 2, serverName, sso, database = {}, rtc = {}, appservices = [], version = {}, urlPreview = true, } = props;
94
+ const contextNamespace = (0, core_1.useContext)(defaults_1.Namespace);
95
+ const namespace = namespaceProp ?? (contextNamespace !== 'default' ? contextNamespace : undefined) ?? 'default';
96
+ const secretProvider = (0, core_1.useContext)(defaults_1.SecretContext);
97
+ const sharedOperators = (0, core_1.useContext)(defaults_1.OperatorContext);
98
+ const baseDomain = domain;
99
+ const server = serverName ?? baseDomain;
100
+ const host = {
101
+ web: hosts?.web ?? `element.${baseDomain}`,
102
+ synapse: hosts?.synapse ?? `matrix.${baseDomain}`,
103
+ admin: hosts?.admin ?? `element-admin.${baseDomain}`,
104
+ account: hosts?.account ?? `matrix-account.${baseDomain}`,
105
+ rtc: hosts?.rtc ?? `matrix-rtc.${baseDomain}`,
106
+ };
107
+ // --- secrets: backend or explicit refs ------------------------------------
108
+ const backend = secretProvider?.backend;
109
+ const hasBackend = backend === 'openbao' || backend === 'vault';
110
+ if (sso && !sso.clientSecretRef && !hasBackend) {
111
+ throw new Error(`Matrix "${name}": sso.clientSecretRef is required unless a secrets backend (openbao/vault) is configured on the surrounding Platform.\n\n` +
112
+ `Fix: wrap in <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'matrix' }}>\n` +
113
+ ` or pass sso={{ ..., clientSecretRef: '${name}-keycloak-oidc' }} (a pre-created Secret with key 'clientSecret')`);
114
+ }
115
+ if (database.backup && !database.backup.credentialsSecret && !hasBackend) {
116
+ throw new Error(`Matrix "${name}": database.backup.credentialsSecret is required unless a secrets backend (openbao/vault) is configured.\n\n` +
117
+ `Fix: wrap in <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'matrix' }}>\n` +
118
+ ` or pass database={{ backup: { ..., credentialsSecret: '${name}-backup-credentials' } }}`);
119
+ }
120
+ const resources = [];
121
+ // CNPG operator for the two databases
122
+ if (!sharedOperators.some((op) => op.name === 'cnpg')) {
123
+ resources.push((0, core_1.declareOperator)(crds_1.operators['cnpg']()));
124
+ }
125
+ // --- Secrets via backend (OpenBao/Vault static secret bundles) -------------
126
+ const secretSecretDefs = [];
127
+ if (hasBackend) {
128
+ if (sso && !sso.clientSecretRef) {
129
+ secretSecretDefs.push({
130
+ name: `${name}-keycloak-oidc`,
131
+ path: `${secretProvider.path ?? name}/${name}/keycloak-oidc`,
132
+ keys: { clientSecret: 'clientSecret' },
133
+ });
134
+ }
135
+ if (database.backup && !database.backup.credentialsSecret) {
136
+ secretSecretDefs.push({
137
+ name: `${name}-backup-credentials`,
138
+ path: `${secretProvider.path ?? name}/${name}/backup`,
139
+ keys: { 'access-key-id': 'access-key-id', 'secret-access-key': 'secret-access-key' },
140
+ });
141
+ }
142
+ }
143
+ const StaticSecretComponent = backend === 'openbao' ? 'OpenBaoStaticSecret' : 'VaultStaticSecret';
144
+ const staticSecretApiVersion = backend === 'openbao' ? 'secrets.openbao.org/v1beta1' : 'secrets.hashicorp.com/v1beta1';
145
+ for (const def of secretSecretDefs) {
146
+ resources.push((0, core_1.jsx)(StaticSecretComponent, {
147
+ apiVersion: staticSecretApiVersion,
148
+ kind: StaticSecretComponent,
149
+ metadata: { name: def.name, namespace },
150
+ spec: {
151
+ ...(backend === 'openbao'
152
+ ? { openbaoAuthRef: secretProvider.authRef ?? 'openbao-auth' }
153
+ : { vaultAuthRef: secretProvider.authRef ?? 'vault-auth' }),
154
+ mount: secretProvider.mount ?? 'secret',
155
+ type: 'kv-v2',
156
+ path: def.path,
157
+ refreshAfter: '3600s',
158
+ destination: { create: true, name: def.name },
159
+ },
160
+ }));
161
+ }
162
+ const keycloakSecretName = sso?.clientSecretRef ?? (sso ? `${name}-keycloak-oidc` : undefined);
163
+ const backupCredsSecret = database.backup?.credentialsSecret ??
164
+ (database.backup ? `${name}-backup-credentials` : undefined);
165
+ // --- CNPG databases --------------------------------------------------------
166
+ const dbSpecs = [
167
+ {
168
+ id: 'synapse',
169
+ roleComment: 'Synapse Matrix homeserver',
170
+ params: {
171
+ shared_buffers: '512MB',
172
+ max_connections: '200',
173
+ work_mem: '16MB',
174
+ maintenance_work_mem: '256MB',
175
+ effective_cache_size: '1536MB',
176
+ },
177
+ resources: {
178
+ requests: { memory: '1Gi', cpu: '500m' },
179
+ limits: { memory: '2Gi', cpu: '2000m' },
180
+ },
181
+ },
182
+ {
183
+ id: 'mas',
184
+ roleComment: 'Matrix Authentication Service',
185
+ params: {
186
+ shared_buffers: '256MB',
187
+ max_connections: '100',
188
+ work_mem: '8MB',
189
+ maintenance_work_mem: '128MB',
190
+ effective_cache_size: '768MB',
191
+ },
192
+ resources: {
193
+ requests: { memory: '512Mi', cpu: '250m' },
194
+ limits: { memory: '1Gi', cpu: '1000m' },
195
+ },
196
+ },
197
+ ];
198
+ for (const db of dbSpecs) {
199
+ const clusterName = `${name}-${db.id}-db`;
200
+ const backup = database.backup
201
+ ? {
202
+ barmanObjectStore: {
203
+ destinationPath: `${database.backup.destinationPath}/${db.id}-cnpg`,
204
+ endpointURL: database.backup.endpointURL,
205
+ s3Credentials: {
206
+ accessKeyId: { name: backupCredsSecret, key: 'access-key-id' },
207
+ secretAccessKey: { name: backupCredsSecret, key: 'secret-access-key' },
208
+ },
209
+ wal: { compression: 'gzip', encryption: 'AES256', maxParallel: 2 },
210
+ data: { compression: 'gzip', encryption: 'AES256', jobs: 2 },
211
+ },
212
+ retentionPolicy: database.backup.retention ?? '30d',
213
+ }
214
+ : undefined;
215
+ resources.push((0, core_1.jsx)(postgresql_1.ClusterComponent, {
216
+ metadata: { name: clusterName, namespace },
217
+ spec: {
218
+ instances: database.replicas ?? 2,
219
+ bootstrap: {
220
+ initdb: {
221
+ database: db.id,
222
+ owner: db.id,
223
+ encoding: 'UTF8',
224
+ localeCollate: 'C',
225
+ localeCType: 'C',
226
+ },
227
+ },
228
+ managed: {
229
+ roles: [
230
+ {
231
+ name: db.id,
232
+ ensure: 'present',
233
+ comment: db.roleComment,
234
+ login: true,
235
+ superuser: false,
236
+ createdb: false,
237
+ createrole: false,
238
+ inherit: true,
239
+ replication: false,
240
+ bypassrls: false,
241
+ },
242
+ ],
243
+ },
244
+ monitoring: { enablePodMonitor: true },
245
+ postgresql: { parameters: db.params },
246
+ resources: db.resources,
247
+ storage: {
248
+ size: database.storage ?? '20Gi',
249
+ ...(database.storageClass && { storageClass: database.storageClass }),
250
+ },
251
+ ...(backup && { backup }),
252
+ },
253
+ }));
254
+ if (database.backup) {
255
+ resources.push((0, core_1.jsx)(postgresql_1.ScheduledBackupComponent, {
256
+ metadata: { name: `${clusterName}-backup`, namespace },
257
+ spec: {
258
+ cluster: { name: clusterName },
259
+ schedule: database.backup.schedule ?? '30 3 * * *',
260
+ backupOwnerReference: 'none',
261
+ method: 'barmanObjectStore',
262
+ },
263
+ }));
264
+ }
265
+ }
266
+ // --- Config Maps -----------------------------------------------------------
267
+ const synapseConfig = {
268
+ server_name: server,
269
+ public_baseurl: `https://${host.synapse}/`,
270
+ pid_file: '/data/homeserver.pid',
271
+ listeners: [
272
+ {
273
+ port: 8008,
274
+ tls: false,
275
+ bind_addresses: ['::'],
276
+ type: 'http',
277
+ x_forwarded: true,
278
+ resources: [
279
+ { names: ['client', 'federation'], compress: false },
280
+ { names: ['health'], compress: false },
281
+ ],
282
+ },
283
+ ],
284
+ database: {
285
+ name: 'psycopg2',
286
+ args: {
287
+ host: `${name}-synapse-db-rw`,
288
+ port: 5432,
289
+ database: 'synapse',
290
+ user: 'synapse',
291
+ password_file: '/secrets/db/password',
292
+ sslmode: 'prefer',
293
+ },
294
+ },
295
+ report_stats: false,
296
+ enable_registration: false,
297
+ ...(urlPreview ? { ...URL_PREVIEW_BLACKLIST } : { url_preview_enabled: false }),
298
+ ...(rtc.enabled !== false && {
299
+ experimental_features: { msc4143_rtc_transports: true },
300
+ matrix_rtc: {
301
+ transports: [
302
+ {
303
+ type: 'livekit',
304
+ livekit_service_url: `http://${name}-sfu:7880`,
305
+ },
306
+ ],
307
+ },
308
+ }),
309
+ appservice_config_files: appservices.map((a) => `/appservices/${a.name}.yaml`),
310
+ };
311
+ resources.push((0, core_1.jsx)('ConfigMap', {
312
+ apiVersion: 'v1',
313
+ kind: 'ConfigMap',
314
+ metadata: { name: `${name}-synapse-config`, namespace },
315
+ data: {
316
+ 'homeserver.yaml': '# Generated by @r8s/matrix\n' + toYaml(synapseConfig),
317
+ },
318
+ }));
319
+ const masConfig = {
320
+ database: {
321
+ uri: `postgresql://mas:$(MASPASSWORD)@${name}-mas-db-rw:5432/mas?sslmode=prefer`,
322
+ },
323
+ http: {
324
+ listeners: [
325
+ {
326
+ name: 'web',
327
+ resources: [
328
+ { name: 'discovery' },
329
+ { name: 'oauthapi' },
330
+ { name: 'compatapi' },
331
+ { name: 'graphql' },
332
+ ],
333
+ port: 8080,
334
+ host: '0.0.0.0',
335
+ },
336
+ ],
337
+ },
338
+ ...(sso && {
339
+ upstream_oauth2: {
340
+ providers: [
341
+ {
342
+ id: 'sso',
343
+ issuer: sso.issuer,
344
+ human_name: sso.humanName ?? 'SSO',
345
+ client_id: sso.clientId,
346
+ client_secret: '$MAS_OIDC_CLIENT_SECRET',
347
+ token_endpoint_auth_method: 'client_secret_basic',
348
+ scope: sso.scope ?? 'openid email profile',
349
+ claims_imports: {
350
+ localpart: { action: 'suggest', template: '{{ user.preferred_username }}' },
351
+ displayname: { action: 'suggest', template: '{{ user.name }}' },
352
+ email: { action: 'suggest', template: '{{ user.email }}' },
353
+ },
354
+ },
355
+ ],
356
+ },
357
+ passwords: { enabled: false },
358
+ }),
359
+ };
360
+ resources.push((0, core_1.jsx)('ConfigMap', {
361
+ apiVersion: 'v1',
362
+ kind: 'ConfigMap',
363
+ metadata: { name: `${name}-mas-config`, namespace },
364
+ data: {
365
+ 'config.yaml': '# Generated by @r8s/matrix\n' + toYaml(masConfig),
366
+ },
367
+ }));
368
+ const elementWebConfig = {
369
+ default_server_config: {
370
+ 'm.homeserver': {
371
+ base_url: `https://${host.synapse}`,
372
+ server_name: server,
373
+ },
374
+ 'org.matrix.msc4143.rtc_session': {
375
+ focused_element: { focus_url: `https://${host.rtc}` },
376
+ },
377
+ },
378
+ brand: 'Element',
379
+ default_country_code: 'SE',
380
+ show_labs_settings: true,
381
+ };
382
+ resources.push((0, core_1.jsx)('ConfigMap', {
383
+ apiVersion: 'v1',
384
+ kind: 'ConfigMap',
385
+ metadata: { name: `${name}-web-config`, namespace },
386
+ data: { 'config.json': JSON.stringify(elementWebConfig, null, 2) },
387
+ }));
388
+ if (rtc.enabled !== false) {
389
+ const rtcConfig = {
390
+ port: 7880,
391
+ log_level: 'info',
392
+ rtc: {
393
+ tcp_port: 30001,
394
+ muxed_udp_port: 30002,
395
+ ...(rtc.manualIP
396
+ ? { node_ip: rtc.manualIP, use_external_ip: false }
397
+ : { use_external_ip: true }),
398
+ ...(rtc.stunServers?.length && { stun_servers: rtc.stunServers }),
399
+ packet_buffer_size_video: 1000,
400
+ packet_buffer_size_audio: 400,
401
+ batch_io: { batch_size: 256, max_flush_interval: '1ms' },
402
+ },
403
+ audio: { active_red_encoding: true },
404
+ ...(rtc.turnPort !== 0 && {
405
+ turn: {
406
+ enabled: true,
407
+ domain: host.rtc,
408
+ tls_port: 0,
409
+ udp_port: rtc.turnPort ?? 30004,
410
+ },
411
+ }),
412
+ keys: 'livekit-key: $(LIVEKIT_API_SECRET)',
413
+ };
414
+ resources.push((0, core_1.jsx)('ConfigMap', {
415
+ apiVersion: 'v1',
416
+ kind: 'ConfigMap',
417
+ metadata: { name: `${name}-sfu-config`, namespace },
418
+ data: { 'livekit.yaml': '# Generated by @r8s/matrix\n' + toYaml(rtcConfig) },
419
+ }));
420
+ }
421
+ // --- Appservice registrations ---------------------------------------------
422
+ // Registrations carry as_token/hs_token — they render as Secrets, never
423
+ // ConfigMaps. Prefer `secretRef` (existing Secret from the secrets backend)
424
+ // or placeholders; the noPlaintextSecrets guardrail flags live token values.
425
+ for (const appservice of appservices) {
426
+ if (!appservice.secretRef) {
427
+ resources.push((0, core_1.jsx)('Secret', {
428
+ apiVersion: 'v1',
429
+ kind: 'Secret',
430
+ metadata: { name: `${name}-appservice-${appservice.name}`, namespace },
431
+ stringData: { 'registration.yaml': toYaml(appservice.registration ?? {}) },
432
+ }));
433
+ }
434
+ }
435
+ // --- Deployments ------------------------------------------------------------
436
+ const synapseVersion = version.synapse ?? 'v1.99.0';
437
+ const masVersion = version.mas ?? 'latest';
438
+ const webVersion = version.web ?? 'v1.12.15';
439
+ const adminVersion = version.admin ?? 'latest';
440
+ const sfuVersion = version.sfu ?? rtc.sfuVersion ?? 'v1.10.1';
441
+ const synapseEnv = [
442
+ {
443
+ name: 'SYNAPSE_CONFIG_PATH',
444
+ value: '/data/homeserver.yaml',
445
+ },
446
+ ];
447
+ resources.push((0, core_1.jsx)('Deployment', {
448
+ apiVersion: 'apps/v1',
449
+ kind: 'Deployment',
450
+ metadata: { name: `${name}-synapse`, namespace },
451
+ spec: {
452
+ replicas: 1, // federation workers land separately — single writer for now
453
+ strategy: { type: 'Recreate' },
454
+ selector: { matchLabels: { app: `${name}-synapse` } },
455
+ template: {
456
+ metadata: { labels: { app: `-synapse` } },
457
+ spec: {
458
+ tolerations: HA_TOLERATIONS,
459
+ topologySpreadConstraints: haTopologySpread(`${name}-synapse`),
460
+ securityContext: { fsGroup: 991, fsGroupChangePolicy: 'OnRootMismatch' },
461
+ containers: [
462
+ {
463
+ name: 'synapse',
464
+ image: `matrixdotorg/synapse:${synapseVersion}`,
465
+ imagePullPolicy: 'IfNotPresent',
466
+ ports: [{ containerPort: 8008, name: 'client' }],
467
+ env: synapseEnv,
468
+ // /tmp must be writable — readOnlyRootFilesystem + Twisted
469
+ // tempfile buffering breaks media uploads otherwise (upstream
470
+ // matrix-stack 26.9.0 regression)
471
+ volumeMounts: [
472
+ {
473
+ name: 'config',
474
+ mountPath: '/data/homeserver.yaml',
475
+ subPath: 'homeserver.yaml',
476
+ readOnly: true,
477
+ },
478
+ { name: 'db-credentials', mountPath: '/secrets/db', readOnly: true },
479
+ { name: 'tmp', mountPath: '/tmp' },
480
+ ...appservices.map((a) => ({
481
+ name: `appservice-${a.name}`,
482
+ mountPath: `/appservices/${a.name}.yaml`,
483
+ subPath: a.key ?? 'registration.yaml',
484
+ readOnly: true,
485
+ })),
486
+ ],
487
+ livenessProbe: {
488
+ httpGet: { path: '/health', port: 8008 },
489
+ periodSeconds: 30,
490
+ timeoutSeconds: 5,
491
+ },
492
+ readinessProbe: {
493
+ httpGet: { path: '/health', port: 8008 },
494
+ periodSeconds: 10,
495
+ timeoutSeconds: 3,
496
+ },
497
+ resources: {
498
+ requests: { memory: '1Gi', cpu: '500m' },
499
+ limits: { memory: '2Gi', cpu: '2000m' },
500
+ },
501
+ },
502
+ ],
503
+ volumes: [
504
+ { name: 'config', configMap: { name: `${name}-synapse-config` } },
505
+ // CNPG generates the database credentials Secret (<cluster>-app)
506
+ { name: 'db-credentials', secret: { secretName: `${name}-synapse-db-app` } },
507
+ { name: 'tmp', emptyDir: { sizeLimit: '1Gi' } },
508
+ ...appservices.map((a) => ({
509
+ name: `appservice-${a.name}`,
510
+ secret: {
511
+ secretName: a.secretRef ?? `${name}-appservice-${a.name}`,
512
+ },
513
+ })),
514
+ ],
515
+ },
516
+ },
517
+ },
518
+ }));
519
+ const masEnv = [
520
+ {
521
+ name: 'MASPASSWORD',
522
+ valueFrom: { secretKeyRef: { name: `${name}-mas-db-app`, key: 'password' } },
523
+ },
524
+ ...(keycloakSecretName
525
+ ? [
526
+ {
527
+ name: 'MAS_OIDC_CLIENT_SECRET',
528
+ valueFrom: { secretKeyRef: { name: keycloakSecretName, key: 'clientSecret' } },
529
+ },
530
+ ]
531
+ : []),
532
+ {
533
+ name: 'MAS_CONFIG_FILE',
534
+ value: '/config/config.yaml',
535
+ },
536
+ ];
537
+ resources.push((0, core_1.jsx)('Deployment', {
538
+ apiVersion: 'apps/v1',
539
+ kind: 'Deployment',
540
+ metadata: { name: `${name}-mas`, namespace },
541
+ spec: {
542
+ replicas,
543
+ strategy: { type: 'RollingUpdate', rollingUpdate: { maxSurge: 1, maxUnavailable: 0 } },
544
+ selector: { matchLabels: { app: `${name}-mas` } },
545
+ template: {
546
+ metadata: { labels: { app: `-mas` } },
547
+ spec: {
548
+ tolerations: HA_TOLERATIONS,
549
+ topologySpreadConstraints: haTopologySpread(`${name}-mas`),
550
+ containers: [
551
+ {
552
+ name: 'mas',
553
+ image: `ghcr.io/element-hq/matrix-authentication-service:${masVersion}`,
554
+ imagePullPolicy: 'IfNotPresent',
555
+ args: ['server', '--config', '/config/config.yaml'],
556
+ ports: [{ containerPort: 8080, name: 'http' }],
557
+ env: masEnv,
558
+ volumeMounts: [{ name: 'config', mountPath: '/config', readOnly: true }],
559
+ livenessProbe: {
560
+ httpGet: { path: '/health', port: 8080 },
561
+ periodSeconds: 30,
562
+ timeoutSeconds: 5,
563
+ },
564
+ readinessProbe: {
565
+ httpGet: { path: '/health', port: 8080 },
566
+ periodSeconds: 10,
567
+ timeoutSeconds: 3,
568
+ },
569
+ resources: {
570
+ requests: { memory: '256Mi', cpu: '100m' },
571
+ limits: { memory: '512Mi', cpu: '500m' },
572
+ },
573
+ },
574
+ ],
575
+ volumes: [{ name: 'config', configMap: { name: `${name}-mas-config` } }],
576
+ },
577
+ },
578
+ },
579
+ }));
580
+ resources.push((0, core_1.jsx)('Deployment', {
581
+ apiVersion: 'apps/v1',
582
+ kind: 'Deployment',
583
+ metadata: { name: `${name}-web`, namespace },
584
+ spec: {
585
+ replicas,
586
+ selector: { matchLabels: { app: `${name}-web` } },
587
+ template: {
588
+ metadata: { labels: { app: `-web` } },
589
+ spec: {
590
+ tolerations: HA_TOLERATIONS,
591
+ topologySpreadConstraints: haTopologySpread(`${name}-web`),
592
+ containers: [
593
+ {
594
+ name: 'web',
595
+ image: `vectorim/element-web:${webVersion}`,
596
+ imagePullPolicy: 'IfNotPresent',
597
+ ports: [{ containerPort: 80, name: 'http' }],
598
+ volumeMounts: [
599
+ {
600
+ name: 'config',
601
+ mountPath: '/app/config.json',
602
+ subPath: 'config.json',
603
+ readOnly: true,
604
+ },
605
+ ],
606
+ livenessProbe: { httpGet: { path: '/', port: 80 }, periodSeconds: 30 },
607
+ readinessProbe: { httpGet: { path: '/', port: 80 }, periodSeconds: 10 },
608
+ resources: {
609
+ requests: { memory: '64Mi', cpu: '50m' },
610
+ limits: { memory: '256Mi', cpu: '200m' },
611
+ },
612
+ },
613
+ ],
614
+ volumes: [{ name: 'config', configMap: { name: `${name}-web-config` } }],
615
+ },
616
+ },
617
+ },
618
+ }));
619
+ resources.push((0, core_1.jsx)('Deployment', {
620
+ apiVersion: 'apps/v1',
621
+ kind: 'Deployment',
622
+ metadata: { name: `${name}-admin`, namespace },
623
+ spec: {
624
+ replicas,
625
+ selector: { matchLabels: { app: `${name}-admin` } },
626
+ template: {
627
+ metadata: { labels: { app: `-admin` } },
628
+ spec: {
629
+ tolerations: HA_TOLERATIONS,
630
+ topologySpreadConstraints: haTopologySpread(`${name}-admin`),
631
+ containers: [
632
+ {
633
+ name: 'admin',
634
+ image: `ghcr.io/element-hq/element-admin:${adminVersion}`,
635
+ imagePullPolicy: 'IfNotPresent',
636
+ ports: [{ containerPort: 8080, name: 'http' }],
637
+ livenessProbe: { httpGet: { path: '/', port: 8080 }, periodSeconds: 30 },
638
+ readinessProbe: { httpGet: { path: '/', port: 8080 }, periodSeconds: 10 },
639
+ resources: {
640
+ requests: { memory: '64Mi', cpu: '50m' },
641
+ limits: { memory: '256Mi', cpu: '200m' },
642
+ },
643
+ },
644
+ ],
645
+ },
646
+ },
647
+ },
648
+ }));
649
+ if (rtc.enabled !== false) {
650
+ resources.push((0, core_1.jsx)('Deployment', {
651
+ apiVersion: 'apps/v1',
652
+ kind: 'Deployment',
653
+ metadata: { name: `${name}-sfu`, namespace },
654
+ spec: {
655
+ replicas: 1,
656
+ strategy: { type: 'Recreate' },
657
+ selector: { matchLabels: { app: `${name}-sfu` } },
658
+ template: {
659
+ metadata: { labels: { app: `${name}-sfu` } },
660
+ spec: {
661
+ tolerations: HA_TOLERATIONS,
662
+ containers: [
663
+ {
664
+ name: 'sfu',
665
+ image: `livekit/livekit-server:${sfuVersion}`,
666
+ imagePullPolicy: 'IfNotPresent',
667
+ args: ['--config', '/etc/livekit.yaml'],
668
+ ports: [
669
+ { containerPort: 7880, name: 'api' },
670
+ { containerPort: 30001, name: 'rtc-tcp' },
671
+ // LiveKit listens on UDP here even though some Helm charts
672
+ // declare TCP — the Service below routes numerically anyway
673
+ { containerPort: 30002, name: 'rtc-muxed-udp', protocol: 'UDP' },
674
+ { containerPort: rtc.turnPort ?? 30004, name: 'turn-udp', protocol: 'UDP' },
675
+ ],
676
+ env: [
677
+ {
678
+ name: 'LIVEKIT_API_SECRET',
679
+ valueFrom: { secretKeyRef: { name: `${name}-rtc-auth`, key: 'secret' } },
680
+ },
681
+ ],
682
+ volumeMounts: [{ name: 'config', mountPath: '/etc', readOnly: true }],
683
+ livenessProbe: { httpGet: { path: '/', port: 7880 }, periodSeconds: 30 },
684
+ readinessProbe: { httpGet: { path: '/', port: 7880 }, periodSeconds: 10 },
685
+ resources: {
686
+ requests: { memory: '512Mi', cpu: '500m' },
687
+ limits: { memory: '2Gi', cpu: '2000m' },
688
+ },
689
+ },
690
+ ],
691
+ volumes: [{ name: 'config', configMap: { name: `${name}-sfu-config` } }],
692
+ },
693
+ },
694
+ },
695
+ }));
696
+ // Combined LoadBalancer for all SFU traffic — one external IP for
697
+ // TCP+UDP (Harvester CCM shares the pool IP via ipam annotation).
698
+ // Always LoadBalancer: as ClusterIP the UDP/TURN ports are unreachable,
699
+ // which silently breaks MatrixRTC.
700
+ // Numeric targetPorts: the pod's muxed-UDP port is sometimes declared
701
+ // TCP by charts — numeric bypasses that entirely.
702
+ resources.push((0, core_1.jsx)('Service', {
703
+ apiVersion: 'v1',
704
+ kind: 'Service',
705
+ metadata: {
706
+ name: `${name}-sfu`,
707
+ namespace,
708
+ annotations: {
709
+ 'cloudprovider.harvesterhci.io/ipam': 'pool',
710
+ },
711
+ },
712
+ spec: {
713
+ type: 'LoadBalancer',
714
+ externalTrafficPolicy: 'Local',
715
+ ...(rtc.manualIP && { loadBalancerIP: rtc.manualIP }),
716
+ selector: { app: `${name}-sfu` },
717
+ ports: [
718
+ { name: 'api', port: 7880, targetPort: 7880, protocol: 'TCP' },
719
+ { name: 'rtc-tcp', port: 30001, targetPort: 30001, protocol: 'TCP' },
720
+ { name: 'rtc-muxed-udp', port: 30002, targetPort: 30002, protocol: 'UDP' },
721
+ {
722
+ name: 'turn-udp',
723
+ port: rtc.turnPort ?? 30004,
724
+ targetPort: rtc.turnPort ?? 30004,
725
+ protocol: 'UDP',
726
+ },
727
+ ],
728
+ },
729
+ }));
730
+ }
731
+ // --- ClusterIP services -----------------------------------------------------
732
+ for (const svc of [
733
+ { svcName: `${name}-synapse`, port: 8008, app: `${name}-synapse` },
734
+ { svcName: `${name}-mas`, port: 8080, app: `${name}-mas` },
735
+ { svcName: `${name}-web`, port: 80, app: `${name}-web` },
736
+ { svcName: `${name}-admin`, port: 8080, app: `${name}-admin` },
737
+ ]) {
738
+ resources.push((0, core_1.jsx)('Service', {
739
+ apiVersion: 'v1',
740
+ kind: 'Service',
741
+ metadata: { name: svc.svcName, namespace },
742
+ spec: {
743
+ type: 'ClusterIP',
744
+ selector: { app: svc.app },
745
+ ports: [{ port: svc.port, targetPort: svc.port }],
746
+ },
747
+ }));
748
+ }
749
+ // --- Endpoints (5 hosts) ----------------------------------------------------
750
+ const endpointDefs = [
751
+ { host: host.web, serviceName: `${name}-web`, servicePort: 80, suffix: 'web' },
752
+ { host: host.synapse, serviceName: `${name}-synapse`, servicePort: 8008, suffix: 'synapse' },
753
+ { host: host.admin, serviceName: `${name}-admin`, servicePort: 8080, suffix: 'admin' },
754
+ { host: host.account, serviceName: `${name}-mas`, servicePort: 8080, suffix: 'account' },
755
+ ];
756
+ if (rtc.enabled !== false) {
757
+ endpointDefs.push({
758
+ host: host.rtc,
759
+ serviceName: `${name}-sfu`,
760
+ servicePort: 7880,
761
+ suffix: 'rtc',
762
+ });
763
+ }
764
+ for (const ep of endpointDefs) {
765
+ resources.push((0, core_1.jsx)(recipes_1.Endpoint, {
766
+ name: `${name}-${ep.suffix}`,
767
+ namespace,
768
+ host: ep.host,
769
+ serviceName: ep.serviceName,
770
+ servicePort: ep.servicePort,
771
+ tls: { secretName: `${name}-${ep.suffix}-tls`, clusterIssuer: 'letsencrypt-prod' },
772
+ }));
773
+ }
774
+ return (0, core_1.jsx)(core_1.Fragment, { children: resources });
775
+ }
776
+ /** Minimal YAML serialiser for the embedded configs (the stack is
777
+ * configuration-heavy; embedding a full YAML dep just for these is overkill) */
778
+ function toYaml(value, indent = 0) {
779
+ const pad = ' '.repeat(indent);
780
+ if (Array.isArray(value)) {
781
+ return value
782
+ .map((item) => {
783
+ if (typeof item === 'object' && item !== null) {
784
+ const inner = toYaml(item, indent + 2);
785
+ return `${pad}-\n${inner}`;
786
+ }
787
+ return `${pad}- ${item}`;
788
+ })
789
+ .join('\n');
790
+ }
791
+ if (typeof value === 'object' && value !== null) {
792
+ return Object.entries(value)
793
+ .map(([key, val]) => {
794
+ if (typeof val === 'object' && val !== null) {
795
+ return `${pad}${key}:\n${toYaml(val, indent + 2)}`;
796
+ }
797
+ return `${pad}${key}: ${yamlScalar(val)}`;
798
+ })
799
+ .join('\n');
800
+ }
801
+ return `${pad}${yamlScalar(value)}`;
802
+ }
803
+ function yamlScalar(value) {
804
+ if (typeof value === 'number' || typeof value === 'boolean')
805
+ return String(value);
806
+ if (value === null || value === undefined)
807
+ return 'null';
808
+ const str = String(value);
809
+ if (/[:#\s'"{}[\],&*!|>%@`]/.test(str) || str === '' || str.startsWith('$')) {
810
+ return `'${str.replace(/'/g, "''")}'`;
811
+ }
812
+ return str;
813
+ }
814
+ //# 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,53 @@
1
+ {
2
+ "name": "@r8s/matrix",
3
+ "version": "0.2.0",
4
+ "description": "Matrix (Element Server Suite) — Synapse homeserver, MAS auth with Keycloak OIDC, Element Web/Admin, MatrixRTC/LiveKit SFU with HA defaults",
5
+ "license": "MIT",
6
+ "author": "Berget AI AB",
7
+ "homepage": "https://r8s.berget.ai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/berget-ai/r8s",
11
+ "directory": "packages/matrix"
12
+ },
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "require": "./dist/index.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "scripts": {
26
+ "build": "tsc --build",
27
+ "test": "vitest run",
28
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
29
+ },
30
+ "category": "Collaboration & Productivity",
31
+ "keywords": [
32
+ "matrix",
33
+ "element",
34
+ "synapse",
35
+ "chat",
36
+ "rtc",
37
+ "oidc"
38
+ ],
39
+ "dependencies": {
40
+ "@r8s/core": "^0.2.0",
41
+ "@r8s/crds": "^0.2.0",
42
+ "@r8s/k8s-types": "^0.2.0",
43
+ "@r8s/recipes": "^0.2.0"
44
+ },
45
+ "devDependencies": {
46
+ "typescript": "^5.3.0",
47
+ "vitest": "^1.0.0"
48
+ },
49
+ "bugs": "https://github.com/berget-ai/r8s/issues",
50
+ "r8s": {
51
+ "category": "Collaboration & Productivity"
52
+ }
53
+ }