@ninedeploy/schemas 0.10.5 → 0.16.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/LICENSE +21 -21
- package/dist/accessGrants.d.ts +156 -0
- package/dist/accessGrants.d.ts.map +1 -0
- package/dist/accessGrants.js +100 -0
- package/dist/accessGrants.js.map +1 -0
- package/dist/agentCommand.d.ts.map +1 -1
- package/dist/agentCommand.js +11 -1
- package/dist/agentCommand.js.map +1 -1
- package/dist/auth.d.ts +53 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +26 -0
- package/dist/auth.js.map +1 -1
- package/dist/backupPolicy.d.ts +37 -0
- package/dist/backupPolicy.d.ts.map +1 -0
- package/dist/backupPolicy.js +50 -0
- package/dist/backupPolicy.js.map +1 -0
- package/dist/common.d.ts +21 -5
- package/dist/common.d.ts.map +1 -1
- package/dist/common.js +35 -6
- package/dist/common.js.map +1 -1
- package/dist/databaseImport.d.ts +145 -0
- package/dist/databaseImport.d.ts.map +1 -0
- package/dist/databaseImport.js +115 -0
- package/dist/databaseImport.js.map +1 -0
- package/dist/doctor.d.ts +16 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +25 -0
- package/dist/doctor.js.map +1 -1
- package/dist/githubApp.d.ts +236 -0
- package/dist/githubApp.d.ts.map +1 -0
- package/dist/githubApp.js +223 -0
- package/dist/githubApp.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +5 -2
- package/dist/kernel.d.ts.map +1 -1
- package/dist/kernel.js +11 -2
- package/dist/kernel.js.map +1 -1
- package/dist/management.d.ts +46 -2
- package/dist/management.d.ts.map +1 -1
- package/dist/management.js +68 -15
- package/dist/management.js.map +1 -1
- package/dist/multiNode.d.ts +325 -0
- package/dist/multiNode.d.ts.map +1 -0
- package/dist/multiNode.js +294 -0
- package/dist/multiNode.js.map +1 -0
- package/dist/ninedeployManifest.d.ts.map +1 -1
- package/dist/ninedeployManifest.js +6 -3
- package/dist/ninedeployManifest.js.map +1 -1
- package/dist/panelBackup.d.ts +73 -0
- package/dist/panelBackup.d.ts.map +1 -0
- package/dist/panelBackup.js +45 -0
- package/dist/panelBackup.js.map +1 -0
- package/dist/proxyConfig.d.ts +132 -0
- package/dist/proxyConfig.d.ts.map +1 -0
- package/dist/proxyConfig.js +105 -0
- package/dist/proxyConfig.js.map +1 -0
- package/dist/publicAccess.d.ts +64 -0
- package/dist/publicAccess.d.ts.map +1 -0
- package/dist/publicAccess.js +63 -0
- package/dist/publicAccess.js.map +1 -0
- package/dist/secretProviders.d.ts +119 -0
- package/dist/secretProviders.d.ts.map +1 -0
- package/dist/secretProviders.js +130 -0
- package/dist/secretProviders.js.map +1 -0
- package/dist/secretScan.js +1 -1
- package/dist/service.d.ts +27 -17
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +76 -26
- package/dist/service.js.map +1 -1
- package/dist/terminals.d.ts +284 -0
- package/dist/terminals.d.ts.map +1 -0
- package/dist/terminals.js +177 -0
- package/dist/terminals.js.map +1 -0
- package/dist/traffic.d.ts +276 -0
- package/dist/traffic.d.ts.map +1 -0
- package/dist/traffic.js +103 -0
- package/dist/traffic.js.map +1 -0
- package/dist/workspaces.d.ts +19 -1
- package/dist/workspaces.d.ts.map +1 -1
- package/dist/workspaces.js +26 -0
- package/dist/workspaces.js.map +1 -1
- package/package.json +5 -4
- package/src/accessGrants.ts +117 -0
- package/src/agentCommand.ts +67 -0
- package/src/ai.ts +32 -0
- package/src/auth.ts +323 -0
- package/src/backupPolicy.ts +55 -0
- package/src/common.ts +179 -0
- package/src/databaseImport.ts +138 -0
- package/src/doctor.ts +161 -0
- package/src/environments.ts +23 -0
- package/src/githubApp.ts +268 -0
- package/src/index.ts +30 -0
- package/src/insights.ts +78 -0
- package/src/kernel.ts +180 -0
- package/src/labels.ts +86 -0
- package/src/management.ts +620 -0
- package/src/multiNode.ts +354 -0
- package/src/ninedeployManifest.ts +363 -0
- package/src/panelBackup.ts +90 -0
- package/src/project.ts +42 -0
- package/src/proxyConfig.ts +139 -0
- package/src/publicAccess.ts +80 -0
- package/src/runtimeVersions.ts +232 -0
- package/src/secretProviders.ts +159 -0
- package/src/secretScan.ts +169 -0
- package/src/service.ts +1044 -0
- package/src/terminals.ts +212 -0
- package/src/traffic.ts +130 -0
- package/src/workspaces.ts +215 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { envVarName, httpPath, repoBaseDir, slug } from './common.js';
|
|
2
|
+
import { envVarName, httpPath, repoBaseDir, repoRelativePath, slug } from './common.js';
|
|
3
3
|
/**
|
|
4
4
|
* `.ninedeploy` manifest schema — project-side declarative config for how
|
|
5
5
|
* NineDeploy should build, run and route a service. Committed to the repo,
|
|
@@ -43,7 +43,9 @@ export const build = z
|
|
|
43
43
|
build: z.string().min(1).max(500).optional(),
|
|
44
44
|
start: z.string().min(1).max(500).optional(),
|
|
45
45
|
baseDir: repoBaseDir.optional(),
|
|
46
|
-
|
|
46
|
+
// F928: same "inside the repository" rule as baseDir above and the panel's
|
|
47
|
+
// service.build.dockerfilePath — a repo-committed `../../x` must not pass.
|
|
48
|
+
dockerfile: repoRelativePath.min(1).max(200).optional(),
|
|
47
49
|
})
|
|
48
50
|
.strict();
|
|
49
51
|
// ── Run ────────────────────────────────────────────────────────────────────
|
|
@@ -171,7 +173,8 @@ export const previews = z
|
|
|
171
173
|
enabled: z.boolean().default(false),
|
|
172
174
|
/**
|
|
173
175
|
* Hostname template. `{n}` is replaced by the PR number. Example:
|
|
174
|
-
* `pr-{n}.
|
|
176
|
+
* `pr-{n}-{{slug}}.{{domain}}` (the panel also requires `{{slug}}` and its own
|
|
177
|
+
* wildcard zone, r511). Must contain `{n}` when enabled.
|
|
175
178
|
*/
|
|
176
179
|
pattern: z
|
|
177
180
|
.string()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ninedeployManifest.js","sourceRoot":"","sources":["../src/ninedeployManifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"ninedeployManifest.js","sourceRoot":"","sources":["../src/ninedeployManifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** The recovery passphrase seals every panel backup; it is the ONE secret an
|
|
3
|
+
* operator must keep off this server to restore on a new one. */
|
|
4
|
+
export declare const PANEL_BACKUP_PASSPHRASE_MIN = 12;
|
|
5
|
+
export declare const PANEL_BACKUP_RETAIN_MIN = 1;
|
|
6
|
+
export declare const PANEL_BACKUP_RETAIN_MAX = 365;
|
|
7
|
+
export declare const PANEL_BACKUP_DEFAULT_CRON = "0 3 * * *";
|
|
8
|
+
export declare const PANEL_BACKUP_DEFAULT_RETAIN = 7;
|
|
9
|
+
/**
|
|
10
|
+
* PUT /v1/system/panel-backup — every field optional; omitted keeps the stored
|
|
11
|
+
* value. `passphrase` is write-only (omitted = keep the stored one). The cron
|
|
12
|
+
* expression is validated with croner (5-part) at the route, the same rule
|
|
13
|
+
* scheduled jobs use; the schema package has no cron dependency.
|
|
14
|
+
*/
|
|
15
|
+
export declare const panelBackupSettingsPatch: z.ZodObject<{
|
|
16
|
+
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
cron: z.ZodOptional<z.ZodString>;
|
|
18
|
+
destinationId: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
19
|
+
retain: z.ZodOptional<z.ZodNumber>;
|
|
20
|
+
passphrase: z.ZodOptional<z.ZodString>;
|
|
21
|
+
}, z.core.$strict>;
|
|
22
|
+
export type PanelBackupSettingsPatch = z.infer<typeof panelBackupSettingsPatch>;
|
|
23
|
+
/**
|
|
24
|
+
* POST /v1/system/panel-backup/restore — destructive: replaces this panel's
|
|
25
|
+
* database, master key, .env and Traefik config. `confirm` must repeat the
|
|
26
|
+
* object's file name (the part of `key` after the last `/`).
|
|
27
|
+
*/
|
|
28
|
+
export declare const panelBackupRestore: z.ZodObject<{
|
|
29
|
+
destinationId: z.ZodOptional<z.ZodNumber>;
|
|
30
|
+
key: z.ZodString;
|
|
31
|
+
passphrase: z.ZodString;
|
|
32
|
+
confirm: z.ZodString;
|
|
33
|
+
}, z.core.$strict>;
|
|
34
|
+
export type PanelBackupRestore = z.infer<typeof panelBackupRestore>;
|
|
35
|
+
/** Outcome of the latest run, as `GET /v1/system/panel-backup` reports it. */
|
|
36
|
+
export interface PanelBackupRunState {
|
|
37
|
+
status: 'running' | 'completed' | 'failed';
|
|
38
|
+
trigger: 'schedule' | 'manual';
|
|
39
|
+
startedAt: string;
|
|
40
|
+
finishedAt: string | null;
|
|
41
|
+
key: string | null;
|
|
42
|
+
sizeBytes: number | null;
|
|
43
|
+
error: string | null;
|
|
44
|
+
/** Retention problems that did not fail the run (the new backup is safe). */
|
|
45
|
+
warning: string | null;
|
|
46
|
+
}
|
|
47
|
+
/** `GET /v1/system/panel-backup`. */
|
|
48
|
+
export interface PanelBackupStatus {
|
|
49
|
+
settings: {
|
|
50
|
+
enabled: boolean;
|
|
51
|
+
cron: string;
|
|
52
|
+
destinationId: number | null;
|
|
53
|
+
retain: number;
|
|
54
|
+
hasPassphrase: boolean;
|
|
55
|
+
};
|
|
56
|
+
/** True while a run (or a restore) is executing in this process. */
|
|
57
|
+
running: boolean;
|
|
58
|
+
lastRun: PanelBackupRunState | null;
|
|
59
|
+
lastSuccessAt: string | null;
|
|
60
|
+
/** Next scheduled run (ISO) when enabled and the cron is valid. */
|
|
61
|
+
nextRunAt: string | null;
|
|
62
|
+
/** The master key comes from NINEDEPLOY_MASTER_KEY(S), not the master.key
|
|
63
|
+
* file — backups then do NOT contain it and it must be kept separately. */
|
|
64
|
+
masterKeyFromEnv: boolean;
|
|
65
|
+
}
|
|
66
|
+
/** One panel backup object in the destination bucket. */
|
|
67
|
+
export interface PanelBackupObject {
|
|
68
|
+
key: string;
|
|
69
|
+
name: string;
|
|
70
|
+
sizeBytes: number;
|
|
71
|
+
lastModified: string;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=panelBackup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelBackup.d.ts","sourceRoot":"","sources":["../src/panelBackup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;kEACkE;AAClE,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,yBAAyB,cAAc,CAAC;AACrD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB;;;;;;kBAa1B,CAAC;AACZ,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;;;kBASpB,CAAC;AACZ,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IAC3C,OAAO,EAAE,UAAU,GAAG,QAAQ,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,qCAAqC;AACrC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IACF,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACpC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mEAAmE;IACnE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;gFAC4E;IAC5E,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// ── Panel self-backup (0.12) ───────────────────────────────────────────────
|
|
3
|
+
/** The recovery passphrase seals every panel backup; it is the ONE secret an
|
|
4
|
+
* operator must keep off this server to restore on a new one. */
|
|
5
|
+
export const PANEL_BACKUP_PASSPHRASE_MIN = 12;
|
|
6
|
+
export const PANEL_BACKUP_RETAIN_MIN = 1;
|
|
7
|
+
export const PANEL_BACKUP_RETAIN_MAX = 365;
|
|
8
|
+
export const PANEL_BACKUP_DEFAULT_CRON = '0 3 * * *';
|
|
9
|
+
export const PANEL_BACKUP_DEFAULT_RETAIN = 7;
|
|
10
|
+
/**
|
|
11
|
+
* PUT /v1/system/panel-backup — every field optional; omitted keeps the stored
|
|
12
|
+
* value. `passphrase` is write-only (omitted = keep the stored one). The cron
|
|
13
|
+
* expression is validated with croner (5-part) at the route, the same rule
|
|
14
|
+
* scheduled jobs use; the schema package has no cron dependency.
|
|
15
|
+
*/
|
|
16
|
+
export const panelBackupSettingsPatch = z
|
|
17
|
+
.object({
|
|
18
|
+
enabled: z.boolean().optional(),
|
|
19
|
+
cron: z.string().trim().min(1).max(120).optional(),
|
|
20
|
+
/** A `backup_destinations` id; null clears it (and requires enabled=false). */
|
|
21
|
+
destinationId: z.number().int().positive().nullable().optional(),
|
|
22
|
+
retain: z.number().int().min(PANEL_BACKUP_RETAIN_MIN).max(PANEL_BACKUP_RETAIN_MAX).optional(),
|
|
23
|
+
passphrase: z
|
|
24
|
+
.string()
|
|
25
|
+
.min(PANEL_BACKUP_PASSPHRASE_MIN, `The recovery passphrase needs at least ${PANEL_BACKUP_PASSPHRASE_MIN} characters`)
|
|
26
|
+
.max(1024)
|
|
27
|
+
.optional(),
|
|
28
|
+
})
|
|
29
|
+
.strict();
|
|
30
|
+
/**
|
|
31
|
+
* POST /v1/system/panel-backup/restore — destructive: replaces this panel's
|
|
32
|
+
* database, master key, .env and Traefik config. `confirm` must repeat the
|
|
33
|
+
* object's file name (the part of `key` after the last `/`).
|
|
34
|
+
*/
|
|
35
|
+
export const panelBackupRestore = z
|
|
36
|
+
.object({
|
|
37
|
+
/** Destination to read from; omitted = the configured one. On a fresh
|
|
38
|
+
* install, add the old bucket as a destination and name it here. */
|
|
39
|
+
destinationId: z.number().int().positive().optional(),
|
|
40
|
+
key: z.string().min(1).max(1024),
|
|
41
|
+
passphrase: z.string().min(1).max(1024),
|
|
42
|
+
confirm: z.string().max(1024),
|
|
43
|
+
})
|
|
44
|
+
.strict();
|
|
45
|
+
//# sourceMappingURL=panelBackup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panelBackup.js","sourceRoot":"","sources":["../src/panelBackup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E;kEACkE;AAClE,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAC3C,MAAM,CAAC,MAAM,yBAAyB,GAAG,WAAW,CAAC;AACrD,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC;KACtC,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAClD,+EAA+E;IAC/E,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,QAAQ,EAAE;IAC7F,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,2BAA2B,EAAE,0CAA0C,2BAA2B,aAAa,CAAC;SACpH,GAAG,CAAC,IAAI,CAAC;SACT,QAAQ,EAAE;CACd,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC;KAChC,MAAM,CAAC;IACN;yEACqE;IACrE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;CAC9B,CAAC;KACD,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** 256 KiB. Measured in UTF-8 bytes on the server; this caps the string. */
|
|
3
|
+
export declare const TRAEFIK_CUSTOM_CONFIG_MAX_BYTES: number;
|
|
4
|
+
export declare const CUSTOM_CERTIFICATE_CHAIN_MAX_BYTES: number;
|
|
5
|
+
export declare const CUSTOM_CERTIFICATE_KEY_MAX_BYTES: number;
|
|
6
|
+
export declare const CUSTOM_CERTIFICATES_MAX = 100;
|
|
7
|
+
/** PUT /v1/traefik/custom-config and POST …/validate. */
|
|
8
|
+
export declare const traefikCustomConfigInput: z.ZodObject<{
|
|
9
|
+
content: z.ZodString;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type TraefikCustomConfigInput = z.infer<typeof traefikCustomConfigInput>;
|
|
12
|
+
/** One validation finding; `path` is a dotted YAML path (`http.routers.custom-a.rule`). */
|
|
13
|
+
export declare const traefikCustomConfigIssue: z.ZodObject<{
|
|
14
|
+
path: z.ZodString;
|
|
15
|
+
message: z.ZodString;
|
|
16
|
+
}, z.core.$strip>;
|
|
17
|
+
export type TraefikCustomConfigIssue = z.infer<typeof traefikCustomConfigIssue>;
|
|
18
|
+
/** POST /v1/traefik/custom-config/validate. No state change. */
|
|
19
|
+
export declare const traefikCustomConfigValidation: z.ZodObject<{
|
|
20
|
+
ok: z.ZodBoolean;
|
|
21
|
+
errors: z.ZodArray<z.ZodObject<{
|
|
22
|
+
path: z.ZodString;
|
|
23
|
+
message: z.ZodString;
|
|
24
|
+
}, z.core.$strip>>;
|
|
25
|
+
warnings: z.ZodArray<z.ZodObject<{
|
|
26
|
+
path: z.ZodString;
|
|
27
|
+
message: z.ZodString;
|
|
28
|
+
}, z.core.$strip>>;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export type TraefikCustomConfigValidation = z.infer<typeof traefikCustomConfigValidation>;
|
|
31
|
+
export declare const traefikCustomConfigState: z.ZodEnum<{
|
|
32
|
+
applied: "applied";
|
|
33
|
+
none: "none";
|
|
34
|
+
rejected: "rejected";
|
|
35
|
+
}>;
|
|
36
|
+
export type TraefikCustomConfigState = z.infer<typeof traefikCustomConfigState>;
|
|
37
|
+
/** GET /v1/traefik/custom-config. `content: null` = none saved. */
|
|
38
|
+
export declare const traefikCustomConfig: z.ZodObject<{
|
|
39
|
+
content: z.ZodNullable<z.ZodString>;
|
|
40
|
+
sha256: z.ZodNullable<z.ZodString>;
|
|
41
|
+
updatedAt: z.ZodNullable<z.ZodString>;
|
|
42
|
+
updatedBy: z.ZodNullable<z.ZodNumber>;
|
|
43
|
+
status: z.ZodEnum<{
|
|
44
|
+
applied: "applied";
|
|
45
|
+
none: "none";
|
|
46
|
+
rejected: "rejected";
|
|
47
|
+
}>;
|
|
48
|
+
lastError: z.ZodNullable<z.ZodString>;
|
|
49
|
+
}, z.core.$strip>;
|
|
50
|
+
export type TraefikCustomConfig = z.infer<typeof traefikCustomConfig>;
|
|
51
|
+
/** POST /v1/traefik/certificates/custom → 201. */
|
|
52
|
+
export declare const customCertificateUpload: z.ZodObject<{
|
|
53
|
+
name: z.ZodString;
|
|
54
|
+
certPem: z.ZodString;
|
|
55
|
+
keyPem: z.ZodString;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
export type CustomCertificateUpload = z.infer<typeof customCertificateUpload>;
|
|
58
|
+
/** PUT /v1/traefik/certificates/custom/:certId. An omitted name keeps the stored one. */
|
|
59
|
+
export declare const customCertificateReplace: z.ZodObject<{
|
|
60
|
+
name: z.ZodOptional<z.ZodString>;
|
|
61
|
+
certPem: z.ZodString;
|
|
62
|
+
keyPem: z.ZodString;
|
|
63
|
+
}, z.core.$strip>;
|
|
64
|
+
export type CustomCertificateReplace = z.infer<typeof customCertificateReplace>;
|
|
65
|
+
/** One element of GET /v1/traefik/certificates/custom. */
|
|
66
|
+
export declare const customCertificate: z.ZodObject<{
|
|
67
|
+
id: z.ZodNumber;
|
|
68
|
+
name: z.ZodString;
|
|
69
|
+
hostnames: z.ZodArray<z.ZodString>;
|
|
70
|
+
subject: z.ZodNullable<z.ZodString>;
|
|
71
|
+
issuer: z.ZodNullable<z.ZodString>;
|
|
72
|
+
notBefore: z.ZodString;
|
|
73
|
+
notAfter: z.ZodString;
|
|
74
|
+
fingerprint: z.ZodString;
|
|
75
|
+
expired: z.ZodBoolean;
|
|
76
|
+
coveredDomains: z.ZodArray<z.ZodObject<{
|
|
77
|
+
id: z.ZodNumber;
|
|
78
|
+
hostname: z.ZodString;
|
|
79
|
+
serviceId: z.ZodNumber;
|
|
80
|
+
}, z.core.$strip>>;
|
|
81
|
+
}, z.core.$strip>;
|
|
82
|
+
export type CustomCertificate = z.infer<typeof customCertificate>;
|
|
83
|
+
/** PUT /v1/traefik/custom-config → 200. Router-level findings come back as warnings. */
|
|
84
|
+
export declare const traefikCustomConfigApplied: z.ZodObject<{
|
|
85
|
+
ok: z.ZodLiteral<true>;
|
|
86
|
+
status: z.ZodLiteral<"applied">;
|
|
87
|
+
sha256: z.ZodString;
|
|
88
|
+
warnings: z.ZodArray<z.ZodObject<{
|
|
89
|
+
path: z.ZodString;
|
|
90
|
+
message: z.ZodString;
|
|
91
|
+
}, z.core.$strip>>;
|
|
92
|
+
}, z.core.$strip>;
|
|
93
|
+
export type TraefikCustomConfigApplied = z.infer<typeof traefikCustomConfigApplied>;
|
|
94
|
+
/**
|
|
95
|
+
* The 400 / 422 body of PUT /v1/traefik/custom-config: the error envelope
|
|
96
|
+
* plus the findings (`errors` empty only on a 503).
|
|
97
|
+
*/
|
|
98
|
+
export declare const traefikCustomConfigRefusal: z.ZodObject<{
|
|
99
|
+
error: z.ZodObject<{
|
|
100
|
+
code: z.ZodString;
|
|
101
|
+
message: z.ZodString;
|
|
102
|
+
}, z.core.$strip>;
|
|
103
|
+
errors: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
104
|
+
path: z.ZodString;
|
|
105
|
+
message: z.ZodString;
|
|
106
|
+
}, z.core.$strip>>>;
|
|
107
|
+
warnings: z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
108
|
+
path: z.ZodString;
|
|
109
|
+
message: z.ZodString;
|
|
110
|
+
}, z.core.$strip>>>;
|
|
111
|
+
}, z.core.$strip>;
|
|
112
|
+
export type TraefikCustomConfigRefusal = z.infer<typeof traefikCustomConfigRefusal>;
|
|
113
|
+
/** POST (201) and PUT of /v1/traefik/certificates/custom: the listing entry plus size warnings. */
|
|
114
|
+
export declare const customCertificateSaved: z.ZodObject<{
|
|
115
|
+
id: z.ZodNumber;
|
|
116
|
+
name: z.ZodString;
|
|
117
|
+
hostnames: z.ZodArray<z.ZodString>;
|
|
118
|
+
subject: z.ZodNullable<z.ZodString>;
|
|
119
|
+
issuer: z.ZodNullable<z.ZodString>;
|
|
120
|
+
notBefore: z.ZodString;
|
|
121
|
+
notAfter: z.ZodString;
|
|
122
|
+
fingerprint: z.ZodString;
|
|
123
|
+
expired: z.ZodBoolean;
|
|
124
|
+
coveredDomains: z.ZodArray<z.ZodObject<{
|
|
125
|
+
id: z.ZodNumber;
|
|
126
|
+
hostname: z.ZodString;
|
|
127
|
+
serviceId: z.ZodNumber;
|
|
128
|
+
}, z.core.$strip>>;
|
|
129
|
+
warnings: z.ZodArray<z.ZodString>;
|
|
130
|
+
}, z.core.$strip>;
|
|
131
|
+
export type CustomCertificateSaved = z.infer<typeof customCertificateSaved>;
|
|
132
|
+
//# sourceMappingURL=proxyConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxyConfig.d.ts","sourceRoot":"","sources":["../src/proxyConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,4EAA4E;AAC5E,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAC1D,eAAO,MAAM,kCAAkC,QAAY,CAAC;AAC5D,eAAO,MAAM,gCAAgC,QAAY,CAAC;AAC1D,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAI3C,yDAAyD;AACzD,eAAO,MAAM,wBAAwB;;iBAEnC,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,2FAA2F;AAC3F,eAAO,MAAM,wBAAwB;;;iBAGnC,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,gEAAgE;AAChE,eAAO,MAAM,6BAA6B;;;;;;;;;;iBAIxC,CAAC;AACH,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE1F,eAAO,MAAM,wBAAwB;;;;EAA0C,CAAC;AAChF,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,mEAAmE;AACnE,eAAO,MAAM,mBAAmB;;;;;;;;;;;iBAQ9B,CAAC;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAwBtE,kDAAkD;AAClD,eAAO,MAAM,uBAAuB;;;;iBAIlC,CAAC;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAE9E,yFAAyF;AACzF,eAAO,MAAM,wBAAwB;;;;iBAInC,CAAC;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEhF,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;iBAiB5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIlE,wFAAwF;AACxF,eAAO,MAAM,0BAA0B;;;;;;;;iBAKrC,CAAC;AACH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEpF;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;iBAIrC,CAAC;AACH,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEpF,mGAAmG;AACnG,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;iBAEjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// ── Proxy management (0.14) ────────────────────────────────────────────────
|
|
3
|
+
// Request and response shapes for `/v1/traefik/custom-config` and
|
|
4
|
+
// `/v1/traefik/certificates/custom`. Operator only. These are SHAPE checks:
|
|
5
|
+
// the YAML rules (allowed sections, `custom-` names, entry points, refused
|
|
6
|
+
// keys) and the certificate proof (key matches leaf, key type, expiry) run on
|
|
7
|
+
// the server. No response shape carries a private key. Design: DESIGN.md §2.
|
|
8
|
+
/** 256 KiB. Measured in UTF-8 bytes on the server; this caps the string. */
|
|
9
|
+
export const TRAEFIK_CUSTOM_CONFIG_MAX_BYTES = 256 * 1024;
|
|
10
|
+
export const CUSTOM_CERTIFICATE_CHAIN_MAX_BYTES = 64 * 1024;
|
|
11
|
+
export const CUSTOM_CERTIFICATE_KEY_MAX_BYTES = 16 * 1024;
|
|
12
|
+
export const CUSTOM_CERTIFICATES_MAX = 100;
|
|
13
|
+
// ── Custom dynamic config ──────────────────────────────────────────────────
|
|
14
|
+
/** PUT /v1/traefik/custom-config and POST …/validate. */
|
|
15
|
+
export const traefikCustomConfigInput = z.object({
|
|
16
|
+
content: z.string().min(1).max(TRAEFIK_CUSTOM_CONFIG_MAX_BYTES),
|
|
17
|
+
});
|
|
18
|
+
/** One validation finding; `path` is a dotted YAML path (`http.routers.custom-a.rule`). */
|
|
19
|
+
export const traefikCustomConfigIssue = z.object({
|
|
20
|
+
path: z.string(),
|
|
21
|
+
message: z.string(),
|
|
22
|
+
});
|
|
23
|
+
/** POST /v1/traefik/custom-config/validate. No state change. */
|
|
24
|
+
export const traefikCustomConfigValidation = z.object({
|
|
25
|
+
ok: z.boolean(),
|
|
26
|
+
errors: z.array(traefikCustomConfigIssue),
|
|
27
|
+
warnings: z.array(traefikCustomConfigIssue),
|
|
28
|
+
});
|
|
29
|
+
export const traefikCustomConfigState = z.enum(['none', 'applied', 'rejected']);
|
|
30
|
+
/** GET /v1/traefik/custom-config. `content: null` = none saved. */
|
|
31
|
+
export const traefikCustomConfig = z.object({
|
|
32
|
+
content: z.string().nullable(),
|
|
33
|
+
sha256: z.string().nullable(),
|
|
34
|
+
updatedAt: z.string().nullable(),
|
|
35
|
+
/** User id of the last saver. */
|
|
36
|
+
updatedBy: z.number().int().nullable(),
|
|
37
|
+
status: traefikCustomConfigState,
|
|
38
|
+
lastError: z.string().nullable(),
|
|
39
|
+
});
|
|
40
|
+
// ── Custom certificates ────────────────────────────────────────────────────
|
|
41
|
+
const certificatePem = z
|
|
42
|
+
.string()
|
|
43
|
+
.trim()
|
|
44
|
+
.min(1)
|
|
45
|
+
.max(CUSTOM_CERTIFICATE_CHAIN_MAX_BYTES)
|
|
46
|
+
.regex(/-----BEGIN CERTIFICATE-----[\s\S]+-----END CERTIFICATE-----/, 'certPem must be a PEM certificate chain');
|
|
47
|
+
/** Unencrypted PKCS#8, PKCS#1 or SEC1 key. Passphrase-protected keys are refused. */
|
|
48
|
+
const privateKeyPem = z
|
|
49
|
+
.string()
|
|
50
|
+
.trim()
|
|
51
|
+
.min(1)
|
|
52
|
+
.max(CUSTOM_CERTIFICATE_KEY_MAX_BYTES)
|
|
53
|
+
.regex(/^-----BEGIN (RSA |EC )?PRIVATE KEY-----\r?\n[\s\S]+\r?\n-----END \1PRIVATE KEY-----$/, 'keyPem must be an unencrypted PEM private key');
|
|
54
|
+
const certificateName = z.string().trim().min(1).max(100);
|
|
55
|
+
/** POST /v1/traefik/certificates/custom → 201. */
|
|
56
|
+
export const customCertificateUpload = z.object({
|
|
57
|
+
name: certificateName,
|
|
58
|
+
certPem: certificatePem,
|
|
59
|
+
keyPem: privateKeyPem,
|
|
60
|
+
});
|
|
61
|
+
/** PUT /v1/traefik/certificates/custom/:certId. An omitted name keeps the stored one. */
|
|
62
|
+
export const customCertificateReplace = z.object({
|
|
63
|
+
name: certificateName.optional(),
|
|
64
|
+
certPem: certificatePem,
|
|
65
|
+
keyPem: privateKeyPem,
|
|
66
|
+
});
|
|
67
|
+
/** One element of GET /v1/traefik/certificates/custom. */
|
|
68
|
+
export const customCertificate = z.object({
|
|
69
|
+
id: z.number().int(),
|
|
70
|
+
name: z.string(),
|
|
71
|
+
hostnames: z.array(z.string()),
|
|
72
|
+
subject: z.string().nullable(),
|
|
73
|
+
issuer: z.string().nullable(),
|
|
74
|
+
notBefore: z.string(),
|
|
75
|
+
notAfter: z.string(),
|
|
76
|
+
fingerprint: z.string(),
|
|
77
|
+
expired: z.boolean(),
|
|
78
|
+
coveredDomains: z.array(z.object({
|
|
79
|
+
id: z.number().int(),
|
|
80
|
+
hostname: z.string(),
|
|
81
|
+
serviceId: z.number().int(),
|
|
82
|
+
})),
|
|
83
|
+
});
|
|
84
|
+
// ── Write results (0.14 T2, additive) ──────────────────────────────────────
|
|
85
|
+
/** PUT /v1/traefik/custom-config → 200. Router-level findings come back as warnings. */
|
|
86
|
+
export const traefikCustomConfigApplied = z.object({
|
|
87
|
+
ok: z.literal(true),
|
|
88
|
+
status: z.literal('applied'),
|
|
89
|
+
sha256: z.string(),
|
|
90
|
+
warnings: z.array(traefikCustomConfigIssue),
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* The 400 / 422 body of PUT /v1/traefik/custom-config: the error envelope
|
|
94
|
+
* plus the findings (`errors` empty only on a 503).
|
|
95
|
+
*/
|
|
96
|
+
export const traefikCustomConfigRefusal = z.object({
|
|
97
|
+
error: z.object({ code: z.string(), message: z.string() }),
|
|
98
|
+
errors: z.array(traefikCustomConfigIssue).default([]),
|
|
99
|
+
warnings: z.array(traefikCustomConfigIssue).default([]),
|
|
100
|
+
});
|
|
101
|
+
/** POST (201) and PUT of /v1/traefik/certificates/custom: the listing entry plus size warnings. */
|
|
102
|
+
export const customCertificateSaved = customCertificate.extend({
|
|
103
|
+
warnings: z.array(z.string()),
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=proxyConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxyConfig.js","sourceRoot":"","sources":["../src/proxyConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const PUBLIC_ACCESS_PORT_MIN = 1024;
|
|
3
|
+
export declare const PUBLIC_ACCESS_PORT_MAX = 65535;
|
|
4
|
+
export declare const PUBLIC_ACCESS_ALLOWLIST_MAX = 100;
|
|
5
|
+
/** Engines a TCP sidecar can expose. Every other engine is refused with 422. */
|
|
6
|
+
export declare const publicAccessEngines: readonly ['postgres', 'mysql', 'mariadb', 'redis', 'valkey', 'mongo', 'keydb', 'dragonfly'];
|
|
7
|
+
/** Mirrors `databasePublicTlsMode` in `@ninedeploy/db`. */
|
|
8
|
+
export declare const publicAccessTlsMode: z.ZodEnum<{
|
|
9
|
+
none: "none";
|
|
10
|
+
terminate: "terminate";
|
|
11
|
+
}>;
|
|
12
|
+
export type PublicAccessTlsMode = z.infer<typeof publicAccessTlsMode>;
|
|
13
|
+
export declare const publicAccessPort: z.ZodNumber;
|
|
14
|
+
/** One allow-list entry as typed (an address or CIDR); the server parses it. */
|
|
15
|
+
export declare const publicAccessAllowlistEntry: z.ZodString;
|
|
16
|
+
/** 1–100 entries. An empty allow-list is never "allow everyone". */
|
|
17
|
+
export declare const publicAccessAllowlist: z.ZodArray<z.ZodString>;
|
|
18
|
+
/** The hostname clients connect to (and, in terminate mode, the TLS name). */
|
|
19
|
+
export declare const publicAccessHostname: z.ZodString;
|
|
20
|
+
/**
|
|
21
|
+
* PUT /v1/databases/:id/public-access (operator). Applies synchronously and
|
|
22
|
+
* answers with the GET shape. Disabling is DELETE, so `enabled` is pinned to
|
|
23
|
+
* `true` here.
|
|
24
|
+
*/
|
|
25
|
+
export declare const publicAccessPut: z.ZodObject<{
|
|
26
|
+
enabled: z.ZodLiteral<true>;
|
|
27
|
+
port: z.ZodNumber;
|
|
28
|
+
ipAllowlist: z.ZodArray<z.ZodString>;
|
|
29
|
+
tlsMode: z.ZodDefault<z.ZodEnum<{
|
|
30
|
+
none: "none";
|
|
31
|
+
terminate: "terminate";
|
|
32
|
+
}>>;
|
|
33
|
+
tlsHostname: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export type PublicAccessPut = z.input<typeof publicAccessPut>;
|
|
36
|
+
/** GET (db admin) and PUT response. `configured: false` = no row. */
|
|
37
|
+
export declare const publicAccessStatus: z.ZodObject<{
|
|
38
|
+
supported: z.ZodBoolean;
|
|
39
|
+
configured: z.ZodBoolean;
|
|
40
|
+
enabled: z.ZodBoolean;
|
|
41
|
+
port: z.ZodNullable<z.ZodNumber>;
|
|
42
|
+
tlsMode: z.ZodEnum<{
|
|
43
|
+
none: "none";
|
|
44
|
+
terminate: "terminate";
|
|
45
|
+
}>;
|
|
46
|
+
tlsHostname: z.ZodNullable<z.ZodString>;
|
|
47
|
+
ipAllowlist: z.ZodArray<z.ZodString>;
|
|
48
|
+
status: z.ZodEnum<{
|
|
49
|
+
error: "error";
|
|
50
|
+
off: "off";
|
|
51
|
+
running: "running";
|
|
52
|
+
}>;
|
|
53
|
+
lastError: z.ZodNullable<z.ZodString>;
|
|
54
|
+
appliedAt: z.ZodNullable<z.ZodString>;
|
|
55
|
+
publicHost: z.ZodNullable<z.ZodString>;
|
|
56
|
+
}, z.core.$strip>;
|
|
57
|
+
export type PublicAccessStatus = z.infer<typeof publicAccessStatus>;
|
|
58
|
+
/** The `publicAccess` field added to the database serializer; null when unconfigured. */
|
|
59
|
+
export declare const databasePublicAccessSummary: z.ZodNullable<z.ZodObject<{
|
|
60
|
+
enabled: z.ZodBoolean;
|
|
61
|
+
port: z.ZodNumber;
|
|
62
|
+
}, z.core.$strip>>;
|
|
63
|
+
export type DatabasePublicAccessSummary = z.infer<typeof databasePublicAccessSummary>;
|
|
64
|
+
//# sourceMappingURL=publicAccess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publicAccess.d.ts","sourceRoot":"","sources":["../src/publicAccess.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAC5C,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,YAAI,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,CAAU,CAAC;AAE/H,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB;;;EAAgC,CAAC;AACjE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEtE,eAAO,MAAM,gBAAgB,aAA2E,CAAC;AAEzG,gFAAgF;AAChF,eAAO,MAAM,0BAA0B,aAAmC,CAAC;AAE3E,oEAAoE;AACpE,eAAO,MAAM,qBAAqB,yBAA8E,CAAC;AAEjH,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,aAQ9B,CAAC;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe;;;;;;;;;iBAM1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,qEAAqE;AACrE,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;iBAc7B,CAAC;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEpE,yFAAyF;AACzF,eAAO,MAAM,2BAA2B;;;kBAK3B,CAAC;AACd,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
// ── Public database access (0.14) ──────────────────────────────────────────
|
|
3
|
+
// Request and response shapes for `/v1/databases/:id/public-access`. A
|
|
4
|
+
// per-database Traefik TCP sidecar (`nd-dbpub-<slug>`) publishes one host
|
|
5
|
+
// port, gated by a required IP allow-list. These are SHAPE checks only: the
|
|
6
|
+
// server validates every allow-list entry with `node:net` (and refuses `/0`),
|
|
7
|
+
// checks the port against reserved and in-use host ports, and refuses engines
|
|
8
|
+
// and TLS modes the sidecar cannot serve. Design: DESIGN.md §1.
|
|
9
|
+
export const PUBLIC_ACCESS_PORT_MIN = 1024;
|
|
10
|
+
export const PUBLIC_ACCESS_PORT_MAX = 65535;
|
|
11
|
+
export const PUBLIC_ACCESS_ALLOWLIST_MAX = 100;
|
|
12
|
+
/** Engines a TCP sidecar can expose. Every other engine is refused with 422. */
|
|
13
|
+
export const publicAccessEngines = ['postgres', 'mysql', 'mariadb', 'redis', 'valkey', 'mongo', 'keydb', 'dragonfly'];
|
|
14
|
+
/** Mirrors `databasePublicTlsMode` in `@ninedeploy/db`. */
|
|
15
|
+
export const publicAccessTlsMode = z.enum(['none', 'terminate']);
|
|
16
|
+
export const publicAccessPort = z.number().int().min(PUBLIC_ACCESS_PORT_MIN).max(PUBLIC_ACCESS_PORT_MAX);
|
|
17
|
+
/** One allow-list entry as typed (an address or CIDR); the server parses it. */
|
|
18
|
+
export const publicAccessAllowlistEntry = z.string().trim().min(1).max(64);
|
|
19
|
+
/** 1–100 entries. An empty allow-list is never "allow everyone". */
|
|
20
|
+
export const publicAccessAllowlist = z.array(publicAccessAllowlistEntry).min(1).max(PUBLIC_ACCESS_ALLOWLIST_MAX);
|
|
21
|
+
/** The hostname clients connect to (and, in terminate mode, the TLS name). */
|
|
22
|
+
export const publicAccessHostname = z
|
|
23
|
+
.string()
|
|
24
|
+
.trim()
|
|
25
|
+
.min(1)
|
|
26
|
+
.max(253)
|
|
27
|
+
.regex(/^(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?)(?:\.(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?))*$/, 'must be a valid hostname');
|
|
28
|
+
/**
|
|
29
|
+
* PUT /v1/databases/:id/public-access (operator). Applies synchronously and
|
|
30
|
+
* answers with the GET shape. Disabling is DELETE, so `enabled` is pinned to
|
|
31
|
+
* `true` here.
|
|
32
|
+
*/
|
|
33
|
+
export const publicAccessPut = z.object({
|
|
34
|
+
enabled: z.literal(true),
|
|
35
|
+
port: publicAccessPort,
|
|
36
|
+
ipAllowlist: publicAccessAllowlist,
|
|
37
|
+
tlsMode: publicAccessTlsMode.default('none'),
|
|
38
|
+
tlsHostname: publicAccessHostname.optional(),
|
|
39
|
+
});
|
|
40
|
+
/** GET (db admin) and PUT response. `configured: false` = no row. */
|
|
41
|
+
export const publicAccessStatus = z.object({
|
|
42
|
+
/** false for engines a TCP sidecar cannot expose. */
|
|
43
|
+
supported: z.boolean(),
|
|
44
|
+
configured: z.boolean(),
|
|
45
|
+
enabled: z.boolean(),
|
|
46
|
+
port: z.number().int().nullable(),
|
|
47
|
+
tlsMode: publicAccessTlsMode,
|
|
48
|
+
tlsHostname: z.string().nullable(),
|
|
49
|
+
ipAllowlist: z.array(z.string()),
|
|
50
|
+
status: z.enum(['off', 'running', 'error']),
|
|
51
|
+
lastError: z.string().nullable(),
|
|
52
|
+
appliedAt: z.string().nullable(),
|
|
53
|
+
/** `tlsHostname`, else the panel domain, else the host of the public URL. */
|
|
54
|
+
publicHost: z.string().nullable(),
|
|
55
|
+
});
|
|
56
|
+
/** The `publicAccess` field added to the database serializer; null when unconfigured. */
|
|
57
|
+
export const databasePublicAccessSummary = z
|
|
58
|
+
.object({
|
|
59
|
+
enabled: z.boolean(),
|
|
60
|
+
port: z.number().int(),
|
|
61
|
+
})
|
|
62
|
+
.nullable();
|
|
63
|
+
//# sourceMappingURL=publicAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publicAccess.js","sourceRoot":"","sources":["../src/publicAccess.ts"],"names":[],"mappings":"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"}
|