@vibesdotdev/infra-doks 0.0.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/README.md +107 -0
- package/SPEC.md +285 -0
- package/dist/client/digitalocean-app-deploy.client.d.ts +46 -0
- package/dist/client/digitalocean-app-deploy.client.d.ts.map +1 -0
- package/dist/client/digitalocean-app-deploy.client.js +135 -0
- package/dist/client/digitalocean-app-deploy.client.js.map +1 -0
- package/dist/client/index.d.ts +15 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +18 -0
- package/dist/client/index.js.map +1 -0
- package/dist/cloud/base.d.ts +33 -0
- package/dist/cloud/base.d.ts.map +1 -0
- package/dist/cloud/base.js +86 -0
- package/dist/cloud/base.js.map +1 -0
- package/dist/cloud/digitalocean.d.ts +33 -0
- package/dist/cloud/digitalocean.d.ts.map +1 -0
- package/dist/cloud/digitalocean.js +258 -0
- package/dist/cloud/digitalocean.js.map +1 -0
- package/dist/cloud/factory.d.ts +28 -0
- package/dist/cloud/factory.d.ts.map +1 -0
- package/dist/cloud/factory.js +151 -0
- package/dist/cloud/factory.js.map +1 -0
- package/dist/cloud/index.d.ts +12 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +11 -0
- package/dist/cloud/index.js.map +1 -0
- package/dist/doks.plugin.d.ts +41 -0
- package/dist/doks.plugin.d.ts.map +1 -0
- package/dist/doks.plugin.js +287 -0
- package/dist/doks.plugin.js.map +1 -0
- package/dist/implementations/deployment.impl.d.ts +34 -0
- package/dist/implementations/deployment.impl.d.ts.map +1 -0
- package/dist/implementations/deployment.impl.js +86 -0
- package/dist/implementations/deployment.impl.js.map +1 -0
- package/dist/implementations/droplet.impl.d.ts +85 -0
- package/dist/implementations/droplet.impl.d.ts.map +1 -0
- package/dist/implementations/droplet.impl.js +113 -0
- package/dist/implementations/droplet.impl.js.map +1 -0
- package/dist/implementations/gitea.impl.d.ts +68 -0
- package/dist/implementations/gitea.impl.d.ts.map +1 -0
- package/dist/implementations/gitea.impl.js +295 -0
- package/dist/implementations/gitea.impl.js.map +1 -0
- package/dist/implementations/managed-db.impl.d.ts +25 -0
- package/dist/implementations/managed-db.impl.d.ts.map +1 -0
- package/dist/implementations/managed-db.impl.js +31 -0
- package/dist/implementations/managed-db.impl.js.map +1 -0
- package/dist/implementations/managed-redis.impl.d.ts +37 -0
- package/dist/implementations/managed-redis.impl.d.ts.map +1 -0
- package/dist/implementations/managed-redis.impl.js +40 -0
- package/dist/implementations/managed-redis.impl.js.map +1 -0
- package/dist/implementations/spaces.impl.d.ts +36 -0
- package/dist/implementations/spaces.impl.d.ts.map +1 -0
- package/dist/implementations/spaces.impl.js +40 -0
- package/dist/implementations/spaces.impl.js.map +1 -0
- package/dist/implementations/statefulset.impl.d.ts +65 -0
- package/dist/implementations/statefulset.impl.d.ts.map +1 -0
- package/dist/implementations/statefulset.impl.js +165 -0
- package/dist/implementations/statefulset.impl.js.map +1 -0
- package/dist/implementations/verdaccio.impl.d.ts +65 -0
- package/dist/implementations/verdaccio.impl.d.ts.map +1 -0
- package/dist/implementations/verdaccio.impl.js +259 -0
- package/dist/implementations/verdaccio.impl.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/kubernetes/index.d.ts +95 -0
- package/dist/kubernetes/index.d.ts.map +1 -0
- package/dist/kubernetes/index.js +625 -0
- package/dist/kubernetes/index.js.map +1 -0
- package/dist/secrets/index.d.ts +4 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +4 -0
- package/dist/secrets/index.js.map +1 -0
- package/dist/secrets/vault.descriptor.d.ts +10 -0
- package/dist/secrets/vault.descriptor.d.ts.map +1 -0
- package/dist/secrets/vault.descriptor.js +25 -0
- package/dist/secrets/vault.descriptor.js.map +1 -0
- package/dist/secrets/vault.impl.cloud.d.ts +40 -0
- package/dist/secrets/vault.impl.cloud.d.ts.map +1 -0
- package/dist/secrets/vault.impl.cloud.js +178 -0
- package/dist/secrets/vault.impl.cloud.js.map +1 -0
- package/dist/secrets/vault.impl.d.ts +29 -0
- package/dist/secrets/vault.impl.d.ts.map +1 -0
- package/dist/secrets/vault.impl.js +137 -0
- package/dist/secrets/vault.impl.js.map +1 -0
- package/dist/types.d.ts +509 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +47 -0
- package/dist/types.js.map +1 -0
- package/package.json +145 -0
- package/src/client/digitalocean-app-deploy.client.ts +226 -0
- package/src/client/index.ts +24 -0
- package/src/cloud/base.ts +149 -0
- package/src/cloud/digitalocean.ts +363 -0
- package/src/cloud/factory.ts +190 -0
- package/src/cloud/index.ts +81 -0
- package/src/doks.plugin.ts +401 -0
- package/src/implementations/deployment.impl.ts +93 -0
- package/src/implementations/droplet.impl.ts +157 -0
- package/src/implementations/gitea.impl.ts +319 -0
- package/src/implementations/managed-db.impl.ts +37 -0
- package/src/implementations/managed-redis.impl.ts +49 -0
- package/src/implementations/spaces.impl.ts +52 -0
- package/src/implementations/statefulset.impl.ts +186 -0
- package/src/implementations/verdaccio.impl.ts +300 -0
- package/src/index.ts +136 -0
- package/src/kubernetes/index.ts +754 -0
- package/src/secrets/index.ts +9 -0
- package/src/secrets/vault.descriptor.ts +28 -0
- package/src/secrets/vault.impl.cloud.ts +278 -0
- package/src/secrets/vault.impl.ts +149 -0
- package/src/types.ts +563 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault Backend Descriptor
|
|
3
|
+
*
|
|
4
|
+
* HashiCorp Vault KV v2 secrets store for staging/production.
|
|
5
|
+
* Only available on cloud hardware (inside K8s cluster).
|
|
6
|
+
*/
|
|
7
|
+
import type { SecretsStoreDescriptor } from '@vibesdotdev/secrets/kinds/store.schema';
|
|
8
|
+
declare const descriptor: SecretsStoreDescriptor;
|
|
9
|
+
export default descriptor;
|
|
10
|
+
//# sourceMappingURL=vault.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.descriptor.d.ts","sourceRoot":"","sources":["../../src/secrets/vault.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEtF,QAAA,MAAM,UAAU,EAAE,sBAgBjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault Backend Descriptor
|
|
3
|
+
*
|
|
4
|
+
* HashiCorp Vault KV v2 secrets store for staging/production.
|
|
5
|
+
* Only available on cloud hardware (inside K8s cluster).
|
|
6
|
+
*/
|
|
7
|
+
const descriptor = {
|
|
8
|
+
id: 'vault',
|
|
9
|
+
kind: 'secrets/store',
|
|
10
|
+
name: 'HashiCorp Vault',
|
|
11
|
+
description: 'Vault KV v2 secrets engine for K8s-deployed environments',
|
|
12
|
+
tags: ['remote', 'vault', 'kubernetes'],
|
|
13
|
+
enabled: true,
|
|
14
|
+
hardware: ['cloud'],
|
|
15
|
+
backend: 'vault',
|
|
16
|
+
tiers: ['staging', 'production'],
|
|
17
|
+
priority: 30,
|
|
18
|
+
config: {
|
|
19
|
+
address: 'http://vault.observability.svc.cluster.local:8200',
|
|
20
|
+
mount: 'staging',
|
|
21
|
+
authMethod: 'kubernetes'
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export default descriptor;
|
|
25
|
+
//# sourceMappingURL=vault.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.descriptor.js","sourceRoot":"","sources":["../../src/secrets/vault.descriptor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,UAAU,GAA2B;IAC1C,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,0DAA0D;IACvE,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC;IACvC,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;IAChC,QAAQ,EAAE,EAAE;IACZ,MAAM,EAAE;QACP,OAAO,EAAE,mDAAmD;QAC5D,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,YAAY;KACxB;CACD,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HashiCorp Vault KV v2 HTTP Client
|
|
3
|
+
*
|
|
4
|
+
* Communicates with Vault's KV v2 secrets engine.
|
|
5
|
+
* Supports Kubernetes auth (service account) and token auth.
|
|
6
|
+
*/
|
|
7
|
+
export interface VaultClientConfig {
|
|
8
|
+
address: string;
|
|
9
|
+
mount: string;
|
|
10
|
+
token?: string;
|
|
11
|
+
}
|
|
12
|
+
/** Read all key-value pairs at a path */
|
|
13
|
+
export declare function readKVSecret(config: VaultClientConfig, path: string): Promise<Record<string, string>>;
|
|
14
|
+
/** Write key-value pairs to a path (merges with existing) */
|
|
15
|
+
export declare function writeKVSecret(config: VaultClientConfig, path: string, data: Record<string, string>): Promise<void>;
|
|
16
|
+
/** Delete a specific key from a path (read, remove key, write back) */
|
|
17
|
+
export declare function deleteKVKey(config: VaultClientConfig, path: string, key: string): Promise<void>;
|
|
18
|
+
/** List sub-paths under a given path */
|
|
19
|
+
export declare function listKVPaths(config: VaultClientConfig, path: string): Promise<string[]>;
|
|
20
|
+
export interface VaultSealStatus {
|
|
21
|
+
type: string;
|
|
22
|
+
initialized: boolean;
|
|
23
|
+
sealed: boolean;
|
|
24
|
+
t: number;
|
|
25
|
+
n: number;
|
|
26
|
+
progress: number;
|
|
27
|
+
nonce: string;
|
|
28
|
+
version: string;
|
|
29
|
+
}
|
|
30
|
+
export interface VaultUnsealOptions {
|
|
31
|
+
address?: string;
|
|
32
|
+
ingressIp?: string;
|
|
33
|
+
dryRun?: boolean;
|
|
34
|
+
keys?: string[];
|
|
35
|
+
log?: (message: string) => void;
|
|
36
|
+
error?: (message: string) => void;
|
|
37
|
+
}
|
|
38
|
+
export declare function collectVaultUnsealKeysFromEnv(maxKeys?: number): string[];
|
|
39
|
+
export declare function unsealVault(options?: VaultUnsealOptions): Promise<VaultSealStatus>;
|
|
40
|
+
//# sourceMappingURL=vault.impl.cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.impl.cloud.d.ts","sourceRoot":"","sources":["../../src/secrets/vault.impl.cloud.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAgED,yCAAyC;AACzC,wBAAsB,YAAY,CACjC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAMjC;AAED,6DAA6D;AAC7D,wBAAsB,aAAa,CAClC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,uEAAuE;AACvE,wBAAsB,WAAW,CAChC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GACT,OAAO,CAAC,IAAI,CAAC,CAIf;AAED,wCAAwC;AACxC,wBAAsB,WAAW,CAChC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAuDD,wBAAgB,6BAA6B,CAAC,OAAO,SAAI,GAAG,MAAM,EAAE,CAOnE;AAED,wBAAsB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,eAAe,CAAC,CAkE5F"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HashiCorp Vault KV v2 HTTP Client
|
|
3
|
+
*
|
|
4
|
+
* Communicates with Vault's KV v2 secrets engine.
|
|
5
|
+
* Supports Kubernetes auth (service account) and token auth.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
const K8S_TOKEN_PATH = '/var/run/secrets/kubernetes.io/serviceaccount/token';
|
|
9
|
+
const K8S_AUTH_MOUNT = 'kubernetes';
|
|
10
|
+
async function getVaultToken(config) {
|
|
11
|
+
if (config.token)
|
|
12
|
+
return config.token;
|
|
13
|
+
if (process.env.VAULT_TOKEN)
|
|
14
|
+
return process.env.VAULT_TOKEN;
|
|
15
|
+
// Kubernetes auth: exchange service account JWT for Vault token
|
|
16
|
+
try {
|
|
17
|
+
const jwt = await readFile(K8S_TOKEN_PATH, 'utf-8');
|
|
18
|
+
const role = process.env.VAULT_K8S_ROLE ?? 'staging-app';
|
|
19
|
+
const res = await fetch(`${config.address}/v1/auth/${K8S_AUTH_MOUNT}/login`, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
body: JSON.stringify({ jwt, role })
|
|
23
|
+
});
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
throw new Error(`Vault K8s auth failed: ${res.status}`);
|
|
26
|
+
}
|
|
27
|
+
const data = (await res.json());
|
|
28
|
+
return data.auth.client_token;
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
throw new Error(`Cannot authenticate to Vault: ${e}. Set VAULT_TOKEN or run inside K8s.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
async function vaultFetch(config, path, init) {
|
|
35
|
+
const token = await getVaultToken(config);
|
|
36
|
+
const url = `${config.address}${path}`;
|
|
37
|
+
const res = await fetch(url, {
|
|
38
|
+
...init,
|
|
39
|
+
headers: {
|
|
40
|
+
'X-Vault-Token': token,
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
...(init?.headers ?? {})
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
if (!res.ok) {
|
|
46
|
+
const body = await res.text();
|
|
47
|
+
throw new Error(`Vault API error (${res.status}): ${body}`);
|
|
48
|
+
}
|
|
49
|
+
return (await res.json());
|
|
50
|
+
}
|
|
51
|
+
/** Read all key-value pairs at a path */
|
|
52
|
+
export async function readKVSecret(config, path) {
|
|
53
|
+
const res = await vaultFetch(config, `/v1/${config.mount}/data/${path}`);
|
|
54
|
+
return res.data.data;
|
|
55
|
+
}
|
|
56
|
+
/** Write key-value pairs to a path (merges with existing) */
|
|
57
|
+
export async function writeKVSecret(config, path, data) {
|
|
58
|
+
await vaultFetch(config, `/v1/${config.mount}/data/${path}`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
body: JSON.stringify({ data })
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/** Delete a specific key from a path (read, remove key, write back) */
|
|
64
|
+
export async function deleteKVKey(config, path, key) {
|
|
65
|
+
const current = await readKVSecret(config, path);
|
|
66
|
+
delete current[key];
|
|
67
|
+
await writeKVSecret(config, path, current);
|
|
68
|
+
}
|
|
69
|
+
/** List sub-paths under a given path */
|
|
70
|
+
export async function listKVPaths(config, path) {
|
|
71
|
+
try {
|
|
72
|
+
const res = await vaultFetch(config, `/v1/${config.mount}/metadata/${path}`, { method: 'LIST' });
|
|
73
|
+
return res.data.keys;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const DEFAULT_VAULT_ADDR = 'https://vault.vibes.dev';
|
|
80
|
+
function hostFor(address) {
|
|
81
|
+
return new URL(address).host;
|
|
82
|
+
}
|
|
83
|
+
async function vaultOperatorFetch(address, ingressIp, path, init) {
|
|
84
|
+
const url = ingressIp
|
|
85
|
+
? `${address.replace(hostFor(address), ingressIp)}${path}`
|
|
86
|
+
: `${address}${path}`;
|
|
87
|
+
const headers = new Headers(init?.headers);
|
|
88
|
+
if (ingressIp)
|
|
89
|
+
headers.set('Host', hostFor(address));
|
|
90
|
+
headers.set('Content-Type', 'application/json');
|
|
91
|
+
const res = await fetch(url, { ...init, headers });
|
|
92
|
+
if (!res.ok) {
|
|
93
|
+
const body = await res.text();
|
|
94
|
+
throw new Error(`Vault ${path} failed (${res.status}): ${body}`);
|
|
95
|
+
}
|
|
96
|
+
return (await res.json());
|
|
97
|
+
}
|
|
98
|
+
async function getSealStatus(address, ingressIp) {
|
|
99
|
+
return vaultOperatorFetch(address, ingressIp, '/v1/sys/seal-status');
|
|
100
|
+
}
|
|
101
|
+
async function submitUnsealKey(address, ingressIp, key) {
|
|
102
|
+
return vaultOperatorFetch(address, ingressIp, '/v1/sys/unseal', {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
body: JSON.stringify({ key })
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
async function resetUnsealProgress(address, ingressIp) {
|
|
108
|
+
await vaultOperatorFetch(address, ingressIp, '/v1/sys/unseal', {
|
|
109
|
+
method: 'POST',
|
|
110
|
+
body: JSON.stringify({ reset: true })
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
export function collectVaultUnsealKeysFromEnv(maxKeys = 5) {
|
|
114
|
+
const keys = [];
|
|
115
|
+
for (let i = 1; i <= maxKeys; i++) {
|
|
116
|
+
const key = process.env[`VAULT_UNSEAL_KEY_${i}`];
|
|
117
|
+
if (key && key.length > 0)
|
|
118
|
+
keys.push(key);
|
|
119
|
+
}
|
|
120
|
+
return keys;
|
|
121
|
+
}
|
|
122
|
+
export async function unsealVault(options = {}) {
|
|
123
|
+
const address = options.address ?? process.env.VAULT_ADDR ?? DEFAULT_VAULT_ADDR;
|
|
124
|
+
const ingressIp = options.ingressIp ?? process.env.VAULT_INGRESS_IP;
|
|
125
|
+
const dryRun = options.dryRun === true;
|
|
126
|
+
const log = options.log ?? console.log;
|
|
127
|
+
const error = options.error ?? console.error;
|
|
128
|
+
const keys = options.keys ?? collectVaultUnsealKeysFromEnv();
|
|
129
|
+
log('\n=== Unseal Vault ===');
|
|
130
|
+
log(` Address: ${address}`);
|
|
131
|
+
if (ingressIp)
|
|
132
|
+
log(` Ingress override: ${ingressIp}`);
|
|
133
|
+
log(` Dry run: ${dryRun}\n`);
|
|
134
|
+
let status = await getSealStatus(address, ingressIp);
|
|
135
|
+
log(` Initialized: ${status.initialized}`);
|
|
136
|
+
log(` Sealed: ${status.sealed}`);
|
|
137
|
+
log(` Threshold: ${status.t} of ${status.n}`);
|
|
138
|
+
log(` Progress: ${status.progress}/${status.t}\n`);
|
|
139
|
+
if (!status.initialized) {
|
|
140
|
+
throw new Error('Vault is not initialized. Run `vault operator init` first.');
|
|
141
|
+
}
|
|
142
|
+
if (!status.sealed) {
|
|
143
|
+
log(' ✓ Vault already unsealed — nothing to do.\n');
|
|
144
|
+
return status;
|
|
145
|
+
}
|
|
146
|
+
if (keys.length < status.t) {
|
|
147
|
+
throw new Error(`Need ${status.t} unseal keys, have ${keys.length} (set VAULT_UNSEAL_KEY_1..${status.t}).`);
|
|
148
|
+
}
|
|
149
|
+
if (dryRun) {
|
|
150
|
+
log(` [dry-run] Would submit ${status.t} of ${keys.length} available keys.\n`);
|
|
151
|
+
return status;
|
|
152
|
+
}
|
|
153
|
+
if (status.progress > 0) {
|
|
154
|
+
log(' Resetting prior partial-unseal progress...');
|
|
155
|
+
await resetUnsealProgress(address, ingressIp);
|
|
156
|
+
}
|
|
157
|
+
let submitted = 0;
|
|
158
|
+
for (const key of keys) {
|
|
159
|
+
if (!status.sealed)
|
|
160
|
+
break;
|
|
161
|
+
try {
|
|
162
|
+
status = await submitUnsealKey(address, ingressIp, key);
|
|
163
|
+
submitted++;
|
|
164
|
+
log(` ✓ Key ${submitted} accepted — progress ${status.progress}/${status.t}, sealed=${status.sealed}`);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
error(` ✗ Key ${submitted + 1} rejected: ${err.message}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (status.sealed) {
|
|
171
|
+
error(`\n Vault still sealed after submitting ${submitted} keys.`);
|
|
172
|
+
await resetUnsealProgress(address, ingressIp);
|
|
173
|
+
throw new Error('Unseal failed — keys may be wrong or out of order.');
|
|
174
|
+
}
|
|
175
|
+
log(`\n ✓ Vault unsealed (used ${submitted} keys).\n`);
|
|
176
|
+
return status;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=vault.impl.cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.impl.cloud.js","sourceRoot":"","sources":["../../src/secrets/vault.impl.cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault Backend Implementation
|
|
3
|
+
*
|
|
4
|
+
* Stores secrets in HashiCorp Vault KV v2 engine.
|
|
5
|
+
* Paths follow Helm chart conventions: {mount}/oauth, {mount}/app,
|
|
6
|
+
* {mount}/artifacts, {mount}/infrastructure.
|
|
7
|
+
*
|
|
8
|
+
* All secrets for an environment are stored under a single Vault path
|
|
9
|
+
* (e.g., staging/app) as a flat key-value map.
|
|
10
|
+
*/
|
|
11
|
+
import type { SecretsStoreDescriptor } from '@vibesdotdev/secrets/kinds/store.schema';
|
|
12
|
+
import type { SecretsStoreImplementation, SecretEntry } from '@vibesdotdev/secrets/kinds/store.interface';
|
|
13
|
+
declare class VaultStore implements SecretsStoreImplementation {
|
|
14
|
+
readonly id = "vault";
|
|
15
|
+
readonly descriptor: SecretsStoreDescriptor;
|
|
16
|
+
constructor(desc: SecretsStoreDescriptor);
|
|
17
|
+
list(environment: string): Promise<SecretEntry[]>;
|
|
18
|
+
get(environment: string, key: string): Promise<string | undefined>;
|
|
19
|
+
set(environment: string, key: string, value: string): Promise<void>;
|
|
20
|
+
unset(environment: string, key: string): Promise<void>;
|
|
21
|
+
getAll(environment: string): Promise<Record<string, string>>;
|
|
22
|
+
setAll(environment: string, secrets: Record<string, string>): Promise<void>;
|
|
23
|
+
private configForEnv;
|
|
24
|
+
private findPathForKey;
|
|
25
|
+
private safeRead;
|
|
26
|
+
}
|
|
27
|
+
export declare function createVaultStore(): import("@vibesdotdev/runtime").RuntimeImplementationWrapper<VaultStore>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=vault.impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.impl.d.ts","sourceRoot":"","sources":["../../src/secrets/vault.impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAqB1G,cAAM,UAAW,YAAW,0BAA0B;IACrD,QAAQ,CAAC,EAAE,WAAW;IACtB,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;gBAEhC,IAAI,EAAE,sBAAsB;IAIlC,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAkBjD,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAalE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnE,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtD,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAgB5D,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQjF,OAAO,CAAC,YAAY;YAKN,cAAc;YAYd,QAAQ;CAOtB;AAED,wBAAgB,gBAAgB,4EAQ/B"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault Backend Implementation
|
|
3
|
+
*
|
|
4
|
+
* Stores secrets in HashiCorp Vault KV v2 engine.
|
|
5
|
+
* Paths follow Helm chart conventions: {mount}/oauth, {mount}/app,
|
|
6
|
+
* {mount}/artifacts, {mount}/infrastructure.
|
|
7
|
+
*
|
|
8
|
+
* All secrets for an environment are stored under a single Vault path
|
|
9
|
+
* (e.g., staging/app) as a flat key-value map.
|
|
10
|
+
*/
|
|
11
|
+
import { createRuntimeImplementation } from '@vibesdotdev/runtime/factory/implementation';
|
|
12
|
+
import { readKVSecret, writeKVSecret, deleteKVKey } from './vault.impl.cloud.js';
|
|
13
|
+
import descriptor from './vault.descriptor.js';
|
|
14
|
+
/** Vault paths that correspond to Helm chart secret groups */
|
|
15
|
+
const VAULT_PATHS = ['app', 'oauth', 'artifacts', 'infrastructure'];
|
|
16
|
+
function getConfig(desc) {
|
|
17
|
+
return {
|
|
18
|
+
address: desc.config?.address ?? 'http://vault.observability.svc.cluster.local:8200',
|
|
19
|
+
mount: desc.config?.mount ?? 'staging',
|
|
20
|
+
token: process.env.VAULT_TOKEN
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function getMountForEnvironment(desc, environment) {
|
|
24
|
+
if (environment === 'production')
|
|
25
|
+
return 'production';
|
|
26
|
+
if (environment === 'staging')
|
|
27
|
+
return 'staging';
|
|
28
|
+
return desc.config?.mount ?? environment;
|
|
29
|
+
}
|
|
30
|
+
class VaultStore {
|
|
31
|
+
id = 'vault';
|
|
32
|
+
descriptor;
|
|
33
|
+
constructor(desc) {
|
|
34
|
+
this.descriptor = desc;
|
|
35
|
+
}
|
|
36
|
+
async list(environment) {
|
|
37
|
+
const config = this.configForEnv(environment);
|
|
38
|
+
const entries = [];
|
|
39
|
+
for (const path of VAULT_PATHS) {
|
|
40
|
+
try {
|
|
41
|
+
const data = await readKVSecret(config, path);
|
|
42
|
+
for (const key of Object.keys(data)) {
|
|
43
|
+
entries.push({ key, hasValue: data[key] !== '', source: `vault/${path}` });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// path may not exist yet
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return entries;
|
|
51
|
+
}
|
|
52
|
+
async get(environment, key) {
|
|
53
|
+
const config = this.configForEnv(environment);
|
|
54
|
+
for (const path of VAULT_PATHS) {
|
|
55
|
+
try {
|
|
56
|
+
const data = await readKVSecret(config, path);
|
|
57
|
+
if (key in data)
|
|
58
|
+
return data[key];
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
async set(environment, key, value) {
|
|
67
|
+
const config = this.configForEnv(environment);
|
|
68
|
+
// Default to 'app' path for new secrets
|
|
69
|
+
const targetPath = (await this.findPathForKey(config, key)) ?? 'app';
|
|
70
|
+
const current = await this.safeRead(config, targetPath);
|
|
71
|
+
current[key] = value;
|
|
72
|
+
await writeKVSecret(config, targetPath, current);
|
|
73
|
+
}
|
|
74
|
+
async unset(environment, key) {
|
|
75
|
+
const config = this.configForEnv(environment);
|
|
76
|
+
const targetPath = await this.findPathForKey(config, key);
|
|
77
|
+
if (targetPath) {
|
|
78
|
+
await deleteKVKey(config, targetPath, key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async getAll(environment) {
|
|
82
|
+
const config = this.configForEnv(environment);
|
|
83
|
+
const all = {};
|
|
84
|
+
for (const path of VAULT_PATHS) {
|
|
85
|
+
try {
|
|
86
|
+
const data = await readKVSecret(config, path);
|
|
87
|
+
Object.assign(all, data);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return all;
|
|
94
|
+
}
|
|
95
|
+
async setAll(environment, secrets) {
|
|
96
|
+
const config = this.configForEnv(environment);
|
|
97
|
+
// Write all to the 'app' path by default
|
|
98
|
+
const current = await this.safeRead(config, 'app');
|
|
99
|
+
Object.assign(current, secrets);
|
|
100
|
+
await writeKVSecret(config, 'app', current);
|
|
101
|
+
}
|
|
102
|
+
configForEnv(environment) {
|
|
103
|
+
const base = getConfig(this.descriptor);
|
|
104
|
+
return { ...base, mount: getMountForEnvironment(this.descriptor, environment) };
|
|
105
|
+
}
|
|
106
|
+
async findPathForKey(config, key) {
|
|
107
|
+
for (const path of VAULT_PATHS) {
|
|
108
|
+
try {
|
|
109
|
+
const data = await readKVSecret(config, path);
|
|
110
|
+
if (key in data)
|
|
111
|
+
return path;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
async safeRead(config, path) {
|
|
120
|
+
try {
|
|
121
|
+
return await readKVSecret(config, path);
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return {};
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export function createVaultStore() {
|
|
129
|
+
const store = new VaultStore(descriptor);
|
|
130
|
+
return createRuntimeImplementation({
|
|
131
|
+
id: 'vault',
|
|
132
|
+
kind: 'secrets/store',
|
|
133
|
+
priority: 30,
|
|
134
|
+
implementation: store
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=vault.impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.impl.js","sourceRoot":"","sources":["../../src/secrets/vault.impl.ts"],"names":[],"mappings":"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"}
|