@geekmidas/cli 10.0.0-alpha.78 → 10.0.0-alpha.80
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/{add-D2XKszYP.mjs → add-CIxT-Iq6.mjs} +2 -2
- package/dist/{add-D2XKszYP.mjs.map → add-CIxT-Iq6.mjs.map} +1 -1
- package/dist/{add-BvOICikp.cjs → add-DJ0VE-y-.cjs} +7 -7
- package/dist/{add-BvOICikp.cjs.map → add-DJ0VE-y-.cjs.map} +1 -1
- package/dist/{aws-Bja4zGSs.mjs → aws-B-6uEhgP.mjs} +8 -2
- package/dist/{aws-Bja4zGSs.mjs.map → aws-B-6uEhgP.mjs.map} +1 -1
- package/dist/{aws-CQAuluiu.cjs → aws-BTawF0F-.cjs} +19 -2
- package/dist/{aws-CQAuluiu.cjs.map → aws-BTawF0F-.cjs.map} +1 -1
- package/dist/{bundler-C6T-1OLT.cjs → bundler-BlbSLFLn.cjs} +3 -3
- package/dist/{bundler-C6T-1OLT.cjs.map → bundler-BlbSLFLn.cjs.map} +1 -1
- package/dist/{bundler-CtHzKqnZ.mjs → bundler-D4pl87A5.mjs} +3 -3
- package/dist/{bundler-CtHzKqnZ.mjs.map → bundler-D4pl87A5.mjs.map} +1 -1
- package/dist/{cli-BgPyhx1i.mjs → cli-7aLfgIGt.mjs} +3 -3
- package/dist/{cli-BgPyhx1i.mjs.map → cli-7aLfgIGt.mjs.map} +1 -1
- package/dist/{cli-K6Vj_pPW.cjs → cli-BkNZBe_-.cjs} +4 -4
- package/dist/{cli-K6Vj_pPW.cjs.map → cli-BkNZBe_-.cjs.map} +1 -1
- package/dist/{compose-B7MC19eC.cjs → compose-Bn4OJONR.cjs} +88 -60
- package/dist/{compose-B7MC19eC.cjs.map → compose-Bn4OJONR.cjs.map} +1 -1
- package/dist/{compose-DByK353T.mjs → compose-n7K8H5j8.mjs} +36 -8
- package/dist/{compose-DByK353T.mjs.map → compose-n7K8H5j8.mjs.map} +1 -1
- package/dist/{config-Bql0AmJt.d.mts → config-L_6NivCp.d.mts} +3 -3
- package/dist/{config-Bql0AmJt.d.mts.map → config-L_6NivCp.d.mts.map} +1 -1
- package/dist/{config-DlNpHK8p.d.cts → config-Mr4rcXFC.d.cts} +3 -3
- package/dist/{config-DlNpHK8p.d.cts.map → config-Mr4rcXFC.d.cts.map} +1 -1
- package/dist/config.d.cts +3 -3
- package/dist/config.d.mts +3 -3
- package/dist/{databases-C2p5LGAp.cjs → databases-BY-pEImp.cjs} +185 -7
- package/dist/databases-BY-pEImp.cjs.map +1 -0
- package/dist/{databases-hUHTuwhx.mjs → databases-CzszQV0N.mjs} +153 -5
- package/dist/databases-CzszQV0N.mjs.map +1 -0
- package/dist/deploy/public.cjs +12 -11
- package/dist/deploy/public.d.cts +19 -3
- package/dist/deploy/public.d.cts.map +1 -1
- package/dist/deploy/public.d.mts +19 -3
- package/dist/deploy/public.d.mts.map +1 -1
- package/dist/deploy/public.mjs +6 -6
- package/dist/{deploy-BerP7ppB.mjs → deploy-DK4Y6ev4.mjs} +3 -3
- package/dist/{deploy-BerP7ppB.mjs.map → deploy-DK4Y6ev4.mjs.map} +1 -1
- package/dist/{deploy-Dt42xiQA.cjs → deploy-Ppnh8MHS.cjs} +9 -9
- package/dist/{deploy-Dt42xiQA.cjs.map → deploy-Ppnh8MHS.cjs.map} +1 -1
- package/dist/{dokploy-ssZQRK2C.mjs → dokploy-Bjq05wkw.mjs} +2 -2
- package/dist/{dokploy-ssZQRK2C.mjs.map → dokploy-Bjq05wkw.mjs.map} +1 -1
- package/dist/{dokploy-NG9UrVrP.cjs → dokploy-CJvdoNc3.cjs} +2 -2
- package/dist/{dokploy-NG9UrVrP.cjs.map → dokploy-CJvdoNc3.cjs.map} +1 -1
- package/dist/{encryption-De6MN0O5.mjs → encryption-BrsOJFFz.mjs} +2 -2
- package/dist/{encryption-De6MN0O5.mjs.map → encryption-BrsOJFFz.mjs.map} +1 -1
- package/dist/{encryption-CbMI24fI.cjs → encryption-CAyR6D7B.cjs} +5 -5
- package/dist/{encryption-CbMI24fI.cjs.map → encryption-CAyR6D7B.cjs.map} +1 -1
- package/dist/{engine-CoCsNoW_.cjs → engine-DzBZR5D0.cjs} +118 -82
- package/dist/engine-DzBZR5D0.cjs.map +1 -0
- package/dist/{engine-DOjGIgl4.mjs → engine-ba9CvjTo.mjs} +53 -17
- package/dist/engine-ba9CvjTo.mjs.map +1 -0
- package/dist/github-BLjU59Ye.cjs +669 -0
- package/dist/github-BLjU59Ye.cjs.map +1 -0
- package/dist/github-CVdbVlT5.mjs +669 -0
- package/dist/github-CVdbVlT5.mjs.map +1 -0
- package/dist/{index-BXO0vlme.d.mts → index-C0UmP_lg.d.mts} +2 -2
- package/dist/{index-BXO0vlme.d.mts.map → index-C0UmP_lg.d.mts.map} +1 -1
- package/dist/{index-Rs0Fua-q.d.cts → index-DTEPwLml.d.cts} +2 -2
- package/dist/{index-Rs0Fua-q.d.cts.map → index-DTEPwLml.d.cts.map} +1 -1
- package/dist/index.cjs +114 -114
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +41 -41
- package/dist/index.mjs.map +1 -1
- package/dist/{migrate-Cgoy58Sh.cjs → migrate-DkB833Jj.cjs} +8 -9
- package/dist/{migrate-Cgoy58Sh.cjs.map → migrate-DkB833Jj.cjs.map} +1 -1
- package/dist/{migrate-CNKaQl3K.mjs → migrate-DlBgATa-.mjs} +3 -4
- package/dist/{migrate-CNKaQl3K.mjs.map → migrate-DlBgATa-.mjs.map} +1 -1
- package/dist/{migrate-B4GBvCNY.cjs → migrate-iEdyEx4S.cjs} +4 -4
- package/dist/{migrate-B4GBvCNY.cjs.map → migrate-iEdyEx4S.cjs.map} +1 -1
- package/dist/{migrate-BQ4wVKq_.mjs → migrate-pfu4aYzX.mjs} +2 -2
- package/dist/{migrate-BQ4wVKq_.mjs.map → migrate-pfu4aYzX.mjs.map} +1 -1
- package/dist/openapi.d.cts +1 -1
- package/dist/openapi.d.mts +1 -1
- package/dist/reconcile/public.d.cts +1 -1
- package/dist/reconcile/public.d.mts +1 -1
- package/dist/{resolve-CEaqRBzY.cjs → resolve-4_5N67Fk.cjs} +3 -3
- package/dist/{resolve-CEaqRBzY.cjs.map → resolve-4_5N67Fk.cjs.map} +1 -1
- package/dist/{resolve-mvaystiE.mjs → resolve-CQPn66jr.mjs} +3 -3
- package/dist/{resolve-mvaystiE.mjs.map → resolve-CQPn66jr.mjs.map} +1 -1
- package/dist/{rollback-S2C-Y9pB.mjs → rollback-C0cbdsM-.mjs} +3 -3
- package/dist/{rollback-S2C-Y9pB.mjs.map → rollback-C0cbdsM-.mjs.map} +1 -1
- package/dist/{rollback-F3P-rA-r.cjs → rollback-CgYUPLbq.cjs} +5 -5
- package/dist/{rollback-F3P-rA-r.cjs.map → rollback-CgYUPLbq.cjs.map} +1 -1
- package/dist/{runtime-D9AxGzrw.d.cts → runtime-D6A-C6zh.d.cts} +2 -2
- package/dist/{runtime-D9AxGzrw.d.cts.map → runtime-D6A-C6zh.d.cts.map} +1 -1
- package/dist/{runtime-Dflki3Vs.d.mts → runtime-ekxfPNM-.d.mts} +2 -2
- package/dist/{runtime-Dflki3Vs.d.mts.map → runtime-ekxfPNM-.d.mts.map} +1 -1
- package/dist/sandbox/migrate-worker.cjs +22 -8
- package/dist/sandbox/migrate-worker.cjs.map +1 -1
- package/dist/sandbox/migrate-worker.mjs +22 -8
- package/dist/sandbox/migrate-worker.mjs.map +1 -1
- package/dist/{secretsManager-Ti0oZwsS.mjs → secretsManager-Chs9VV2r.mjs} +8 -2
- package/dist/{secretsManager-Ti0oZwsS.mjs.map → secretsManager-Chs9VV2r.mjs.map} +1 -1
- package/dist/{secretsManager-DUXW3fQt.cjs → secretsManager-DcMlHnRC.cjs} +19 -2
- package/dist/{secretsManager-DUXW3fQt.cjs.map → secretsManager-DcMlHnRC.cjs.map} +1 -1
- package/dist/{stale-C5FqIVc8.mjs → seeds-BdkFpW0P.mjs} +64 -6
- package/dist/seeds-BdkFpW0P.mjs.map +1 -0
- package/dist/{stale-BsiPJI7Y.cjs → seeds-ZljwYV_p.cjs} +81 -5
- package/dist/seeds-ZljwYV_p.cjs.map +1 -0
- package/dist/sniffer-BjG-1mlD.cjs.map +1 -1
- package/dist/sniffer-ByWtH28i.mjs.map +1 -1
- package/dist/target/public.cjs +1 -1
- package/dist/target/public.d.cts +2 -2
- package/dist/target/public.d.mts +2 -2
- package/dist/target/public.mjs +1 -1
- package/dist/{types-DKxkXsKC.d.mts → types-BzCavjGt.d.mts} +29 -2
- package/dist/types-BzCavjGt.d.mts.map +1 -0
- package/dist/{types-ByY0zi3n.d.cts → types-DZtj9jeI.d.cts} +29 -2
- package/dist/types-DZtj9jeI.d.cts.map +1 -0
- package/dist/workspace/index.d.cts +2 -2
- package/dist/workspace/index.d.mts +2 -2
- package/package.json +15 -15
- package/dist/databases-C2p5LGAp.cjs.map +0 -1
- package/dist/databases-hUHTuwhx.mjs.map +0 -1
- package/dist/engine-CoCsNoW_.cjs.map +0 -1
- package/dist/engine-DOjGIgl4.mjs.map +0 -1
- package/dist/github-CwX9z89E.mjs +0 -213
- package/dist/github-CwX9z89E.mjs.map +0 -1
- package/dist/github-D9vGqdLk.cjs +0 -213
- package/dist/github-D9vGqdLk.cjs.map +0 -1
- package/dist/provider-B3Sv_a74.cjs +0 -173
- package/dist/provider-B3Sv_a74.cjs.map +0 -1
- package/dist/provider-D7rQzzzf.mjs +0 -138
- package/dist/provider-D7rQzzzf.mjs.map +0 -1
- package/dist/stale-BsiPJI7Y.cjs.map +0 -1
- package/dist/stale-C5FqIVc8.mjs.map +0 -1
- package/dist/types-ByY0zi3n.d.cts.map +0 -1
- package/dist/types-DKxkXsKC.d.mts.map +0 -1
|
@@ -5,9 +5,9 @@ const require_discover = require("./discover-D1It5r_h.cjs");
|
|
|
5
5
|
const require_sandbox = require("./sandbox-CL--ZDui.cjs");
|
|
6
6
|
const require_derive = require("./derive-DAbo49sm.cjs");
|
|
7
7
|
const require_workspace = require("./workspace-Bp8FEkF-.cjs");
|
|
8
|
-
const
|
|
8
|
+
const require_seeds = require("./seeds-ZljwYV_p.cjs");
|
|
9
9
|
const require_sniffer = require("./sniffer-BjG-1mlD.cjs");
|
|
10
|
-
const
|
|
10
|
+
const require_databases = require("./databases-BY-pEImp.cjs");
|
|
11
11
|
const require_credentialSchemas = require("./credentialSchemas-DCR4Wd1W.cjs");
|
|
12
12
|
let node_path = require("node:path");
|
|
13
13
|
let node_fs_promises = require("node:fs/promises");
|
|
@@ -97,7 +97,7 @@ async function writeCredentialsFile(credentials) {
|
|
|
97
97
|
async function buildImage(imageRef, buildArgs, credentials, { cwd, dockerfile, signal, stdio }) {
|
|
98
98
|
logger$3.log(`\n🔨 Building Docker image: ${imageRef}`);
|
|
99
99
|
logger$3.log(" Generating Dockerfile...");
|
|
100
|
-
const { buildRoot } = await
|
|
100
|
+
const { buildRoot } = await require_seeds.dockerCommand({ cwd });
|
|
101
101
|
const dockerfilePath = (0, node_path.relative)(buildRoot, dockerfile);
|
|
102
102
|
const secret = credentials ? await writeCredentialsFile(credentials) : void 0;
|
|
103
103
|
try {
|
|
@@ -117,7 +117,7 @@ async function buildImage(imageRef, buildArgs, credentials, { cwd, dockerfile, s
|
|
|
117
117
|
});
|
|
118
118
|
logger$3.log(`✅ Image built: ${imageRef}`);
|
|
119
119
|
} catch (error) {
|
|
120
|
-
throw new
|
|
120
|
+
throw new require_seeds.DockerBuildFailed(imageRef, error);
|
|
121
121
|
} finally {
|
|
122
122
|
await secret?.cleanup();
|
|
123
123
|
}
|
|
@@ -135,7 +135,7 @@ async function pushImage(imageRef, { cwd, signal, stdio }) {
|
|
|
135
135
|
});
|
|
136
136
|
logger$3.log(`✅ Image pushed: ${imageRef}`);
|
|
137
137
|
} catch (error) {
|
|
138
|
-
throw new
|
|
138
|
+
throw new require_seeds.DockerPushFailed(imageRef, error);
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
/**
|
|
@@ -174,11 +174,11 @@ async function pushedDigest(imageRef, { cwd, signal } = { cwd: process.cwd() })
|
|
|
174
174
|
async function deployDocker(options) {
|
|
175
175
|
const { stage, tag, skipPush, masterKey, config, buildArgs, credentials } = options;
|
|
176
176
|
const imageName = config.imageName;
|
|
177
|
-
const imageRef =
|
|
177
|
+
const imageRef = require_seeds.validateImageRef(getImageRef(config.registry, imageName, tag));
|
|
178
178
|
const cwd = options.cwd ?? process.cwd();
|
|
179
179
|
const docker = {
|
|
180
180
|
cwd,
|
|
181
|
-
dockerfile: (0, node_path.join)(cwd, options.dockerfile ??
|
|
181
|
+
dockerfile: (0, node_path.join)(cwd, options.dockerfile ?? require_seeds.dockerfileOf(config.appName ?? imageName, options.appPath ?? ".")),
|
|
182
182
|
...options.signal ? { signal: options.signal } : {},
|
|
183
183
|
...options.stdio ? { stdio: options.stdio } : {}
|
|
184
184
|
};
|
|
@@ -258,12 +258,12 @@ async function projectById(api, projectId) {
|
|
|
258
258
|
* another identity's, raises `ProjectNotOwned` — it is never adopted.
|
|
259
259
|
*/
|
|
260
260
|
async function findProject(api, identity, stateProjectId) {
|
|
261
|
-
const name =
|
|
262
|
-
const marker =
|
|
261
|
+
const name = require_seeds.projectName(identity);
|
|
262
|
+
const marker = require_seeds.ownershipMarker(identity);
|
|
263
263
|
if (stateProjectId) {
|
|
264
264
|
const known = await projectById(api, stateProjectId);
|
|
265
265
|
if (known) {
|
|
266
|
-
const claimed =
|
|
266
|
+
const claimed = require_seeds.markerOf(known.description);
|
|
267
267
|
if (claimed && claimed !== marker) throw new ProjectNotOwned(known.name, known.projectId, identity.key, claimed);
|
|
268
268
|
return {
|
|
269
269
|
projectId: known.projectId,
|
|
@@ -276,7 +276,7 @@ async function findProject(api, identity, stateProjectId) {
|
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
278
|
const projects = await api.listProjects();
|
|
279
|
-
const owned = projects.find((p) => p.name.toLowerCase() === name.toLowerCase() &&
|
|
279
|
+
const owned = projects.find((p) => p.name.toLowerCase() === name.toLowerCase() && require_seeds.isOwnedBy(p.description, identity));
|
|
280
280
|
if (owned) {
|
|
281
281
|
const details = await api.getProject(owned.projectId);
|
|
282
282
|
return {
|
|
@@ -289,7 +289,7 @@ async function findProject(api, identity, stateProjectId) {
|
|
|
289
289
|
};
|
|
290
290
|
}
|
|
291
291
|
const clash = projects.find((p) => p.name.toLowerCase() === name.toLowerCase());
|
|
292
|
-
if (clash) throw new ProjectNotOwned(clash.name, clash.projectId, identity.key,
|
|
292
|
+
if (clash) throw new ProjectNotOwned(clash.name, clash.projectId, identity.key, require_seeds.markerOf(clash.description));
|
|
293
293
|
return null;
|
|
294
294
|
}
|
|
295
295
|
/**
|
|
@@ -298,7 +298,7 @@ async function findProject(api, identity, stateProjectId) {
|
|
|
298
298
|
* deploy without state still finds it — or a new one, marked.
|
|
299
299
|
*/
|
|
300
300
|
async function resolveProject(api, identity, stateProjectId, log = () => {}, hooks = {}) {
|
|
301
|
-
const marker =
|
|
301
|
+
const marker = require_seeds.ownershipMarker(identity);
|
|
302
302
|
const found = await findProject(api, identity, stateProjectId);
|
|
303
303
|
if (found) {
|
|
304
304
|
if (found.needsClaim) {
|
|
@@ -316,7 +316,7 @@ async function resolveProject(api, identity, stateProjectId, log = () => {}, hoo
|
|
|
316
316
|
};
|
|
317
317
|
}
|
|
318
318
|
await hooks.beforeCreate?.();
|
|
319
|
-
const created = await api.createProject(
|
|
319
|
+
const created = await api.createProject(require_seeds.projectName(identity), withMarker("Deployed by gkm.", marker));
|
|
320
320
|
return {
|
|
321
321
|
projectId: created.project.projectId,
|
|
322
322
|
name: created.project.name,
|
|
@@ -427,7 +427,7 @@ async function resolveRegistry(api, options) {
|
|
|
427
427
|
* @returns Filtered secrets with found/missing tracking
|
|
428
428
|
*/
|
|
429
429
|
function filterSecretsForApp(stageSecrets, sniffedEnv) {
|
|
430
|
-
const allSecrets =
|
|
430
|
+
const allSecrets = require_seeds.toEmbeddableSecrets(stageSecrets);
|
|
431
431
|
const filtered = {};
|
|
432
432
|
const found = [];
|
|
433
433
|
const missing = [];
|
|
@@ -582,7 +582,7 @@ const PROVISIONERS = {
|
|
|
582
582
|
*/
|
|
583
583
|
database: async (declaration, context) => {
|
|
584
584
|
if (declaration.kind !== "database") throw new WrongKind(declaration.kind);
|
|
585
|
-
const name =
|
|
585
|
+
const name = require_seeds.resourceName(declaration.id, declaration.kind, context.stage);
|
|
586
586
|
const { postgres } = await context.api.findOrCreatePostgres(serviceName({
|
|
587
587
|
stage: context.stage,
|
|
588
588
|
app: context.scope ?? context.project
|
|
@@ -619,7 +619,7 @@ const PROVISIONERS = {
|
|
|
619
619
|
if (declaration.kind !== "database-schema") throw new WrongKind(declaration.kind);
|
|
620
620
|
const parent = context.provisioned[declaration.of];
|
|
621
621
|
if (!parent) throw new UnresolvedParent(declaration.id, declaration.of);
|
|
622
|
-
const runtime =
|
|
622
|
+
const runtime = require_seeds.resourceName(declaration.id, declaration.kind, context.stage);
|
|
623
623
|
const owner = (0, _geekmidas_db_pg_roles.ownerRole)(runtime);
|
|
624
624
|
const reads = readsFrom(context.manifest, declaration.id);
|
|
625
625
|
const parentUrl = new URL(parent.provides[(0, _geekmidas_manifest.provideKey)(declaration.of, "url")] ?? "");
|
|
@@ -734,7 +734,7 @@ const PROVISIONERS = {
|
|
|
734
734
|
stage: context.stage,
|
|
735
735
|
app: context.scope ?? context.project
|
|
736
736
|
}, declaration.id);
|
|
737
|
-
const bucket =
|
|
737
|
+
const bucket = require_seeds.resourceName(declaration.id, declaration.kind, context.stage);
|
|
738
738
|
const user = context.supplied?.AWS_ACCESS_KEY_ID ?? `${bucket}-root`;
|
|
739
739
|
const password = context.supplied?.AWS_SECRET_ACCESS_KEY ?? derivedPassword(context, `objects:${declaration.id}`);
|
|
740
740
|
const { compose } = await context.api.findOrCreateCompose(service, context.projectId, context.environmentId, minioCompose({
|
|
@@ -1070,7 +1070,7 @@ function mailpitCompose(service) {
|
|
|
1070
1070
|
*/
|
|
1071
1071
|
function storageKeys(values) {
|
|
1072
1072
|
const keys = {};
|
|
1073
|
-
for (const key of [...
|
|
1073
|
+
for (const key of [...require_seeds.STORAGE_KEY_PAIR, "AWS_REGION"]) {
|
|
1074
1074
|
const value = values?.[key];
|
|
1075
1075
|
if (value !== void 0) keys[key] = value;
|
|
1076
1076
|
}
|
|
@@ -1081,7 +1081,7 @@ function storageKeys(values) {
|
|
|
1081
1081
|
* `validate` already refused, should a provisioner be reached without it.
|
|
1082
1082
|
*/
|
|
1083
1083
|
function notConfigured(id, kind, context) {
|
|
1084
|
-
const { missing } =
|
|
1084
|
+
const { missing } = require_seeds.externalServices({
|
|
1085
1085
|
stage: context.stage,
|
|
1086
1086
|
declarations: [{
|
|
1087
1087
|
id,
|
|
@@ -1091,7 +1091,7 @@ function notConfigured(id, kind, context) {
|
|
|
1091
1091
|
allow: [],
|
|
1092
1092
|
...context.domain ? { domain: context.domain } : {}
|
|
1093
1093
|
});
|
|
1094
|
-
return new
|
|
1094
|
+
return new require_seeds.ExternalServicesNotConfigured(context.stage, missing);
|
|
1095
1095
|
}
|
|
1096
1096
|
/** Whether anything reads through a reader on this construct. */
|
|
1097
1097
|
function readsFrom(manifest, id) {
|
|
@@ -1265,7 +1265,7 @@ async function provisionDeclared(options) {
|
|
|
1265
1265
|
clusters: {}
|
|
1266
1266
|
};
|
|
1267
1267
|
const manifest = options.manifest ?? await require_discover.discover({
|
|
1268
|
-
patterns:
|
|
1268
|
+
patterns: require_seeds.constructGlobs(workspace),
|
|
1269
1269
|
cwd: workspace.root
|
|
1270
1270
|
});
|
|
1271
1271
|
if (Object.keys(manifest).length === 0) return empty;
|
|
@@ -1278,9 +1278,9 @@ async function provisionDeclared(options) {
|
|
|
1278
1278
|
stage: options.stage,
|
|
1279
1279
|
project: workspace.name,
|
|
1280
1280
|
scope: options.scope ?? workspace.name,
|
|
1281
|
-
cache:
|
|
1282
|
-
events:
|
|
1283
|
-
storage:
|
|
1281
|
+
cache: require_seeds.cacheBackendFor(require_seeds.providerOf(workspace)),
|
|
1282
|
+
events: require_seeds.eventsBackendFor(require_seeds.providerOf(workspace)),
|
|
1283
|
+
storage: require_seeds.storageBackendFor(require_seeds.providerOf(workspace)),
|
|
1284
1284
|
...options.devServices ? { devServices: options.devServices } : {},
|
|
1285
1285
|
...workspace.deploy?.domains?.[options.stage] ? { domain: workspace.deploy.domains[options.stage] } : {},
|
|
1286
1286
|
addresses: surfaceAddresses(manifest, options.appUrls),
|
|
@@ -1320,7 +1320,7 @@ async function provisionDeclared(options) {
|
|
|
1320
1320
|
* run again.
|
|
1321
1321
|
*/
|
|
1322
1322
|
async function applyDeclared(client, statements) {
|
|
1323
|
-
return (await
|
|
1323
|
+
return (await require_seeds.applyPostgres(client, statements)).filter((entry) => entry.created).length;
|
|
1324
1324
|
}
|
|
1325
1325
|
/**
|
|
1326
1326
|
* The provisioning order, with queues and topics moved to the end.
|
|
@@ -1653,7 +1653,7 @@ async function orchestrateDns(appHostnames, dnsConfig, dokployEndpoint, state) {
|
|
|
1653
1653
|
hasFailures = true;
|
|
1654
1654
|
}
|
|
1655
1655
|
if (state) {
|
|
1656
|
-
for (const record of domainRecords) if (record.created || record.existed)
|
|
1656
|
+
for (const record of domainRecords) if (record.created || record.existed) require_seeds.setDnsRecord(state, {
|
|
1657
1657
|
domain: rootDomain,
|
|
1658
1658
|
name: record.subdomain,
|
|
1659
1659
|
type: record.type,
|
|
@@ -1688,7 +1688,7 @@ async function verifyDnsRecords(appHostnames, serverIp, state) {
|
|
|
1688
1688
|
const results = [];
|
|
1689
1689
|
logger$2.log("\n🔍 Verifying DNS records...");
|
|
1690
1690
|
for (const [appName, hostname] of appHostnames) {
|
|
1691
|
-
if (
|
|
1691
|
+
if (require_seeds.isDnsVerified(state, hostname, serverIp)) {
|
|
1692
1692
|
logger$2.log(` ✓ ${hostname} (previously verified)`);
|
|
1693
1693
|
results.push({
|
|
1694
1694
|
hostname,
|
|
@@ -1702,7 +1702,7 @@ async function verifyDnsRecords(appHostnames, serverIp, state) {
|
|
|
1702
1702
|
try {
|
|
1703
1703
|
const resolvedIp = await resolveHostnameToIp(hostname);
|
|
1704
1704
|
if (resolvedIp === serverIp) {
|
|
1705
|
-
|
|
1705
|
+
require_seeds.setDnsVerification(state, hostname, serverIp);
|
|
1706
1706
|
logger$2.log(` ✓ ${hostname} → ${resolvedIp}`);
|
|
1707
1707
|
results.push({
|
|
1708
1708
|
hostname,
|
|
@@ -1763,10 +1763,10 @@ function generateSecret() {
|
|
|
1763
1763
|
* Otherwise generates a new one and stores it.
|
|
1764
1764
|
*/
|
|
1765
1765
|
function getOrGenerateSecret(state, appName, secretName) {
|
|
1766
|
-
const existing =
|
|
1766
|
+
const existing = require_seeds.getGeneratedSecret(state, appName, secretName);
|
|
1767
1767
|
if (existing) return existing;
|
|
1768
1768
|
const generated = generateSecret();
|
|
1769
|
-
|
|
1769
|
+
require_seeds.setGeneratedSecret(state, appName, secretName, generated);
|
|
1770
1770
|
return generated;
|
|
1771
1771
|
}
|
|
1772
1772
|
/**
|
|
@@ -1914,15 +1914,17 @@ var DeployMigrationsFailed = class extends Error {
|
|
|
1914
1914
|
}
|
|
1915
1915
|
};
|
|
1916
1916
|
/**
|
|
1917
|
-
* The URLs a stage's migrations connect with, keyed as the migrator
|
|
1918
|
-
* them, grouped by the database their cluster serves — for the targets
|
|
1919
|
-
* have a migration to
|
|
1920
|
-
* nothing for a project that has
|
|
1917
|
+
* The URLs a stage's migrations and seeds connect with, keyed as the migrator
|
|
1918
|
+
* reads them, grouped by the database their cluster serves — for the targets
|
|
1919
|
+
* that have a migration or a seed to run. Empty when none does, so a deploy
|
|
1920
|
+
* publishes nothing for a project that has written neither.
|
|
1921
1921
|
*/
|
|
1922
1922
|
async function migrationUrls(root, manifest, env) {
|
|
1923
1923
|
const byDatabase = /* @__PURE__ */ new Map();
|
|
1924
1924
|
for (const target of (0, _geekmidas_manifest.migrationTargets)(manifest)) {
|
|
1925
|
-
|
|
1925
|
+
const migrations = await require_databases.migrationFiles((0, node_path.join)(root, target.migrations));
|
|
1926
|
+
const seeds = await require_databases.migrationFiles((0, node_path.join)(root, target.seeds));
|
|
1927
|
+
if (migrations.size === 0 && seeds.size === 0) continue;
|
|
1926
1928
|
for (const role of ["ownerUrl", "url"]) {
|
|
1927
1929
|
const key = (0, _geekmidas_manifest.provideKey)(target.id, role);
|
|
1928
1930
|
const url = env[key];
|
|
@@ -1939,8 +1941,14 @@ async function migrationUrls(root, manifest, env) {
|
|
|
1939
1941
|
const answer = require_schemas.discriminatedUnion("reason", [require_schemas.object({
|
|
1940
1942
|
reason: require_schemas.literal("migrated"),
|
|
1941
1943
|
runs: require_schemas.array(require_schemas.object({
|
|
1944
|
+
construct: require_schemas.string(),
|
|
1942
1945
|
migrations: require_schemas.string(),
|
|
1943
1946
|
applied: require_schemas.array(require_schemas.string())
|
|
1947
|
+
})),
|
|
1948
|
+
seeds: require_schemas.array(require_schemas.object({
|
|
1949
|
+
construct: require_schemas.string(),
|
|
1950
|
+
seeds: require_schemas.string(),
|
|
1951
|
+
seeded: require_schemas.array(require_schemas.string())
|
|
1944
1952
|
}))
|
|
1945
1953
|
}), require_schemas.object({
|
|
1946
1954
|
reason: require_schemas.literal("failed"),
|
|
@@ -1949,13 +1957,18 @@ const answer = require_schemas.discriminatedUnion("reason", [require_schemas.obj
|
|
|
1949
1957
|
message: require_schemas.string()
|
|
1950
1958
|
})
|
|
1951
1959
|
})]);
|
|
1952
|
-
/**
|
|
1960
|
+
/**
|
|
1961
|
+
* Apply every pending migration, then run every seed, in the sandbox, as each
|
|
1962
|
+
* construct's owner. A failing migration throws `DeployMigrationsFailed`, a
|
|
1963
|
+
* failing seed `DeploySeedsFailed` — either before any app is released.
|
|
1964
|
+
*/
|
|
1953
1965
|
async function runMigrations(options) {
|
|
1954
1966
|
const sandbox = options.sandbox ?? require_sandbox.activeSandbox() ?? new require_credentials.LocalSandbox({ root: options.root });
|
|
1955
1967
|
const { value } = await require_discover.runWorker(sandbox, "migrations", {
|
|
1956
1968
|
name: "migrate-worker",
|
|
1957
1969
|
args: [JSON.stringify({
|
|
1958
1970
|
root: options.root,
|
|
1971
|
+
stage: options.stage,
|
|
1959
1972
|
manifest: options.manifest,
|
|
1960
1973
|
patterns: options.patterns
|
|
1961
1974
|
})],
|
|
@@ -1965,8 +1978,15 @@ async function runMigrations(options) {
|
|
|
1965
1978
|
signal: options.signal,
|
|
1966
1979
|
schema: answer
|
|
1967
1980
|
});
|
|
1968
|
-
if (value.reason === "failed")
|
|
1969
|
-
|
|
1981
|
+
if (value.reason === "failed") {
|
|
1982
|
+
const { error } = value;
|
|
1983
|
+
if (error.name === "SeedFailed") throw new require_seeds.DeploySeedsFailed(options.stage, String(error.construct ?? "unknown"), String(error.seed ?? "unknown"), error);
|
|
1984
|
+
throw new DeployMigrationsFailed(options.stage, error.name, error.message);
|
|
1985
|
+
}
|
|
1986
|
+
return {
|
|
1987
|
+
migrations: value.runs,
|
|
1988
|
+
seeds: value.seeds
|
|
1989
|
+
};
|
|
1970
1990
|
}
|
|
1971
1991
|
//#endregion
|
|
1972
1992
|
//#region src/target/dokploy/postgres.ts
|
|
@@ -2275,29 +2295,29 @@ async function validateDokploy(phase) {
|
|
|
2275
2295
|
ctx
|
|
2276
2296
|
};
|
|
2277
2297
|
const stored = await phase.secrets.read();
|
|
2278
|
-
const services =
|
|
2298
|
+
const services = require_seeds.assertExternalServices({
|
|
2279
2299
|
stage,
|
|
2280
|
-
declarations:
|
|
2300
|
+
declarations: require_seeds.manifestServiceDeclarations(phase.manifest),
|
|
2281
2301
|
supplied: stored?.custom ?? {},
|
|
2282
2302
|
allow: phase.allowDevServices,
|
|
2283
2303
|
...workspace.deploy?.domains?.[stage] ? { domain: workspace.deploy.domains[stage] } : {}
|
|
2284
2304
|
});
|
|
2285
|
-
|
|
2286
|
-
|
|
2305
|
+
require_seeds.reportDevServices(phase, require_seeds.devServicesUsed(services));
|
|
2306
|
+
require_seeds.assertNoStaleSecrets({
|
|
2287
2307
|
manifest: phase.manifest,
|
|
2288
2308
|
stage,
|
|
2289
2309
|
supplied: stored?.custom ?? {}
|
|
2290
2310
|
});
|
|
2291
2311
|
await require_credentialSchemas.assertStageCredentials({
|
|
2292
2312
|
root: workspace.root,
|
|
2293
|
-
patterns:
|
|
2313
|
+
patterns: require_seeds.constructGlobs(workspace),
|
|
2294
2314
|
manifest: phase.manifest,
|
|
2295
2315
|
stage,
|
|
2296
2316
|
supplied: stored?.custom ?? {}
|
|
2297
2317
|
});
|
|
2298
2318
|
const runnables = phase.runnables ?? {};
|
|
2299
2319
|
const background = phase.background ?? {};
|
|
2300
|
-
const workers =
|
|
2320
|
+
const workers = require_seeds.workerUnits(workspace, phase.manifest, background).filter((worker) => appsToDeployNames.includes(worker.app));
|
|
2301
2321
|
if (workers.length > 0) logger.log(` Deploying workers: ${workers.map((w) => `${w.name} (from ${w.app})`).join(", ")}`);
|
|
2302
2322
|
return {
|
|
2303
2323
|
...run,
|
|
@@ -2322,7 +2342,7 @@ async function preflight({ workspace, manifest, stage, secrets: secretsStore, ct
|
|
|
2322
2342
|
logger.log("\n🔐 Loading secrets and analyzing environment requirements...");
|
|
2323
2343
|
const stored = await secretsStore.read();
|
|
2324
2344
|
if (!stored) logger.log(` ⚠️ No secrets found for stage "${stage}"; starting them`);
|
|
2325
|
-
const { secrets: stageSecrets, generated } =
|
|
2345
|
+
const { secrets: stageSecrets, generated } = require_seeds.withGeneratedSecrets(stored ?? require_seeds.initStageSecrets(stage), manifest);
|
|
2326
2346
|
if (generated.length > 0) {
|
|
2327
2347
|
if (ctx.dryRun) logger.log(` 🔑 Would generate for "${stage}" (${secretsStore.store}): ${generated.join(", ")}`);
|
|
2328
2348
|
else {
|
|
@@ -2375,7 +2395,7 @@ async function provision(run) {
|
|
|
2375
2395
|
};
|
|
2376
2396
|
const { api, endpoint } = await dokployApi(workspace, ctx);
|
|
2377
2397
|
logger.log("\n📋 Loading deploy state...");
|
|
2378
|
-
const journal = await
|
|
2398
|
+
const journal = await require_seeds.DeployJournal.open(store, stage, () => require_seeds.createEmptyState(stage, "", ""));
|
|
2379
2399
|
const state = journal.state;
|
|
2380
2400
|
if (journal.existed) logger.log(` Found existing state for stage "${stage}"`);
|
|
2381
2401
|
else logger.log(` Creating new state for stage "${stage}"`);
|
|
@@ -2387,7 +2407,7 @@ async function provision(run) {
|
|
|
2387
2407
|
key: "project",
|
|
2388
2408
|
type: "project",
|
|
2389
2409
|
data: {
|
|
2390
|
-
name:
|
|
2410
|
+
name: require_seeds.projectName(identity),
|
|
2391
2411
|
identity: identity.key
|
|
2392
2412
|
}
|
|
2393
2413
|
};
|
|
@@ -2514,10 +2534,10 @@ async function provision(run) {
|
|
|
2514
2534
|
projectName: identity.scope,
|
|
2515
2535
|
stage,
|
|
2516
2536
|
config: workspace.deploy.backups,
|
|
2517
|
-
existingState:
|
|
2537
|
+
existingState: require_seeds.getBackupState(state),
|
|
2518
2538
|
logger
|
|
2519
2539
|
});
|
|
2520
|
-
|
|
2540
|
+
require_seeds.setBackupState(state, backupState);
|
|
2521
2541
|
if (!backupState.postgresBackupId) {
|
|
2522
2542
|
const backupSchedule = workspace.deploy.backups.schedule ?? "0 2 * * *";
|
|
2523
2543
|
const backupRetention = workspace.deploy.backups.retention ?? 30;
|
|
@@ -2531,7 +2551,7 @@ async function provision(run) {
|
|
|
2531
2551
|
enabled: true,
|
|
2532
2552
|
keepLatestCount: backupRetention
|
|
2533
2553
|
});
|
|
2534
|
-
|
|
2554
|
+
require_seeds.setPostgresBackupId(state, backup.backupId);
|
|
2535
2555
|
logger.log(` ✓ Postgres backup schedule created (${backupSchedule})`);
|
|
2536
2556
|
} else logger.log(" ✓ Using existing postgres backup schedule");
|
|
2537
2557
|
}
|
|
@@ -2650,7 +2670,7 @@ async function releaseDokploy(run) {
|
|
|
2650
2670
|
intervalMs: run.verify.intervalMs,
|
|
2651
2671
|
signal: ctx.signal
|
|
2652
2672
|
});
|
|
2653
|
-
|
|
2673
|
+
require_seeds.recordRelease(state, appName, {
|
|
2654
2674
|
...image,
|
|
2655
2675
|
tag: imageTag
|
|
2656
2676
|
});
|
|
@@ -2666,14 +2686,14 @@ async function releaseDokploy(run) {
|
|
|
2666
2686
|
const app = workspace.apps[appName];
|
|
2667
2687
|
logger.log(`\n ⚙️ Deploying ${appName}...`);
|
|
2668
2688
|
try {
|
|
2669
|
-
const application = await ensureApplication(api, journal, appName,
|
|
2689
|
+
const application = await ensureApplication(api, journal, appName, require_seeds.applicationName(identity, appName), project.projectId, environmentId, applied);
|
|
2670
2690
|
const appSecrets = encryptedSecrets.get(appName);
|
|
2671
2691
|
const credentials = appSecrets && appSecrets.secretCount > 0 ? {
|
|
2672
2692
|
encrypted: appSecrets.payload.encrypted,
|
|
2673
2693
|
iv: appSecrets.payload.iv
|
|
2674
2694
|
} : void 0;
|
|
2675
2695
|
if (appSecrets && credentials) logger.log(` Encrypted ${appSecrets.secretCount} secrets`);
|
|
2676
|
-
const imageRef$1 =
|
|
2696
|
+
const imageRef$1 = require_seeds.imageRef(identity, appName, registry, imageTag);
|
|
2677
2697
|
logger.log(` Building Docker image: ${imageRef$1}`);
|
|
2678
2698
|
const image = await deployDocker({
|
|
2679
2699
|
stage,
|
|
@@ -2681,7 +2701,7 @@ async function releaseDokploy(run) {
|
|
|
2681
2701
|
skipPush: false,
|
|
2682
2702
|
config: {
|
|
2683
2703
|
registry,
|
|
2684
|
-
imageName:
|
|
2704
|
+
imageName: require_seeds.imageName(identity, appName),
|
|
2685
2705
|
appName
|
|
2686
2706
|
},
|
|
2687
2707
|
credentials,
|
|
@@ -2715,7 +2735,7 @@ async function releaseDokploy(run) {
|
|
|
2715
2735
|
const withDeclared = {
|
|
2716
2736
|
...resolved,
|
|
2717
2737
|
...declaredEnv,
|
|
2718
|
-
...
|
|
2738
|
+
...require_seeds.otelEnv(stageSecrets?.custom ?? {}, appName)
|
|
2719
2739
|
};
|
|
2720
2740
|
const envVars = Object.entries(withDeclared).map(([key, value]) => `${key}=${value}`);
|
|
2721
2741
|
if (Object.keys(withDeclared).length > 0) logger.log(` Resolved ${Object.keys(withDeclared).length} env vars: ${Object.keys(withDeclared).sort().join(", ")}`);
|
|
@@ -2752,8 +2772,8 @@ async function releaseDokploy(run) {
|
|
|
2752
2772
|
ctx.signal?.throwIfAborted();
|
|
2753
2773
|
logger.log(`\n 🧵 Deploying ${worker.name} (worker ${worker.id})...`);
|
|
2754
2774
|
try {
|
|
2755
|
-
const application = await ensureApplication(api, journal, worker.name,
|
|
2756
|
-
const keys = [...
|
|
2775
|
+
const application = await ensureApplication(api, journal, worker.name, require_seeds.applicationName(identity, worker.name), project.projectId, environmentId, applied);
|
|
2776
|
+
const keys = [...require_seeds.workerEnvKeys(run.manifest, worker.id, run.runnables) ?? []].sort();
|
|
2757
2777
|
const secrets = prepareSecretsForApp(stageSecrets, {
|
|
2758
2778
|
appName: worker.name,
|
|
2759
2779
|
requiredEnvVars: keys,
|
|
@@ -2763,7 +2783,7 @@ async function releaseDokploy(run) {
|
|
|
2763
2783
|
encrypted: secrets.payload.encrypted,
|
|
2764
2784
|
iv: secrets.payload.iv
|
|
2765
2785
|
} : void 0;
|
|
2766
|
-
const imageRef$2 =
|
|
2786
|
+
const imageRef$2 = require_seeds.imageRef(identity, worker.name, registry, imageTag);
|
|
2767
2787
|
logger.log(` Building Docker image: ${imageRef$2}`);
|
|
2768
2788
|
const image = await deployDocker({
|
|
2769
2789
|
stage,
|
|
@@ -2771,22 +2791,22 @@ async function releaseDokploy(run) {
|
|
|
2771
2791
|
skipPush: false,
|
|
2772
2792
|
config: {
|
|
2773
2793
|
registry,
|
|
2774
|
-
imageName:
|
|
2794
|
+
imageName: require_seeds.imageName(identity, worker.name),
|
|
2775
2795
|
appName: worker.name
|
|
2776
2796
|
},
|
|
2777
2797
|
credentials,
|
|
2778
2798
|
cwd: workspace.root,
|
|
2779
|
-
dockerfile:
|
|
2799
|
+
dockerfile: require_seeds.workerDockerfileOf(worker.name),
|
|
2780
2800
|
...ctx.signal ? { signal: ctx.signal } : {},
|
|
2781
2801
|
...ctx.stdio ? { stdio: ctx.stdio } : {}
|
|
2782
2802
|
});
|
|
2783
2803
|
built(worker.name, image, imageRef$2);
|
|
2784
2804
|
const env = {
|
|
2785
2805
|
...Object.fromEntries(Object.entries(declaredEnv).filter(([key]) => keys.includes(key))),
|
|
2786
|
-
...
|
|
2806
|
+
...require_seeds.otelEnv(stageSecrets?.custom ?? {}, worker.name),
|
|
2787
2807
|
...credentials ? { GKM_MASTER_KEY: secrets.masterKey } : {},
|
|
2788
2808
|
NODE_ENV: "production",
|
|
2789
|
-
PORT: String(
|
|
2809
|
+
PORT: String(require_seeds.WORKER_PORT),
|
|
2790
2810
|
STAGE: stage
|
|
2791
2811
|
};
|
|
2792
2812
|
logger.log(` Resolved ${Object.keys(env).length} env vars: ${Object.keys(env).sort().join(", ")}`);
|
|
@@ -2819,7 +2839,7 @@ async function releaseDokploy(run) {
|
|
|
2819
2839
|
const app = workspace.apps[appName];
|
|
2820
2840
|
logger.log(`\n 🌐 Deploying ${appName}...`);
|
|
2821
2841
|
try {
|
|
2822
|
-
const application = await ensureApplication(api, journal, appName,
|
|
2842
|
+
const application = await ensureApplication(api, journal, appName, require_seeds.applicationName(identity, appName), project.projectId, environmentId, applied);
|
|
2823
2843
|
const dependencyUrls = {};
|
|
2824
2844
|
if (app.dependencies) {
|
|
2825
2845
|
for (const dep of app.dependencies) if (publicUrls[dep]) dependencyUrls[dep] = publicUrls[dep];
|
|
@@ -2848,7 +2868,7 @@ async function releaseDokploy(run) {
|
|
|
2848
2868
|
}
|
|
2849
2869
|
}
|
|
2850
2870
|
if (buildArgs.length > 0) logger.log(` Build args: ${publicUrlArgNames.join(", ")}`);
|
|
2851
|
-
const imageRef$3 =
|
|
2871
|
+
const imageRef$3 = require_seeds.imageRef(identity, appName, registry, imageTag);
|
|
2852
2872
|
logger.log(` Building Docker image: ${imageRef$3}`);
|
|
2853
2873
|
const image = await deployDocker({
|
|
2854
2874
|
stage,
|
|
@@ -2856,7 +2876,7 @@ async function releaseDokploy(run) {
|
|
|
2856
2876
|
skipPush: false,
|
|
2857
2877
|
config: {
|
|
2858
2878
|
registry,
|
|
2859
|
-
imageName:
|
|
2879
|
+
imageName: require_seeds.imageName(identity, appName),
|
|
2860
2880
|
appName
|
|
2861
2881
|
},
|
|
2862
2882
|
buildArgs,
|
|
@@ -2938,15 +2958,15 @@ function failed(run, appName, error) {
|
|
|
2938
2958
|
});
|
|
2939
2959
|
}
|
|
2940
2960
|
/**
|
|
2941
|
-
* The stage's pending migrations
|
|
2942
|
-
* each cluster published for them. Nothing is
|
|
2943
|
-
* for a project with
|
|
2961
|
+
* The stage's pending migrations applied, then every seed run, in the
|
|
2962
|
+
* deploy's sandbox against each cluster published for them. Nothing is
|
|
2963
|
+
* published, and nothing runs, for a project with neither.
|
|
2944
2964
|
*/
|
|
2945
2965
|
async function migrate(run) {
|
|
2946
2966
|
const { workspace, manifest, stage, ctx } = run;
|
|
2947
2967
|
const { api, endpoint, migrations, declaredClusters } = run.provisioned;
|
|
2948
2968
|
if (migrations.size === 0) return;
|
|
2949
|
-
logger.log("\n🗄️ Applying migrations...");
|
|
2969
|
+
logger.log("\n🗄️ Applying migrations and seeds...");
|
|
2950
2970
|
const host = serverHostname(endpoint);
|
|
2951
2971
|
const urls = {};
|
|
2952
2972
|
for (const [database, keys] of migrations) {
|
|
@@ -2959,15 +2979,24 @@ async function migrate(run) {
|
|
|
2959
2979
|
}
|
|
2960
2980
|
for (const [key, url] of Object.entries(keys)) urls[key] = publishedUrl(url, published);
|
|
2961
2981
|
}
|
|
2962
|
-
const
|
|
2982
|
+
const ran = await runMigrations({
|
|
2963
2983
|
root: workspace.root,
|
|
2964
2984
|
stage,
|
|
2965
2985
|
manifest,
|
|
2966
|
-
patterns:
|
|
2986
|
+
patterns: require_seeds.constructGlobs(workspace),
|
|
2967
2987
|
urls,
|
|
2968
2988
|
signal: ctx.signal
|
|
2969
2989
|
});
|
|
2970
|
-
for (const { migrations: folder, applied } of
|
|
2990
|
+
for (const { migrations: folder, applied } of ran.migrations) if (applied.length === 0) logger.log(` ✓ ${folder}: up to date`);
|
|
2991
|
+
require_seeds.reportDatabaseRuns(ran.migrations.map(({ construct, migrations: folder, applied }) => ({
|
|
2992
|
+
construct,
|
|
2993
|
+
folder,
|
|
2994
|
+
applied
|
|
2995
|
+
})), ran.seeds.map(({ construct, seeds: folder, seeded }) => ({
|
|
2996
|
+
construct,
|
|
2997
|
+
folder,
|
|
2998
|
+
seeded
|
|
2999
|
+
})), (line) => logger.log(` ${line}`), (event) => ctx.emit(event));
|
|
2971
3000
|
}
|
|
2972
3001
|
/**
|
|
2973
3002
|
* DNS records for `apps`' hosts, their propagation, and Dokploy's validation
|
|
@@ -3074,7 +3103,7 @@ async function rollbackDokploy(run, failure) {
|
|
|
3074
3103
|
verify: run.verify,
|
|
3075
3104
|
signal: run.ctx.signal
|
|
3076
3105
|
});
|
|
3077
|
-
|
|
3106
|
+
require_seeds.recordRollback(state, appName, before);
|
|
3078
3107
|
await journal.save();
|
|
3079
3108
|
logger.log(` ✓ ${appName} rolled back to ${before.ref}`);
|
|
3080
3109
|
}
|
|
@@ -3143,7 +3172,7 @@ async function ensureApplication(api, journal, appName, dokployAppName, projectI
|
|
|
3143
3172
|
action: via === "created" ? "create" : "reuse",
|
|
3144
3173
|
id: resource.applicationId
|
|
3145
3174
|
}, via);
|
|
3146
|
-
|
|
3175
|
+
require_seeds.setApplicationId(journal.state, appName, resource.applicationId);
|
|
3147
3176
|
return resource;
|
|
3148
3177
|
}
|
|
3149
3178
|
/**
|
|
@@ -3225,7 +3254,7 @@ async function dokployApi(workspace, ctx) {
|
|
|
3225
3254
|
/** Each app's public host, the same way the deploy resolves it. */
|
|
3226
3255
|
function hostOf(workspace, appName, stage) {
|
|
3227
3256
|
const app = workspace.apps[appName];
|
|
3228
|
-
return
|
|
3257
|
+
return require_seeds.resolveHost(appName, app, stage, workspace.deploy?.domains, app.type === "web" && require_seeds.isMainFrontendApp(appName, app, workspace.apps));
|
|
3229
3258
|
}
|
|
3230
3259
|
/**
|
|
3231
3260
|
* What a deploy would do, from the same lookups it starts with — and nothing
|
|
@@ -3259,7 +3288,7 @@ async function planDokploy(run) {
|
|
|
3259
3288
|
key: "project",
|
|
3260
3289
|
resourceType: "project",
|
|
3261
3290
|
action: "create"
|
|
3262
|
-
},
|
|
3291
|
+
}, require_seeds.projectName(identity));
|
|
3263
3292
|
const environment = project?.environments.find((e) => e.name.toLowerCase() === stage.toLowerCase());
|
|
3264
3293
|
plan(environment ? {
|
|
3265
3294
|
key: "environment",
|
|
@@ -3301,12 +3330,19 @@ async function planDokploy(run) {
|
|
|
3301
3330
|
resourceType: declaration.kind,
|
|
3302
3331
|
action: "ensure"
|
|
3303
3332
|
}, declaration.kind);
|
|
3333
|
+
require_seeds.reportPlannedSeeds((await require_databases.plannedSeeds({
|
|
3334
|
+
root: workspace.root,
|
|
3335
|
+
manifest
|
|
3336
|
+
})).map(({ target, seeds }) => ({
|
|
3337
|
+
folder: target.seeds,
|
|
3338
|
+
seeds
|
|
3339
|
+
})), (line) => logger.log(` ${line}`));
|
|
3304
3340
|
const apps = [];
|
|
3305
3341
|
const urls = {};
|
|
3306
3342
|
for (const appName of appsToDeployNames) {
|
|
3307
3343
|
const app = workspace.apps[appName];
|
|
3308
3344
|
if (app.type === "mobile") continue;
|
|
3309
|
-
const dokployAppName =
|
|
3345
|
+
const dokployAppName = require_seeds.applicationName(identity, appName);
|
|
3310
3346
|
const recordedId = state?.applications?.[appName];
|
|
3311
3347
|
const existing = project && environment ? (recordedId ? await api.getApplication(recordedId).catch(() => null) : null) ?? await api.findApplicationByName(project.projectId, dokployAppName, environment.environmentId) : null;
|
|
3312
3348
|
plan(existing ? {
|
|
@@ -3319,7 +3355,7 @@ async function planDokploy(run) {
|
|
|
3319
3355
|
resourceType: "application",
|
|
3320
3356
|
action: "create"
|
|
3321
3357
|
}, dokployAppName);
|
|
3322
|
-
const ref =
|
|
3358
|
+
const ref = require_seeds.imageRef(identity, appName, workspace.deploy.registry, imageTag);
|
|
3323
3359
|
plan({
|
|
3324
3360
|
key: `image:${appName}`,
|
|
3325
3361
|
resourceType: "image",
|
|
@@ -3348,7 +3384,7 @@ async function planDokploy(run) {
|
|
|
3348
3384
|
});
|
|
3349
3385
|
}
|
|
3350
3386
|
for (const worker of run.workers) {
|
|
3351
|
-
const dokployAppName =
|
|
3387
|
+
const dokployAppName = require_seeds.applicationName(identity, worker.name);
|
|
3352
3388
|
const recordedId = state?.applications?.[worker.name];
|
|
3353
3389
|
const existing = project && environment ? (recordedId ? await api.getApplication(recordedId).catch(() => null) : null) ?? await api.findApplicationByName(project.projectId, dokployAppName, environment.environmentId) : null;
|
|
3354
3390
|
plan(existing ? {
|
|
@@ -3361,7 +3397,7 @@ async function planDokploy(run) {
|
|
|
3361
3397
|
resourceType: "application",
|
|
3362
3398
|
action: "create"
|
|
3363
3399
|
}, `${dokployAppName}, worker ${worker.id} — no domain`);
|
|
3364
|
-
const ref =
|
|
3400
|
+
const ref = require_seeds.imageRef(identity, worker.name, workspace.deploy.registry, imageTag);
|
|
3365
3401
|
plan({
|
|
3366
3402
|
key: `image:${worker.name}`,
|
|
3367
3403
|
resourceType: "image",
|
|
@@ -3510,4 +3546,4 @@ Object.defineProperty(exports, "verifySettings", {
|
|
|
3510
3546
|
}
|
|
3511
3547
|
});
|
|
3512
3548
|
|
|
3513
|
-
//# sourceMappingURL=engine-
|
|
3549
|
+
//# sourceMappingURL=engine-DzBZR5D0.cjs.map
|