@r8s/recipes 0.1.0 → 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.
- package/dist/app.d.ts +11 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +15 -11
- package/dist/app.js.map +1 -1
- package/dist/database.d.ts +80 -5
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +189 -76
- package/dist/database.js.map +1 -1
- package/dist/dns-provider.js +1 -1
- package/dist/dns-provider.js.map +1 -1
- package/dist/endpoint-provider.d.ts.map +1 -1
- package/dist/endpoint-provider.js +22 -2
- package/dist/endpoint-provider.js.map +1 -1
- package/dist/endpoint.d.ts +17 -0
- package/dist/endpoint.d.ts.map +1 -1
- package/dist/endpoint.js +73 -35
- package/dist/endpoint.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +9 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js.map +1 -1
- package/dist/r8s-cluster.d.ts +105 -0
- package/dist/r8s-cluster.d.ts.map +1 -0
- package/dist/r8s-cluster.js +187 -0
- package/dist/r8s-cluster.js.map +1 -0
- package/dist/secret-provider.d.ts +5 -1
- package/dist/secret-provider.d.ts.map +1 -1
- package/dist/secret-provider.js +3 -1
- package/dist/secret-provider.js.map +1 -1
- package/dist/web-service.d.ts +89 -0
- package/dist/web-service.d.ts.map +1 -1
- package/dist/web-service.js +74 -17
- package/dist/web-service.js.map +1 -1
- package/package.json +4 -4
package/dist/app.d.ts
CHANGED
|
@@ -11,8 +11,9 @@ export interface AppProps {
|
|
|
11
11
|
port?: number;
|
|
12
12
|
/** Number of pod replicas (defaults to 2) */
|
|
13
13
|
replicas?: number;
|
|
14
|
-
/** Domain name (e.g., 'api.example.com') the endpoint should accept traffic for
|
|
15
|
-
|
|
14
|
+
/** Domain name (e.g., 'api.example.com') the endpoint should accept traffic for.
|
|
15
|
+
* When omitted, no Endpoint/Ingress/Gateway is created (useful for manual routing). */
|
|
16
|
+
host?: string;
|
|
16
17
|
/** TLS certificate configuration for HTTPS */
|
|
17
18
|
tls?: TLSConfig;
|
|
18
19
|
/** Plain environment variables (non-sensitive) */
|
|
@@ -36,6 +37,14 @@ export interface AppProps {
|
|
|
36
37
|
cache?: boolean;
|
|
37
38
|
/** Create a DNS record via ExternalDNS (default: false) */
|
|
38
39
|
dns?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Reference to a shared Gateway instead of creating a per-app Gateway.
|
|
42
|
+
* Avoids allocating a new LoadBalancer IP per app.
|
|
43
|
+
*/
|
|
44
|
+
sharedGateway?: {
|
|
45
|
+
name: string;
|
|
46
|
+
namespace?: string;
|
|
47
|
+
};
|
|
39
48
|
/** Child components rendered as sibling resources (e.g., a BackgroundWorker) */
|
|
40
49
|
children?: unknown;
|
|
41
50
|
}
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAG/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAI/C,MAAM,WAAW,QAAQ;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AAG/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAI/C,MAAM,WAAW,QAAQ;IACvB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;4FACwF;IACxF,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,8CAA8C;IAC9C,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,CAAA;IAC5C,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACtC,2DAA2D;IAC3D,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,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAA;IACb;;;OAGG;IACH,aAAa,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACpD,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,kCA4FlC"}
|
package/dist/app.js
CHANGED
|
@@ -59,7 +59,7 @@ const redis_1 = require("@r8s/crds/redis");
|
|
|
59
59
|
* )
|
|
60
60
|
*/
|
|
61
61
|
function App(props) {
|
|
62
|
-
const { name, namespace: namespaceProp, image, port = 3000, replicas = 2, host, tls, env = {}, secrets = {}, vault = {}, resources, cache = false, dns, children, } = props;
|
|
62
|
+
const { name, namespace: namespaceProp, image, port = 3000, replicas = 2, host, tls, env = {}, secrets = {}, vault = {}, resources, cache = false, dns, sharedGateway, children, } = props;
|
|
63
63
|
// Inherit namespace from <Platform> context if not explicitly set
|
|
64
64
|
const contextNamespace = (0, core_1.useContext)(defaults_1.Namespace);
|
|
65
65
|
const namespace = namespaceProp ?? (contextNamespace !== 'default' ? contextNamespace : undefined) ?? 'default';
|
|
@@ -75,15 +75,19 @@ function App(props) {
|
|
|
75
75
|
vault,
|
|
76
76
|
resources,
|
|
77
77
|
}));
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
78
|
+
// Only create Endpoint if host is provided
|
|
79
|
+
if (host) {
|
|
80
|
+
elements.push((0, core_1.jsx)(endpoint_1.Endpoint, {
|
|
81
|
+
name: `${name}-endpoint`,
|
|
82
|
+
namespace,
|
|
83
|
+
host,
|
|
84
|
+
serviceName: name,
|
|
85
|
+
servicePort: 80,
|
|
86
|
+
tls,
|
|
87
|
+
dns,
|
|
88
|
+
...(sharedGateway && { sharedGateway }),
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
87
91
|
// Redis cache
|
|
88
92
|
if (cache) {
|
|
89
93
|
const sharedOperators = (0, core_1.useContext)(defaults_1.OperatorContext);
|
|
@@ -107,7 +111,7 @@ function App(props) {
|
|
|
107
111
|
},
|
|
108
112
|
}));
|
|
109
113
|
// Auto-wire REDIS_URL env var
|
|
110
|
-
env.REDIS_URL = `redis://${name}-cache.${namespace}.svc.cluster.local:6379`;
|
|
114
|
+
env.REDIS_URL = `redis://${name}-cache-leader.${namespace}.svc.cluster.local:6379`;
|
|
111
115
|
}
|
|
112
116
|
// Children render as sibling resources (e.g. <BackgroundWorker />).
|
|
113
117
|
// WebService does not currently accept children as a prop, so we keep
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"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"}
|
package/dist/database.d.ts
CHANGED
|
@@ -1,18 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Continuous + scheduled backup configuration for a dedicated CNPG cluster.
|
|
3
|
+
* Renders `spec.backup.barmanObjectStore` on the Cluster plus a
|
|
4
|
+
* ScheduledBackup resource. Backup is explicit opt-in — nothing renders
|
|
5
|
+
* unless this prop is set.
|
|
6
|
+
*/
|
|
7
|
+
export interface DatabaseBackupProps {
|
|
8
|
+
/** S3 destination path, e.g. 's3://backups/myapp-cnpg' */
|
|
9
|
+
destinationPath: string;
|
|
10
|
+
/** S3 endpoint URL, e.g. 'https://s3.example.com' (RustFS/Scaleway/…) */
|
|
11
|
+
endpointURL: string;
|
|
12
|
+
/**
|
|
13
|
+
* Name of an existing Secret holding the S3 credentials with CNPG keys
|
|
14
|
+
* `access-key-id` and `secret-access-key`. When omitted, the Platform
|
|
15
|
+
* secrets backend (openbao/vault) provisions `<name>-backup-credentials`
|
|
16
|
+
* from `<path>/<name>-s3-credentials` — the backend entry must contain
|
|
17
|
+
* the same kebab-case keys. Without backend or secret this throws.
|
|
18
|
+
*/
|
|
19
|
+
credentialsSecret?: string;
|
|
20
|
+
/** Retention policy for barman backups (default: '30d') */
|
|
21
|
+
retention?: string;
|
|
22
|
+
/** Cron schedule for the ScheduledBackup (default: '0 3 * * *') */
|
|
23
|
+
schedule?: string;
|
|
24
|
+
/** Data/WAL compression — values valid for both streams (default: 'gzip') */
|
|
25
|
+
compression?: 'gzip' | 'bzip2' | 'snappy';
|
|
26
|
+
/** WAL encryption (default: 'AES256') */
|
|
27
|
+
encryption?: 'AES256' | 'aws:kms';
|
|
28
|
+
}
|
|
1
29
|
export interface DatabaseProps {
|
|
2
30
|
/** Resource name (also the default database name) */
|
|
3
31
|
name: string;
|
|
4
32
|
/** Kubernetes namespace (defaults to 'default') */
|
|
5
33
|
namespace?: string;
|
|
34
|
+
/** Number of CNPG instances in the dedicated cluster (defaults to 3) */
|
|
35
|
+
instances?: number;
|
|
6
36
|
/** Storage size (e.g., '10Gi') for the dedicated cluster data volume */
|
|
7
37
|
storage?: string;
|
|
38
|
+
/** Storage class name for the data volume (defaults to cluster default) */
|
|
39
|
+
storageClass?: string;
|
|
40
|
+
/** PostgreSQL parameters, e.g. { max_connections: '200' } */
|
|
41
|
+
parameters?: Record<string, string>;
|
|
42
|
+
/**
|
|
43
|
+
* Continuous barman backup to S3 object storage + ScheduledBackup.
|
|
44
|
+
* Explicit opt-in.
|
|
45
|
+
*/
|
|
46
|
+
backup?: DatabaseBackupProps;
|
|
47
|
+
/**
|
|
48
|
+
* Workloads that consume the database credentials. Rendered as
|
|
49
|
+
* `rolloutRestartTargets` on the generated VaultStaticSecret/
|
|
50
|
+
* OpenBaoStaticSecret so pods restart when credentials rotate.
|
|
51
|
+
*/
|
|
52
|
+
rolloutRestartTargets?: {
|
|
53
|
+
kind?: string;
|
|
54
|
+
name: string;
|
|
55
|
+
apiVersion?: string;
|
|
56
|
+
}[];
|
|
8
57
|
/** Operator version override. If not set, reads from OperatorContext or uses default. */
|
|
9
58
|
operatorVersion?: string;
|
|
10
59
|
/**
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
60
|
+
* SQL statements run once after the initial database bootstrap
|
|
61
|
+
* (CNPG `bootstrap.initdb.postInitApplicationSQL`). Use for schema
|
|
62
|
+
* extensions the application requires on a fresh cluster — e.g.
|
|
63
|
+
* creating roles or extensions. Parameterized by the CNPG operator.
|
|
14
64
|
*/
|
|
15
|
-
|
|
65
|
+
postInitSQL?: string[];
|
|
16
66
|
/** Child components rendered with this database's connection info in context */
|
|
17
67
|
children?: unknown;
|
|
18
68
|
}
|
|
@@ -27,7 +77,10 @@ export interface DatabaseProps {
|
|
|
27
77
|
* connection info via DatabaseContext automatically.
|
|
28
78
|
*
|
|
29
79
|
* Credentials are managed by the secrets backend configured on the Platform.
|
|
30
|
-
* Without a
|
|
80
|
+
* Without a backend, credentials are CNPG-managed (bootstrap secret is
|
|
81
|
+
* generated automatically in-cluster). Plaintext password props are NOT
|
|
82
|
+
* supported — rendered YAML is committed to git and applied to clusters,
|
|
83
|
+
* so a plaintext password there is a credential leak.
|
|
31
84
|
*
|
|
32
85
|
* @example
|
|
33
86
|
* import { Database } from '@r8s/recipes'
|
|
@@ -44,6 +97,28 @@ export interface DatabaseProps {
|
|
|
44
97
|
* </Database>
|
|
45
98
|
* </Platform>
|
|
46
99
|
* )
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* import { Platform, Database, WebService } from '@r8s/recipes'
|
|
103
|
+
*
|
|
104
|
+
* // HA database with continuous S3 backup — the backend provisions the
|
|
105
|
+
* // backup credentials, pods restart when they rotate.
|
|
106
|
+
* export default (
|
|
107
|
+
* <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps', refreshAfter: '3600s' }}>
|
|
108
|
+
* <Database
|
|
109
|
+
* name="app-db"
|
|
110
|
+
* storage="20Gi"
|
|
111
|
+
* instances={2}
|
|
112
|
+
* rolloutRestartTargets={[{ name: 'api' }]}
|
|
113
|
+
* backup={{
|
|
114
|
+
* destinationPath: 's3://backups/app-cnpg',
|
|
115
|
+
* endpointURL: 'https://s3.example.com',
|
|
116
|
+
* }}
|
|
117
|
+
* >
|
|
118
|
+
* <WebService name="api" image="myapp/api:v1" />
|
|
119
|
+
* </Database>
|
|
120
|
+
* </Platform>
|
|
121
|
+
* )
|
|
47
122
|
*/
|
|
48
123
|
export declare function Database(props: DatabaseProps): import("@r8s/core").r8sElement[];
|
|
49
124
|
//# sourceMappingURL=database.d.ts.map
|
package/dist/database.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.tsx"],"names":[],"mappings":"AAWA;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,0DAA0D;IAC1D,eAAe,EAAE,MAAM,CAAA;IACvB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAA;IACnB;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IACzC,yCAAyC;IACzC,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAA;IACZ,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAA;IAC5B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC9E,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,oCA+M5C"}
|
package/dist/database.js
CHANGED
|
@@ -15,7 +15,10 @@ const operators_1 = require("./operators");
|
|
|
15
15
|
* connection info via DatabaseContext automatically.
|
|
16
16
|
*
|
|
17
17
|
* Credentials are managed by the secrets backend configured on the Platform.
|
|
18
|
-
* Without a
|
|
18
|
+
* Without a backend, credentials are CNPG-managed (bootstrap secret is
|
|
19
|
+
* generated automatically in-cluster). Plaintext password props are NOT
|
|
20
|
+
* supported — rendered YAML is committed to git and applied to clusters,
|
|
21
|
+
* so a plaintext password there is a credential leak.
|
|
19
22
|
*
|
|
20
23
|
* @example
|
|
21
24
|
* import { Database } from '@r8s/recipes'
|
|
@@ -32,9 +35,47 @@ const operators_1 = require("./operators");
|
|
|
32
35
|
* </Database>
|
|
33
36
|
* </Platform>
|
|
34
37
|
* )
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* import { Platform, Database, WebService } from '@r8s/recipes'
|
|
41
|
+
*
|
|
42
|
+
* // HA database with continuous S3 backup — the backend provisions the
|
|
43
|
+
* // backup credentials, pods restart when they rotate.
|
|
44
|
+
* export default (
|
|
45
|
+
* <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps', refreshAfter: '3600s' }}>
|
|
46
|
+
* <Database
|
|
47
|
+
* name="app-db"
|
|
48
|
+
* storage="20Gi"
|
|
49
|
+
* instances={2}
|
|
50
|
+
* rolloutRestartTargets={[{ name: 'api' }]}
|
|
51
|
+
* backup={{
|
|
52
|
+
* destinationPath: 's3://backups/app-cnpg',
|
|
53
|
+
* endpointURL: 'https://s3.example.com',
|
|
54
|
+
* }}
|
|
55
|
+
* >
|
|
56
|
+
* <WebService name="api" image="myapp/api:v1" />
|
|
57
|
+
* </Database>
|
|
58
|
+
* </Platform>
|
|
59
|
+
* )
|
|
35
60
|
*/
|
|
36
61
|
function Database(props) {
|
|
37
|
-
const { name, namespace: namespaceProp, storage = '10Gi', operatorVersion,
|
|
62
|
+
const { name, namespace: namespaceProp, instances = 3, storage = '10Gi', storageClass, parameters, backup, rolloutRestartTargets, operatorVersion, postInitSQL, children, } = props;
|
|
63
|
+
// Plaintext password props are forbidden. This also catches untyped/JS
|
|
64
|
+
// callers that pass `password` to Database regardless of backend — the
|
|
65
|
+
// rendered Secret would leak the credential into git and cluster state.
|
|
66
|
+
const legacyPassword = props.password;
|
|
67
|
+
if (legacyPassword !== undefined && legacyPassword !== null && legacyPassword !== '') {
|
|
68
|
+
throw new Error(`Database "${name}" received a plaintext password. ` +
|
|
69
|
+
`Plaintext credentials in rendered manifests are no longer supported — ` +
|
|
70
|
+
`the YAML is committed to git and applied to clusters, which leaks the credential.\n` +
|
|
71
|
+
`\n` +
|
|
72
|
+
`Fix: configure a secrets backend on the Platform and let it manage credentials:\n` +
|
|
73
|
+
` <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>\n` +
|
|
74
|
+
` <Database name="${name}" />\n` +
|
|
75
|
+
` </Platform>\n` +
|
|
76
|
+
`\n` +
|
|
77
|
+
`Supported backends: 'openbao', 'vault', 'sealed-secrets', 'kubernetes', 'manual-secrets'`);
|
|
78
|
+
}
|
|
38
79
|
// Inherit namespace from <Platform> context if not explicitly set
|
|
39
80
|
const contextNamespace = (0, core_1.useContext)(defaults_1.Namespace);
|
|
40
81
|
const namespace = namespaceProp ?? (contextNamespace !== 'default' ? contextNamespace : undefined) ?? 'default';
|
|
@@ -54,7 +95,7 @@ function Database(props) {
|
|
|
54
95
|
passwordKey: 'password',
|
|
55
96
|
vendor: 'postgres',
|
|
56
97
|
};
|
|
57
|
-
resources.push(...createSecretResources(name, namespace, secretName, secretProvider,
|
|
98
|
+
resources.push(...createSecretResources(name, namespace, secretName, secretProvider, 'shared', undefined));
|
|
58
99
|
if (children) {
|
|
59
100
|
resources.push((0, core_1.jsx)(defaults_1.DatabaseContext.Provider, { value: connection, children }));
|
|
60
101
|
}
|
|
@@ -62,21 +103,71 @@ function Database(props) {
|
|
|
62
103
|
else {
|
|
63
104
|
// Dedicated cluster — create full CNPG cluster
|
|
64
105
|
const hasCNPG = sharedOperators.some((op) => op.name === 'cnpg');
|
|
106
|
+
// Backup credentials: explicit existing Secret, or provisioned by the
|
|
107
|
+
// secrets backend. Plaintext is never rendered.
|
|
108
|
+
let backupCredentials;
|
|
109
|
+
if (backup) {
|
|
110
|
+
if (backup.credentialsSecret) {
|
|
111
|
+
backupCredentials = backup.credentialsSecret;
|
|
112
|
+
}
|
|
113
|
+
else if (secretProvider &&
|
|
114
|
+
(secretProvider.backend === 'openbao' || secretProvider.backend === 'vault')) {
|
|
115
|
+
backupCredentials = `${name}-backup-credentials`;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw new Error(`Database "${name}" has backup configured without backup credentials.\n` +
|
|
119
|
+
`\n` +
|
|
120
|
+
`Set an existing Secret holding keys 'access-key-id' and 'secret-access-key':\n` +
|
|
121
|
+
` backup={{ ..., credentialsSecret: 'my-backup-creds' }}\n` +
|
|
122
|
+
`\n` +
|
|
123
|
+
`or let the Platform secrets backend provision them from '<path>/${name}-s3-credentials':\n` +
|
|
124
|
+
` <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
65
127
|
const cluster = {
|
|
66
128
|
apiVersion: 'postgresql.cnpg.io/v1',
|
|
67
129
|
kind: 'Cluster',
|
|
68
130
|
metadata: { name, namespace },
|
|
69
131
|
spec: {
|
|
70
|
-
instances
|
|
71
|
-
storage: {
|
|
132
|
+
instances,
|
|
133
|
+
storage: {
|
|
134
|
+
size: storage,
|
|
135
|
+
...(storageClass && { storageClass }),
|
|
136
|
+
},
|
|
72
137
|
bootstrap: {
|
|
73
138
|
initdb: {
|
|
74
139
|
database: name,
|
|
75
140
|
owner: name,
|
|
76
141
|
secret: { name: secretName },
|
|
142
|
+
// Roles/extensions the application needs on a fresh cluster —
|
|
143
|
+
// applied once by CNPG after the initial bootstrap.
|
|
144
|
+
...(postInitSQL && postInitSQL.length > 0
|
|
145
|
+
? { postInitApplicationSQL: postInitSQL }
|
|
146
|
+
: {}),
|
|
77
147
|
},
|
|
78
148
|
},
|
|
79
149
|
monitoring: { enablePodMonitor: true },
|
|
150
|
+
...(parameters && { postgresql: { parameters } }),
|
|
151
|
+
...(backup && backupCredentials
|
|
152
|
+
? {
|
|
153
|
+
backup: {
|
|
154
|
+
retentionPolicy: backup.retention ?? '30d',
|
|
155
|
+
barmanObjectStore: {
|
|
156
|
+
destinationPath: backup.destinationPath,
|
|
157
|
+
endpointURL: backup.endpointURL,
|
|
158
|
+
s3Credentials: {
|
|
159
|
+
accessKeyId: { name: backupCredentials, key: 'access-key-id' },
|
|
160
|
+
secretAccessKey: { name: backupCredentials, key: 'secret-access-key' },
|
|
161
|
+
},
|
|
162
|
+
data: { compression: backup.compression ?? 'gzip' },
|
|
163
|
+
wal: {
|
|
164
|
+
compression: backup.compression ?? 'gzip',
|
|
165
|
+
encryption: backup.encryption ?? 'AES256',
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
: {}),
|
|
80
171
|
},
|
|
81
172
|
};
|
|
82
173
|
const connection = {
|
|
@@ -92,12 +183,27 @@ function Database(props) {
|
|
|
92
183
|
resources.push((0, core_1.declareOperator)((0, operators_1.cnpgOperator)(operatorVersion)));
|
|
93
184
|
}
|
|
94
185
|
resources.push((0, core_1.jsx)('Cluster', cluster));
|
|
186
|
+
if (backup && backupCredentials) {
|
|
187
|
+
resources.push((0, core_1.jsx)('ScheduledBackup', {
|
|
188
|
+
apiVersion: 'postgresql.cnpg.io/v1',
|
|
189
|
+
kind: 'ScheduledBackup',
|
|
190
|
+
metadata: { name: `${name}-backup`, namespace },
|
|
191
|
+
spec: {
|
|
192
|
+
cluster: { name },
|
|
193
|
+
schedule: backup.schedule ?? '0 3 * * *',
|
|
194
|
+
backupOwnerReference: 'self',
|
|
195
|
+
},
|
|
196
|
+
}));
|
|
197
|
+
// Backend-provisioned S3 credentials for barman
|
|
198
|
+
if (!backup.credentialsSecret && secretProvider) {
|
|
199
|
+
resources.push(...createStaticSecretResource(`${name}-backup-credentials`, `${name}-backup-credentials`, namespace, secretProvider, `${secretProvider.path}/${name}-s3-credentials`, undefined));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
95
202
|
// For dedicated clusters with a secrets backend, the backend manages
|
|
96
|
-
// credentials. For kubernetes backend, CNPG manages the
|
|
97
|
-
// automatically —
|
|
98
|
-
// when kubernetes backend is explicitly chosen.
|
|
203
|
+
// credentials. For kubernetes/manual-secrets backend, CNPG manages the
|
|
204
|
+
// bootstrap secret automatically — no plaintext Secret is rendered.
|
|
99
205
|
if (secretProvider) {
|
|
100
|
-
resources.push(...createSecretResources(name, namespace, secretName, secretProvider,
|
|
206
|
+
resources.push(...createSecretResources(name, namespace, secretName, secretProvider, 'dedicated', rolloutRestartTargets));
|
|
101
207
|
}
|
|
102
208
|
if (children) {
|
|
103
209
|
resources.push((0, core_1.jsx)(defaults_1.DatabaseContext.Provider, { value: connection, children }));
|
|
@@ -107,63 +213,34 @@ function Database(props) {
|
|
|
107
213
|
}
|
|
108
214
|
/**
|
|
109
215
|
* Create the secret resources for a database based on the active secrets
|
|
110
|
-
* backend.
|
|
111
|
-
*
|
|
216
|
+
* backend. Plaintext credentials are never rendered — backends either
|
|
217
|
+
* reference credentials stored externally (openbao/vault), hold
|
|
218
|
+
* user-sealed ciphertext (sealed-secrets), or delegate to CNPG's
|
|
219
|
+
* in-cluster bootstrap secret generation (kubernetes/manual-secrets on
|
|
220
|
+
* dedicated clusters).
|
|
112
221
|
*/
|
|
113
|
-
function createSecretResources(name, namespace, secretName, secretProvider,
|
|
222
|
+
function createSecretResources(name, namespace, secretName, secretProvider, mode, rolloutRestartTargets) {
|
|
114
223
|
const resources = [];
|
|
115
224
|
if (!secretProvider) {
|
|
116
|
-
if (
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
` <Platform secrets={{ backend: 'openbao' }}>\n` +
|
|
121
|
-
` <Database name="${name}" />\n` +
|
|
122
|
-
` </Platform>\n` +
|
|
123
|
-
`\n` +
|
|
124
|
-
`Or provide a password directly (not recommended for production):\n` +
|
|
125
|
-
` <Database name="${name}" password="..." />`);
|
|
225
|
+
if (mode === 'dedicated') {
|
|
226
|
+
// CNPG generates the bootstrap secret in-cluster — no credential
|
|
227
|
+
// in the rendered manifest at all.
|
|
228
|
+
return resources;
|
|
126
229
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
}));
|
|
137
|
-
return resources;
|
|
230
|
+
throw new Error(`Database "${name}" is attached to a shared Cluster without a secrets backend.\n` +
|
|
231
|
+
`\n` +
|
|
232
|
+
`CNPG only provisions credentials for databases on dedicated clusters, so a ` +
|
|
233
|
+
`shared-cluster database needs a managed secrets backend:\n` +
|
|
234
|
+
` <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>\n` +
|
|
235
|
+
` <Database name="${name}" />\n` +
|
|
236
|
+
` </Platform>\n` +
|
|
237
|
+
`\n` +
|
|
238
|
+
`Supported backends: 'openbao', 'vault', 'sealed-secrets', 'kubernetes', 'manual-secrets'`);
|
|
138
239
|
}
|
|
139
240
|
switch (secretProvider.backend) {
|
|
140
241
|
case 'vault':
|
|
141
|
-
resources.push((0, core_1.jsx)('VaultStaticSecret', {
|
|
142
|
-
apiVersion: 'secrets.hashicorp.com/v1beta1',
|
|
143
|
-
kind: 'VaultStaticSecret',
|
|
144
|
-
metadata: { name: `${name}-db-secret`, namespace },
|
|
145
|
-
spec: {
|
|
146
|
-
vaultAuthRef: secretProvider.authRef,
|
|
147
|
-
mount: secretProvider.mount,
|
|
148
|
-
type: 'kv-v2',
|
|
149
|
-
path: `${secretProvider.path}/${name}`,
|
|
150
|
-
destination: { create: true, name: secretName },
|
|
151
|
-
},
|
|
152
|
-
}));
|
|
153
|
-
break;
|
|
154
242
|
case 'openbao':
|
|
155
|
-
resources.push((
|
|
156
|
-
apiVersion: 'secrets.openbao.org/v1beta1',
|
|
157
|
-
kind: 'OpenBaoStaticSecret',
|
|
158
|
-
metadata: { name: `${name}-db-secret`, namespace },
|
|
159
|
-
spec: {
|
|
160
|
-
openbaoAuthRef: secretProvider.authRef,
|
|
161
|
-
mount: secretProvider.mount,
|
|
162
|
-
type: 'kv-v2',
|
|
163
|
-
path: `${secretProvider.path}/${name}`,
|
|
164
|
-
destination: { create: true, name: secretName },
|
|
165
|
-
},
|
|
166
|
-
}));
|
|
243
|
+
resources.push(...createStaticSecretResource(`${name}-db-secret`, secretName, namespace, secretProvider, `${secretProvider.path}/${name}`, rolloutRestartTargets));
|
|
167
244
|
break;
|
|
168
245
|
case 'sealed-secrets':
|
|
169
246
|
// Sealed Secrets: the user provides a sealed secret that was encrypted
|
|
@@ -182,31 +259,67 @@ function createSecretResources(name, namespace, secretName, secretProvider, pass
|
|
|
182
259
|
}));
|
|
183
260
|
break;
|
|
184
261
|
case 'kubernetes':
|
|
185
|
-
|
|
186
|
-
|
|
262
|
+
case 'manual-secrets':
|
|
263
|
+
// Plain Kubernetes Secrets — but the credential itself must never be
|
|
264
|
+
// in the rendered manifest. On dedicated clusters CNPG generates the
|
|
265
|
+
// bootstrap secret in-cluster; on shared clusters there is nothing to
|
|
266
|
+
// generate the credential, so a managed backend is required.
|
|
267
|
+
if (mode === 'shared') {
|
|
268
|
+
throw new Error(`Database "${name}" uses the '${secretProvider.backend}' secrets backend on a shared Cluster.\n` +
|
|
187
269
|
`\n` +
|
|
188
|
-
`
|
|
189
|
-
`
|
|
190
|
-
` <Platform secrets={{ backend: 'openbao' }}>\n` +
|
|
270
|
+
`Credentials for shared-cluster databases cannot be provisioned automatically. ` +
|
|
271
|
+
`Use a managed backend instead:\n` +
|
|
272
|
+
` <Platform secrets={{ backend: 'openbao', mount: 'kv', path: 'apps' }}>\n` +
|
|
273
|
+
` <Database name="${name}" />\n` +
|
|
274
|
+
` </Platform>\n` +
|
|
191
275
|
`\n` +
|
|
192
|
-
`
|
|
193
|
-
` <Database name="${name}" password="..." />`);
|
|
276
|
+
`Supported backends: 'openbao', 'vault', 'sealed-secrets', 'kubernetes', 'manual-secrets'`);
|
|
194
277
|
}
|
|
195
|
-
resources.push((0, core_1.jsx)('Secret', {
|
|
196
|
-
apiVersion: 'v1',
|
|
197
|
-
kind: 'Secret',
|
|
198
|
-
metadata: { name: secretName, namespace },
|
|
199
|
-
stringData: {
|
|
200
|
-
password,
|
|
201
|
-
username: name,
|
|
202
|
-
uri: `postgresql://${name}:${password}@${host}:5432/${name}`,
|
|
203
|
-
},
|
|
204
|
-
}));
|
|
205
278
|
break;
|
|
206
279
|
default:
|
|
207
280
|
throw new Error(`Database "${name}" has an unknown secrets backend "${secretProvider.backend}".\n` +
|
|
208
|
-
`Supported backends: 'openbao', 'vault', 'sealed-secrets', 'kubernetes'`);
|
|
281
|
+
`Supported backends: 'openbao', 'vault', 'sealed-secrets', 'kubernetes', 'manual-secrets'`);
|
|
209
282
|
}
|
|
210
283
|
return resources;
|
|
211
284
|
}
|
|
285
|
+
/**
|
|
286
|
+
* Render a VaultStaticSecret / OpenBaoStaticSecret syncing one backend entry
|
|
287
|
+
* into a Kubernetes Secret. Rotation semantics are first-class:
|
|
288
|
+
* `refreshAfter` comes from the provider (Platform secrets config),
|
|
289
|
+
* `rolloutRestartTargets` restarts consuming workloads on rotation.
|
|
290
|
+
* The secret content itself is never rendered into the manifest.
|
|
291
|
+
*/
|
|
292
|
+
function createStaticSecretResource(resourceName, destinationName, namespace, secretProvider, vaultPath, rolloutRestartTargets) {
|
|
293
|
+
const targets = rolloutRestartTargets?.map((t) => ({
|
|
294
|
+
apiVersion: t.apiVersion ?? 'apps/v1',
|
|
295
|
+
kind: t.kind ?? 'Deployment',
|
|
296
|
+
name: t.name,
|
|
297
|
+
}));
|
|
298
|
+
const spec = {
|
|
299
|
+
mount: secretProvider.mount,
|
|
300
|
+
type: 'kv-v2',
|
|
301
|
+
path: vaultPath,
|
|
302
|
+
...(secretProvider.refreshAfter && { refreshAfter: secretProvider.refreshAfter }),
|
|
303
|
+
...(targets && targets.length > 0 && { rolloutRestartTargets: targets }),
|
|
304
|
+
destination: { create: true, name: destinationName },
|
|
305
|
+
};
|
|
306
|
+
if (secretProvider.backend === 'openbao') {
|
|
307
|
+
return [
|
|
308
|
+
(0, core_1.jsx)('OpenBaoStaticSecret', {
|
|
309
|
+
apiVersion: 'secrets.openbao.org/v1beta1',
|
|
310
|
+
kind: 'OpenBaoStaticSecret',
|
|
311
|
+
metadata: { name: resourceName, namespace },
|
|
312
|
+
spec: { openbaoAuthRef: secretProvider.authRef, ...spec },
|
|
313
|
+
}),
|
|
314
|
+
];
|
|
315
|
+
}
|
|
316
|
+
return [
|
|
317
|
+
(0, core_1.jsx)('VaultStaticSecret', {
|
|
318
|
+
apiVersion: 'secrets.hashicorp.com/v1beta1',
|
|
319
|
+
kind: 'VaultStaticSecret',
|
|
320
|
+
metadata: { name: resourceName, namespace },
|
|
321
|
+
spec: { vaultAuthRef: secretProvider.authRef, ...spec },
|
|
322
|
+
}),
|
|
323
|
+
];
|
|
324
|
+
}
|
|
212
325
|
//# sourceMappingURL=database.js.map
|
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.tsx"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.tsx"],"names":[],"mappings":"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"}
|
package/dist/dns-provider.js
CHANGED
|
@@ -102,7 +102,7 @@ function DnsProvider(props) {
|
|
|
102
102
|
: config.settings.tsig.path;
|
|
103
103
|
const SecretKind = secrets.backend === 'openbao' ? 'OpenBaoStaticSecret' : 'VaultStaticSecret';
|
|
104
104
|
resources.push((0, core_1.jsx)(SecretKind, {
|
|
105
|
-
apiVersion: 'secrets.hashicorp.com/
|
|
105
|
+
apiVersion: 'secrets.hashicorp.com/v1beta1',
|
|
106
106
|
kind: SecretKind,
|
|
107
107
|
metadata: { name: secretName, namespace: 'external-dns' },
|
|
108
108
|
spec: {
|
package/dist/dns-provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dns-provider.js","sourceRoot":"","sources":["../src/dns-provider.tsx"],"names":[],"mappings":";;;AA0CA,kCAKC;AA6ED,kCAqEC;AAjMD,oCAAsE;AACtE,iDAAkD;AAClD,iDAAmE;AACnE,oCAAqC;AAuCrC,SAAgB,WAAW,CAAC,KAAuB;IACjD,OAAO;QACL,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,KAAK;KAChB,CAAA;AACH,CAAC;AAaY,QAAA,UAAU,GAAG,IAAA,wBAAa,EAAmB,IAAI,CAAC,CAAA;AAmB/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,SAAgB,WAAW,CAAC,KAAuB;IACjD,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAEpC,MAAM,eAAe,GAAG,IAAA,iBAAU,EAAC,0BAAe,CAAC,CAAA;IACnD,MAAM,OAAO,GAAG,IAAA,iBAAU,EAAC,wBAAa,CAAC,CAAA;IAEzC,0BAA0B;IAC1B,IAAI,MAAiB,CAAA;IACrB,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;IACrC,CAAC;SAAM,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QAClC,MAAM,GAAG,QAAQ,CAAA;IACnB,CAAC;SAAM,IACL,QAAQ;QACR,OAAO,QAAQ,KAAK,QAAQ;QAC5B,MAAM,IAAI,QAAQ;QACjB,QAAgB,CAAC,IAAI,KAAK,WAAW,EACtC,CAAC;QACD,sDAAsD;QACtD,MAAM,GAAG,WAAW,CAAE,QAAgB,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;IAC3D,CAAC;IAED,MAAM,SAAS,GAA6B,EAAE,CAAA;IAE9C,gCAAgC;IAChC,MAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc,CAAC,CAAA;IAC/E,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,SAAS,CAAC,IAAI,CAAC,IAAA,sBAAe,EAAC,gBAAS,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9D,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,KAAK,CACb,+EAA+E;gBAC7E,YAAY,OAAO,EAAE,OAAO,IAAI,MAAM,IAAI;gBAC1C,kEAAkE,CACrE,CAAA;QACH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,mBAAmB,CAAA;QACzE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAA;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAA;QACnC,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;YAC5C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAA;QAE7B,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,CAAA;QAC9F,SAAS,CAAC,IAAI,CACZ,IAAA,UAAG,EAAC,UAAU,EAAE;YACd,UAAU,EAAE
|
|
1
|
+
{"version":3,"file":"dns-provider.js","sourceRoot":"","sources":["../src/dns-provider.tsx"],"names":[],"mappings":"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"}
|