@r8s/nextcloud 0.2.0 → 0.3.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,132 @@
1
+ export interface NextcloudProps {
2
+ /** Resource name (defaults to 'nextcloud') */
3
+ name?: string;
4
+ /** Kubernetes namespace (defaults to 'default') */
5
+ namespace?: string;
6
+ /** Container image tag (defaults to '31-apache' — pin a version in production) */
7
+ version?: string;
8
+ /** Public hostname for the web UI and WebDAV (required) */
9
+ host: string;
10
+ /**
11
+ * Number of replicas. Safe to scale beyond 1 when `objectStorage` is
12
+ * configured (file blobs live in S3) and `cache` is enabled — Nextcloud
13
+ * becomes effectively stateless. Requires a StorageClass with
14
+ * ReadWriteMany support for the /var/www/html claim.
15
+ */
16
+ replicas?: number;
17
+ /** Provision a Redis replication set for file locking and caching (default: true) */
18
+ cache?: boolean;
19
+ /**
20
+ * Size of the PersistentVolumeClaim backing /var/www/html (defaults to
21
+ * '10Gi'). Apps, config and the data directory all live in this tree.
22
+ */
23
+ storage?: string;
24
+ /**
25
+ * StorageClass for the /var/www/html PersistentVolumeClaim. Must provide
26
+ * ReadWriteMany when `replicas` > 1 (e.g. NFS or EFS). Defaults to the
27
+ * cluster default StorageClass when omitted.
28
+ */
29
+ storageClassName?: string;
30
+ /**
31
+ * S3-compatible object storage used as primary storage for files
32
+ * (RustFS in the platform). Reference a bucket whose credentials live
33
+ * in a Secret provisioned by the secrets backend (keys: accessKey,
34
+ * secretKey) — never plaintext.
35
+ */
36
+ objectStorage?: {
37
+ /** S3 host WITHOUT protocol/scheme, e.g. s3.internal.example.com */
38
+ endpoint: string;
39
+ /** Bucket used for user files */
40
+ bucket: string;
41
+ /** Name of the Secret holding accessKey / secretKey */
42
+ credentialsSecret: string;
43
+ /** Region string for the S3 client (defaults to 'us-east-1') */
44
+ region?: string;
45
+ /** TCP port of the S3 endpoint (defaults to the provider default, typically 443) */
46
+ port?: number;
47
+ /** Use TLS against the S3 endpoint (default: true) */
48
+ ssl?: boolean;
49
+ };
50
+ /**
51
+ * Name of an existing Secret holding the Nextcloud app secrets
52
+ * (key: adminPassword). Required unless a secrets backend
53
+ * (openbao/vault) is configured on the surrounding Platform — the
54
+ * backend then provisions them automatically. Plaintext admin
55
+ * passwords are not supported.
56
+ */
57
+ secretsName?: string;
58
+ /** Requested resources */
59
+ resources?: {
60
+ requests?: {
61
+ cpu?: string;
62
+ memory?: string;
63
+ };
64
+ limits?: {
65
+ cpu?: string;
66
+ memory?: string;
67
+ };
68
+ };
69
+ /** TLS configuration (defaults to letsencrypt-prod cluster issuer) */
70
+ tls?: {
71
+ secretName: string;
72
+ clusterIssuer: string;
73
+ };
74
+ }
75
+ /**
76
+ * Nextcloud — self-hosted file cloud with Postgres, Redis, S3 primary
77
+ * storage and background cron jobs.
78
+ *
79
+ * @title Nextcloud
80
+ * @category File & Collaboration
81
+ *
82
+ * Composes:
83
+ * - CNPG Postgres cluster (file index, shares, user data)
84
+ * - Redis replication set for file locking and caching (default on)
85
+ * - PersistentVolumeClaim backing /var/www/html (ReadWriteMany)
86
+ * - Nextcloud Deployment + Service + Endpoint (nextcloud:31-apache,
87
+ * probed via /status.php)
88
+ * - CronJob running `php -f /var/www/html/cron.php` every 5 minutes on
89
+ * the same claim (concurrency forbidden)
90
+ * - S3/RustFS bucket reference for primary file storage
91
+ * - Admin bootstrap password provisioned by the Platform secrets
92
+ * backend (openbao / vault), or referenced from an existing Secret
93
+ *
94
+ * The main app is a raw Deployment (not WebService) because Nextcloud
95
+ * needs the /var/www/html claim volume-mounted; the CronJob shares the
96
+ * same claim so background jobs operate on the live data tree.
97
+ *
98
+ * @example
99
+ * import { Platform } from '@r8s/recipes'
100
+ * import { Nextcloud } from '@r8s/nextcloud'
101
+ *
102
+ * export default (
103
+ * <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>
104
+ * <Nextcloud
105
+ * name="cloud"
106
+ * host="cloud.example.com"
107
+ * objectStorage={{
108
+ * endpoint: 's3.internal.example.com',
109
+ * bucket: 'cloud-files',
110
+ * credentialsSecret: 'cloud-files-credentials',
111
+ * }}
112
+ * />
113
+ * </Platform>
114
+ * )
115
+ * @example
116
+ * import { Nextcloud } from '@r8s/nextcloud'
117
+ *
118
+ * export default (
119
+ * <Nextcloud
120
+ * name="cloud"
121
+ * host="${env:CLOUD_HOST}"
122
+ * secretsName="cloud-app-secrets"
123
+ * objectStorage={{
124
+ * endpoint: '${env:S3_ENDPOINT}',
125
+ * bucket: 'cloud-files',
126
+ * credentialsSecret: 'cloud-files-credentials',
127
+ * }}
128
+ * />
129
+ * )
130
+ */
131
+ export declare function Nextcloud(props: NextcloudProps): import("@r8s/core").r8sElement;
132
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAA;IACZ;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qFAAqF;IACrF,KAAK,CAAC,EAAE,OAAO,CAAA;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB;;;;;OAKG;IACH,aAAa,CAAC,EAAE;QACd,oEAAoE;QACpE,QAAQ,EAAE,MAAM,CAAA;QAChB,iCAAiC;QACjC,MAAM,EAAE,MAAM,CAAA;QACd,uDAAuD;QACvD,iBAAiB,EAAE,MAAM,CAAA;QACzB,gEAAgE;QAChE,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,oFAAoF;QACpF,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,sDAAsD;QACtD,GAAG,CAAC,EAAE,OAAO,CAAA;KACd,CAAA;IACD;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,0BAA0B;IAC1B,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,sEAAsE;IACtE,GAAG,CAAC,EAAE;QACJ,UAAU,EAAE,MAAM,CAAA;QAClB,aAAa,EAAE,MAAM,CAAA;KACtB,CAAA;CACF;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,kCAsT9C"}
package/dist/index.js ADDED
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Nextcloud = Nextcloud;
4
+ const jsx_runtime_1 = require("@r8s/core/jsx-runtime");
5
+ const core_1 = require("@r8s/core");
6
+ const defaults_1 = require("@r8s/core/defaults");
7
+ const recipes_1 = require("@r8s/recipes");
8
+ const redis_1 = require("@r8s/crds/redis");
9
+ const operator_redis_1 = require("@r8s/operator-redis");
10
+ const HTML_MOUNT = '/var/www/html';
11
+ const STATUS_PATH = '/status.php';
12
+ /**
13
+ * Nextcloud — self-hosted file cloud with Postgres, Redis, S3 primary
14
+ * storage and background cron jobs.
15
+ *
16
+ * @title Nextcloud
17
+ * @category File & Collaboration
18
+ *
19
+ * Composes:
20
+ * - CNPG Postgres cluster (file index, shares, user data)
21
+ * - Redis replication set for file locking and caching (default on)
22
+ * - PersistentVolumeClaim backing /var/www/html (ReadWriteMany)
23
+ * - Nextcloud Deployment + Service + Endpoint (nextcloud:31-apache,
24
+ * probed via /status.php)
25
+ * - CronJob running `php -f /var/www/html/cron.php` every 5 minutes on
26
+ * the same claim (concurrency forbidden)
27
+ * - S3/RustFS bucket reference for primary file storage
28
+ * - Admin bootstrap password provisioned by the Platform secrets
29
+ * backend (openbao / vault), or referenced from an existing Secret
30
+ *
31
+ * The main app is a raw Deployment (not WebService) because Nextcloud
32
+ * needs the /var/www/html claim volume-mounted; the CronJob shares the
33
+ * same claim so background jobs operate on the live data tree.
34
+ *
35
+ * @example
36
+ * import { Platform } from '@r8s/recipes'
37
+ * import { Nextcloud } from '@r8s/nextcloud'
38
+ *
39
+ * export default (
40
+ * <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>
41
+ * <Nextcloud
42
+ * name="cloud"
43
+ * host="cloud.example.com"
44
+ * objectStorage={{
45
+ * endpoint: 's3.internal.example.com',
46
+ * bucket: 'cloud-files',
47
+ * credentialsSecret: 'cloud-files-credentials',
48
+ * }}
49
+ * />
50
+ * </Platform>
51
+ * )
52
+ * @example
53
+ * import { Nextcloud } from '@r8s/nextcloud'
54
+ *
55
+ * export default (
56
+ * <Nextcloud
57
+ * name="cloud"
58
+ * host="${env:CLOUD_HOST}"
59
+ * secretsName="cloud-app-secrets"
60
+ * objectStorage={{
61
+ * endpoint: '${env:S3_ENDPOINT}',
62
+ * bucket: 'cloud-files',
63
+ * credentialsSecret: 'cloud-files-credentials',
64
+ * }}
65
+ * />
66
+ * )
67
+ */
68
+ function Nextcloud(props) {
69
+ const { name = 'nextcloud', namespace = 'default', version = '31-apache', host, replicas = 1, cache = true, storage = '10Gi', storageClassName, objectStorage, secretsName, resources = {
70
+ requests: { memory: '512Mi', cpu: '250m' },
71
+ limits: { memory: '2Gi', cpu: '1000m' },
72
+ }, tls = { secretName: `${name}-tls`, clusterIssuer: 'letsencrypt-prod' }, } = props;
73
+ const sharedOperators = (0, core_1.useContext)(defaults_1.OperatorContext);
74
+ const secretProvider = (0, core_1.useContext)(defaults_1.SecretContext);
75
+ const resources_ = [];
76
+ const dbHost = `${name}-rw`;
77
+ const dbCredentialsName = `${name}-db-credentials`;
78
+ const appSecretsName = secretsName ?? `${name}-app-secrets`;
79
+ const htmlClaim = `${name}-html`;
80
+ const image = `nextcloud:${version}`;
81
+ const cronSchedule = '*/5 * * * *';
82
+ // --- App secrets provisioning ---------------------------------------------
83
+ // The admin bootstrap password must never be rendered as plaintext. With a
84
+ // secrets backend it is provisioned through the backend (key `adminPassword`);
85
+ // otherwise reference a pre-created Secret.
86
+ if (!secretsName) {
87
+ if (!secretProvider ||
88
+ (secretProvider.backend !== 'vault' && secretProvider.backend !== 'openbao')) {
89
+ throw new Error(`Nextcloud "${name}" requires application secrets (NEXTCLOUD_ADMIN_PASSWORD).\n` +
90
+ `\n` +
91
+ `Nextcloud bootstraps its admin account from this password — it must not ` +
92
+ `be rendered as plaintext.\n` +
93
+ `\n` +
94
+ `Fix: configure a secrets backend on the Platform:\n` +
95
+ ` <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>\n` +
96
+ ` <Nextcloud name="${name}" host="${host}" />\n` +
97
+ ` </Platform>\n` +
98
+ `\n` +
99
+ `Or reference a pre-created Secret (key: adminPassword):\n` +
100
+ ` <Nextcloud name="${name}" host="${host}" secretsName="${name}-app-secrets" />`);
101
+ }
102
+ const spec = {
103
+ ...(secretProvider.backend === 'vault'
104
+ ? { vaultAuthRef: secretProvider.authRef }
105
+ : { openbaoAuthRef: secretProvider.authRef }),
106
+ mount: secretProvider.mount,
107
+ type: 'kv-v2',
108
+ path: `${secretProvider.path ?? name}/${name}/secrets`,
109
+ destination: { create: true, name: appSecretsName },
110
+ };
111
+ resources_.push(secretProvider.backend === 'vault'
112
+ ? (0, core_1.jsx)('VaultStaticSecret', {
113
+ apiVersion: 'secrets.hashicorp.com/v1beta1',
114
+ kind: 'VaultStaticSecret',
115
+ metadata: { name: `${name}-secrets`, namespace },
116
+ spec,
117
+ })
118
+ : (0, core_1.jsx)('OpenBaoStaticSecret', {
119
+ apiVersion: 'secrets.openbao.org/v1beta1',
120
+ kind: 'OpenBaoStaticSecret',
121
+ metadata: { name: `${name}-secrets`, namespace },
122
+ spec,
123
+ }));
124
+ }
125
+ // --- Operators -------------------------------------------------------------
126
+ if (cache) {
127
+ resources_.push(...(0, operator_redis_1.declareIfMissing)(sharedOperators));
128
+ }
129
+ // Redis — file locking + caching (OT-Container-Kit operator). A
130
+ // RedisReplication (master/replica) is what Nextcloud's locking needs;
131
+ // cluster mode is overkill and the `${name}-redis` service fronts it.
132
+ if (cache) {
133
+ resources_.push((0, redis_1.RedisReplicationComponent)({
134
+ metadata: { name: `${name}-redis`, namespace },
135
+ spec: {
136
+ clusterSize: 3,
137
+ kubernetesConfig: { image: 'redis:7.2-alpine' },
138
+ },
139
+ }));
140
+ }
141
+ // --- /var/www/html persistence ----------------------------------------------
142
+ // Apps, config and the data directory live under /var/www/html and must
143
+ // survive pod restarts. ReadWriteMany lets the cron job share the same
144
+ // tree and keeps replicas > 1 viable (requires an RWX StorageClass).
145
+ const htmlPvc = {
146
+ apiVersion: 'v1',
147
+ kind: 'PersistentVolumeClaim',
148
+ metadata: { name: htmlClaim, namespace, labels: { app: name } },
149
+ spec: {
150
+ accessModes: ['ReadWriteMany'],
151
+ resources: { requests: { storage } },
152
+ ...(storageClassName && { storageClassName }),
153
+ },
154
+ };
155
+ resources_.push((0, core_1.jsx)('PersistentVolumeClaim', htmlPvc));
156
+ // --- Env wiring --------------------------------------------------------------
157
+ // Every credential is referenced with $(VAR) expansion or secretKeyRef —
158
+ // no plaintext in the manifest. Secret-backed vars are declared BEFORE
159
+ // plain env vars so dependent $(VAR) expansion resolves. Nextcloud
160
+ // natively reads POSTGRES_* and OBJECTSTORE_S3_*; the S3 keys/secrets are
161
+ // expanded from the AWS_* secret-backed vars. (Nextcloud ignores
162
+ // DATABASE_URL — do not add it back.)
163
+ const secrets = {
164
+ PGPASSWORD: { secret: dbCredentialsName, key: 'password' },
165
+ NEXTCLOUD_ADMIN_PASSWORD: { secret: appSecretsName, key: 'adminPassword' },
166
+ ...(objectStorage
167
+ ? {
168
+ AWS_ACCESS_KEY_ID: { secret: objectStorage.credentialsSecret, key: 'accessKey' },
169
+ AWS_SECRET_ACCESS_KEY: { secret: objectStorage.credentialsSecret, key: 'secretKey' },
170
+ }
171
+ : {}),
172
+ };
173
+ const env = {
174
+ POSTGRES_HOST: dbHost,
175
+ POSTGRES_PORT: '5432',
176
+ POSTGRES_DB: name,
177
+ POSTGRES_USER: name,
178
+ POSTGRES_PASSWORD: '$(PGPASSWORD)',
179
+ NEXTCLOUD_ADMIN_USER: 'admin',
180
+ NEXTCLOUD_TRUSTED_DOMAINS: host,
181
+ OVERWRITEHOST: host,
182
+ OVERWRITEPROTOCOL: 'https',
183
+ OVERWRITECLIURL: `https://${host}`,
184
+ ...(cache ? { REDIS_HOST: `${name}-redis`, REDIS_HOST_PORT: '6379' } : {}),
185
+ ...(objectStorage
186
+ ? {
187
+ OBJECTSTORE_S3_HOST: objectStorage.endpoint,
188
+ OBJECTSTORE_S3_BUCKET: objectStorage.bucket,
189
+ OBJECTSTORE_S3_REGION: objectStorage.region ?? 'us-east-1',
190
+ OBJECTSTORE_S3_SSL: (objectStorage.ssl ?? true) ? 'true' : 'false',
191
+ ...(objectStorage.port !== undefined && {
192
+ OBJECTSTORE_S3_PORT: String(objectStorage.port),
193
+ }),
194
+ OBJECTSTORE_S3_USEPATH_STYLE: 'true',
195
+ OBJECTSTORE_S3_AUTOCREATE: 'true',
196
+ OBJECTSTORE_S3_KEY: '$(AWS_ACCESS_KEY_ID)',
197
+ OBJECTSTORE_S3_SECRET: '$(AWS_SECRET_ACCESS_KEY)',
198
+ }
199
+ : {}),
200
+ };
201
+ const envVars = Object.entries(secrets).map(([envName, ref]) => ({
202
+ name: envName,
203
+ valueFrom: {
204
+ secretKeyRef: typeof ref === 'string'
205
+ ? { name: ref, key: envName }
206
+ : { name: ref.secret, key: ref.key || envName },
207
+ },
208
+ }));
209
+ envVars.push(...Object.entries(env).map(([envName, value]) => ({ name: envName, value })));
210
+ // --- Database (CNPG) + app + endpoint ------------------------------------------
211
+ // <Database> is the parent wrapper so the CNPG operator and the Cluster
212
+ // piggyback on the r8s Database recipe (connect info stays by convention:
213
+ // host `${name}-rw`, secret `${name}-db-credentials` key `password`). The
214
+ // app is a raw Deployment because WebService cannot mount volumes.
215
+ const app = {
216
+ apiVersion: 'apps/v1',
217
+ kind: 'Deployment',
218
+ metadata: { name, namespace, labels: { app: name } },
219
+ spec: {
220
+ replicas,
221
+ selector: { matchLabels: { app: name } },
222
+ template: {
223
+ metadata: { labels: { app: name } },
224
+ spec: {
225
+ containers: [
226
+ {
227
+ name: 'app',
228
+ image,
229
+ imagePullPolicy: 'Always',
230
+ ports: [{ containerPort: 80 }],
231
+ env: envVars,
232
+ resources,
233
+ livenessProbe: {
234
+ httpGet: { path: STATUS_PATH, port: 80 },
235
+ initialDelaySeconds: 30,
236
+ periodSeconds: 10,
237
+ },
238
+ readinessProbe: {
239
+ httpGet: { path: STATUS_PATH, port: 80 },
240
+ initialDelaySeconds: 20,
241
+ periodSeconds: 10,
242
+ failureThreshold: 5,
243
+ },
244
+ volumeMounts: [{ name: 'html', mountPath: HTML_MOUNT }],
245
+ },
246
+ ],
247
+ volumes: [{ name: 'html', persistentVolumeClaim: { claimName: htmlClaim } }],
248
+ },
249
+ },
250
+ },
251
+ };
252
+ const appService = {
253
+ apiVersion: 'v1',
254
+ kind: 'Service',
255
+ metadata: { name, namespace },
256
+ spec: {
257
+ type: 'ClusterIP',
258
+ selector: { app: name },
259
+ ports: [{ port: 80, targetPort: 80 }],
260
+ },
261
+ };
262
+ resources_.push((0, core_1.jsx)(recipes_1.Database, {
263
+ backup: false,
264
+ name,
265
+ namespace,
266
+ storage: '10Gi',
267
+ children: (0, core_1.jsx)(core_1.Fragment, {
268
+ children: [(0, core_1.jsx)('Deployment', app), (0, core_1.jsx)('Service', appService)],
269
+ }),
270
+ }));
271
+ // --- CronJob — background jobs (php -f cron.php) --------------------------------
272
+ // WebService cannot express a separate scheduled workload, so the cron job
273
+ // is a raw CronJob that mounts the SAME `${name}-html` claim and runs the
274
+ // image's own php. It cannot see DatabaseContext: host/user are hardcoded
275
+ // by convention and the DB password arrives via secretKeyRef.
276
+ resources_.push((0, core_1.jsx)('CronJob', {
277
+ apiVersion: 'batch/v1',
278
+ kind: 'CronJob',
279
+ metadata: { name: `${name}-cron`, namespace },
280
+ spec: {
281
+ schedule: cronSchedule,
282
+ concurrencyPolicy: 'Forbid',
283
+ successfulJobsHistoryLimit: 1,
284
+ failedJobsHistoryLimit: 1,
285
+ jobTemplate: {
286
+ spec: {
287
+ backoffLimit: 2,
288
+ template: {
289
+ metadata: { labels: { app: `${name}-cron` } },
290
+ spec: {
291
+ restartPolicy: 'OnFailure',
292
+ containers: [
293
+ {
294
+ name: 'nextcloud-cron',
295
+ image,
296
+ command: ['php', '-f', '/var/www/html/cron.php'],
297
+ env: [
298
+ { name: 'POSTGRES_HOST', value: dbHost },
299
+ { name: 'POSTGRES_PORT', value: '5432' },
300
+ { name: 'POSTGRES_DB', value: name },
301
+ { name: 'POSTGRES_USER', value: name },
302
+ {
303
+ name: 'PGPASSWORD',
304
+ valueFrom: {
305
+ secretKeyRef: { name: dbCredentialsName, key: 'password' },
306
+ },
307
+ },
308
+ ...(cache ? [{ name: 'REDIS_HOST', value: `${name}-redis` }] : []),
309
+ ],
310
+ resources: {
311
+ requests: { memory: '128Mi', cpu: '100m' },
312
+ limits: { memory: '512Mi', cpu: '500m' },
313
+ },
314
+ volumeMounts: [{ name: 'html', mountPath: HTML_MOUNT }],
315
+ },
316
+ ],
317
+ volumes: [{ name: 'html', persistentVolumeClaim: { claimName: htmlClaim } }],
318
+ },
319
+ },
320
+ },
321
+ },
322
+ },
323
+ }));
324
+ // --- Endpoint — web UI and WebDAV share the host --------------------------------
325
+ resources_.push((0, jsx_runtime_1.jsx)(recipes_1.Endpoint, { name: `${name}-endpoint`, namespace: namespace, host: host, serviceName: name, servicePort: 80, tls: tls }));
326
+ return (0, core_1.jsx)(core_1.Fragment, { children: resources_ });
327
+ }
328
+ //# 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@r8s/nextcloud",
3
- "version": "0.2.0",
4
- "description": "Nextcloud file cloud Postgres file index, Redis cache, S3-compatible primary storage, cron background jobs",
3
+ "version": "0.3.0",
4
+ "description": "Nextcloud file cloud \u2014 Postgres file index, Redis cache, S3-compatible primary storage, cron background jobs",
5
5
  "license": "MIT",
6
6
  "author": "Berget AI AB",
7
7
  "homepage": "https://r8s.berget.ai",
@@ -29,13 +29,20 @@
29
29
  },
30
30
  "category": "Collaboration & Productivity",
31
31
  "dependencies": {
32
- "@r8s/core": "^0.2.0",
33
- "@r8s/crds": "^0.2.0",
34
- "@r8s/k8s-types": "^0.2.0",
35
- "@r8s/recipes": "^0.2.0"
32
+ "@r8s/core": "^0.3.0",
33
+ "@r8s/crds": "^0.3.0",
34
+ "@r8s/k8s-types": "^0.3.0",
35
+ "@r8s/recipes": "^0.3.0"
36
36
  },
37
37
  "devDependencies": {
38
38
  "typescript": "^5.3.0",
39
- "vitest": "^1.0.0"
39
+ "vitest": "^1.0.0",
40
+ "@r8s/operator-redis": "^0.22.0"
41
+ },
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "peerDependencies": {
46
+ "@r8s/operator-redis": "^0.22.0"
40
47
  }
41
48
  }