@syedar/seedar-cli 1.1.2 → 1.2.0-test.3
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 +26 -3
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +20 -522
- package/dist/cli.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +18 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/help.d.ts +2 -0
- package/dist/commands/help.d.ts.map +1 -0
- package/dist/commands/help.js +17 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +35 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/lifecycle.d.ts +4 -0
- package/dist/commands/lifecycle.d.ts.map +1 -0
- package/dist/commands/lifecycle.js +63 -0
- package/dist/commands/lifecycle.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +20 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/status.d.ts +4 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +230 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +5 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +163 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/docker/compose.d.ts +6 -0
- package/dist/docker/compose.d.ts.map +1 -0
- package/dist/docker/compose.js +55 -0
- package/dist/docker/compose.js.map +1 -0
- package/dist/docker/health.d.ts +3 -0
- package/dist/docker/health.d.ts.map +1 -0
- package/dist/docker/health.js +38 -0
- package/dist/docker/health.js.map +1 -0
- package/dist/docker/ports.d.ts +3 -0
- package/dist/docker/ports.d.ts.map +1 -0
- package/dist/docker/ports.js +27 -0
- package/dist/docker/ports.js.map +1 -0
- package/dist/docker/prerequisites.d.ts +2 -0
- package/dist/docker/prerequisites.d.ts.map +1 -0
- package/dist/docker/prerequisites.js +12 -0
- package/dist/docker/prerequisites.js.map +1 -0
- package/dist/{process.d.ts → docker/process.d.ts} +2 -1
- package/dist/docker/process.d.ts.map +1 -0
- package/dist/{process.js → docker/process.js} +11 -0
- package/dist/docker/process.js.map +1 -0
- package/dist/index.js +0 -0
- package/dist/install/config.d.ts +7 -0
- package/dist/install/config.d.ts.map +1 -0
- package/dist/install/config.js +81 -0
- package/dist/install/config.js.map +1 -0
- package/dist/install/flow.d.ts +9 -0
- package/dist/install/flow.d.ts.map +1 -0
- package/dist/install/flow.js +103 -0
- package/dist/install/flow.js.map +1 -0
- package/dist/install/output.d.ts +7 -0
- package/dist/install/output.d.ts.map +1 -0
- package/dist/install/output.js +22 -0
- package/dist/install/output.js.map +1 -0
- package/dist/install/ports.d.ts +8 -0
- package/dist/install/ports.d.ts.map +1 -0
- package/dist/install/ports.js +38 -0
- package/dist/install/ports.js.map +1 -0
- package/dist/install/prompts.d.ts +4 -0
- package/dist/install/prompts.d.ts.map +1 -0
- package/dist/install/prompts.js +155 -0
- package/dist/install/prompts.js.map +1 -0
- package/dist/runtime/guards.d.ts +3 -0
- package/dist/runtime/guards.d.ts.map +1 -0
- package/dist/runtime/guards.js +7 -0
- package/dist/runtime/guards.js.map +1 -0
- package/dist/{runtime.d.ts → runtime/index.d.ts} +2 -2
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/{runtime.js → runtime/index.js} +2 -2
- package/dist/runtime/index.js.map +1 -0
- package/dist/shared/args.d.ts +8 -0
- package/dist/shared/args.d.ts.map +1 -0
- package/dist/shared/args.js +40 -0
- package/dist/shared/args.js.map +1 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/logging.d.ts +3 -0
- package/dist/shared/logging.d.ts.map +1 -0
- package/dist/shared/logging.js +8 -0
- package/dist/shared/logging.js.map +1 -0
- package/dist/shared/package.d.ts +2 -0
- package/dist/shared/package.d.ts.map +1 -0
- package/dist/shared/package.js +2 -0
- package/dist/shared/package.js.map +1 -0
- package/dist/shared/time.d.ts +2 -0
- package/dist/shared/time.d.ts.map +1 -0
- package/dist/shared/time.js +4 -0
- package/dist/shared/time.js.map +1 -0
- package/dist/{types.d.ts → shared/types.d.ts} +6 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/shared/ui.d.ts +7 -0
- package/dist/shared/ui.d.ts.map +1 -0
- package/dist/shared/ui.js +25 -0
- package/dist/shared/ui.js.map +1 -0
- package/package.json +11 -6
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/process.d.ts.map +0 -1
- package/dist/process.js.map +0 -1
- package/dist/prompts.d.ts +0 -4
- package/dist/prompts.d.ts.map +0 -1
- package/dist/prompts.js +0 -115
- package/dist/prompts.js.map +0 -1
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{constants.d.ts → shared/constants.d.ts} +0 -0
- /package/dist/{constants.js → shared/constants.js} +0 -0
- /package/dist/{types.js → shared/types.js} +0 -0
package/README.md
CHANGED
|
@@ -1,16 +1,39 @@
|
|
|
1
1
|
# @syedar/seedar-cli
|
|
2
2
|
|
|
3
|
-
Seedar
|
|
3
|
+
Seedar ????????????
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## ??
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
8
|
npx @syedar/seedar-cli@latest install
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
??????
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
14
|
npm install -g @syedar/seedar-cli
|
|
15
15
|
seedar status
|
|
16
16
|
```
|
|
17
|
+
|
|
18
|
+
## ????
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# ????
|
|
22
|
+
seedar install
|
|
23
|
+
|
|
24
|
+
# ?? / ??????
|
|
25
|
+
seedar start
|
|
26
|
+
seedar stop
|
|
27
|
+
|
|
28
|
+
# ???????
|
|
29
|
+
seedar status
|
|
30
|
+
seedar logs --follow
|
|
31
|
+
|
|
32
|
+
# ??????????? / ??????? data
|
|
33
|
+
seedar uninstall --remove-data --force
|
|
34
|
+
|
|
35
|
+
# ?????????????? CLI
|
|
36
|
+
seedar uninstall --all --force
|
|
37
|
+
# ?
|
|
38
|
+
seedar remove --force
|
|
39
|
+
```
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AASA,wBAAsB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0C3D"}
|
package/dist/cli.js
CHANGED
|
@@ -1,537 +1,35 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
return await new Promise((resolve) => {
|
|
10
|
-
const server = net.createServer();
|
|
11
|
-
server.unref();
|
|
12
|
-
server.on("error", () => resolve(false));
|
|
13
|
-
server.listen(port, "0.0.0.0", () => {
|
|
14
|
-
server.close(() => resolve(true));
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
function parseArgs(rawArgs) {
|
|
19
|
-
const flags = {
|
|
20
|
-
yes: false,
|
|
21
|
-
force: false,
|
|
22
|
-
follow: false,
|
|
23
|
-
removeData: false,
|
|
24
|
-
};
|
|
25
|
-
const positional = [];
|
|
26
|
-
for (const arg of rawArgs) {
|
|
27
|
-
if (arg === "--yes" || arg === "-y") {
|
|
28
|
-
flags.yes = true;
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
if (arg === "--force") {
|
|
32
|
-
flags.force = true;
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
if (arg === "--follow" || arg === "-f") {
|
|
36
|
-
flags.follow = true;
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
if (arg === "--remove-data") {
|
|
40
|
-
flags.removeData = true;
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
positional.push(arg);
|
|
44
|
-
}
|
|
45
|
-
const [command = "help", ...rest] = positional;
|
|
46
|
-
return {
|
|
47
|
-
command,
|
|
48
|
-
positional: rest,
|
|
49
|
-
flags,
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
async function writeCliLog(layout, message) {
|
|
53
|
-
const line = `[${new Date().toISOString()}] ${message}\n`;
|
|
54
|
-
await mkdir(layout.logsDir, { recursive: true });
|
|
55
|
-
await appendFile(path.join(layout.logsDir, "cli.log"), line, "utf8");
|
|
56
|
-
}
|
|
57
|
-
async function requireRuntimeConfig(layout) {
|
|
58
|
-
if (!(await hasRuntimeConfig(layout))) {
|
|
59
|
-
throw new Error(`未检测到运行时配置,请先执行 seedar install。安装目录: ${layout.installRoot}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async function ensurePrerequisites() {
|
|
63
|
-
const major = Number(process.versions.node.split(".")[0]);
|
|
64
|
-
if (major < MIN_NODE_MAJOR) {
|
|
65
|
-
throw new Error(`Node.js 版本过低,当前 ${process.version},需要 >= ${MIN_NODE_MAJOR}`);
|
|
66
|
-
}
|
|
67
|
-
await runCommandOrThrow("docker", ["--version"]);
|
|
68
|
-
await runCommandOrThrow("docker", ["compose", "version"]);
|
|
69
|
-
await runCommandOrThrow("docker", ["info"]);
|
|
70
|
-
}
|
|
71
|
-
async function wait(ms) {
|
|
72
|
-
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
73
|
-
}
|
|
74
|
-
async function getServiceContainerId(layout, service) {
|
|
75
|
-
const result = await runDockerCompose(layout, ["ps", "-q", service]);
|
|
76
|
-
const id = result.stdout.trim();
|
|
77
|
-
return id || null;
|
|
78
|
-
}
|
|
79
|
-
async function waitForServiceHealthy(layout, service, timeoutMs = 120_000) {
|
|
80
|
-
const startedAt = Date.now();
|
|
81
|
-
while (Date.now() - startedAt < timeoutMs) {
|
|
82
|
-
const containerId = await getServiceContainerId(layout, service);
|
|
83
|
-
if (!containerId) {
|
|
84
|
-
await wait(2_000);
|
|
85
|
-
continue;
|
|
86
|
-
}
|
|
87
|
-
const inspectResult = await runCommand("docker", [
|
|
88
|
-
"inspect",
|
|
89
|
-
"--format",
|
|
90
|
-
"{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}",
|
|
91
|
-
containerId,
|
|
92
|
-
]);
|
|
93
|
-
const state = inspectResult.stdout.trim();
|
|
94
|
-
if (state === "healthy" || state === "running") {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
if (state === "unhealthy" || state === "exited") {
|
|
98
|
-
throw new Error(`${service} 服务状态异常: ${state}`);
|
|
99
|
-
}
|
|
100
|
-
await wait(3_000);
|
|
101
|
-
}
|
|
102
|
-
throw new Error(`等待 ${service} 服务健康检查超时`);
|
|
103
|
-
}
|
|
104
|
-
function printInstallSummary(layout, env) {
|
|
105
|
-
console.log("Seedar 安装完成。");
|
|
106
|
-
console.log(`安装目录: ${layout.installRoot}`);
|
|
107
|
-
console.log(`Web: http://localhost:${env.WEB_PORT}`);
|
|
108
|
-
console.log(`Server: http://localhost:${env.SERVER_PORT}`);
|
|
109
|
-
console.log(`MySQL: localhost:${env.MYSQL_PORT}`);
|
|
110
|
-
console.log(`版本: ${env.SEEDAR_VERSION}`);
|
|
111
|
-
}
|
|
112
|
-
async function runInstallFlow(layout, env) {
|
|
113
|
-
await writeCliLog(layout, `开始安装,目标版本 ${env.SEEDAR_VERSION}`);
|
|
114
|
-
await runDockerComposeOrThrow(layout, ["pull", "mysql", "server", "web"], {
|
|
115
|
-
stdio: "inherit",
|
|
116
|
-
});
|
|
117
|
-
await runDockerComposeOrThrow(layout, ["up", "-d", "mysql"], {
|
|
118
|
-
stdio: "inherit",
|
|
119
|
-
});
|
|
120
|
-
await waitForServiceHealthy(layout, "mysql");
|
|
121
|
-
await runDockerComposeOrThrow(layout, ["run", "--rm", "migrate"], {
|
|
122
|
-
stdio: "inherit",
|
|
123
|
-
});
|
|
124
|
-
await runDockerComposeOrThrow(layout, ["up", "-d", "server", "web"], {
|
|
125
|
-
stdio: "inherit",
|
|
126
|
-
});
|
|
127
|
-
await writeCliLog(layout, `安装完成,版本 ${env.SEEDAR_VERSION}`);
|
|
128
|
-
}
|
|
129
|
-
async function parseComposePsOutput(layout) {
|
|
130
|
-
const result = await runDockerCompose(layout, ["ps", "--all", "--format", "json"]);
|
|
131
|
-
const raw = result.stdout.trim();
|
|
132
|
-
if (!raw) {
|
|
133
|
-
return [];
|
|
134
|
-
}
|
|
135
|
-
try {
|
|
136
|
-
const parsed = JSON.parse(raw);
|
|
137
|
-
return Array.isArray(parsed) ? parsed : [];
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
return raw
|
|
141
|
-
.split(/\r?\n/)
|
|
142
|
-
.filter(Boolean)
|
|
143
|
-
.map((line) => JSON.parse(line));
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
function getPublishersFromServices(services) {
|
|
147
|
-
const ports = new Set();
|
|
148
|
-
for (const service of services) {
|
|
149
|
-
const publishers = service.Publishers;
|
|
150
|
-
if (!Array.isArray(publishers)) {
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
for (const publisher of publishers) {
|
|
154
|
-
if (publisher &&
|
|
155
|
-
typeof publisher === "object" &&
|
|
156
|
-
"PublishedPort" in publisher &&
|
|
157
|
-
typeof publisher.PublishedPort === "number") {
|
|
158
|
-
ports.add(String(publisher.PublishedPort));
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return ports;
|
|
163
|
-
}
|
|
164
|
-
async function getDiskFreeBytes(targetPath) {
|
|
165
|
-
if (process.platform === "win32") {
|
|
166
|
-
const root = path.parse(path.resolve(targetPath)).root.replace(/\\$/, "");
|
|
167
|
-
const result = await runCommand("powershell", [
|
|
168
|
-
"-NoProfile",
|
|
169
|
-
"-Command",
|
|
170
|
-
`(Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='${root}'").FreeSpace`,
|
|
171
|
-
], { shell: false });
|
|
172
|
-
const value = Number(result.stdout.trim());
|
|
173
|
-
return Number.isFinite(value) ? value : null;
|
|
174
|
-
}
|
|
175
|
-
const result = await runCommand("df", ["-Pk", targetPath]);
|
|
176
|
-
const lines = result.stdout.trim().split(/\r?\n/);
|
|
177
|
-
if (lines.length < 2) {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
const parts = lines[1].trim().split(/\s+/);
|
|
181
|
-
const availableKb = Number(parts[3]);
|
|
182
|
-
if (!Number.isFinite(availableKb)) {
|
|
183
|
-
return null;
|
|
184
|
-
}
|
|
185
|
-
return availableKb * 1024;
|
|
186
|
-
}
|
|
187
|
-
async function collectDoctorChecks(layout) {
|
|
188
|
-
const checks = [];
|
|
189
|
-
const nodeMajor = Number(process.versions.node.split(".")[0]);
|
|
190
|
-
checks.push({
|
|
191
|
-
code: "D001",
|
|
192
|
-
status: nodeMajor >= MIN_NODE_MAJOR ? "ok" : "fail",
|
|
193
|
-
title: "Node.js 版本",
|
|
194
|
-
detail: nodeMajor >= MIN_NODE_MAJOR
|
|
195
|
-
? `当前 ${process.version}`
|
|
196
|
-
: `当前 ${process.version},需要 >= ${MIN_NODE_MAJOR}`,
|
|
197
|
-
});
|
|
198
|
-
const dockerVersion = await runCommand("docker", ["--version"]);
|
|
199
|
-
checks.push({
|
|
200
|
-
code: "D002",
|
|
201
|
-
status: dockerVersion.code === 0 ? "ok" : "fail",
|
|
202
|
-
title: "Docker CLI",
|
|
203
|
-
detail: dockerVersion.code === 0
|
|
204
|
-
? dockerVersion.stdout.trim()
|
|
205
|
-
: dockerVersion.stderr.trim() || "无法执行 docker --version",
|
|
206
|
-
});
|
|
207
|
-
const dockerInfo = await runCommand("docker", ["info"]);
|
|
208
|
-
checks.push({
|
|
209
|
-
code: "D003",
|
|
210
|
-
status: dockerInfo.code === 0 ? "ok" : "fail",
|
|
211
|
-
title: "Docker Daemon",
|
|
212
|
-
detail: dockerInfo.code === 0
|
|
213
|
-
? "Docker daemon 可用"
|
|
214
|
-
: dockerInfo.stderr.trim() || "无法连接 Docker daemon",
|
|
215
|
-
});
|
|
216
|
-
const composeVersion = await runCommand("docker", ["compose", "version"]);
|
|
217
|
-
checks.push({
|
|
218
|
-
code: "D004",
|
|
219
|
-
status: composeVersion.code === 0 ? "ok" : "fail",
|
|
220
|
-
title: "Docker Compose",
|
|
221
|
-
detail: composeVersion.code === 0
|
|
222
|
-
? composeVersion.stdout.trim()
|
|
223
|
-
: composeVersion.stderr.trim() || "无法执行 docker compose version",
|
|
224
|
-
});
|
|
225
|
-
const installRootParent = path.dirname(layout.installRoot);
|
|
226
|
-
try {
|
|
227
|
-
await access(installRootParent);
|
|
228
|
-
checks.push({
|
|
229
|
-
code: "D005",
|
|
230
|
-
status: "ok",
|
|
231
|
-
title: "安装目录访问",
|
|
232
|
-
detail: `可访问 ${installRootParent}`,
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
catch (error) {
|
|
236
|
-
checks.push({
|
|
237
|
-
code: "D005",
|
|
238
|
-
status: "fail",
|
|
239
|
-
title: "安装目录访问",
|
|
240
|
-
detail: error instanceof Error ? error.message : "无法访问安装目录父级路径",
|
|
241
|
-
});
|
|
242
|
-
}
|
|
243
|
-
const diskFree = await getDiskFreeBytes(layout.installRoot);
|
|
244
|
-
if (diskFree === null) {
|
|
245
|
-
checks.push({
|
|
246
|
-
code: "D006",
|
|
247
|
-
status: "warn",
|
|
248
|
-
title: "磁盘剩余空间",
|
|
249
|
-
detail: "无法识别磁盘剩余空间",
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
const diskFreeGb = (diskFree / 1024 / 1024 / 1024).toFixed(2);
|
|
254
|
-
checks.push({
|
|
255
|
-
code: "D006",
|
|
256
|
-
status: diskFree >= 2 * 1024 * 1024 * 1024 ? "ok" : "warn",
|
|
257
|
-
title: "磁盘剩余空间",
|
|
258
|
-
detail: `${diskFreeGb} GB`,
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
const hasConfig = await hasRuntimeConfig(layout);
|
|
262
|
-
if (!hasConfig) {
|
|
263
|
-
const defaultPorts = [
|
|
264
|
-
["D009", "3306"],
|
|
265
|
-
["D010", "8090"],
|
|
266
|
-
["D011", "8080"],
|
|
267
|
-
];
|
|
268
|
-
for (const [code, port] of defaultPorts) {
|
|
269
|
-
const available = await isPortAvailable(Number(port));
|
|
270
|
-
checks.push({
|
|
271
|
-
code,
|
|
272
|
-
status: available ? "ok" : "warn",
|
|
273
|
-
title: `默认端口 ${port}`,
|
|
274
|
-
detail: available ? "端口当前可用" : "端口已被占用,安装时需要改配",
|
|
275
|
-
});
|
|
276
|
-
}
|
|
277
|
-
return checks;
|
|
278
|
-
}
|
|
279
|
-
let envConfig = null;
|
|
280
|
-
try {
|
|
281
|
-
envConfig = await readEnvConfig(layout);
|
|
282
|
-
checks.push({
|
|
283
|
-
code: "D007",
|
|
284
|
-
status: "ok",
|
|
285
|
-
title: "运行时配置",
|
|
286
|
-
detail: `已检测到 ${REQUIRED_ENV_KEYS.length} 个必填字段`,
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
checks.push({
|
|
291
|
-
code: "D007",
|
|
292
|
-
status: "fail",
|
|
293
|
-
title: "运行时配置",
|
|
294
|
-
detail: error instanceof Error ? error.message : "运行时配置损坏",
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
if (!envConfig) {
|
|
298
|
-
return checks;
|
|
299
|
-
}
|
|
300
|
-
const composeConfig = await runDockerCompose(layout, ["config", "-q"]);
|
|
301
|
-
checks.push({
|
|
302
|
-
code: "D008",
|
|
303
|
-
status: composeConfig.code === 0 ? "ok" : "fail",
|
|
304
|
-
title: "Compose 配置",
|
|
305
|
-
detail: composeConfig.code === 0
|
|
306
|
-
? "docker compose config 校验通过"
|
|
307
|
-
: composeConfig.stderr.trim() || "docker compose config 校验失败",
|
|
308
|
-
});
|
|
309
|
-
const services = await parseComposePsOutput(layout);
|
|
310
|
-
const publishedPorts = getPublishersFromServices(services);
|
|
311
|
-
const envPorts = [envConfig.MYSQL_PORT, envConfig.SERVER_PORT, envConfig.WEB_PORT];
|
|
312
|
-
for (const [index, port] of envPorts.entries()) {
|
|
313
|
-
const inUseByCurrentProject = publishedPorts.has(port);
|
|
314
|
-
const available = await isPortAvailable(Number(port));
|
|
315
|
-
const status = inUseByCurrentProject || available ? "ok" : "warn";
|
|
316
|
-
checks.push({
|
|
317
|
-
code: `D01${index}`,
|
|
318
|
-
status,
|
|
319
|
-
title: `端口 ${port}`,
|
|
320
|
-
detail: inUseByCurrentProject
|
|
321
|
-
? "端口已由当前 Seedar 安装占用"
|
|
322
|
-
: available
|
|
323
|
-
? "端口配置可用"
|
|
324
|
-
: "端口已被其他进程占用",
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
const serverImage = `${DEFAULT_SERVER_IMAGE}:${envConfig.SEEDAR_VERSION}`;
|
|
328
|
-
const webImage = `${DEFAULT_WEB_IMAGE}:${envConfig.SEEDAR_VERSION}`;
|
|
329
|
-
for (const [index, image] of [serverImage, webImage].entries()) {
|
|
330
|
-
const manifest = await runCommand("docker", ["manifest", "inspect", image]);
|
|
331
|
-
checks.push({
|
|
332
|
-
code: `D02${index}`,
|
|
333
|
-
status: manifest.code === 0 ? "ok" : "fail",
|
|
334
|
-
title: `镜像可访问性 ${image}`,
|
|
335
|
-
detail: manifest.code === 0
|
|
336
|
-
? "镜像清单可访问"
|
|
337
|
-
: manifest.stderr.trim() || "无法访问镜像清单,请检查 DockerHub 凭证或镜像发布状态",
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
return checks;
|
|
341
|
-
}
|
|
342
|
-
async function installCommand(versionArg, flags) {
|
|
343
|
-
const layout = getRuntimeLayout();
|
|
344
|
-
await ensurePrerequisites();
|
|
345
|
-
const state = await readInstallState(layout);
|
|
346
|
-
const hasConfig = await hasRuntimeConfig(layout);
|
|
347
|
-
if (state === "installed" && hasConfig) {
|
|
348
|
-
throw new Error(`检测到现有安装目录 ${layout.installRoot}。如需升级请使用 seedar update。`);
|
|
349
|
-
}
|
|
350
|
-
let env;
|
|
351
|
-
if (state === "uninstalled" && hasConfig) {
|
|
352
|
-
env = await readEnvConfig(layout);
|
|
353
|
-
env.SEEDAR_VERSION = versionArg ?? env.SEEDAR_VERSION;
|
|
354
|
-
await ensurePortsAvailable(env);
|
|
355
|
-
await writeCliLog(layout, `复用已有配置重新安装,目标版本 ${env.SEEDAR_VERSION}`);
|
|
356
|
-
}
|
|
357
|
-
else {
|
|
358
|
-
env = await collectInstallConfig(layout, versionArg, flags);
|
|
359
|
-
await ensurePortsAvailable(env);
|
|
360
|
-
}
|
|
361
|
-
await writeRuntimeFiles(layout, env);
|
|
362
|
-
await runInstallFlow(layout, env);
|
|
363
|
-
await writeInstalledVersion(layout, env.SEEDAR_VERSION);
|
|
364
|
-
await writeInstallState(layout, "installed");
|
|
365
|
-
printInstallSummary(layout, env);
|
|
366
|
-
}
|
|
367
|
-
async function updateCommand(versionArg) {
|
|
368
|
-
const layout = getRuntimeLayout();
|
|
369
|
-
await ensurePrerequisites();
|
|
370
|
-
await requireRuntimeConfig(layout);
|
|
371
|
-
const currentEnv = await readEnvConfig(layout);
|
|
372
|
-
const currentVersion = await readInstalledVersion(layout);
|
|
373
|
-
const nextVersion = versionArg ?? DEFAULT_VERSION;
|
|
374
|
-
const backupDir = await backupRuntime(layout);
|
|
375
|
-
const nextEnv = {
|
|
376
|
-
...currentEnv,
|
|
377
|
-
SEEDAR_VERSION: nextVersion,
|
|
378
|
-
};
|
|
379
|
-
await writeRuntimeFiles(layout, nextEnv);
|
|
380
|
-
try {
|
|
381
|
-
await writeCliLog(layout, `开始升级,当前版本 ${currentVersion ?? "unknown"} -> ${nextVersion}`);
|
|
382
|
-
await runDockerComposeOrThrow(layout, ["pull", "mysql", "server", "web"], {
|
|
383
|
-
stdio: "inherit",
|
|
384
|
-
});
|
|
385
|
-
await runDockerComposeOrThrow(layout, ["up", "-d", "mysql"], {
|
|
386
|
-
stdio: "inherit",
|
|
387
|
-
});
|
|
388
|
-
await waitForServiceHealthy(layout, "mysql");
|
|
389
|
-
await runDockerComposeOrThrow(layout, ["run", "--rm", "migrate"], {
|
|
390
|
-
stdio: "inherit",
|
|
391
|
-
});
|
|
392
|
-
await runDockerComposeOrThrow(layout, ["up", "-d", "server", "web"], {
|
|
393
|
-
stdio: "inherit",
|
|
394
|
-
});
|
|
395
|
-
await writeInstalledVersion(layout, nextVersion);
|
|
396
|
-
await writeInstallState(layout, "installed");
|
|
397
|
-
await writeCliLog(layout, `升级完成,版本 ${nextVersion}`);
|
|
398
|
-
console.log(`Seedar 已升级到 ${nextVersion}`);
|
|
399
|
-
console.log(`备份目录: ${backupDir}`);
|
|
400
|
-
}
|
|
401
|
-
catch (error) {
|
|
402
|
-
await restoreRuntimeFromBackup(layout, backupDir);
|
|
403
|
-
await writeCliLog(layout, `升级失败,已恢复运行时配置。备份目录 ${backupDir}`);
|
|
404
|
-
throw new Error(`升级失败,已恢复运行时配置。备份目录: ${backupDir}\n${error instanceof Error ? error.message : "未知错误"}`);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
async function uninstallCommand(flags) {
|
|
408
|
-
const layout = getRuntimeLayout();
|
|
409
|
-
await ensurePrerequisites();
|
|
410
|
-
await requireRuntimeConfig(layout);
|
|
411
|
-
await writeCliLog(layout, "开始卸载");
|
|
412
|
-
await runDockerComposeOrThrow(layout, ["down", "--remove-orphans"], {
|
|
413
|
-
stdio: "inherit",
|
|
414
|
-
});
|
|
415
|
-
if (flags.removeData) {
|
|
416
|
-
if (!flags.force && process.stdin.isTTY) {
|
|
417
|
-
console.log("检测到 --remove-data,将删除本地数据目录。若需跳过确认,请附带 --force。");
|
|
418
|
-
throw new Error("请确认后重新执行: seedar uninstall --remove-data --force");
|
|
419
|
-
}
|
|
420
|
-
const resolvedDataPath = path.resolve(layout.dataDir);
|
|
421
|
-
const installRoot = path.resolve(layout.installRoot);
|
|
422
|
-
if (!resolvedDataPath.startsWith(installRoot)) {
|
|
423
|
-
throw new Error(`拒绝删除 installRoot 之外的路径: ${resolvedDataPath}`);
|
|
424
|
-
}
|
|
425
|
-
await rm(layout.dataDir, { recursive: true, force: true });
|
|
426
|
-
await writeCliLog(layout, `已删除数据目录 ${layout.dataDir}`);
|
|
427
|
-
}
|
|
428
|
-
await writeInstallState(layout, "uninstalled");
|
|
429
|
-
await writeCliLog(layout, "卸载完成");
|
|
430
|
-
console.log("Seedar 已卸载。");
|
|
431
|
-
console.log(`配置保留在: ${layout.runtimeDir}`);
|
|
432
|
-
console.log(`备份保留在: ${layout.backupsDir}`);
|
|
433
|
-
if (!flags.removeData) {
|
|
434
|
-
console.log(`数据保留在: ${layout.dataDir}`);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
async function statusCommand() {
|
|
438
|
-
const layout = getRuntimeLayout();
|
|
439
|
-
const hasConfig = await hasRuntimeConfig(layout);
|
|
440
|
-
if (!hasConfig) {
|
|
441
|
-
console.log(`未检测到 Seedar 安装。预期目录: ${layout.installRoot}`);
|
|
442
|
-
return;
|
|
443
|
-
}
|
|
444
|
-
const env = await readEnvConfig(layout);
|
|
445
|
-
const state = await readInstallState(layout);
|
|
446
|
-
const version = await readInstalledVersion(layout);
|
|
447
|
-
const services = await parseComposePsOutput(layout);
|
|
448
|
-
console.log(`安装目录: ${layout.installRoot}`);
|
|
449
|
-
console.log(`状态: ${state}`);
|
|
450
|
-
console.log(`目标版本: ${version ?? env.SEEDAR_VERSION}`);
|
|
451
|
-
console.log(`Web: http://localhost:${env.WEB_PORT}`);
|
|
452
|
-
console.log(`Server: http://localhost:${env.SERVER_PORT}`);
|
|
453
|
-
console.log(`MySQL: localhost:${env.MYSQL_PORT}`);
|
|
454
|
-
if (services.length === 0) {
|
|
455
|
-
console.log("当前没有运行中的容器。");
|
|
456
|
-
return;
|
|
457
|
-
}
|
|
458
|
-
console.log("");
|
|
459
|
-
console.log("容器状态:");
|
|
460
|
-
for (const service of services) {
|
|
461
|
-
const serviceName = String(service.Service ?? service.Name ?? "unknown");
|
|
462
|
-
const status = String(service.State ?? "unknown");
|
|
463
|
-
const health = service.Health ? `, health=${String(service.Health)}` : "";
|
|
464
|
-
const publishers = Array.isArray(service.Publishers)
|
|
465
|
-
? service.Publishers.map((item) => {
|
|
466
|
-
if (item &&
|
|
467
|
-
typeof item === "object" &&
|
|
468
|
-
"PublishedPort" in item &&
|
|
469
|
-
"TargetPort" in item) {
|
|
470
|
-
return `${String(item.PublishedPort)}->${String(item.TargetPort)}`;
|
|
471
|
-
}
|
|
472
|
-
return null;
|
|
473
|
-
})
|
|
474
|
-
.filter(Boolean)
|
|
475
|
-
.join(", ")
|
|
476
|
-
: "";
|
|
477
|
-
const ports = publishers ? `, ports=${publishers}` : "";
|
|
478
|
-
console.log(`- ${serviceName}: ${status}${health}${ports}`);
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
async function logsCommand(serviceArg, flags) {
|
|
482
|
-
const layout = getRuntimeLayout();
|
|
483
|
-
await requireRuntimeConfig(layout);
|
|
484
|
-
if (serviceArg && !VALID_SERVICES.includes(serviceArg)) {
|
|
485
|
-
throw new Error(`未知服务 ${serviceArg},可选值: ${VALID_SERVICES.join(", ")}`);
|
|
486
|
-
}
|
|
487
|
-
const args = ["logs", "--tail", "200"];
|
|
488
|
-
if (flags.follow) {
|
|
489
|
-
args.push("--follow");
|
|
490
|
-
}
|
|
491
|
-
if (serviceArg) {
|
|
492
|
-
args.push(serviceArg);
|
|
493
|
-
}
|
|
494
|
-
await runDockerComposeOrThrow(layout, args, { stdio: "inherit" });
|
|
495
|
-
}
|
|
496
|
-
async function doctorCommand() {
|
|
497
|
-
const layout = getRuntimeLayout();
|
|
498
|
-
const checks = await collectDoctorChecks(layout);
|
|
499
|
-
let failed = false;
|
|
500
|
-
for (const check of checks) {
|
|
501
|
-
const prefix = check.status === "ok" ? "OK" : check.status === "warn" ? "WARN" : "FAIL";
|
|
502
|
-
console.log(`[${prefix} ${check.code}] ${check.title}: ${check.detail}`);
|
|
503
|
-
if (check.status === "fail") {
|
|
504
|
-
failed = true;
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
if (failed) {
|
|
508
|
-
process.exitCode = 1;
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
function printHelp() {
|
|
512
|
-
console.log(`Seedar CLI
|
|
513
|
-
|
|
514
|
-
用法:
|
|
515
|
-
seedar install [version]
|
|
516
|
-
seedar update [version]
|
|
517
|
-
seedar uninstall [--remove-data] [--force]
|
|
518
|
-
seedar status
|
|
519
|
-
seedar logs [mysql|server|web|migrate] [--follow]
|
|
520
|
-
seedar doctor
|
|
521
|
-
`);
|
|
522
|
-
}
|
|
1
|
+
import { parseArgs } from "./shared/args.js";
|
|
2
|
+
import { doctorCommand } from "./commands/doctor.js";
|
|
3
|
+
import { printHelp } from "./commands/help.js";
|
|
4
|
+
import { installCommand } from "./commands/install.js";
|
|
5
|
+
import { startCommand, stopCommand, updateCommand } from "./commands/lifecycle.js";
|
|
6
|
+
import { logsCommand } from "./commands/logs.js";
|
|
7
|
+
import { purgeCommand, removeAllCommand, uninstallCommand } from "./commands/uninstall.js";
|
|
8
|
+
import { statusCommand } from "./commands/status.js";
|
|
523
9
|
export async function main(rawArgs) {
|
|
524
10
|
const parsed = parseArgs(rawArgs);
|
|
525
11
|
switch (parsed.command) {
|
|
526
12
|
case "install":
|
|
527
13
|
await installCommand(parsed.positional[0], parsed.flags);
|
|
528
14
|
return;
|
|
15
|
+
case "start":
|
|
16
|
+
await startCommand();
|
|
17
|
+
return;
|
|
18
|
+
case "stop":
|
|
19
|
+
await stopCommand();
|
|
20
|
+
return;
|
|
529
21
|
case "update":
|
|
530
22
|
await updateCommand(parsed.positional[0]);
|
|
531
23
|
return;
|
|
532
24
|
case "uninstall":
|
|
533
25
|
await uninstallCommand(parsed.flags);
|
|
534
26
|
return;
|
|
27
|
+
case "remove":
|
|
28
|
+
await removeAllCommand(parsed.flags);
|
|
29
|
+
return;
|
|
30
|
+
case "purge":
|
|
31
|
+
await purgeCommand(parsed.flags);
|
|
32
|
+
return;
|
|
535
33
|
case "status":
|
|
536
34
|
await statusCommand();
|
|
537
35
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAiB;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAElC,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,SAAS;YACZ,MAAM,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;QACT,KAAK,OAAO;YACV,MAAM,YAAY,EAAE,CAAC;YACrB,OAAO;QACT,KAAK,MAAM;YACT,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,KAAK,WAAW;YACd,MAAM,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACrC,OAAO;QACT,KAAK,OAAO;YACV,MAAM,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,EAAE,CAAC;YACtB,OAAO;QACT,KAAK,MAAM;YACT,MAAM,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACtD,OAAO;QACT,KAAK,QAAQ;YACX,MAAM,aAAa,EAAE,CAAC;YACtB,OAAO;QACT,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,SAAS,EAAE,CAAC;YACZ,OAAO;QACT;YACE,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;IACnE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBnD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { collectDoctorChecks } from "./status.js";
|
|
2
|
+
import { getRuntimeLayout } from "../runtime/index.js";
|
|
3
|
+
export async function doctorCommand() {
|
|
4
|
+
const layout = getRuntimeLayout();
|
|
5
|
+
const checks = await collectDoctorChecks(layout);
|
|
6
|
+
let failed = false;
|
|
7
|
+
for (const check of checks) {
|
|
8
|
+
const prefix = check.status === "ok" ? "OK" : check.status === "warn" ? "WARN" : "FAIL";
|
|
9
|
+
console.log(`[${prefix} ${check.code}] ${check.title}: ${check.detail}`);
|
|
10
|
+
if (check.status === "fail") {
|
|
11
|
+
failed = true;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
if (failed) {
|
|
15
|
+
process.exitCode = 1;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=doctor.js.map
|