@r8s/nextcloud 0.2.0 → 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.
- package/dist/index.d.ts +132 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +328 -0
- package/dist/index.js.map +1 -0
- package/package.json +5 -2
- package/__tests__/nextcloud.test.ts +0 -409
- package/examples/basic.tsx +0 -16
- package/src/index.tsx +0 -447
- package/tsconfig.json +0 -15
package/dist/index.d.ts
ADDED
|
@@ -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;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,kCAqT9C"}
|
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 crds_1 = require("@r8s/crds");
|
|
8
|
+
const recipes_1 = require("@r8s/recipes");
|
|
9
|
+
const redis_1 = require("@r8s/crds/redis");
|
|
10
|
+
const OPERATOR_REDIS = 'redis-operator';
|
|
11
|
+
const HTML_MOUNT = '/var/www/html';
|
|
12
|
+
const STATUS_PATH = '/status.php';
|
|
13
|
+
/**
|
|
14
|
+
* Nextcloud — self-hosted file cloud with Postgres, Redis, S3 primary
|
|
15
|
+
* storage and background cron jobs.
|
|
16
|
+
*
|
|
17
|
+
* @title Nextcloud
|
|
18
|
+
* @category File & Collaboration
|
|
19
|
+
*
|
|
20
|
+
* Composes:
|
|
21
|
+
* - CNPG Postgres cluster (file index, shares, user data)
|
|
22
|
+
* - Redis replication set for file locking and caching (default on)
|
|
23
|
+
* - PersistentVolumeClaim backing /var/www/html (ReadWriteMany)
|
|
24
|
+
* - Nextcloud Deployment + Service + Endpoint (nextcloud:31-apache,
|
|
25
|
+
* probed via /status.php)
|
|
26
|
+
* - CronJob running `php -f /var/www/html/cron.php` every 5 minutes on
|
|
27
|
+
* the same claim (concurrency forbidden)
|
|
28
|
+
* - S3/RustFS bucket reference for primary file storage
|
|
29
|
+
* - Admin bootstrap password provisioned by the Platform secrets
|
|
30
|
+
* backend (openbao / vault), or referenced from an existing Secret
|
|
31
|
+
*
|
|
32
|
+
* The main app is a raw Deployment (not WebService) because Nextcloud
|
|
33
|
+
* needs the /var/www/html claim volume-mounted; the CronJob shares the
|
|
34
|
+
* same claim so background jobs operate on the live data tree.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* import { Platform } from '@r8s/recipes'
|
|
38
|
+
* import { Nextcloud } from '@r8s/nextcloud'
|
|
39
|
+
*
|
|
40
|
+
* export default (
|
|
41
|
+
* <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>
|
|
42
|
+
* <Nextcloud
|
|
43
|
+
* name="cloud"
|
|
44
|
+
* host="cloud.example.com"
|
|
45
|
+
* objectStorage={{
|
|
46
|
+
* endpoint: 's3.internal.example.com',
|
|
47
|
+
* bucket: 'cloud-files',
|
|
48
|
+
* credentialsSecret: 'cloud-files-credentials',
|
|
49
|
+
* }}
|
|
50
|
+
* />
|
|
51
|
+
* </Platform>
|
|
52
|
+
* )
|
|
53
|
+
* @example
|
|
54
|
+
* import { Nextcloud } from '@r8s/nextcloud'
|
|
55
|
+
*
|
|
56
|
+
* export default (
|
|
57
|
+
* <Nextcloud
|
|
58
|
+
* name="cloud"
|
|
59
|
+
* host="${env:CLOUD_HOST}"
|
|
60
|
+
* secretsName="cloud-app-secrets"
|
|
61
|
+
* objectStorage={{
|
|
62
|
+
* endpoint: '${env:S3_ENDPOINT}',
|
|
63
|
+
* bucket: 'cloud-files',
|
|
64
|
+
* credentialsSecret: 'cloud-files-credentials',
|
|
65
|
+
* }}
|
|
66
|
+
* />
|
|
67
|
+
* )
|
|
68
|
+
*/
|
|
69
|
+
function Nextcloud(props) {
|
|
70
|
+
const { name = 'nextcloud', namespace = 'default', version = '31-apache', host, replicas = 1, cache = true, storage = '10Gi', storageClassName, objectStorage, secretsName, resources = {
|
|
71
|
+
requests: { memory: '512Mi', cpu: '250m' },
|
|
72
|
+
limits: { memory: '2Gi', cpu: '1000m' },
|
|
73
|
+
}, tls = { secretName: `${name}-tls`, clusterIssuer: 'letsencrypt-prod' }, } = props;
|
|
74
|
+
const sharedOperators = (0, core_1.useContext)(defaults_1.OperatorContext);
|
|
75
|
+
const secretProvider = (0, core_1.useContext)(defaults_1.SecretContext);
|
|
76
|
+
const resources_ = [];
|
|
77
|
+
const dbHost = `${name}-rw`;
|
|
78
|
+
const dbCredentialsName = `${name}-db-credentials`;
|
|
79
|
+
const appSecretsName = secretsName ?? `${name}-app-secrets`;
|
|
80
|
+
const htmlClaim = `${name}-html`;
|
|
81
|
+
const image = `nextcloud:${version}`;
|
|
82
|
+
const cronSchedule = '*/5 * * * *';
|
|
83
|
+
// --- App secrets provisioning ---------------------------------------------
|
|
84
|
+
// The admin bootstrap password must never be rendered as plaintext. With a
|
|
85
|
+
// secrets backend it is provisioned through the backend (key `adminPassword`);
|
|
86
|
+
// otherwise reference a pre-created Secret.
|
|
87
|
+
if (!secretsName) {
|
|
88
|
+
if (!secretProvider ||
|
|
89
|
+
(secretProvider.backend !== 'vault' && secretProvider.backend !== 'openbao')) {
|
|
90
|
+
throw new Error(`Nextcloud "${name}" requires application secrets (NEXTCLOUD_ADMIN_PASSWORD).\n` +
|
|
91
|
+
`\n` +
|
|
92
|
+
`Nextcloud bootstraps its admin account from this password — it must not ` +
|
|
93
|
+
`be rendered as plaintext.\n` +
|
|
94
|
+
`\n` +
|
|
95
|
+
`Fix: configure a secrets backend on the Platform:\n` +
|
|
96
|
+
` <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>\n` +
|
|
97
|
+
` <Nextcloud name="${name}" host="${host}" />\n` +
|
|
98
|
+
` </Platform>\n` +
|
|
99
|
+
`\n` +
|
|
100
|
+
`Or reference a pre-created Secret (key: adminPassword):\n` +
|
|
101
|
+
` <Nextcloud name="${name}" host="${host}" secretsName="${name}-app-secrets" />`);
|
|
102
|
+
}
|
|
103
|
+
const spec = {
|
|
104
|
+
...(secretProvider.backend === 'vault'
|
|
105
|
+
? { vaultAuthRef: secretProvider.authRef }
|
|
106
|
+
: { openbaoAuthRef: secretProvider.authRef }),
|
|
107
|
+
mount: secretProvider.mount,
|
|
108
|
+
type: 'kv-v2',
|
|
109
|
+
path: `${secretProvider.path ?? name}/${name}/secrets`,
|
|
110
|
+
destination: { create: true, name: appSecretsName },
|
|
111
|
+
};
|
|
112
|
+
resources_.push(secretProvider.backend === 'vault'
|
|
113
|
+
? (0, core_1.jsx)('VaultStaticSecret', {
|
|
114
|
+
apiVersion: 'secrets.hashicorp.com/v1beta1',
|
|
115
|
+
kind: 'VaultStaticSecret',
|
|
116
|
+
metadata: { name: `${name}-secrets`, namespace },
|
|
117
|
+
spec,
|
|
118
|
+
})
|
|
119
|
+
: (0, core_1.jsx)('OpenBaoStaticSecret', {
|
|
120
|
+
apiVersion: 'secrets.openbao.org/v1beta1',
|
|
121
|
+
kind: 'OpenBaoStaticSecret',
|
|
122
|
+
metadata: { name: `${name}-secrets`, namespace },
|
|
123
|
+
spec,
|
|
124
|
+
}));
|
|
125
|
+
}
|
|
126
|
+
// --- Operators -------------------------------------------------------------
|
|
127
|
+
if (cache && !sharedOperators.some((op) => op.name === OPERATOR_REDIS)) {
|
|
128
|
+
resources_.push((0, core_1.declareOperator)(crds_1.operators[OPERATOR_REDIS]()));
|
|
129
|
+
}
|
|
130
|
+
// Redis — file locking + caching (OT-Container-Kit operator). A
|
|
131
|
+
// RedisReplication (master/replica) is what Nextcloud's locking needs;
|
|
132
|
+
// cluster mode is overkill and the `${name}-redis` service fronts it.
|
|
133
|
+
if (cache) {
|
|
134
|
+
resources_.push((0, redis_1.RedisReplicationComponent)({
|
|
135
|
+
metadata: { name: `${name}-redis`, namespace },
|
|
136
|
+
spec: {
|
|
137
|
+
clusterSize: 3,
|
|
138
|
+
kubernetesConfig: { image: 'redis:7.2-alpine' },
|
|
139
|
+
},
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
// --- /var/www/html persistence ----------------------------------------------
|
|
143
|
+
// Apps, config and the data directory live under /var/www/html and must
|
|
144
|
+
// survive pod restarts. ReadWriteMany lets the cron job share the same
|
|
145
|
+
// tree and keeps replicas > 1 viable (requires an RWX StorageClass).
|
|
146
|
+
const htmlPvc = {
|
|
147
|
+
apiVersion: 'v1',
|
|
148
|
+
kind: 'PersistentVolumeClaim',
|
|
149
|
+
metadata: { name: htmlClaim, namespace, labels: { app: name } },
|
|
150
|
+
spec: {
|
|
151
|
+
accessModes: ['ReadWriteMany'],
|
|
152
|
+
resources: { requests: { storage } },
|
|
153
|
+
...(storageClassName && { storageClassName }),
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
resources_.push((0, core_1.jsx)('PersistentVolumeClaim', htmlPvc));
|
|
157
|
+
// --- Env wiring --------------------------------------------------------------
|
|
158
|
+
// Every credential is referenced with $(VAR) expansion or secretKeyRef —
|
|
159
|
+
// no plaintext in the manifest. Secret-backed vars are declared BEFORE
|
|
160
|
+
// plain env vars so dependent $(VAR) expansion resolves. Nextcloud
|
|
161
|
+
// natively reads POSTGRES_* and OBJECTSTORE_S3_*; the S3 keys/secrets are
|
|
162
|
+
// expanded from the AWS_* secret-backed vars. (Nextcloud ignores
|
|
163
|
+
// DATABASE_URL — do not add it back.)
|
|
164
|
+
const secrets = {
|
|
165
|
+
PGPASSWORD: { secret: dbCredentialsName, key: 'password' },
|
|
166
|
+
NEXTCLOUD_ADMIN_PASSWORD: { secret: appSecretsName, key: 'adminPassword' },
|
|
167
|
+
...(objectStorage
|
|
168
|
+
? {
|
|
169
|
+
AWS_ACCESS_KEY_ID: { secret: objectStorage.credentialsSecret, key: 'accessKey' },
|
|
170
|
+
AWS_SECRET_ACCESS_KEY: { secret: objectStorage.credentialsSecret, key: 'secretKey' },
|
|
171
|
+
}
|
|
172
|
+
: {}),
|
|
173
|
+
};
|
|
174
|
+
const env = {
|
|
175
|
+
POSTGRES_HOST: dbHost,
|
|
176
|
+
POSTGRES_PORT: '5432',
|
|
177
|
+
POSTGRES_DB: name,
|
|
178
|
+
POSTGRES_USER: name,
|
|
179
|
+
POSTGRES_PASSWORD: '$(PGPASSWORD)',
|
|
180
|
+
NEXTCLOUD_ADMIN_USER: 'admin',
|
|
181
|
+
NEXTCLOUD_TRUSTED_DOMAINS: host,
|
|
182
|
+
OVERWRITEHOST: host,
|
|
183
|
+
OVERWRITEPROTOCOL: 'https',
|
|
184
|
+
OVERWRITECLIURL: `https://${host}`,
|
|
185
|
+
...(cache ? { REDIS_HOST: `${name}-redis`, REDIS_HOST_PORT: '6379' } : {}),
|
|
186
|
+
...(objectStorage
|
|
187
|
+
? {
|
|
188
|
+
OBJECTSTORE_S3_HOST: objectStorage.endpoint,
|
|
189
|
+
OBJECTSTORE_S3_BUCKET: objectStorage.bucket,
|
|
190
|
+
OBJECTSTORE_S3_REGION: objectStorage.region ?? 'us-east-1',
|
|
191
|
+
OBJECTSTORE_S3_SSL: (objectStorage.ssl ?? true) ? 'true' : 'false',
|
|
192
|
+
...(objectStorage.port !== undefined && {
|
|
193
|
+
OBJECTSTORE_S3_PORT: String(objectStorage.port),
|
|
194
|
+
}),
|
|
195
|
+
OBJECTSTORE_S3_USEPATH_STYLE: 'true',
|
|
196
|
+
OBJECTSTORE_S3_AUTOCREATE: 'true',
|
|
197
|
+
OBJECTSTORE_S3_KEY: '$(AWS_ACCESS_KEY_ID)',
|
|
198
|
+
OBJECTSTORE_S3_SECRET: '$(AWS_SECRET_ACCESS_KEY)',
|
|
199
|
+
}
|
|
200
|
+
: {}),
|
|
201
|
+
};
|
|
202
|
+
const envVars = Object.entries(secrets).map(([envName, ref]) => ({
|
|
203
|
+
name: envName,
|
|
204
|
+
valueFrom: {
|
|
205
|
+
secretKeyRef: typeof ref === 'string'
|
|
206
|
+
? { name: ref, key: envName }
|
|
207
|
+
: { name: ref.secret, key: ref.key || envName },
|
|
208
|
+
},
|
|
209
|
+
}));
|
|
210
|
+
envVars.push(...Object.entries(env).map(([envName, value]) => ({ name: envName, value })));
|
|
211
|
+
// --- Database (CNPG) + app + endpoint ------------------------------------------
|
|
212
|
+
// <Database> is the parent wrapper so the CNPG operator and the Cluster
|
|
213
|
+
// piggyback on the r8s Database recipe (connect info stays by convention:
|
|
214
|
+
// host `${name}-rw`, secret `${name}-db-credentials` key `password`). The
|
|
215
|
+
// app is a raw Deployment because WebService cannot mount volumes.
|
|
216
|
+
const app = {
|
|
217
|
+
apiVersion: 'apps/v1',
|
|
218
|
+
kind: 'Deployment',
|
|
219
|
+
metadata: { name, namespace, labels: { app: name } },
|
|
220
|
+
spec: {
|
|
221
|
+
replicas,
|
|
222
|
+
selector: { matchLabels: { app: name } },
|
|
223
|
+
template: {
|
|
224
|
+
metadata: { labels: { app: name } },
|
|
225
|
+
spec: {
|
|
226
|
+
containers: [
|
|
227
|
+
{
|
|
228
|
+
name: 'app',
|
|
229
|
+
image,
|
|
230
|
+
imagePullPolicy: 'Always',
|
|
231
|
+
ports: [{ containerPort: 80 }],
|
|
232
|
+
env: envVars,
|
|
233
|
+
resources,
|
|
234
|
+
livenessProbe: {
|
|
235
|
+
httpGet: { path: STATUS_PATH, port: 80 },
|
|
236
|
+
initialDelaySeconds: 30,
|
|
237
|
+
periodSeconds: 10,
|
|
238
|
+
},
|
|
239
|
+
readinessProbe: {
|
|
240
|
+
httpGet: { path: STATUS_PATH, port: 80 },
|
|
241
|
+
initialDelaySeconds: 20,
|
|
242
|
+
periodSeconds: 10,
|
|
243
|
+
failureThreshold: 5,
|
|
244
|
+
},
|
|
245
|
+
volumeMounts: [{ name: 'html', mountPath: HTML_MOUNT }],
|
|
246
|
+
},
|
|
247
|
+
],
|
|
248
|
+
volumes: [{ name: 'html', persistentVolumeClaim: { claimName: htmlClaim } }],
|
|
249
|
+
},
|
|
250
|
+
},
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
const appService = {
|
|
254
|
+
apiVersion: 'v1',
|
|
255
|
+
kind: 'Service',
|
|
256
|
+
metadata: { name, namespace },
|
|
257
|
+
spec: {
|
|
258
|
+
type: 'ClusterIP',
|
|
259
|
+
selector: { app: name },
|
|
260
|
+
ports: [{ port: 80, targetPort: 80 }],
|
|
261
|
+
},
|
|
262
|
+
};
|
|
263
|
+
resources_.push((0, core_1.jsx)(recipes_1.Database, {
|
|
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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@r8s/nextcloud",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Nextcloud file cloud — Postgres file index, Redis cache, S3-compatible primary storage, cron background jobs",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Berget AI AB",
|
|
@@ -37,5 +37,8 @@
|
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"typescript": "^5.3.0",
|
|
39
39
|
"vitest": "^1.0.0"
|
|
40
|
-
}
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
]
|
|
41
44
|
}
|