@zintrust/cloudflare-containers-proxy 0.1.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/build-manifest.json +36 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.js +272 -0
- package/package.json +33 -0
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# @zintrust/cloudflare-containers-proxy
|
|
2
|
+
|
|
3
|
+
Cloudflare Containers + Durable Object gateway for the ZinTrust proxy stack.
|
|
4
|
+
|
|
5
|
+
## What this provides
|
|
6
|
+
|
|
7
|
+
- A Worker `fetch` handler that routes by path prefix (`/mysql/*`, `/postgres/*`, etc.)
|
|
8
|
+
- Container-backed Durable Object classes (one per proxy service)
|
|
9
|
+
|
|
10
|
+
## Typical usage (in an app repo)
|
|
11
|
+
|
|
12
|
+
1. Install:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm i @zintrust/cloudflare-containers-proxy
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
2. Create a local Worker entry file that re-exports the package:
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
// src/containers-proxy.ts
|
|
22
|
+
export { default } from '@zintrust/cloudflare-containers-proxy';
|
|
23
|
+
export * from '@zintrust/cloudflare-containers-proxy';
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
3. Point your `wrangler.containers-proxy.jsonc` `main` to that file.
|
|
27
|
+
|
|
28
|
+
## CLI flow (recommended)
|
|
29
|
+
|
|
30
|
+
If your app uses the ZinTrust CLI:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
zin init:containers-proxy
|
|
34
|
+
npm i @zintrust/cloudflare-containers-proxy
|
|
35
|
+
zin docker -c wrangler.containers-proxy.jsonc -e staging
|
|
36
|
+
zin deploy:ccp
|
|
37
|
+
```
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zintrust/cloudflare-containers-proxy",
|
|
3
|
+
"version": "0.1.43",
|
|
4
|
+
"buildDate": "2026-02-19T18:46:20.595Z",
|
|
5
|
+
"buildEnvironment": {
|
|
6
|
+
"node": "v20.20.0",
|
|
7
|
+
"platform": "linux",
|
|
8
|
+
"arch": "x64"
|
|
9
|
+
},
|
|
10
|
+
"git": {
|
|
11
|
+
"commit": "d42fc0e",
|
|
12
|
+
"branch": "master"
|
|
13
|
+
},
|
|
14
|
+
"package": {
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20.0.0"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": [
|
|
19
|
+
"@cloudflare/containers",
|
|
20
|
+
"@cloudflare/workers-types"
|
|
21
|
+
],
|
|
22
|
+
"peerDependencies": [
|
|
23
|
+
"@zintrust/core"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"files": {
|
|
27
|
+
"index.d.ts": {
|
|
28
|
+
"size": 3701,
|
|
29
|
+
"sha256": "0f7335c84e3f52ee46fa680b635f383e607e64af93338701934105234be3ce18"
|
|
30
|
+
},
|
|
31
|
+
"index.js": {
|
|
32
|
+
"size": 12198,
|
|
33
|
+
"sha256": "00696df76d78232e337eb112ff58b791daf52ecd8d01b62b25020691cd79d772"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Container } from '@cloudflare/containers';
|
|
2
|
+
export type ZintrustContainerNamespace = {
|
|
3
|
+
getByName(name: string): {
|
|
4
|
+
fetch(request: Request): Promise<Response>;
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
export type ZintrustContainersProxyEnv = {
|
|
8
|
+
ZT_PROXY_MYSQL: ZintrustContainerNamespace;
|
|
9
|
+
ZT_PROXY_POSTGRES: ZintrustContainerNamespace;
|
|
10
|
+
ZT_PROXY_REDIS: ZintrustContainerNamespace;
|
|
11
|
+
ZT_PROXY_MONGODB: ZintrustContainerNamespace;
|
|
12
|
+
ZT_PROXY_SQLSERVER: ZintrustContainerNamespace;
|
|
13
|
+
ZT_PROXY_SMTP: ZintrustContainerNamespace;
|
|
14
|
+
ENVIRONMENT?: string;
|
|
15
|
+
NODE_ENV?: string;
|
|
16
|
+
APP_NAME?: string;
|
|
17
|
+
APP_KEY?: string;
|
|
18
|
+
CSRF_SKIP_PATHS?: string;
|
|
19
|
+
ZT_ZIN_BIN?: string;
|
|
20
|
+
MYSQL_PROXY_KEY_ID?: string;
|
|
21
|
+
MYSQL_PROXY_SECRET?: string;
|
|
22
|
+
MYSQL_PROXY_SIGNING_WINDOW_MS?: string;
|
|
23
|
+
MYSQL_PROXY_POOL_LIMIT?: string;
|
|
24
|
+
MYSQL_DB_HOST?: string;
|
|
25
|
+
MYSQL_DB_PORT?: string;
|
|
26
|
+
MYSQL_DB_DATABASE?: string;
|
|
27
|
+
MYSQL_DB_USERNAME?: string;
|
|
28
|
+
MYSQL_DB_PASSWORD?: string;
|
|
29
|
+
POSTGRES_PROXY_KEY_ID?: string;
|
|
30
|
+
POSTGRES_PROXY_SECRET?: string;
|
|
31
|
+
POSTGRES_PROXY_SIGNING_WINDOW_MS?: string;
|
|
32
|
+
POSTGRES_PROXY_POOL_LIMIT?: string;
|
|
33
|
+
POSTGRES_DB_HOST?: string;
|
|
34
|
+
POSTGRES_DB_PORT?: string;
|
|
35
|
+
POSTGRES_DB_DATABASE?: string;
|
|
36
|
+
POSTGRES_DB_USERNAME?: string;
|
|
37
|
+
POSTGRES_DB_PASSWORD?: string;
|
|
38
|
+
REDIS_PROXY_KEY_ID?: string;
|
|
39
|
+
REDIS_PROXY_SECRET?: string;
|
|
40
|
+
REDIS_PROXY_SIGNING_WINDOW_MS?: string;
|
|
41
|
+
REDIS_PROXY_TARGET_HOST?: string;
|
|
42
|
+
REDIS_PROXY_TARGET_PORT?: string;
|
|
43
|
+
REDIS_PROXY_TARGET_PASSWORD?: string;
|
|
44
|
+
REDIS_PROXY_TARGET_DB?: string;
|
|
45
|
+
MONGODB_PROXY_KEY_ID?: string;
|
|
46
|
+
MONGODB_PROXY_SECRET?: string;
|
|
47
|
+
MONGODB_PROXY_SIGNING_WINDOW_MS?: string;
|
|
48
|
+
MONGODB_PROXY_TARGET_URI?: string;
|
|
49
|
+
MONGODB_PROXY_TARGET_DB?: string;
|
|
50
|
+
SQLSERVER_PROXY_KEY_ID?: string;
|
|
51
|
+
SQLSERVER_PROXY_SECRET?: string;
|
|
52
|
+
SQLSERVER_PROXY_SIGNING_WINDOW_MS?: string;
|
|
53
|
+
SQLSERVER_PROXY_POOL_LIMIT?: string;
|
|
54
|
+
SQLSERVER_DB_HOST?: string;
|
|
55
|
+
SQLSERVER_DB_PORT?: string;
|
|
56
|
+
SQLSERVER_DB_DATABASE?: string;
|
|
57
|
+
SQLSERVER_DB_USERNAME?: string;
|
|
58
|
+
SQLSERVER_DB_PASSWORD?: string;
|
|
59
|
+
SMTP_PROXY_KEY_ID?: string;
|
|
60
|
+
SMTP_PROXY_SECRET?: string;
|
|
61
|
+
SMTP_PROXY_SIGNING_WINDOW_MS?: string;
|
|
62
|
+
MAIL_HOST?: string;
|
|
63
|
+
MAIL_PORT?: string;
|
|
64
|
+
MAIL_SECURE?: string;
|
|
65
|
+
MAIL_USERNAME?: string;
|
|
66
|
+
MAIL_PASSWORD?: string;
|
|
67
|
+
MAIL_FROM_ADDRESS?: string;
|
|
68
|
+
MAIL_FROM_NAME?: string;
|
|
69
|
+
};
|
|
70
|
+
export declare class ZintrustMySqlProxyContainer extends Container {
|
|
71
|
+
defaultPort: number;
|
|
72
|
+
sleepAfter: string;
|
|
73
|
+
pingEndpoint: string;
|
|
74
|
+
fetch(request: Request): Promise<Response>;
|
|
75
|
+
}
|
|
76
|
+
export declare class ZintrustPostgresProxyContainer extends Container {
|
|
77
|
+
defaultPort: number;
|
|
78
|
+
sleepAfter: string;
|
|
79
|
+
pingEndpoint: string;
|
|
80
|
+
fetch(request: Request): Promise<Response>;
|
|
81
|
+
}
|
|
82
|
+
export declare class ZintrustRedisProxyContainer extends Container {
|
|
83
|
+
defaultPort: number;
|
|
84
|
+
sleepAfter: string;
|
|
85
|
+
pingEndpoint: string;
|
|
86
|
+
fetch(request: Request): Promise<Response>;
|
|
87
|
+
}
|
|
88
|
+
export declare class ZintrustMongoDbProxyContainer extends Container {
|
|
89
|
+
defaultPort: number;
|
|
90
|
+
sleepAfter: string;
|
|
91
|
+
pingEndpoint: string;
|
|
92
|
+
fetch(request: Request): Promise<Response>;
|
|
93
|
+
}
|
|
94
|
+
export declare class ZintrustSqlServerProxyContainer extends Container {
|
|
95
|
+
defaultPort: number;
|
|
96
|
+
sleepAfter: string;
|
|
97
|
+
pingEndpoint: string;
|
|
98
|
+
fetch(request: Request): Promise<Response>;
|
|
99
|
+
}
|
|
100
|
+
export declare class ZintrustSmtpProxyContainer extends Container {
|
|
101
|
+
defaultPort: number;
|
|
102
|
+
sleepAfter: string;
|
|
103
|
+
pingEndpoint: string;
|
|
104
|
+
fetch(request: Request): Promise<Response>;
|
|
105
|
+
}
|
|
106
|
+
declare const _default: {
|
|
107
|
+
fetch(request: Request, env: ZintrustContainersProxyEnv): Promise<Response>;
|
|
108
|
+
};
|
|
109
|
+
export default _default;
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { Container } from '@cloudflare/containers';
|
|
2
|
+
const getContainerEnv = (container) => {
|
|
3
|
+
return container.env;
|
|
4
|
+
};
|
|
5
|
+
const toStringEnv = (value, fallback = '') => {
|
|
6
|
+
if (typeof value === 'string')
|
|
7
|
+
return value;
|
|
8
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
9
|
+
return String(value);
|
|
10
|
+
if (typeof value === 'boolean')
|
|
11
|
+
return value ? 'true' : 'false';
|
|
12
|
+
return fallback;
|
|
13
|
+
};
|
|
14
|
+
const createCommonProxyEnvVars = (env) => {
|
|
15
|
+
const environment = toStringEnv(env.ENVIRONMENT, '');
|
|
16
|
+
const nodeEnvFallback = environment.length > 0 ? environment : 'production';
|
|
17
|
+
return {
|
|
18
|
+
ENVIRONMENT: environment,
|
|
19
|
+
NODE_ENV: toStringEnv(env.NODE_ENV, nodeEnvFallback),
|
|
20
|
+
APP_NAME: toStringEnv(env.APP_NAME, 'ZinTrust'),
|
|
21
|
+
APP_KEY: toStringEnv(env.APP_KEY, ''),
|
|
22
|
+
CSRF_SKIP_PATHS: toStringEnv(env.CSRF_SKIP_PATHS, '/api/*,/queue-monitor/*'),
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
const resolveZinBin = (env) => {
|
|
26
|
+
return toStringEnv(env.ZT_ZIN_BIN, 'dist/bin/zin.js');
|
|
27
|
+
};
|
|
28
|
+
const createProxyEntrypoint = (env, command, port) => {
|
|
29
|
+
return ['node', resolveZinBin(env), command, '--host', '0.0.0.0', '--port', String(port)];
|
|
30
|
+
};
|
|
31
|
+
const createMySqlProxyEnvVars = (env) => {
|
|
32
|
+
return {
|
|
33
|
+
...createCommonProxyEnvVars(env),
|
|
34
|
+
MYSQL_PROXY_REQUIRE_SIGNING: 'true',
|
|
35
|
+
MYSQL_PROXY_KEY_ID: toStringEnv(env.MYSQL_PROXY_KEY_ID, ''),
|
|
36
|
+
MYSQL_PROXY_SECRET: toStringEnv(env.MYSQL_PROXY_SECRET, ''),
|
|
37
|
+
MYSQL_PROXY_SIGNING_WINDOW_MS: toStringEnv(env.MYSQL_PROXY_SIGNING_WINDOW_MS, '60000'),
|
|
38
|
+
MYSQL_PROXY_POOL_LIMIT: toStringEnv(env.MYSQL_PROXY_POOL_LIMIT, '100'),
|
|
39
|
+
MYSQL_DB_HOST: toStringEnv(env.MYSQL_DB_HOST, ''),
|
|
40
|
+
MYSQL_DB_PORT: toStringEnv(env.MYSQL_DB_PORT, '3306'),
|
|
41
|
+
MYSQL_DB_DATABASE: toStringEnv(env.MYSQL_DB_DATABASE, 'zintrust'),
|
|
42
|
+
MYSQL_DB_USERNAME: toStringEnv(env.MYSQL_DB_USERNAME, 'zintrust'),
|
|
43
|
+
MYSQL_DB_PASSWORD: toStringEnv(env.MYSQL_DB_PASSWORD, ''),
|
|
44
|
+
DB_HOST: toStringEnv(env.MYSQL_DB_HOST, ''),
|
|
45
|
+
DB_PORT: toStringEnv(env.MYSQL_DB_PORT, '3306'),
|
|
46
|
+
DB_DATABASE: toStringEnv(env.MYSQL_DB_DATABASE, 'zintrust'),
|
|
47
|
+
DB_USERNAME: toStringEnv(env.MYSQL_DB_USERNAME, 'zintrust'),
|
|
48
|
+
DB_PASSWORD: toStringEnv(env.MYSQL_DB_PASSWORD, ''),
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
const createPostgresProxyEnvVars = (env) => {
|
|
52
|
+
return {
|
|
53
|
+
...createCommonProxyEnvVars(env),
|
|
54
|
+
POSTGRES_PROXY_REQUIRE_SIGNING: 'true',
|
|
55
|
+
POSTGRES_PROXY_KEY_ID: toStringEnv(env.POSTGRES_PROXY_KEY_ID, ''),
|
|
56
|
+
POSTGRES_PROXY_SECRET: toStringEnv(env.POSTGRES_PROXY_SECRET, ''),
|
|
57
|
+
POSTGRES_PROXY_SIGNING_WINDOW_MS: toStringEnv(env.POSTGRES_PROXY_SIGNING_WINDOW_MS, '60000'),
|
|
58
|
+
POSTGRES_PROXY_POOL_LIMIT: toStringEnv(env.POSTGRES_PROXY_POOL_LIMIT, '100'),
|
|
59
|
+
DB_HOST: toStringEnv(env.POSTGRES_DB_HOST, ''),
|
|
60
|
+
DB_PORT_POSTGRESQL: toStringEnv(env.POSTGRES_DB_PORT, '5432'),
|
|
61
|
+
DB_DATABASE_POSTGRESQL: toStringEnv(env.POSTGRES_DB_DATABASE, 'postgres'),
|
|
62
|
+
DB_USERNAME_POSTGRESQL: toStringEnv(env.POSTGRES_DB_USERNAME, 'postgres'),
|
|
63
|
+
DB_PASSWORD_POSTGRESQL: toStringEnv(env.POSTGRES_DB_PASSWORD, ''),
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
const createRedisProxyEnvVars = (env) => {
|
|
67
|
+
return {
|
|
68
|
+
...createCommonProxyEnvVars(env),
|
|
69
|
+
REDIS_PROXY_REQUIRE_SIGNING: 'true',
|
|
70
|
+
REDIS_PROXY_KEY_ID: toStringEnv(env.REDIS_PROXY_KEY_ID, ''),
|
|
71
|
+
REDIS_PROXY_SECRET: toStringEnv(env.REDIS_PROXY_SECRET, ''),
|
|
72
|
+
REDIS_PROXY_SIGNING_WINDOW_MS: toStringEnv(env.REDIS_PROXY_SIGNING_WINDOW_MS, '60000'),
|
|
73
|
+
REDIS_PROXY_TARGET_HOST: toStringEnv(env.REDIS_PROXY_TARGET_HOST, ''),
|
|
74
|
+
REDIS_PROXY_TARGET_PORT: toStringEnv(env.REDIS_PROXY_TARGET_PORT, '6379'),
|
|
75
|
+
REDIS_PROXY_TARGET_PASSWORD: toStringEnv(env.REDIS_PROXY_TARGET_PASSWORD, ''),
|
|
76
|
+
REDIS_PROXY_TARGET_DB: toStringEnv(env.REDIS_PROXY_TARGET_DB, '0'),
|
|
77
|
+
REDIS_HOST: toStringEnv(env.REDIS_PROXY_TARGET_HOST, ''),
|
|
78
|
+
REDIS_PORT: toStringEnv(env.REDIS_PROXY_TARGET_PORT, '6379'),
|
|
79
|
+
REDIS_PASSWORD: toStringEnv(env.REDIS_PROXY_TARGET_PASSWORD, ''),
|
|
80
|
+
REDIS_DB: toStringEnv(env.REDIS_PROXY_TARGET_DB, '0'),
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
const createMongoDbProxyEnvVars = (env) => {
|
|
84
|
+
return {
|
|
85
|
+
...createCommonProxyEnvVars(env),
|
|
86
|
+
MONGODB_PROXY_REQUIRE_SIGNING: 'true',
|
|
87
|
+
MONGODB_PROXY_KEY_ID: toStringEnv(env.MONGODB_PROXY_KEY_ID, ''),
|
|
88
|
+
MONGODB_PROXY_SECRET: toStringEnv(env.MONGODB_PROXY_SECRET, ''),
|
|
89
|
+
MONGODB_PROXY_SIGNING_WINDOW_MS: toStringEnv(env.MONGODB_PROXY_SIGNING_WINDOW_MS, '60000'),
|
|
90
|
+
MONGO_URI: toStringEnv(env.MONGODB_PROXY_TARGET_URI, ''),
|
|
91
|
+
MONGO_DB: toStringEnv(env.MONGODB_PROXY_TARGET_DB, 'zintrust'),
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
const createSqlServerProxyEnvVars = (env) => {
|
|
95
|
+
return {
|
|
96
|
+
...createCommonProxyEnvVars(env),
|
|
97
|
+
SQLSERVER_PROXY_REQUIRE_SIGNING: 'true',
|
|
98
|
+
SQLSERVER_PROXY_KEY_ID: toStringEnv(env.SQLSERVER_PROXY_KEY_ID, ''),
|
|
99
|
+
SQLSERVER_PROXY_SECRET: toStringEnv(env.SQLSERVER_PROXY_SECRET, ''),
|
|
100
|
+
SQLSERVER_PROXY_SIGNING_WINDOW_MS: toStringEnv(env.SQLSERVER_PROXY_SIGNING_WINDOW_MS, '60000'),
|
|
101
|
+
SQLSERVER_PROXY_POOL_LIMIT: toStringEnv(env.SQLSERVER_PROXY_POOL_LIMIT, '100'),
|
|
102
|
+
DB_HOST_MSSQL: toStringEnv(env.SQLSERVER_DB_HOST, ''),
|
|
103
|
+
DB_PORT_MSSQL: toStringEnv(env.SQLSERVER_DB_PORT, '1433'),
|
|
104
|
+
DB_DATABASE_MSSQL: toStringEnv(env.SQLSERVER_DB_DATABASE, 'zintrust'),
|
|
105
|
+
DB_USERNAME_MSSQL: toStringEnv(env.SQLSERVER_DB_USERNAME, 'sa'),
|
|
106
|
+
DB_PASSWORD_MSSQL: toStringEnv(env.SQLSERVER_DB_PASSWORD, ''),
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
const createSmtpProxyEnvVars = (env) => {
|
|
110
|
+
return {
|
|
111
|
+
...createCommonProxyEnvVars(env),
|
|
112
|
+
SMTP_PROXY_REQUIRE_SIGNING: 'true',
|
|
113
|
+
SMTP_PROXY_KEY_ID: toStringEnv(env.SMTP_PROXY_KEY_ID, ''),
|
|
114
|
+
SMTP_PROXY_SECRET: toStringEnv(env.SMTP_PROXY_SECRET, ''),
|
|
115
|
+
SMTP_PROXY_SIGNING_WINDOW_MS: toStringEnv(env.SMTP_PROXY_SIGNING_WINDOW_MS, '60000'),
|
|
116
|
+
MAIL_DRIVER: 'smtp',
|
|
117
|
+
MAIL_CONNECTION: 'smtp',
|
|
118
|
+
MAIL_HOST: toStringEnv(env.MAIL_HOST, ''),
|
|
119
|
+
MAIL_PORT: toStringEnv(env.MAIL_PORT, '587'),
|
|
120
|
+
MAIL_SECURE: toStringEnv(env.MAIL_SECURE, 'false'),
|
|
121
|
+
MAIL_USERNAME: toStringEnv(env.MAIL_USERNAME, ''),
|
|
122
|
+
MAIL_PASSWORD: toStringEnv(env.MAIL_PASSWORD, ''),
|
|
123
|
+
MAIL_FROM_ADDRESS: toStringEnv(env.MAIL_FROM_ADDRESS, ''),
|
|
124
|
+
MAIL_FROM_NAME: toStringEnv(env.MAIL_FROM_NAME, 'ZinTrust'),
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
const ensureContainerStarted = async (container, port, start) => {
|
|
128
|
+
await container.startAndWaitForPorts({
|
|
129
|
+
startOptions: {
|
|
130
|
+
envVars: start.envVars,
|
|
131
|
+
entrypoint: start.entrypoint,
|
|
132
|
+
enableInternet: true,
|
|
133
|
+
},
|
|
134
|
+
ports: port,
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
// =============================================================================
|
|
138
|
+
// Container-backed Durable Object classes
|
|
139
|
+
// =============================================================================
|
|
140
|
+
export class ZintrustMySqlProxyContainer extends Container {
|
|
141
|
+
defaultPort = 8789;
|
|
142
|
+
sleepAfter = '10m';
|
|
143
|
+
pingEndpoint = '/health';
|
|
144
|
+
async fetch(request) {
|
|
145
|
+
const env = getContainerEnv(this);
|
|
146
|
+
await ensureContainerStarted(this, 8789, {
|
|
147
|
+
envVars: createMySqlProxyEnvVars(env),
|
|
148
|
+
entrypoint: createProxyEntrypoint(env, 'proxy:mysql', 8789),
|
|
149
|
+
});
|
|
150
|
+
return super.fetch(request);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export class ZintrustPostgresProxyContainer extends Container {
|
|
154
|
+
defaultPort = 8790;
|
|
155
|
+
sleepAfter = '10m';
|
|
156
|
+
pingEndpoint = '/health';
|
|
157
|
+
async fetch(request) {
|
|
158
|
+
const env = getContainerEnv(this);
|
|
159
|
+
await ensureContainerStarted(this, 8790, {
|
|
160
|
+
envVars: createPostgresProxyEnvVars(env),
|
|
161
|
+
entrypoint: createProxyEntrypoint(env, 'proxy:postgres', 8790),
|
|
162
|
+
});
|
|
163
|
+
return super.fetch(request);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
export class ZintrustRedisProxyContainer extends Container {
|
|
167
|
+
defaultPort = 8791;
|
|
168
|
+
sleepAfter = '10m';
|
|
169
|
+
pingEndpoint = '/health';
|
|
170
|
+
async fetch(request) {
|
|
171
|
+
const env = getContainerEnv(this);
|
|
172
|
+
await ensureContainerStarted(this, 8791, {
|
|
173
|
+
envVars: createRedisProxyEnvVars(env),
|
|
174
|
+
entrypoint: createProxyEntrypoint(env, 'proxy:redis', 8791),
|
|
175
|
+
});
|
|
176
|
+
return super.fetch(request);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export class ZintrustMongoDbProxyContainer extends Container {
|
|
180
|
+
defaultPort = 8792;
|
|
181
|
+
sleepAfter = '10m';
|
|
182
|
+
pingEndpoint = '/health';
|
|
183
|
+
async fetch(request) {
|
|
184
|
+
const env = getContainerEnv(this);
|
|
185
|
+
await ensureContainerStarted(this, 8792, {
|
|
186
|
+
envVars: createMongoDbProxyEnvVars(env),
|
|
187
|
+
entrypoint: createProxyEntrypoint(env, 'proxy:mongodb', 8792),
|
|
188
|
+
});
|
|
189
|
+
return super.fetch(request);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
export class ZintrustSqlServerProxyContainer extends Container {
|
|
193
|
+
defaultPort = 8793;
|
|
194
|
+
sleepAfter = '10m';
|
|
195
|
+
pingEndpoint = '/health';
|
|
196
|
+
async fetch(request) {
|
|
197
|
+
const env = getContainerEnv(this);
|
|
198
|
+
await ensureContainerStarted(this, 8793, {
|
|
199
|
+
envVars: createSqlServerProxyEnvVars(env),
|
|
200
|
+
entrypoint: createProxyEntrypoint(env, 'proxy:sqlserver', 8793),
|
|
201
|
+
});
|
|
202
|
+
return super.fetch(request);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
export class ZintrustSmtpProxyContainer extends Container {
|
|
206
|
+
defaultPort = 8794;
|
|
207
|
+
sleepAfter = '10m';
|
|
208
|
+
pingEndpoint = '/health';
|
|
209
|
+
async fetch(request) {
|
|
210
|
+
const env = getContainerEnv(this);
|
|
211
|
+
await ensureContainerStarted(this, 8794, {
|
|
212
|
+
envVars: createSmtpProxyEnvVars(env),
|
|
213
|
+
entrypoint: createProxyEntrypoint(env, 'proxy:smtp', 8794),
|
|
214
|
+
});
|
|
215
|
+
return super.fetch(request);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// =============================================================================
|
|
219
|
+
// Worker gateway (replaces docker-compose proxy-gateway)
|
|
220
|
+
// =============================================================================
|
|
221
|
+
const JSON_HEADERS = Object.freeze({ 'content-type': 'application/json; charset=utf-8' });
|
|
222
|
+
const createJson = (value, init) => {
|
|
223
|
+
return new Response(JSON.stringify(value), {
|
|
224
|
+
status: init?.status,
|
|
225
|
+
headers: {
|
|
226
|
+
...JSON_HEADERS,
|
|
227
|
+
...(init?.headers ?? undefined),
|
|
228
|
+
},
|
|
229
|
+
});
|
|
230
|
+
};
|
|
231
|
+
const rewritePrefix = (request, prefix) => {
|
|
232
|
+
const url = new URL(request.url);
|
|
233
|
+
if (!url.pathname.startsWith(prefix))
|
|
234
|
+
return request;
|
|
235
|
+
const nextPath = url.pathname.slice(prefix.length);
|
|
236
|
+
const normalized = nextPath === '' ? '/' : nextPath;
|
|
237
|
+
url.pathname = normalized.startsWith('/') ? normalized : `/${normalized}`;
|
|
238
|
+
return new Request(url.toString(), request);
|
|
239
|
+
};
|
|
240
|
+
const CONTAINER_INSTANCE_NAME = 'cf-singleton-container';
|
|
241
|
+
const ROUTES = Object.freeze({
|
|
242
|
+
mysql: { binding: 'ZT_PROXY_MYSQL', prefix: '/mysql' },
|
|
243
|
+
postgres: { binding: 'ZT_PROXY_POSTGRES', prefix: '/postgres' },
|
|
244
|
+
redis: { binding: 'ZT_PROXY_REDIS', prefix: '/redis' },
|
|
245
|
+
mongodb: { binding: 'ZT_PROXY_MONGODB', prefix: '/mongodb' },
|
|
246
|
+
sqlserver: { binding: 'ZT_PROXY_SQLSERVER', prefix: '/sqlserver' },
|
|
247
|
+
smtp: { binding: 'ZT_PROXY_SMTP', prefix: '/smtp' },
|
|
248
|
+
});
|
|
249
|
+
export default {
|
|
250
|
+
async fetch(request, env) {
|
|
251
|
+
const url = new URL(request.url);
|
|
252
|
+
if (url.pathname === '/health') {
|
|
253
|
+
return createJson({ status: 'ok', service: 'zintrust-containers-proxy' }, { status: 200 });
|
|
254
|
+
}
|
|
255
|
+
if (url.pathname === '/' || url.pathname === '') {
|
|
256
|
+
return createJson({
|
|
257
|
+
status: 'ok',
|
|
258
|
+
service: 'zintrust-containers-proxy',
|
|
259
|
+
routes: Object.keys(ROUTES).map((k) => `/${k}/*`),
|
|
260
|
+
}, { status: 200 });
|
|
261
|
+
}
|
|
262
|
+
const segments = url.pathname.split('/').filter((p) => p.trim() !== '');
|
|
263
|
+
const firstSegment = segments.length > 0 ? segments[0] : '';
|
|
264
|
+
const def = ROUTES[firstSegment];
|
|
265
|
+
if (!def) {
|
|
266
|
+
return createJson({ error: 'not_found', message: 'Unknown proxy route' }, { status: 404 });
|
|
267
|
+
}
|
|
268
|
+
const namespace = env[def.binding];
|
|
269
|
+
const stub = namespace.getByName(CONTAINER_INSTANCE_NAME);
|
|
270
|
+
return stub.fetch(rewritePrefix(request, def.prefix));
|
|
271
|
+
},
|
|
272
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zintrust/cloudflare-containers-proxy",
|
|
3
|
+
"version": "0.1.43",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"default": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": ">=20.0.0"
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"@zintrust/core": "^0.1.43"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@cloudflare/containers": "^0.1.0",
|
|
26
|
+
"@cloudflare/workers-types": "^4.20260217.0"
|
|
27
|
+
},
|
|
28
|
+
"scripts": {
|
|
29
|
+
"build": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json",
|
|
30
|
+
"type-check": "tsc -p tsconfig.json --noEmit",
|
|
31
|
+
"prepublishOnly": "npm run build"
|
|
32
|
+
}
|
|
33
|
+
}
|