@zintrust/core 0.1.44 → 0.1.48
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/app/Middleware/index.d.ts.map +1 -1
- package/app/Middleware/index.js +4 -4
- package/config/storage.d.ts.map +1 -1
- package/config/storage.js +1 -1
- package/package.json +2 -1
- package/packages/workers/src/http/middleware/FeaturesValidator.d.ts.map +1 -1
- package/packages/workers/src/http/middleware/FeaturesValidator.js +5 -4
- package/src/cli/CLI.d.ts.map +1 -1
- package/src/cli/CLI.js +2 -0
- package/src/cli/commands/ContainerComposeLifecycle.d.ts +20 -0
- package/src/cli/commands/ContainerComposeLifecycle.d.ts.map +1 -0
- package/src/cli/commands/ContainerComposeLifecycle.js +46 -0
- package/src/cli/commands/ContainerProxiesCommand.d.ts.map +1 -1
- package/src/cli/commands/ContainerProxiesCommand.js +7 -44
- package/src/cli/commands/ContainerWorkersCommand.d.ts.map +1 -1
- package/src/cli/commands/ContainerWorkersCommand.js +7 -30
- package/src/cli/commands/DockerCommand.d.ts.map +1 -1
- package/src/cli/commands/DockerCommand.js +84 -2
- package/src/cli/commands/DockerPushCommand.d.ts +5 -0
- package/src/cli/commands/DockerPushCommand.d.ts.map +1 -0
- package/src/cli/commands/DockerPushCommand.js +92 -0
- package/src/cli/commands/InitContainerCommand.d.ts.map +1 -1
- package/src/cli/commands/InitContainerCommand.js +1 -0
- package/src/config/queue.d.ts.map +1 -1
- package/src/config/queue.js +27 -8
- package/src/index.js +3 -3
- package/src/orm/Database.d.ts.map +1 -1
- package/src/orm/Database.js +36 -2
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +0 -2
- package/src/performance/Optimizer.js +1 -1
- package/src/proxy/ProxyServer.d.ts.map +1 -1
- package/src/proxy/ProxyServer.js +9 -0
- package/src/session/SessionManager.js +1 -1
- package/src/templates/docker/docker-compose.schedules.yml.tpl +78 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../app/Middleware/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGjE,KAAK,eAAe,GAAG,WAAW,GAAG,cAAc,CAAC;AACpD,KAAK,gBAAgB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAajE;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CASd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAQF,eAAO,MAAM,mBAAmB,GAC9B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAsBd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAUd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,eAAe,EAAE,YAAW,YAAsB,MAC5E,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../app/Middleware/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtF,OAAO,KAAK,EAAW,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGjE,KAAK,eAAe,GAAG,WAAW,GAAG,cAAc,CAAC;AACpD,KAAK,gBAAgB,GAAG,iBAAiB,GAAG,oBAAoB,CAAC;AAajE;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CASd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GACzB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAC5B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAYd,CAAC;AAQF,eAAO,MAAM,mBAAmB,GAC9B,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAsBd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAUd,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,YAAY,eAAe,EAAE,YAAW,YAAsB,MAC5E,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAiCtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,aAAa,gBAAgB,MAC5C,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAmCtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,UAAU,MACvC,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,IAAI,CAwBtF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAClC,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,MAAM,MAAM,OAAO,CAAC,IAAI,CAAC,KACxB,OAAO,CAAC,IAAI,CAiBd,CAAC"}
|
package/app/Middleware/index.js
CHANGED
|
@@ -118,12 +118,12 @@ export const jwtMiddleware = (jwtManager, algorithm = 'HS256') => {
|
|
|
118
118
|
res.setStatus(401).json({ error: 'Invalid authorization header format' });
|
|
119
119
|
return;
|
|
120
120
|
}
|
|
121
|
-
if (await TokenRevocation.isRevoked(token)) {
|
|
122
|
-
res.setStatus(401).json({ error: 'Invalid or expired token' });
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
121
|
try {
|
|
126
122
|
const payload = resolveJwtManager(jwtManager).verify(token, algorithm);
|
|
123
|
+
if (await TokenRevocation.isRevoked(token)) {
|
|
124
|
+
res.setStatus(401).json({ error: 'Invalid or expired token' });
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
127
|
// Store in request context (TypeScript allows dynamic properties)
|
|
128
128
|
req.user = payload;
|
|
129
129
|
await next();
|
package/config/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../config/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../config/storage.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,wBAiDmC"}
|
package/config/storage.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zintrust/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.48",
|
|
4
4
|
"description": "Production-grade TypeScript backend framework for JavaScript",
|
|
5
5
|
"homepage": "https://zintrust.com",
|
|
6
6
|
"repository": {
|
|
@@ -49,6 +49,7 @@
|
|
|
49
49
|
"./package.json": "./package.json"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
+
"@cloudflare/containers": "^0.1.0",
|
|
52
53
|
"@zintrust/workers": "^0.1.31",
|
|
53
54
|
"bcryptjs": "^3.0.3",
|
|
54
55
|
"bullmq": "^5.69.3",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeaturesValidator.d.ts","sourceRoot":"","sources":["../../../../../../packages/workers/src/http/middleware/FeaturesValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"FeaturesValidator.d.ts","sourceRoot":"","sources":["../../../../../../packages/workers/src/http/middleware/FeaturesValidator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAgBnF,eAAO,MAAM,sBAAsB,GAAI,SAAS,YAAY,KAAG,YAoD9D,CAAC"}
|
|
@@ -20,8 +20,8 @@ export const withFeaturesValidation = (handler) => {
|
|
|
20
20
|
if (!features) {
|
|
21
21
|
return handler(req, res); // Skip validation if features is not provided
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
if (
|
|
23
|
+
const isPlainObject = Object.prototype.toString.call(features) === '[object Object]' && !Array.isArray(features);
|
|
24
|
+
if (!isPlainObject) {
|
|
25
25
|
return res.setStatus(400).json({
|
|
26
26
|
error: 'Invalid features configuration',
|
|
27
27
|
message: 'Features must be an object',
|
|
@@ -29,7 +29,8 @@ export const withFeaturesValidation = (handler) => {
|
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
31
|
// Validate each feature key and value
|
|
32
|
-
const
|
|
32
|
+
const featuresObj = features;
|
|
33
|
+
const featureKeys = Object.keys(featuresObj);
|
|
33
34
|
for (const key of featureKeys) {
|
|
34
35
|
if (!VALID_FEATURES.has(key)) {
|
|
35
36
|
return res.setStatus(400).json({
|
|
@@ -38,7 +39,7 @@ export const withFeaturesValidation = (handler) => {
|
|
|
38
39
|
code: 'INVALID_FEATURE',
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
|
-
const value =
|
|
42
|
+
const value = featuresObj[key];
|
|
42
43
|
if (typeof value !== 'boolean') {
|
|
43
44
|
return res.setStatus(400).json({
|
|
44
45
|
error: 'Invalid feature value',
|
package/src/cli/CLI.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../../src/cli/CLI.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"CLI.d.ts","sourceRoot":"","sources":["../../../src/cli/CLI.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,WAAW,IAAI;IACnB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,UAAU,IAAI,OAAO,CAAC;CACvB;AA2PD;;;;;;;GAOG;AACH,eAAO,MAAM,GAAG;cACJ,IAAI;EAed,CAAC"}
|
package/src/cli/CLI.js
CHANGED
|
@@ -17,6 +17,7 @@ import { DeployContainerProxiesCommand } from './commands/DeployContainerProxies
|
|
|
17
17
|
import { DeployContainersProxyCommand } from './commands/DeployContainersProxyCommand.js';
|
|
18
18
|
import { DeployContainerWorkersCommand } from './commands/DeployContainerWorkersCommand.js';
|
|
19
19
|
import { DockerCommand } from './commands/DockerCommand.js';
|
|
20
|
+
import { DockerPushCommand } from './commands/DockerPushCommand.js';
|
|
20
21
|
import { DoctorArchitectureCommand } from './commands/DoctorArchitectureCommand.js';
|
|
21
22
|
import { FixCommand } from './commands/FixCommand.js';
|
|
22
23
|
import { InitContainerCommand } from './commands/InitContainerCommand.js';
|
|
@@ -89,6 +90,7 @@ const buildCommandRegistry = () => {
|
|
|
89
90
|
AddMigrationCommand.create(),
|
|
90
91
|
StartCommand.create(),
|
|
91
92
|
DockerCommand.create(),
|
|
93
|
+
DockerPushCommand.create(),
|
|
92
94
|
QueueCommand.create(),
|
|
93
95
|
QueueRecoveryCommand.create(),
|
|
94
96
|
ScheduleListCommand.create(),
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type ComposeBuildOptions = {
|
|
2
|
+
noCache?: boolean;
|
|
3
|
+
pull?: boolean;
|
|
4
|
+
};
|
|
5
|
+
type ComposeUpOptions = {
|
|
6
|
+
detach?: boolean;
|
|
7
|
+
removeOrphans?: boolean;
|
|
8
|
+
};
|
|
9
|
+
type ComposeDownOptions = {
|
|
10
|
+
volumes?: boolean;
|
|
11
|
+
removeOrphans?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export declare const ContainerComposeLifecycle: Readonly<{
|
|
14
|
+
normalizeAction<const Allowed extends readonly string[]>(raw: string | undefined, allowed: Allowed, usageMessage: string): Allowed[number];
|
|
15
|
+
runBuild(composePath: string, options: ComposeBuildOptions, logMessage: string): Promise<void>;
|
|
16
|
+
runUp(composePath: string, options: ComposeUpOptions, logMessage: string): Promise<void>;
|
|
17
|
+
runDown(composePath: string, options: ComposeDownOptions, logMessage: string): Promise<void>;
|
|
18
|
+
}>;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=ContainerComposeLifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContainerComposeLifecycle.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerComposeLifecycle.ts"],"names":[],"mappings":"AAIA,KAAK,mBAAmB,GAAG;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,yBAAyB;0BACd,OAAO,SAAS,SAAS,MAAM,EAAE,OAChD,MAAM,GAAG,SAAS,WACd,OAAO,gBACF,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC;0BASH,MAAM,WACV,mBAAmB,cAChB,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;uBAeS,MAAM,WAAW,gBAAgB,cAAc,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;yBAgB/E,MAAM,WACV,kBAAkB,cACf,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;EAchB,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { runComposeWithFallback } from '../commands/DockerComposeCommandUtils.js';
|
|
2
|
+
import { Logger } from '../../config/logger.js';
|
|
3
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
4
|
+
export const ContainerComposeLifecycle = Object.freeze({
|
|
5
|
+
normalizeAction(raw, allowed, usageMessage) {
|
|
6
|
+
const value = (raw ?? '').trim().toLowerCase();
|
|
7
|
+
for (const item of allowed) {
|
|
8
|
+
if (value === item)
|
|
9
|
+
return item;
|
|
10
|
+
}
|
|
11
|
+
throw ErrorFactory.createCliError(usageMessage);
|
|
12
|
+
},
|
|
13
|
+
async runBuild(composePath, options, logMessage) {
|
|
14
|
+
const args = ['compose', '-f', composePath, 'build'];
|
|
15
|
+
if (options.noCache === true) {
|
|
16
|
+
args.push('--no-cache');
|
|
17
|
+
}
|
|
18
|
+
if (options.pull === true) {
|
|
19
|
+
args.push('--pull');
|
|
20
|
+
}
|
|
21
|
+
Logger.info(logMessage);
|
|
22
|
+
await runComposeWithFallback(args);
|
|
23
|
+
},
|
|
24
|
+
async runUp(composePath, options, logMessage) {
|
|
25
|
+
const args = ['compose', '-f', composePath, 'up'];
|
|
26
|
+
if (options.detach === true) {
|
|
27
|
+
args.push('-d');
|
|
28
|
+
}
|
|
29
|
+
if (options.removeOrphans === true) {
|
|
30
|
+
args.push('--remove-orphans');
|
|
31
|
+
}
|
|
32
|
+
Logger.info(logMessage);
|
|
33
|
+
await runComposeWithFallback(args);
|
|
34
|
+
},
|
|
35
|
+
async runDown(composePath, options, logMessage) {
|
|
36
|
+
const args = ['compose', '-f', composePath, 'down'];
|
|
37
|
+
if (options.volumes === true) {
|
|
38
|
+
args.push('-v');
|
|
39
|
+
}
|
|
40
|
+
if (options.removeOrphans === true) {
|
|
41
|
+
args.push('--remove-orphans');
|
|
42
|
+
}
|
|
43
|
+
Logger.info(logMessage);
|
|
44
|
+
await runComposeWithFallback(args);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContainerProxiesCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerProxiesCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ContainerProxiesCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerProxiesCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAyBrE,eAAO,MAAM,uBAAuB;cACxB,YAAY;EAgDtB,CAAC"}
|
|
@@ -1,45 +1,8 @@
|
|
|
1
1
|
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
5
|
-
const runBuild = async (composePath, options) => {
|
|
6
|
-
const args = ['compose', '-f', composePath, 'build'];
|
|
7
|
-
if (options.noCache === true) {
|
|
8
|
-
args.push('--no-cache');
|
|
9
|
-
}
|
|
10
|
-
if (options.pull === true) {
|
|
11
|
-
args.push('--pull');
|
|
12
|
-
}
|
|
13
|
-
Logger.info('Building proxy stack image...');
|
|
14
|
-
await runComposeWithFallback(args);
|
|
15
|
-
};
|
|
16
|
-
const runUp = async (composePath, options) => {
|
|
17
|
-
const args = ['compose', '-f', composePath, 'up'];
|
|
18
|
-
if (options.detach === true) {
|
|
19
|
-
args.push('-d');
|
|
20
|
-
}
|
|
21
|
-
if (options.removeOrphans === true) {
|
|
22
|
-
args.push('--remove-orphans');
|
|
23
|
-
}
|
|
24
|
-
Logger.info('Starting proxy stack...');
|
|
25
|
-
await runComposeWithFallback(args);
|
|
26
|
-
};
|
|
27
|
-
const runDown = async (composePath, options) => {
|
|
28
|
-
const args = ['compose', '-f', composePath, 'down'];
|
|
29
|
-
if (options.removeOrphans === true) {
|
|
30
|
-
args.push('--remove-orphans');
|
|
31
|
-
}
|
|
32
|
-
if (options.volumes === true) {
|
|
33
|
-
args.push('--volumes');
|
|
34
|
-
}
|
|
35
|
-
Logger.info('Stopping proxy stack...');
|
|
36
|
-
await runComposeWithFallback(args);
|
|
37
|
-
};
|
|
2
|
+
import { ContainerComposeLifecycle } from '../commands/ContainerComposeLifecycle.js';
|
|
3
|
+
import { resolveComposePath } from '../commands/DockerComposeCommandUtils.js';
|
|
38
4
|
const normalizeAction = (raw) => {
|
|
39
|
-
|
|
40
|
-
if (value === 'build' || value === 'up' || value === 'down')
|
|
41
|
-
return value;
|
|
42
|
-
throw ErrorFactory.createCliError('Usage: zin cp <build|up|down> [options]');
|
|
5
|
+
return ContainerComposeLifecycle.normalizeAction(raw, ['build', 'up', 'down'], 'Usage: zin cp <build|up|down> [options]');
|
|
43
6
|
};
|
|
44
7
|
export const ContainerProxiesCommand = Object.freeze({
|
|
45
8
|
create() {
|
|
@@ -60,17 +23,17 @@ export const ContainerProxiesCommand = Object.freeze({
|
|
|
60
23
|
const action = normalizeAction(options.args?.[0]);
|
|
61
24
|
const composePath = resolveComposePath('docker-compose.proxy.yml', 'docker-compose.proxy.yml not found.');
|
|
62
25
|
if (action === 'build') {
|
|
63
|
-
await runBuild(composePath, options);
|
|
26
|
+
await ContainerComposeLifecycle.runBuild(composePath, options, 'Building proxy stack image...');
|
|
64
27
|
return;
|
|
65
28
|
}
|
|
66
29
|
if (action === 'down') {
|
|
67
|
-
await runDown(composePath, options);
|
|
30
|
+
await ContainerComposeLifecycle.runDown(composePath, options, 'Stopping proxy stack...');
|
|
68
31
|
return;
|
|
69
32
|
}
|
|
70
33
|
if (options.build === true) {
|
|
71
|
-
await runBuild(composePath, options);
|
|
34
|
+
await ContainerComposeLifecycle.runBuild(composePath, options, 'Building proxy stack image...');
|
|
72
35
|
}
|
|
73
|
-
await runUp(composePath, options);
|
|
36
|
+
await ContainerComposeLifecycle.runUp(composePath, options, 'Starting proxy stack...');
|
|
74
37
|
},
|
|
75
38
|
});
|
|
76
39
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContainerWorkersCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerWorkersCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ContainerWorkersCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/ContainerWorkersCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAuBrE,eAAO,MAAM,uBAAuB;cACxB,YAAY;EA6CtB,CAAC"}
|
|
@@ -1,31 +1,8 @@
|
|
|
1
1
|
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
5
|
-
const runBuild = async (composePath, options) => {
|
|
6
|
-
const args = ['compose', '-f', composePath, 'build'];
|
|
7
|
-
if (options.noCache === true) {
|
|
8
|
-
args.push('--no-cache');
|
|
9
|
-
}
|
|
10
|
-
if (options.pull === true) {
|
|
11
|
-
args.push('--pull');
|
|
12
|
-
}
|
|
13
|
-
Logger.info('Building container workers image...');
|
|
14
|
-
await runComposeWithFallback(args);
|
|
15
|
-
};
|
|
16
|
-
const runUp = async (composePath, options) => {
|
|
17
|
-
const args = ['compose', '-f', composePath, 'up'];
|
|
18
|
-
if (options.detach === true) {
|
|
19
|
-
args.push('-d');
|
|
20
|
-
}
|
|
21
|
-
Logger.info('Starting container workers...');
|
|
22
|
-
await runComposeWithFallback(args);
|
|
23
|
-
};
|
|
2
|
+
import { ContainerComposeLifecycle } from '../commands/ContainerComposeLifecycle.js';
|
|
3
|
+
import { resolveComposePath } from '../commands/DockerComposeCommandUtils.js';
|
|
24
4
|
const normalizeAction = (raw) => {
|
|
25
|
-
|
|
26
|
-
if (value === 'build' || value === 'up')
|
|
27
|
-
return value;
|
|
28
|
-
throw ErrorFactory.createCliError('Usage: zin cw <build|up> [options]');
|
|
5
|
+
return ContainerComposeLifecycle.normalizeAction(raw, ['build', 'up'], 'Usage: zin cw <build|up> [options]');
|
|
29
6
|
};
|
|
30
7
|
export const ContainerWorkersCommand = Object.freeze({
|
|
31
8
|
create() {
|
|
@@ -34,7 +11,7 @@ export const ContainerWorkersCommand = Object.freeze({
|
|
|
34
11
|
aliases: ['container-workers'],
|
|
35
12
|
description: 'Build or start container-based workers',
|
|
36
13
|
addOptions: (command) => {
|
|
37
|
-
command.argument('<action>', 'Action to run (build
|
|
14
|
+
command.argument('<action>', 'Action to run (build, up)');
|
|
38
15
|
command.option('-d, --detach', 'Run containers in background (up only)');
|
|
39
16
|
command.option('--no-cache', 'Disable Docker build cache (build only)');
|
|
40
17
|
command.option('--pull', 'Always attempt to pull a newer base image (build only)');
|
|
@@ -44,13 +21,13 @@ export const ContainerWorkersCommand = Object.freeze({
|
|
|
44
21
|
const action = normalizeAction(options.args?.[0]);
|
|
45
22
|
const composePath = resolveComposePath('docker-compose.workers.yml', 'docker-compose.workers.yml not found. Run `zin init:cw` first.');
|
|
46
23
|
if (action === 'build') {
|
|
47
|
-
await runBuild(composePath, options);
|
|
24
|
+
await ContainerComposeLifecycle.runBuild(composePath, options, 'Building container workers image...');
|
|
48
25
|
return;
|
|
49
26
|
}
|
|
50
27
|
if (options.build === true) {
|
|
51
|
-
await runBuild(composePath, options);
|
|
28
|
+
await ContainerComposeLifecycle.runBuild(composePath, options, 'Building container workers image...');
|
|
52
29
|
}
|
|
53
|
-
await runUp(composePath, options);
|
|
30
|
+
await ContainerComposeLifecycle.runUp(composePath, options, 'Starting container workers...');
|
|
54
31
|
},
|
|
55
32
|
});
|
|
56
33
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DockerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerCommand.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DockerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerCommand.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA+JrE,eAAO,MAAM,aAAa;cACd,YAAY;EAuBtB,CAAC"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { generateUuid } from '../../common/utility.js';
|
|
1
2
|
import { BaseCommand } from '../BaseCommand.js';
|
|
3
|
+
import { DockerPushCommand } from '../commands/DockerPushCommand.js';
|
|
2
4
|
import { SpawnUtil } from '../utils/spawn.js';
|
|
3
5
|
import { Logger } from '../../config/logger.js';
|
|
4
6
|
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
5
|
-
import { existsSync } from '../../node-singletons/fs.js';
|
|
7
|
+
import { existsSync, renameSync } from '../../node-singletons/fs.js';
|
|
6
8
|
import { join } from '../../node-singletons/path.js';
|
|
7
9
|
const resolveDefaultWranglerConfig = (cwd) => {
|
|
8
10
|
const candidates = [
|
|
@@ -43,6 +45,79 @@ const resolveWranglerConfig = (cwd, options) => {
|
|
|
43
45
|
return fallback;
|
|
44
46
|
throw ErrorFactory.createCliError('Wrangler config not found. Expected wrangler.containers-proxy.jsonc (or wrangler.jsonc/toml).');
|
|
45
47
|
};
|
|
48
|
+
const isContainersProxyConfig = (config) => {
|
|
49
|
+
const base = config.split(/[/\\]/).pop() ?? config;
|
|
50
|
+
return (base === 'wrangler.containers-proxy.jsonc' ||
|
|
51
|
+
base === 'wrangler.containers-proxy.json' ||
|
|
52
|
+
base === 'wrangler.containers-proxy.toml' ||
|
|
53
|
+
base.startsWith('wrangler.containers-proxy.'));
|
|
54
|
+
};
|
|
55
|
+
const withDevVarsForConfig = async (cwd, config, envName, fn) => {
|
|
56
|
+
const nonce = generateUuid();
|
|
57
|
+
const moved = [];
|
|
58
|
+
const swappedIn = [];
|
|
59
|
+
const disable = (name) => {
|
|
60
|
+
const from = join(cwd, name);
|
|
61
|
+
if (!existsSync(from))
|
|
62
|
+
return;
|
|
63
|
+
const to = join(cwd, `${name}.disabled-by-zin-${nonce}`);
|
|
64
|
+
renameSync(from, to);
|
|
65
|
+
moved.push({ from, to });
|
|
66
|
+
};
|
|
67
|
+
const swapIn = (source, target) => {
|
|
68
|
+
const from = join(cwd, source);
|
|
69
|
+
if (!existsSync(from))
|
|
70
|
+
return;
|
|
71
|
+
const to = join(cwd, target);
|
|
72
|
+
if (existsSync(to))
|
|
73
|
+
return;
|
|
74
|
+
renameSync(from, to);
|
|
75
|
+
swappedIn.push({ from, to });
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
if (isContainersProxyConfig(config)) {
|
|
79
|
+
// For containers-proxy configs, we want `.dev.vars*` to exist but only for
|
|
80
|
+
// this run. Users keep the files renamed as `.dev.vars*.containers-proxy`.
|
|
81
|
+
swapIn('.dev.vars.containers-proxy', '.dev.vars');
|
|
82
|
+
if (envName !== '') {
|
|
83
|
+
swapIn(`.dev.vars.${envName}.containers-proxy`, `.dev.vars.${envName}`);
|
|
84
|
+
}
|
|
85
|
+
return await fn();
|
|
86
|
+
}
|
|
87
|
+
// For all other configs, disable `.dev.vars*` so Wrangler relies on `.env*`.
|
|
88
|
+
disable('.dev.vars');
|
|
89
|
+
disable('.dev.vars.local');
|
|
90
|
+
disable('.dev.vars.staging');
|
|
91
|
+
disable('.dev.vars.staging.local');
|
|
92
|
+
if (envName !== '') {
|
|
93
|
+
disable(`.dev.vars.${envName}`);
|
|
94
|
+
disable(`.dev.vars.${envName}.local`);
|
|
95
|
+
}
|
|
96
|
+
return await fn();
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
const restoreSwaps = swappedIn.slice().reverse();
|
|
100
|
+
for (const item of restoreSwaps) {
|
|
101
|
+
try {
|
|
102
|
+
if (existsSync(item.to) && !existsSync(item.from))
|
|
103
|
+
renameSync(item.to, item.from);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// noop
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
const restoreMoved = moved.slice().reverse();
|
|
110
|
+
for (const item of restoreMoved) {
|
|
111
|
+
try {
|
|
112
|
+
if (existsSync(item.to))
|
|
113
|
+
renameSync(item.to, item.from);
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// noop
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
46
121
|
const executeDocker = async (options) => {
|
|
47
122
|
const cwd = process.cwd();
|
|
48
123
|
const config = resolveWranglerConfig(cwd, options);
|
|
@@ -54,7 +129,9 @@ const executeDocker = async (options) => {
|
|
|
54
129
|
if (env.length > 0)
|
|
55
130
|
args.push('--env', env);
|
|
56
131
|
Logger.info('Starting Wrangler dev (Containers/Docker-backed)...');
|
|
57
|
-
const exitCode = await
|
|
132
|
+
const exitCode = await withDevVarsForConfig(cwd, config, env, async () => {
|
|
133
|
+
return SpawnUtil.spawnAndWait({ command: 'wrangler', args, env: process.env });
|
|
134
|
+
});
|
|
58
135
|
process.exit(exitCode);
|
|
59
136
|
};
|
|
60
137
|
export const DockerCommand = Object.freeze({
|
|
@@ -64,6 +141,11 @@ export const DockerCommand = Object.freeze({
|
|
|
64
141
|
aliases: ['dkr', 'dk'],
|
|
65
142
|
description: 'Run Wrangler dev using a Docker-backed Cloudflare Containers config',
|
|
66
143
|
addOptions: (command) => {
|
|
144
|
+
// `zin docker push` (subcommand) for Docker Hub publishing.
|
|
145
|
+
// Keep `zin docker` itself as the Wrangler dev command.
|
|
146
|
+
const pushCommand = DockerPushCommand.create().getCommand();
|
|
147
|
+
pushCommand.name('push');
|
|
148
|
+
command.addCommand(pushCommand);
|
|
67
149
|
command.option('-c, --wrangler-config <path>', 'Wrangler config file (defaults if present)');
|
|
68
150
|
command.option('-e, --env <name>', 'Wrangler environment name');
|
|
69
151
|
command.option('-p, --port <number>', 'Port for wrangler dev');
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DockerPushCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/DockerPushCommand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA6FrE,eAAO,MAAM,iBAAiB;cAClB,YAAY;EA0BtB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { BaseCommand } from '../BaseCommand.js';
|
|
2
|
+
import { VersionChecker } from '../services/VersionChecker.js';
|
|
3
|
+
import { SpawnUtil } from '../utils/spawn.js';
|
|
4
|
+
import { Logger } from '../../config/logger.js';
|
|
5
|
+
import { ErrorFactory } from '../../exceptions/ZintrustError.js';
|
|
6
|
+
const parsePlatforms = (value) => {
|
|
7
|
+
const raw = (value ?? '').trim();
|
|
8
|
+
if (raw !== '')
|
|
9
|
+
return raw;
|
|
10
|
+
return 'linux/amd64,linux/arm64';
|
|
11
|
+
};
|
|
12
|
+
const parseTag = (value) => {
|
|
13
|
+
const raw = (value ?? '').trim();
|
|
14
|
+
if (raw === '') {
|
|
15
|
+
const currentVersion = VersionChecker.getCurrentVersion();
|
|
16
|
+
return currentVersion === '0.0.0' ? 'latest' : currentVersion;
|
|
17
|
+
}
|
|
18
|
+
return raw;
|
|
19
|
+
};
|
|
20
|
+
const resolvePublishTags = (tag, alsoLatest) => {
|
|
21
|
+
if (tag === 'latest')
|
|
22
|
+
return ['latest'];
|
|
23
|
+
if (alsoLatest === false)
|
|
24
|
+
return [tag];
|
|
25
|
+
return [tag, 'latest'];
|
|
26
|
+
};
|
|
27
|
+
const parseOnly = (value) => {
|
|
28
|
+
const raw = (value ?? '').trim().toLowerCase();
|
|
29
|
+
if (raw === 'runtime' || raw === 'gateway')
|
|
30
|
+
return raw;
|
|
31
|
+
return 'both';
|
|
32
|
+
};
|
|
33
|
+
const runPublishImages = async (options) => {
|
|
34
|
+
const tag = parseTag(options.tag);
|
|
35
|
+
const platforms = parsePlatforms(options.platforms);
|
|
36
|
+
const tags = resolvePublishTags(tag, options.alsoLatest);
|
|
37
|
+
const only = parseOnly(options.only);
|
|
38
|
+
const runtimeRepo = 'zintrust/zintrust';
|
|
39
|
+
const gatewayRepo = 'zintrust/zintrust-proxy-gateway';
|
|
40
|
+
const buildArgsFor = (repo, context) => {
|
|
41
|
+
const args = ['buildx', 'build', '--platform', platforms];
|
|
42
|
+
for (const t of tags)
|
|
43
|
+
args.push('-t', `${repo}:${t}`);
|
|
44
|
+
args.push('--push', context);
|
|
45
|
+
return args;
|
|
46
|
+
};
|
|
47
|
+
Logger.info('Publishing images to Docker Hub via buildx...', {
|
|
48
|
+
runtime: runtimeRepo,
|
|
49
|
+
gateway: gatewayRepo,
|
|
50
|
+
platforms,
|
|
51
|
+
tags,
|
|
52
|
+
only,
|
|
53
|
+
});
|
|
54
|
+
if (only === 'runtime' || only === 'both') {
|
|
55
|
+
const runtimeExit = await SpawnUtil.spawnAndWait({
|
|
56
|
+
command: 'docker',
|
|
57
|
+
args: buildArgsFor(runtimeRepo, '.'),
|
|
58
|
+
env: process.env,
|
|
59
|
+
});
|
|
60
|
+
if (runtimeExit !== 0) {
|
|
61
|
+
throw ErrorFactory.createCliError(`Failed to publish ${runtimeRepo} (exit code ${runtimeExit})`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (only === 'gateway' || only === 'both') {
|
|
65
|
+
const gatewayExit = await SpawnUtil.spawnAndWait({
|
|
66
|
+
command: 'docker',
|
|
67
|
+
args: buildArgsFor(gatewayRepo, './docker/proxy-gateway'),
|
|
68
|
+
env: process.env,
|
|
69
|
+
});
|
|
70
|
+
if (gatewayExit !== 0) {
|
|
71
|
+
throw ErrorFactory.createCliError(`Failed to publish ${gatewayRepo} (exit code ${gatewayExit})`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
export const DockerPushCommand = Object.freeze({
|
|
76
|
+
create() {
|
|
77
|
+
return BaseCommand.create({
|
|
78
|
+
name: 'docker:push',
|
|
79
|
+
aliases: ['docker-push'],
|
|
80
|
+
description: 'Build and push ZinTrust Docker images to Docker Hub',
|
|
81
|
+
addOptions: (command) => {
|
|
82
|
+
command.option('--tag <tag>', 'Docker image tag to publish. Defaults to current version and also tags :latest');
|
|
83
|
+
command.option('--platforms <list>', 'Comma-separated platforms for buildx', 'linux/amd64,linux/arm64');
|
|
84
|
+
command.option('--no-also-latest', 'When publishing a non-latest --tag, do not also push :latest');
|
|
85
|
+
command.option('--only <target>', 'Publish only one image: runtime|gateway|both', 'both');
|
|
86
|
+
},
|
|
87
|
+
execute: async (options) => {
|
|
88
|
+
await runPublishImages(options);
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InitContainerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/InitContainerCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"InitContainerCommand.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/InitContainerCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAoOlE,eAAO,MAAM,oBAAoB;cACrB,YAAY;EAkBtB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,KAAK,EAAE,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAGhG,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;IACzC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH,CAAC,CAAC;AA+EH;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,kBA4DnC,CAAC;AA8CH,QAAA,MAAM,iBAAiB,QAAO;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,kBAAkB,CAAC;IAC5B,SAAS,EAAE,CAAC,YAAY,EAAE,sBAAsB,KAAK,kBAAkB,CAAC,eAAe,CAAC,CAAC;IACzF,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,UAAU,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACnF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC;CAuEH,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAqB/D,eAAO,MAAM,WAAW,EAAE,WAYxB,CAAC"}
|
package/src/config/queue.js
CHANGED
|
@@ -5,6 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { Cloudflare } from './cloudflare.js';
|
|
7
7
|
import { Env } from './env.js';
|
|
8
|
+
import { Logger } from './logger.js';
|
|
9
|
+
import { middlewareConfig } from './middleware.js';
|
|
10
|
+
import { ErrorFactory } from '../exceptions/ZintrustError.js';
|
|
8
11
|
import { ZintrustLang } from '../lang/lang.js';
|
|
9
12
|
import { StartupConfigFile, StartupConfigFileRegistry } from '../runtime/StartupConfigFileRegistry.js';
|
|
10
13
|
const getQueueDriver = (driverConfig) => {
|
|
@@ -113,16 +116,32 @@ export const createBaseDrivers = () => ({
|
|
|
113
116
|
/**
|
|
114
117
|
* Helper: Create monitor configuration from environment
|
|
115
118
|
*/
|
|
116
|
-
const createBaseMonitor = () =>
|
|
117
|
-
enabled
|
|
118
|
-
basePath
|
|
119
|
-
middleware
|
|
119
|
+
const createBaseMonitor = () => {
|
|
120
|
+
const enabled = Env.getBool('QUEUE_MONITOR_ENABLED', false);
|
|
121
|
+
const basePath = Env.get('QUEUE_MONITOR_BASE_PATH', '/queue-monitor');
|
|
122
|
+
const middleware = Env.get('QUEUE_MONITOR_MIDDLEWARE', '')
|
|
120
123
|
.split(',')
|
|
121
124
|
.map((m) => m.trim())
|
|
122
|
-
.filter((m) => m.length > 0)
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
125
|
+
.filter((m) => m.length > 0);
|
|
126
|
+
if (enabled && middleware.length > 0) {
|
|
127
|
+
const knownKeys = new Set(Object.keys(middlewareConfig.route ?? {}));
|
|
128
|
+
const unknownKeys = middleware.filter((name) => !knownKeys.has(name));
|
|
129
|
+
if (unknownKeys.length > 0) {
|
|
130
|
+
Logger.error('Unknown QUEUE_MONITOR_MIDDLEWARE keys configured', {
|
|
131
|
+
unknownKeys,
|
|
132
|
+
basePath,
|
|
133
|
+
});
|
|
134
|
+
throw ErrorFactory.createConfigError(`Unknown QUEUE_MONITOR_MIDDLEWARE key(s): ${unknownKeys.join(', ')}. These must match registered route middleware keys in your app.`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
enabled,
|
|
139
|
+
basePath,
|
|
140
|
+
middleware,
|
|
141
|
+
autoRefresh: Env.getBool('QUEUE_MONITOR_AUTO_REFRESH', true),
|
|
142
|
+
refreshIntervalMs: Env.getInt('QUEUE_MONITOR_REFRESH_MS', 5000),
|
|
143
|
+
};
|
|
144
|
+
};
|
|
126
145
|
const createQueueConfig = () => {
|
|
127
146
|
const overrides = StartupConfigFileRegistry.get(StartupConfigFile.Queue) ?? {};
|
|
128
147
|
const baseDefault = Env.get('QUEUE_DRIVER', 'sync');
|
package/src/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @zintrust/core v0.1.
|
|
2
|
+
* @zintrust/core v0.1.48
|
|
3
3
|
*
|
|
4
4
|
* ZinTrust Framework - Production-Grade TypeScript Backend
|
|
5
5
|
* Built for performance, type safety, and exceptional developer experience
|
|
6
6
|
*
|
|
7
7
|
* Build Information:
|
|
8
|
-
* Built: 2026-02-
|
|
8
|
+
* Built: 2026-02-22T16:26:04.049Z
|
|
9
9
|
* Node: >=20.0.0
|
|
10
10
|
* License: MIT
|
|
11
11
|
*
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* Available at runtime for debugging and health checks
|
|
22
22
|
*/
|
|
23
23
|
export const ZINTRUST_VERSION = '0.1.41';
|
|
24
|
-
export const ZINTRUST_BUILD_DATE = '2026-02-
|
|
24
|
+
export const ZINTRUST_BUILD_DATE = '2026-02-22T16:26:04.019Z'; // Replaced during build
|
|
25
25
|
export { Application } from './boot/Application.js';
|
|
26
26
|
export { AwsSigV4 } from './common/index.js';
|
|
27
27
|
export { SignedRequest } from './security/SignedRequest.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../../src/orm/Database.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAWxD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAE1F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvD,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,SAAS;IACxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACrF,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;IACnC,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1F,cAAc,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,aAAa,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC3F,kBAAkB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;IACvD,OAAO,IAAI,eAAe,CAAC;IAC3B,SAAS,IAAI,cAAc,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AA4gBD,eAAO,MAAM,QAAQ;IACnB;;OAEG;oBACa,cAAc,GAAG,SAAS;EAI1C,CAAC;AAIH,eAAO,MAAM,oBAAoB,GAC/B,SAAQ,cAAc,GAAG,SAAqB,EAC9C,uBAA0B,KACzB,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAMxC,CAAC;AAEF,wBAAgB,WAAW,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,UAAU,SAAY,GAAG,SAAS,CAoBtF;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAWnD"}
|
package/src/orm/Database.js
CHANGED
|
@@ -16,6 +16,7 @@ import { PostgreSQLAdapter } from './adapters/PostgreSQLAdapter.js';
|
|
|
16
16
|
import { PostgreSQLProxyAdapter } from './adapters/PostgreSQLProxyAdapter.js';
|
|
17
17
|
import { SQLiteAdapter } from './adapters/SQLiteAdapter.js';
|
|
18
18
|
import { SQLServerAdapter } from './adapters/SQLServerAdapter.js';
|
|
19
|
+
import { createSqlServerProxyAdapter } from './adapters/SqlServerProxyAdapter.js';
|
|
19
20
|
import { DatabaseAdapterRegistry } from './DatabaseAdapterRegistry.js';
|
|
20
21
|
import { QueryBuilder } from './QueryBuilder.js';
|
|
21
22
|
/**
|
|
@@ -31,7 +32,7 @@ const resolveMySqlProxyAdapter = (cfg) => {
|
|
|
31
32
|
const proxyUrl = Env.get('MYSQL_PROXY_URL', '').trim();
|
|
32
33
|
const useProxy = Env.getBool('USE_MYSQL_PROXY', false);
|
|
33
34
|
if (useProxy || proxyUrl.length > 0) {
|
|
34
|
-
Logger.info('[Database] Selecting MySQL proxy adapter
|
|
35
|
+
Logger.info('[Database] Selecting MySQL proxy adapter', {
|
|
35
36
|
driver: cfg.driver,
|
|
36
37
|
useMySqlProxy: useProxy,
|
|
37
38
|
mysqlProxyUrlConfigured: proxyUrl.length > 0,
|
|
@@ -47,7 +48,7 @@ const resolvePostgresProxyAdapter = (cfg) => {
|
|
|
47
48
|
const proxyUrl = Env.get('POSTGRES_PROXY_URL', '').trim();
|
|
48
49
|
const useProxy = Env.getBool('USE_POSTGRES_PROXY', false);
|
|
49
50
|
if (useProxy || proxyUrl.length > 0) {
|
|
50
|
-
Logger.info('[Database] Selecting PostgreSQL proxy adapter
|
|
51
|
+
Logger.info('[Database] Selecting PostgreSQL proxy adapter', {
|
|
51
52
|
driver: cfg.driver,
|
|
52
53
|
usePostgresProxy: useProxy,
|
|
53
54
|
postgresProxyUrlConfigured: proxyUrl.length > 0,
|
|
@@ -57,6 +58,36 @@ const resolvePostgresProxyAdapter = (cfg) => {
|
|
|
57
58
|
}
|
|
58
59
|
return null;
|
|
59
60
|
};
|
|
61
|
+
const resolveSqlServerProxyAdapter = (cfg) => {
|
|
62
|
+
if (cfg.driver !== 'sqlserver')
|
|
63
|
+
return null;
|
|
64
|
+
const proxyUrl = Env.get('SQLSERVER_PROXY_URL', '').trim();
|
|
65
|
+
const useProxy = Env.getBool('USE_SQLSERVER_PROXY', false);
|
|
66
|
+
if (useProxy || proxyUrl.length > 0) {
|
|
67
|
+
Logger.info('[Database] Selecting SQL Server proxy adapter', {
|
|
68
|
+
driver: cfg.driver,
|
|
69
|
+
useSqlServerProxy: useProxy,
|
|
70
|
+
sqlServerProxyUrlConfigured: proxyUrl.length > 0,
|
|
71
|
+
sqlServerProxyUrl: proxyUrl,
|
|
72
|
+
});
|
|
73
|
+
return createSqlServerProxyAdapter();
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
};
|
|
77
|
+
const resolveExplicitProxyAdapter = (cfg) => {
|
|
78
|
+
// Allow proxy adapters to be forced in any runtime (Node or Workers) when
|
|
79
|
+
// the feature flags or proxy URLs are configured.
|
|
80
|
+
const mysqlProxy = resolveMySqlProxyAdapter(cfg);
|
|
81
|
+
if (mysqlProxy)
|
|
82
|
+
return mysqlProxy;
|
|
83
|
+
const postgresProxy = resolvePostgresProxyAdapter(cfg);
|
|
84
|
+
if (postgresProxy)
|
|
85
|
+
return postgresProxy;
|
|
86
|
+
const sqlServerProxy = resolveSqlServerProxyAdapter(cfg);
|
|
87
|
+
if (sqlServerProxy)
|
|
88
|
+
return sqlServerProxy;
|
|
89
|
+
return null;
|
|
90
|
+
};
|
|
60
91
|
const ensureCloudflareSocketSupport = (cfg) => {
|
|
61
92
|
const isSocketDriver = cfg.driver === 'postgresql' || cfg.driver === 'mysql';
|
|
62
93
|
if (!isSocketDriver)
|
|
@@ -92,6 +123,9 @@ const resolveWorkersAdapter = (cfg) => {
|
|
|
92
123
|
return null;
|
|
93
124
|
};
|
|
94
125
|
const createAdapter = (cfg) => {
|
|
126
|
+
const explicitProxy = resolveExplicitProxyAdapter(cfg);
|
|
127
|
+
if (explicitProxy)
|
|
128
|
+
return explicitProxy;
|
|
95
129
|
const workersAdapter = resolveWorkersAdapter(cfg);
|
|
96
130
|
if (workersAdapter)
|
|
97
131
|
return workersAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/orm/QueryBuilder.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/orm/QueryBuilder.ts"],"names":[],"mappings":"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"}
|
package/src/orm/QueryBuilder.js
CHANGED
|
@@ -196,8 +196,6 @@ const buildSelectClause = (columns, dialect) => {
|
|
|
196
196
|
const out = [];
|
|
197
197
|
for (const c of columns) {
|
|
198
198
|
const parsed = tryParseSelectExpr(String(c));
|
|
199
|
-
if (parsed === null)
|
|
200
|
-
continue;
|
|
201
199
|
out.push(formatSelectExpr(parsed, dialect));
|
|
202
200
|
}
|
|
203
201
|
return out.join(', ');
|
|
@@ -469,7 +469,7 @@ export function createMemoized(fn, options = {}) {
|
|
|
469
469
|
typeof a === 'string' ||
|
|
470
470
|
typeof a === 'number' ||
|
|
471
471
|
typeof a === 'boolean' ||
|
|
472
|
-
a ===
|
|
472
|
+
a === undefined);
|
|
473
473
|
key = arePrimitives ? args.join('|') : JSON.stringify(args);
|
|
474
474
|
}
|
|
475
475
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProxyServer.d.ts","sourceRoot":"","sources":["../../../src/proxy/ProxyServer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EAEZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,CACP,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E,CAAC,CAAC;AA0CH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,kBAAkB,KAC1B,QAAQ,CAAC;IACV,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,
|
|
1
|
+
{"version":3,"file":"ProxyServer.d.ts","sourceRoot":"","sources":["../../../src/proxy/ProxyServer.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,MAAM,EAEZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAA+B,MAAM,qBAAqB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,CACP,GAAG,EAAE,eAAe,EACpB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7E,CAAC,CAAC;AA0CH,eAAO,MAAM,iBAAiB,GAC5B,SAAS,kBAAkB,KAC1B,QAAQ,CAAC;IACV,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAkEA,CAAC"}
|
package/src/proxy/ProxyServer.js
CHANGED
|
@@ -38,6 +38,15 @@ export const createProxyServer = (options) => {
|
|
|
38
38
|
const server = createServer(async (req, res) => {
|
|
39
39
|
try {
|
|
40
40
|
const body = await readBody(req, options.maxBodyBytes);
|
|
41
|
+
const rawUrl = req.url ?? '';
|
|
42
|
+
if (rawUrl.startsWith('/containerstarthealthcheck') ||
|
|
43
|
+
rawUrl.startsWith('containerstarthealthcheck')) {
|
|
44
|
+
respond(res, {
|
|
45
|
+
status: 200,
|
|
46
|
+
body: { status: 'ok' },
|
|
47
|
+
});
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
41
50
|
if ((req.url ?? '').startsWith('/health')) {
|
|
42
51
|
const response = await options.backend.health();
|
|
43
52
|
respond(res, response);
|
|
@@ -2,6 +2,7 @@ name: zintrust-schedules
|
|
|
2
2
|
|
|
3
3
|
services:
|
|
4
4
|
schedules:
|
|
5
|
+
image: ${SCHEDULES_IMAGE:-zintrust/zintrust-schedules:latest}
|
|
5
6
|
build:
|
|
6
7
|
context: .
|
|
7
8
|
dockerfile: Dockerfile
|
|
@@ -21,13 +22,43 @@ services:
|
|
|
21
22
|
REDIS_DB: ${REDIS_DB:-0}
|
|
22
23
|
|
|
23
24
|
# Database (for job-tracking cleanup schedule)
|
|
25
|
+
# Supported: postgresql | mysql | sqlserver | sqlite | d1 | d1-remote
|
|
26
|
+
# Tip: to use mysql or sqlserver, start the corresponding profile:
|
|
27
|
+
# docker compose -f docker-compose.schedules.yml --profile mysql up -d
|
|
28
|
+
# docker compose -f docker-compose.schedules.yml --profile sqlserver up -d
|
|
24
29
|
DB_CONNECTION: ${DB_CONNECTION:-postgresql}
|
|
30
|
+
|
|
31
|
+
# PostgreSQL
|
|
25
32
|
DB_HOST: ${DB_HOST:-postgres}
|
|
26
|
-
|
|
33
|
+
DB_PORT_POSTGRESQL: ${DB_PORT_POSTGRESQL:-5432}
|
|
34
|
+
DB_DATABASE_POSTGRESQL: ${DB_DATABASE_POSTGRESQL:-zintrust}
|
|
35
|
+
DB_USERNAME_POSTGRESQL: ${DB_USERNAME_POSTGRESQL:-zintrust}
|
|
36
|
+
DB_PASSWORD_POSTGRESQL: ${DB_PASSWORD_POSTGRESQL:-zintrust}
|
|
37
|
+
|
|
38
|
+
# MySQL
|
|
39
|
+
DB_PORT: ${DB_PORT:-3306}
|
|
27
40
|
DB_DATABASE: ${DB_DATABASE:-zintrust}
|
|
28
41
|
DB_USERNAME: ${DB_USERNAME:-zintrust}
|
|
29
42
|
DB_PASSWORD: ${DB_PASSWORD:-zintrust}
|
|
30
43
|
|
|
44
|
+
# SQL Server
|
|
45
|
+
DB_HOST_MSSQL: ${DB_HOST_MSSQL:-sqlserver}
|
|
46
|
+
DB_PORT_MSSQL: ${DB_PORT_MSSQL:-1433}
|
|
47
|
+
DB_DATABASE_MSSQL: ${DB_DATABASE_MSSQL:-zintrust}
|
|
48
|
+
DB_USERNAME_MSSQL: ${DB_USERNAME_MSSQL:-sa}
|
|
49
|
+
DB_PASSWORD_MSSQL: ${DB_PASSWORD_MSSQL:-YourStrong!Passw0rd}
|
|
50
|
+
|
|
51
|
+
# SQLite (no DB container; writes to local filesystem inside the container)
|
|
52
|
+
DB_DATABASE_SQLITE: ${DB_DATABASE_SQLITE:-.zintrust/dbs/zintrust.sqlite}
|
|
53
|
+
|
|
54
|
+
# Cloudflare D1 (requires Cloudflare credentials / remote proxy)
|
|
55
|
+
D1_DATABASE_ID: ${D1_DATABASE_ID:-}
|
|
56
|
+
D1_ACCOUNT_ID: ${D1_ACCOUNT_ID:-}
|
|
57
|
+
D1_API_TOKEN: ${D1_API_TOKEN:-}
|
|
58
|
+
D1_REMOTE_URL: ${D1_REMOTE_URL:-}
|
|
59
|
+
D1_REMOTE_KEY_ID: ${D1_REMOTE_KEY_ID:-}
|
|
60
|
+
D1_REMOTE_SECRET: ${D1_REMOTE_SECRET:-}
|
|
61
|
+
|
|
31
62
|
# Job tracking cleanup schedule
|
|
32
63
|
JOB_TRACKING_CLEANUP_ENABLED: ${JOB_TRACKING_CLEANUP_ENABLED:-false}
|
|
33
64
|
JOB_TRACKING_CLEANUP_INTERVAL_MS: ${JOB_TRACKING_CLEANUP_INTERVAL_MS:-21600000}
|
|
@@ -37,8 +68,6 @@ services:
|
|
|
37
68
|
JOB_TRACKING_CLEANUP_LOCK_PROVIDER: ${JOB_TRACKING_CLEANUP_LOCK_PROVIDER:-redis}
|
|
38
69
|
command: ['node', 'dist/bin/zin.js', 'schedule:start']
|
|
39
70
|
depends_on:
|
|
40
|
-
postgres:
|
|
41
|
-
condition: service_healthy
|
|
42
71
|
redis:
|
|
43
72
|
condition: service_healthy
|
|
44
73
|
networks:
|
|
@@ -47,21 +76,61 @@ services:
|
|
|
47
76
|
postgres:
|
|
48
77
|
image: postgres:16-alpine
|
|
49
78
|
environment:
|
|
50
|
-
POSTGRES_DB: ${
|
|
51
|
-
POSTGRES_USER: ${
|
|
52
|
-
POSTGRES_PASSWORD: ${
|
|
79
|
+
POSTGRES_DB: ${DB_DATABASE_POSTGRESQL:-zintrust}
|
|
80
|
+
POSTGRES_USER: ${DB_USERNAME_POSTGRESQL:-zintrust}
|
|
81
|
+
POSTGRES_PASSWORD: ${DB_PASSWORD_POSTGRESQL:-zintrust}
|
|
53
82
|
ports:
|
|
54
83
|
- '${POSTGRES_PORT:-5432}:5432'
|
|
55
84
|
volumes:
|
|
56
85
|
- postgres_data:/var/lib/postgresql/data
|
|
57
86
|
healthcheck:
|
|
58
|
-
test: ['CMD-SHELL', 'pg_isready -U ${
|
|
87
|
+
test: ['CMD-SHELL', 'pg_isready -U ${DB_USERNAME_POSTGRESQL:-zintrust}']
|
|
59
88
|
interval: 10s
|
|
60
89
|
timeout: 5s
|
|
61
90
|
retries: 5
|
|
62
91
|
networks:
|
|
63
92
|
- zintrust-network
|
|
64
93
|
|
|
94
|
+
mysql:
|
|
95
|
+
profiles: ['mysql']
|
|
96
|
+
image: mysql:8.4
|
|
97
|
+
environment:
|
|
98
|
+
MYSQL_DATABASE: ${DB_DATABASE:-zintrust}
|
|
99
|
+
MYSQL_USER: ${DB_USERNAME:-zintrust}
|
|
100
|
+
MYSQL_PASSWORD: ${DB_PASSWORD:-zintrust}
|
|
101
|
+
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root}
|
|
102
|
+
ports:
|
|
103
|
+
- '${MYSQL_PORT:-3306}:3306'
|
|
104
|
+
volumes:
|
|
105
|
+
- mysql_data:/var/lib/mysql
|
|
106
|
+
healthcheck:
|
|
107
|
+
test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 -uroot -p${MYSQL_ROOT_PASSWORD:-root} --silent']
|
|
108
|
+
interval: 10s
|
|
109
|
+
timeout: 5s
|
|
110
|
+
retries: 10
|
|
111
|
+
networks:
|
|
112
|
+
- zintrust-network
|
|
113
|
+
|
|
114
|
+
sqlserver:
|
|
115
|
+
profiles: ['sqlserver']
|
|
116
|
+
image: mcr.microsoft.com/mssql/server:2022-latest
|
|
117
|
+
environment:
|
|
118
|
+
ACCEPT_EULA: 'Y'
|
|
119
|
+
MSSQL_PID: ${MSSQL_PID:-Developer}
|
|
120
|
+
MSSQL_SA_PASSWORD: ${MSSQL_SA_PASSWORD:-YourStrong!Passw0rd}
|
|
121
|
+
ports:
|
|
122
|
+
- '${SQLSERVER_PORT:-1433}:1433'
|
|
123
|
+
volumes:
|
|
124
|
+
- sqlserver_data:/var/opt/mssql
|
|
125
|
+
healthcheck:
|
|
126
|
+
test: ['CMD-SHELL', '/opt/mssql-tools18/bin/sqlcmd -S 127.0.0.1 -U sa -P "${MSSQL_SA_PASSWORD:-YourStrong!Passw0rd}" -Q "SELECT 1" 1>/dev/null']
|
|
127
|
+
interval: 10s
|
|
128
|
+
timeout: 10s
|
|
129
|
+
retries: 10
|
|
130
|
+
start_period: 20s
|
|
131
|
+
networks:
|
|
132
|
+
- zintrust-network
|
|
133
|
+
|
|
65
134
|
redis:
|
|
66
135
|
image: redis:7-alpine
|
|
67
136
|
ports:
|
|
@@ -82,3 +151,5 @@ networks:
|
|
|
82
151
|
volumes:
|
|
83
152
|
postgres_data:
|
|
84
153
|
redis_data:
|
|
154
|
+
mysql_data:
|
|
155
|
+
sqlserver_data:
|