ninedeploy 0.18.26 → 0.18.28

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.
Files changed (74) hide show
  1. package/dist/commands/databaseUpgrade.d.ts +27 -0
  2. package/dist/commands/databaseUpgrade.d.ts.map +1 -0
  3. package/dist/commands/databaseUpgrade.js +151 -0
  4. package/dist/commands/databaseUpgrade.js.map +1 -0
  5. package/dist/commands/importApply.d.ts +114 -0
  6. package/dist/commands/importApply.d.ts.map +1 -0
  7. package/dist/commands/importApply.js +403 -0
  8. package/dist/commands/importApply.js.map +1 -0
  9. package/dist/commands/importCutover.d.ts +95 -0
  10. package/dist/commands/importCutover.d.ts.map +1 -0
  11. package/dist/commands/importCutover.js +293 -0
  12. package/dist/commands/importCutover.js.map +1 -0
  13. package/dist/commands/importData.d.ts +60 -0
  14. package/dist/commands/importData.d.ts.map +1 -0
  15. package/dist/commands/importData.js +286 -0
  16. package/dist/commands/importData.js.map +1 -0
  17. package/dist/commands/importPlan.d.ts +32 -0
  18. package/dist/commands/importPlan.d.ts.map +1 -0
  19. package/dist/commands/importPlan.js +138 -0
  20. package/dist/commands/importPlan.js.map +1 -0
  21. package/dist/commands/importVolumes.d.ts +38 -0
  22. package/dist/commands/importVolumes.d.ts.map +1 -0
  23. package/dist/commands/importVolumes.js +161 -0
  24. package/dist/commands/importVolumes.js.map +1 -0
  25. package/dist/index.js +59 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/importers/caprover.d.ts +13 -0
  28. package/dist/lib/importers/caprover.d.ts.map +1 -0
  29. package/dist/lib/importers/caprover.js +150 -0
  30. package/dist/lib/importers/caprover.js.map +1 -0
  31. package/dist/lib/importers/connections.d.ts +39 -0
  32. package/dist/lib/importers/connections.d.ts.map +1 -0
  33. package/dist/lib/importers/connections.js +119 -0
  34. package/dist/lib/importers/connections.js.map +1 -0
  35. package/dist/lib/importers/coolify.d.ts +10 -0
  36. package/dist/lib/importers/coolify.d.ts.map +1 -0
  37. package/dist/lib/importers/coolify.js +174 -0
  38. package/dist/lib/importers/coolify.js.map +1 -0
  39. package/dist/lib/importers/dokploy.d.ts +13 -0
  40. package/dist/lib/importers/dokploy.d.ts.map +1 -0
  41. package/dist/lib/importers/dokploy.js +183 -0
  42. package/dist/lib/importers/dokploy.js.map +1 -0
  43. package/dist/lib/importers/heroku.d.ts +50 -0
  44. package/dist/lib/importers/heroku.d.ts.map +1 -0
  45. package/dist/lib/importers/heroku.js +159 -0
  46. package/dist/lib/importers/heroku.js.map +1 -0
  47. package/dist/lib/importers/plan.d.ts +137 -0
  48. package/dist/lib/importers/plan.d.ts.map +1 -0
  49. package/dist/lib/importers/plan.js +110 -0
  50. package/dist/lib/importers/plan.js.map +1 -0
  51. package/dist/lib/importers/shell.d.ts +24 -0
  52. package/dist/lib/importers/shell.d.ts.map +1 -0
  53. package/dist/lib/importers/shell.js +45 -0
  54. package/dist/lib/importers/shell.js.map +1 -0
  55. package/dist/lib/importers/sources.d.ts +26 -0
  56. package/dist/lib/importers/sources.d.ts.map +1 -0
  57. package/dist/lib/importers/sources.js +100 -0
  58. package/dist/lib/importers/sources.js.map +1 -0
  59. package/package.json +3 -3
  60. package/src/commands/databaseUpgrade.ts +144 -0
  61. package/src/commands/importApply.ts +445 -0
  62. package/src/commands/importCutover.ts +329 -0
  63. package/src/commands/importData.ts +302 -0
  64. package/src/commands/importPlan.ts +143 -0
  65. package/src/commands/importVolumes.ts +168 -0
  66. package/src/index.ts +61 -0
  67. package/src/lib/importers/caprover.ts +141 -0
  68. package/src/lib/importers/connections.ts +133 -0
  69. package/src/lib/importers/coolify.ts +164 -0
  70. package/src/lib/importers/dokploy.ts +167 -0
  71. package/src/lib/importers/heroku.ts +168 -0
  72. package/src/lib/importers/plan.ts +209 -0
  73. package/src/lib/importers/shell.ts +56 -0
  74. package/src/lib/importers/sources.ts +96 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * `ninedeploy databases upgrade …` — O2 major-version upgrades (PostgreSQL,
3
+ * MySQL and MariaDB on the panel host).
4
+ *
5
+ * status <dbId> current release, targets, and the upgrade history
6
+ * start <dbId> --to <release> [--yes] [--no-wait]
7
+ * stop, move into a new volume (PostgreSQL: dump and
8
+ * restore; MySQL/MariaDB: copy and upgrade in place),
9
+ * compare, switch
10
+ * rollback <dbId> <upgradeId> [--yes] point the database back at the previous volume
11
+ * finalize <dbId> <upgradeId> [--yes] delete the volume the database no longer uses
12
+ */
13
+ import type { NineDeployClient } from '../client.js';
14
+ export declare function upgradeStatus(client: NineDeployClient, dbIdStr: string): Promise<void>;
15
+ export declare function upgradeStart(client: NineDeployClient, dbIdStr: string, opts?: {
16
+ to?: string;
17
+ yes?: boolean;
18
+ wait?: boolean;
19
+ pollMs?: number;
20
+ }): Promise<void>;
21
+ export declare function upgradeRollback(client: NineDeployClient, dbIdStr: string, upgradeIdStr: string, opts?: {
22
+ yes?: boolean;
23
+ }): Promise<void>;
24
+ export declare function upgradeFinalize(client: NineDeployClient, dbIdStr: string, upgradeIdStr: string, opts?: {
25
+ yes?: boolean;
26
+ }): Promise<void>;
27
+ //# sourceMappingURL=databaseUpgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseUpgrade.d.ts","sourceRoot":"","sources":["../../src/commands/databaseUpgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAiDrD,wBAAsB,aAAa,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB5F;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GACzE,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAYlJ;AAED,wBAAsB,eAAe,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlJ"}
@@ -0,0 +1,151 @@
1
+ import { prompt } from '../prompts.js';
2
+ import { c, error, header, info, kv, spinner, success, table } from '../lib/format.js';
3
+ const LABELS = { postgres: 'PostgreSQL', mysql: 'MySQL', mariadb: 'MariaDB' };
4
+ const label = (engine) => LABELS[engine] ?? engine;
5
+ /** `fromSeries`/`toSeries` arrive from 0.18.28; older panels send only the majors. */
6
+ const fromOf = (u) => u.fromSeries ?? String(u.fromMajor);
7
+ const toOf = (u) => u.toSeries ?? String(u.toMajor);
8
+ const num = (v, usage) => {
9
+ const n = Number(v);
10
+ if (!Number.isInteger(n) || n <= 0) {
11
+ error(usage);
12
+ process.exitCode = 1;
13
+ return null;
14
+ }
15
+ return n;
16
+ };
17
+ const fail = (err) => {
18
+ error(err instanceof Error ? err.message : String(err));
19
+ process.exitCode = 1;
20
+ };
21
+ const confirm = async (word, question) => {
22
+ const answer = await prompt(`${question} Type "${word}" to continue`, '');
23
+ if (answer.trim() !== word) {
24
+ info('Aborted.');
25
+ return false;
26
+ }
27
+ return true;
28
+ };
29
+ function describeOutcome(u, dbId) {
30
+ if (u.status === 'completed') {
31
+ success(`Upgraded to ${label(u.engine)} ${toOf(u)}.`);
32
+ if (u.verification) {
33
+ const extra = u.verification.users != null ? `, ${u.verification.users} account(s)` : `, ${u.verification.sequences} sequence(s)`;
34
+ info(`Compared before the switch: ${u.verification.tables} table(s), ${u.verification.rows} row(s)${extra}.`);
35
+ }
36
+ info(`The previous volume ${u.previousVolume} is kept. Check your services, then: ninedeploy databases upgrade finalize ${dbId} ${u.id}`);
37
+ info(`To go back to ${label(u.engine)} ${fromOf(u)}: ninedeploy databases upgrade rollback ${dbId} ${u.id}`);
38
+ }
39
+ else {
40
+ error(`The upgrade ${u.status === 'failed' ? 'failed' : `ended ${u.status}`}: ${u.error ?? 'no reason recorded'}`);
41
+ process.exitCode = 1;
42
+ }
43
+ }
44
+ export async function upgradeStatus(client, dbIdStr) {
45
+ const id = num(dbIdStr, 'Usage: ninedeploy databases upgrade status <dbId>');
46
+ if (id === null)
47
+ return;
48
+ let options;
49
+ let history;
50
+ try {
51
+ [options, history] = await spinner('Reading the cluster', () => Promise.all([client.databases.upgrades.options(id), client.databases.upgrades.list(id)]));
52
+ }
53
+ catch (err) {
54
+ fail(err);
55
+ return;
56
+ }
57
+ header('Major upgrade');
58
+ const name = label(options.engine ?? 'postgres');
59
+ const current = options.currentSeries ?? (options.currentMajor != null ? String(options.currentMajor) : null);
60
+ kv('Running', current != null ? `${name} ${current}` : c.dim('unknown'));
61
+ if (options.refusal)
62
+ info(options.refusal.message);
63
+ else
64
+ kv('Can move to', (options.versions ?? options.targets.map(String)).map((v) => `${name} ${v}`).join(', '));
65
+ if (history.length) {
66
+ table(history.map((u) => ({
67
+ id: u.id,
68
+ upgrade: `${fromOf(u)} → ${toOf(u)}`,
69
+ status: u.status === 'running' ? `running (${u.phase ?? '…'})` : u.status,
70
+ started: u.createdAt,
71
+ kept: u.status === 'completed' ? u.previousVolume : u.status === 'rolled_back' ? u.targetVolume : '',
72
+ error: u.error ?? '',
73
+ })));
74
+ }
75
+ }
76
+ export async function upgradeStart(client, dbIdStr, opts = {}) {
77
+ const usage = 'Usage: ninedeploy databases upgrade start <dbId> --to <release> [--yes] [--no-wait]';
78
+ const id = num(dbIdStr, usage);
79
+ if (id === null)
80
+ return;
81
+ const to = (opts.to ?? '').trim();
82
+ if (!/^[0-9]{1,2}([.][0-9]{1,2})?$/.test(to)) {
83
+ error(`--to must be a release, e.g. --to 18 (PostgreSQL), --to 8.4 (MySQL) or --to 11.8 (MariaDB). ${usage}`);
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ if (!opts.yes && !(await confirm('upgrade', `The database stops for the whole upgrade (a safety dump, the move to ${to} in a new volume, a comparison). Attached services lose their connection until it is back.`)))
88
+ return;
89
+ // A whole number goes as toMajor, which panels from before MySQL/MariaDB upgrades also accept.
90
+ const input = /^[0-9]+$/.test(to) ? { toMajor: Number(to) } : { toVersion: to };
91
+ let admitted;
92
+ try {
93
+ admitted = await spinner('Checking the database', () => client.databases.upgrades.start(id, input));
94
+ }
95
+ catch (err) {
96
+ fail(err);
97
+ return;
98
+ }
99
+ const target = `${label(admitted.engine)} ${toOf(admitted)}`;
100
+ if (opts.wait === false) {
101
+ success(`Upgrade #${admitted.id} to ${target} is running. Follow it with: ninedeploy databases upgrade status ${id}`);
102
+ return;
103
+ }
104
+ let done;
105
+ try {
106
+ done = await spinner(`Upgrading to ${target}`, () => client.databases.upgrades.wait(id, admitted.id, opts.pollMs ? { intervalMs: opts.pollMs } : {}));
107
+ }
108
+ catch (err) {
109
+ fail(err);
110
+ return;
111
+ }
112
+ describeOutcome(done, id);
113
+ }
114
+ export async function upgradeRollback(client, dbIdStr, upgradeIdStr, opts = {}) {
115
+ const usage = 'Usage: ninedeploy databases upgrade rollback <dbId> <upgradeId> [--yes]';
116
+ const id = num(dbIdStr, usage);
117
+ if (id === null)
118
+ return;
119
+ const upgradeId = num(upgradeIdStr, usage);
120
+ if (upgradeId === null)
121
+ return;
122
+ if (!opts.yes && !(await confirm('rollback', 'The database restarts on its previous volume. Writes made since the upgrade stay on the upgraded volume and are NOT carried back.')))
123
+ return;
124
+ try {
125
+ const u = await spinner('Rolling back', () => client.databases.upgrades.rollback(id, upgradeId));
126
+ success(`The database runs on ${label(u.engine)} ${fromOf(u)} again (${u.previousVolume}).`);
127
+ info(`The upgraded volume ${u.targetVolume} is kept. Delete it with: ninedeploy databases upgrade finalize ${id} ${u.id}`);
128
+ }
129
+ catch (err) {
130
+ fail(err);
131
+ }
132
+ }
133
+ export async function upgradeFinalize(client, dbIdStr, upgradeIdStr, opts = {}) {
134
+ const usage = 'Usage: ninedeploy databases upgrade finalize <dbId> <upgradeId> [--yes]';
135
+ const id = num(dbIdStr, usage);
136
+ if (id === null)
137
+ return;
138
+ const upgradeId = num(upgradeIdStr, usage);
139
+ if (upgradeId === null)
140
+ return;
141
+ if (!opts.yes && !(await confirm('finalize', 'The volume the database no longer uses is DELETED; after this there is no rollback.')))
142
+ return;
143
+ try {
144
+ const u = await spinner('Finalizing', () => client.databases.upgrades.finalize(id, upgradeId));
145
+ success(`Deleted ${u.removedVolume}.`);
146
+ }
147
+ catch (err) {
148
+ fail(err);
149
+ }
150
+ }
151
+ //# sourceMappingURL=databaseUpgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseUpgrade.js","sourceRoot":"","sources":["../../src/commands/databaseUpgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import { type NineDeployClient } from '../client.js';
2
+ import type { ImportPlan, PlanEngine } from '../lib/importers/plan.js';
3
+ type CreateServiceInput = Parameters<NineDeployClient['services']['create']>[0];
4
+ type CreateDatabaseInput = Parameters<NineDeployClient['databases']['create']>[0];
5
+ /** The panel calls apply makes; NineDeployClient satisfies it. */
6
+ export interface ApplyClient {
7
+ services: {
8
+ create: (input: CreateServiceInput) => Promise<{
9
+ id: number;
10
+ }>;
11
+ /** Settings set right after create (the plan's `settings`, e.g. a worker's `running` health check). */
12
+ update: (id: number, input: {
13
+ healthCheck?: 'running';
14
+ }) => Promise<unknown>;
15
+ };
16
+ databases: {
17
+ create: (input: CreateDatabaseInput) => Promise<{
18
+ id: number;
19
+ }>;
20
+ };
21
+ env: {
22
+ import: (serviceId: number, content: string) => Promise<{
23
+ imported: number;
24
+ skipped: number;
25
+ errors: Array<{
26
+ line: number;
27
+ message: string;
28
+ }>;
29
+ }>;
30
+ };
31
+ attachments: {
32
+ list: (serviceId: number) => Promise<Array<{
33
+ id: number;
34
+ databaseId: number;
35
+ envAlias: string;
36
+ }>>;
37
+ create: (serviceId: number, input: {
38
+ databaseId: number;
39
+ envAlias?: string;
40
+ reuseExisting?: boolean;
41
+ }) => Promise<{
42
+ id: number;
43
+ databaseId: number;
44
+ envAlias: string;
45
+ }>;
46
+ };
47
+ }
48
+ export type ReceiptState = 'pending' | 'done' | 'skipped' | 'failed';
49
+ export interface ReceiptItem {
50
+ kind: 'service' | 'database' | 'env' | 'data' | 'domain' | 'attach' | 'volume';
51
+ ref: string;
52
+ name: string;
53
+ state: ReceiptState;
54
+ /** The NineDeploy id (the service's for an env item, the database's for a data item, the domain's for a domain item). */
55
+ id?: number;
56
+ /** Data and volume items (`import data`): the panel's import id, and the file's sha256 and size. */
57
+ importId?: number;
58
+ sha256?: string;
59
+ bytes?: number;
60
+ at: string;
61
+ notes: string[];
62
+ }
63
+ export interface ImportReceipt {
64
+ receiptVersion: 1;
65
+ panel: string;
66
+ source: {
67
+ kind: string;
68
+ url: string;
69
+ };
70
+ items: Record<string, ReceiptItem>;
71
+ }
72
+ export interface ApplyOptions {
73
+ /** Tag every created service and database with this project. */
74
+ project?: number;
75
+ /** Service name → .env file content. */
76
+ envFiles?: Record<string, string>;
77
+ }
78
+ export interface ApplyDeps {
79
+ client: ApplyClient;
80
+ panel: string;
81
+ receipt: ImportReceipt | null;
82
+ save: (receipt: ImportReceipt) => void;
83
+ now?: () => Date;
84
+ }
85
+ /** Accept only a plan this CLI wrote (planVersion 1) with the parts apply reads. */
86
+ export declare function validatePlan(raw: unknown): ImportPlan;
87
+ /**
88
+ * The source's version, when its image is the same repository NineDeploy runs
89
+ * and the tag is a version (starts with a digit). Otherwise undefined, and
90
+ * the panel picks its default.
91
+ */
92
+ export declare function databaseVersion(engine: PlanEngine, image: string | null): string | undefined;
93
+ /** Variable names a .env file defines (values are never looked at). */
94
+ export declare function envFileKeys(content: string): string[];
95
+ /** Create what the plan describes, recording every step in the receipt. */
96
+ export declare function applyPlan(plan: ImportPlan, opts: ApplyOptions, deps: ApplyDeps): Promise<ImportReceipt>;
97
+ /** The receipt, item by item, in plan order. */
98
+ export declare function renderReceipt(receipt: ImportReceipt): string;
99
+ /** What --yes would do, without calling the panel. */
100
+ export declare function renderApplyPreview(plan: ImportPlan, receipt: ImportReceipt | null, envFiles: Record<string, string>): string;
101
+ /** Write the receipt atomically (temp file, then rename). */
102
+ export declare function writeReceipt(path: string, receipt: ImportReceipt): void;
103
+ export interface ImportApplyOpts {
104
+ receipt?: string;
105
+ project?: string;
106
+ dotenv?: string[];
107
+ yes?: boolean;
108
+ }
109
+ export declare function importApplyAction(planPath: string, opts: ImportApplyOpts, deps?: {
110
+ client?: ApplyClient;
111
+ panel?: string;
112
+ }): Promise<void>;
113
+ export {};
114
+ //# sourceMappingURL=importApply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importApply.d.ts","sourceRoot":"","sources":["../../src/commands/importApply.ts"],"names":[],"mappings":"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"}