@aaricchen1991/n2-cli 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -13,8 +13,11 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
13
13
  const pkg = require(join(__dirname, "..", "package.json"));
14
14
  import { runConfigDelete, runConfigGet, runConfigInit, runConfigList, runConfigSet, } from "./commands/config.js";
15
15
  import { runInit } from "./commands/init.js";
16
+ import { runLogin } from "./commands/login.js";
16
17
  import { runNginx } from "./commands/nginx.js";
18
+ import { readSshKeyFromFile, runServerAdd, runServerDelete, runServerList, runServerShow, runServerUpdate, } from "./commands/servers.js";
17
19
  import { runSslLogs } from "./commands/ssl-logs.js";
20
+ import { runSsh } from "./commands/ssh.js";
18
21
  import { runSsl } from "./commands/ssl.js";
19
22
  import { getDefaultConfigPath } from "./lib/paths.js";
20
23
  const defaultConfig = getDefaultConfigPath();
@@ -109,6 +112,25 @@ configCmd
109
112
  process.exit(1);
110
113
  }
111
114
  });
115
+ program
116
+ .command("login")
117
+ .description("登录 n2-devops 服务器,保存 access token 至 ~/.n2-server/credentials.json")
118
+ .option("--server-url <url>", "服务器地址(默认 N2_SERVER_URL 或 http://localhost:20000)")
119
+ .option("-u, --username <name>", "用户名")
120
+ .option("-p, --password <pwd>", "密码(不传则交互输入,不回显)")
121
+ .action(async (opts) => {
122
+ try {
123
+ await runLogin({
124
+ serverUrl: opts.serverUrl,
125
+ username: opts.username,
126
+ password: opts.password,
127
+ });
128
+ }
129
+ catch (e) {
130
+ consola.error(e);
131
+ process.exit(1);
132
+ }
133
+ });
112
134
  program
113
135
  .command("init")
114
136
  .description("初始化服务器(幂等):nginx、目录、deploy.sh、占位证书")
@@ -165,6 +187,104 @@ program
165
187
  process.exit(1);
166
188
  }
167
189
  });
190
+ const serverCmd = program
191
+ .command("server")
192
+ .description("服务器管理(CRUD,需已登录 n2-server.cdqxtech.com)");
193
+ serverCmd
194
+ .command("list")
195
+ .description("列出当前账户的服务器")
196
+ .action(async () => {
197
+ try {
198
+ await runServerList();
199
+ }
200
+ catch (e) {
201
+ consola.error(e);
202
+ process.exit(1);
203
+ }
204
+ });
205
+ serverCmd
206
+ .command("add")
207
+ .description("添加服务器")
208
+ .requiredOption("-n, --name <name>", "服务器名称(别名)")
209
+ .requiredOption("--ip <ip>", "IP 地址")
210
+ .requiredOption("-u, --username <user>", "SSH 用户名")
211
+ .requiredOption("--ssh-key <path>", "SSH 私钥文件路径")
212
+ .action(async (opts) => {
213
+ try {
214
+ const sshKey = readSshKeyFromFile(opts.sshKey);
215
+ await runServerAdd({
216
+ name: opts.name,
217
+ ip: opts.ip,
218
+ username: opts.username,
219
+ sshKey,
220
+ });
221
+ }
222
+ catch (e) {
223
+ consola.error(e);
224
+ process.exit(1);
225
+ }
226
+ });
227
+ serverCmd
228
+ .command("show <id>")
229
+ .description("查看单个服务器详情")
230
+ .action(async (id) => {
231
+ try {
232
+ await runServerShow(id);
233
+ }
234
+ catch (e) {
235
+ consola.error(e);
236
+ process.exit(1);
237
+ }
238
+ });
239
+ serverCmd
240
+ .command("update <id>")
241
+ .description("更新服务器(可只传要改的字段)")
242
+ .option("-n, --name <name>", "服务器名称(别名)")
243
+ .option("--ip <ip>", "IP 地址")
244
+ .option("-u, --username <user>", "SSH 用户名")
245
+ .option("--ssh-key <path>", "SSH 私钥文件路径")
246
+ .action(async (id, opts) => {
247
+ try {
248
+ const updateOpts = {};
249
+ if (opts.name !== undefined)
250
+ updateOpts.name = opts.name;
251
+ if (opts.ip !== undefined)
252
+ updateOpts.ip = opts.ip;
253
+ if (opts.username !== undefined)
254
+ updateOpts.username = opts.username;
255
+ if (opts.sshKey !== undefined)
256
+ updateOpts.sshKey = readSshKeyFromFile(opts.sshKey);
257
+ await runServerUpdate(id, updateOpts);
258
+ }
259
+ catch (e) {
260
+ consola.error(e);
261
+ process.exit(1);
262
+ }
263
+ });
264
+ serverCmd
265
+ .command("delete <id>")
266
+ .description("删除服务器")
267
+ .action(async (id) => {
268
+ try {
269
+ await runServerDelete(id);
270
+ }
271
+ catch (e) {
272
+ consola.error(e);
273
+ process.exit(1);
274
+ }
275
+ });
276
+ program
277
+ .command("ssh <server-name>")
278
+ .description("通过服务器名称 SSH 登录(从 n2-server 获取配置并执行 ssh)")
279
+ .action(async (serverName) => {
280
+ try {
281
+ await runSsh(serverName);
282
+ }
283
+ catch (e) {
284
+ consola.error(e);
285
+ process.exit(1);
286
+ }
287
+ });
168
288
  program
169
289
  .command("ssl-logs")
170
290
  .description("View SSL log (create, renew, success, failure)")
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,CAAwB,CAAC;AAClF,OAAO,EACL,eAAe,EACf,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;AAC7C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CACV,sEAAsE,CACvE;KACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CACL,qBAAqB,EACrB,kCAAkC,EAClC,aAAa,CACd,CAAC;AAEJ,SAAS,iBAAiB,CAAC,GAG1B;IACC,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;IAC9C,OAAO,CACJ,QAAgC,CAAC,MAAM;QACvC,UAAkC,CAAC,MAAM;QAC1C,aAAa,CACd,CAAC;AACJ,CAAC;AAED,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,qBAAqB,EAAE,QAAQ,EAAE,aAAa,CAAC;KACtD,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC;KAC/B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACzD,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,SAAS,CAAC;KACtB,MAAM,CAAC,qBAAqB,EAAE,QAAQ,EAAE,aAAa,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC1B,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CACV,kFAAkF,CACnF;KACA,MAAM,CAAC,qBAAqB,EAAE,QAAQ,EAAE,aAAa,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/B,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CACV,8DAA8D,CAC/D;KACA,MAAM,CAAC,qBAAqB,EAAE,QAAQ,EAAE,aAAa,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IACvC,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,YAAY,CAAC;YACjB,MAAM,EAAE,UAAU;YAClB,GAAG;YACH,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;SAChE,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS;KACN,OAAO,CAAC,cAAc,CAAC;KACvB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,MAAM,CAAC,qBAAqB,EAAE,QAAQ,EAAE,aAAa,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC/B,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CACL,qBAAqB,EACrB,kCAAkC,EAClC,aAAa,CACd;KACA,MAAM,CACL,sBAAsB,EACtB,oDAAoD,CACrD;KACA,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CACV,0EAA0E,CAC3E;KACA,MAAM,CACL,qBAAqB,EACrB,wDAAwD,EACxD,aAAa,CACd;KACA,MAAM,CACL,qBAAqB,EACrB,8BAA8B,EAC9B,eAAe,CAChB;KACA,MAAM,CAAC,eAAe,EAAE,wCAAwC,CAAC;KACjE,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC;YACb,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CACV,qEAAqE,CACtE;KACA,MAAM,CACL,qBAAqB,EACrB,wDAAwD,EACxD,aAAa,CACd;KACA,MAAM,CACL,iBAAiB,EACjB,oDAAoD,CACrD;KACA,MAAM,CACL,uBAAuB,EACvB,4DAA4D,CAC7D;KACA,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,0BAA0B,CAAC;KAC5E,MAAM,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;KACxD,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC;YACX,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,0BAA0B,CAAC;KAC5E,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC1D,MAAM,CAAC,cAAc,EAAE,sBAAsB,CAAC;KAC9C,MAAM,CACL,mBAAmB,EACnB,4DAA4D,CAC7D;KACA,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;KAC1D,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,UAAU,CAAC;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE;YACrC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Login to n2-devops server; save access token to ~/.n2-server/credentials.json.
3
+ */
4
+ export interface LoginOptions {
5
+ serverUrl?: string;
6
+ username?: string;
7
+ password?: string;
8
+ }
9
+ export declare function runLogin(opts: LoginOptions): Promise<void>;
10
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoCD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAsEhE"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Login to n2-devops server; save access token to ~/.n2-server/credentials.json.
3
+ */
4
+ import readline from "node:readline";
5
+ import { getDefaultServerUrl } from "../lib/api.js";
6
+ import { getCredentialsPath, writeCredentials } from "../lib/credentials.js";
7
+ import { error, info, success } from "../lib/logger.js";
8
+ function promptPassword() {
9
+ return new Promise((resolve) => {
10
+ if (!process.stdin.isTTY) {
11
+ let line = "";
12
+ process.stdin.setEncoding("utf8");
13
+ process.stdin.on("data", (ch) => {
14
+ line += ch;
15
+ if (line.includes("\n") || line.includes("\r")) {
16
+ process.stdin.pause();
17
+ resolve(line.replace(/\r?\n.*/s, "").trim());
18
+ }
19
+ });
20
+ return;
21
+ }
22
+ const stdin = process.stdin;
23
+ const wasRaw = stdin.isRaw ?? false;
24
+ let buf = "";
25
+ const listener = (ch) => {
26
+ const c = ch.toString("utf8");
27
+ if (c === "\n" || c === "\r" || (c.length === 1 && c.charCodeAt(0) === 4)) {
28
+ stdin.removeListener("data", listener);
29
+ if (stdin.setRawMode)
30
+ stdin.setRawMode(wasRaw);
31
+ process.stdout.write("\n");
32
+ resolve(buf);
33
+ }
34
+ else {
35
+ buf += c;
36
+ }
37
+ };
38
+ if (stdin.setRawMode)
39
+ stdin.setRawMode(true);
40
+ stdin.resume();
41
+ stdin.on("data", listener);
42
+ });
43
+ }
44
+ export async function runLogin(opts) {
45
+ const serverUrl = (opts.serverUrl ?? process.env.N2_SERVER_URL ?? getDefaultServerUrl()).replace(/\/$/, "");
46
+ let username = opts.username;
47
+ let password = opts.password;
48
+ if (!username) {
49
+ info("请输入用户名");
50
+ const rl = readline.createInterface({
51
+ input: process.stdin,
52
+ output: process.stdout,
53
+ });
54
+ username = await new Promise((resolve) => {
55
+ rl.question("用户名: ", (answer) => {
56
+ rl.close();
57
+ resolve(answer.trim());
58
+ });
59
+ });
60
+ if (!username) {
61
+ error("用户名为空");
62
+ process.exit(1);
63
+ }
64
+ }
65
+ if (password === undefined) {
66
+ info("请输入密码(输入时不回显)");
67
+ process.stdout.write("密码: ");
68
+ password = await promptPassword();
69
+ if (!password) {
70
+ error("密码为空");
71
+ process.exit(1);
72
+ }
73
+ }
74
+ const loginUrl = `${serverUrl}/api/auth/login`;
75
+ info(`正在登录 ${serverUrl} ...`);
76
+ let res;
77
+ try {
78
+ res = await fetch(loginUrl, {
79
+ method: "POST",
80
+ headers: { "Content-Type": "application/json" },
81
+ body: JSON.stringify({ username, password }),
82
+ });
83
+ }
84
+ catch (e) {
85
+ error("无法连接服务器,请检查地址与网络");
86
+ if (e instanceof Error)
87
+ info(e.message);
88
+ process.exit(1);
89
+ }
90
+ const body = (await res.json());
91
+ if (!res.ok || !body.success || !body.data?.accessToken) {
92
+ const msg = body.message ?? body.error ?? "登录失败";
93
+ if (res.status === 401) {
94
+ error("用户名或密码错误");
95
+ }
96
+ else {
97
+ error(msg);
98
+ }
99
+ process.exit(1);
100
+ }
101
+ writeCredentials(serverUrl, body.data.accessToken);
102
+ const credPath = getCredentialsPath();
103
+ success("登录成功");
104
+ info(`Token 已保存至 ${credPath}`);
105
+ }
106
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Server management CRUD: list, add, show, update, delete.
3
+ * Uses SERVER_MANAGEMENT_BASE_URL and requireAuth.
4
+ */
5
+ export interface ServerEntry {
6
+ id: string;
7
+ name: string;
8
+ ip: string;
9
+ username: string;
10
+ sshKey: string;
11
+ accountId: string;
12
+ }
13
+ export declare function runServerList(): Promise<void>;
14
+ export interface RunServerAddOptions {
15
+ name: string;
16
+ ip: string;
17
+ username: string;
18
+ sshKey: string;
19
+ }
20
+ export declare function runServerAdd(opts: RunServerAddOptions): Promise<void>;
21
+ export declare function runServerShow(id: string): Promise<void>;
22
+ export interface RunServerUpdateOptions {
23
+ name?: string;
24
+ ip?: string;
25
+ username?: string;
26
+ sshKey?: string;
27
+ }
28
+ export declare function runServerUpdate(id: string, opts: RunServerUpdateOptions): Promise<void>;
29
+ export declare function runServerDelete(id: string): Promise<void>;
30
+ /**
31
+ * Read ssh key from file path. Used by add/update.
32
+ */
33
+ export declare function readSshKeyFromFile(filePath: string): string;
34
+ //# sourceMappingURL=servers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servers.d.ts","sourceRoot":"","sources":["../../src/commands/servers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY3E;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7D;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK3D"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Server management CRUD: list, add, show, update, delete.
3
+ * Uses SERVER_MANAGEMENT_BASE_URL and requireAuth.
4
+ */
5
+ import fs from "node:fs";
6
+ import { serverManagementFetch } from "../lib/api.js";
7
+ import { error, info, success } from "../lib/logger.js";
8
+ async function parseJson(res) {
9
+ const body = (await res.json());
10
+ return body.data;
11
+ }
12
+ export async function runServerList() {
13
+ const res = await serverManagementFetch("api/servers");
14
+ const list = await parseJson(res);
15
+ if (!Array.isArray(list) || list.length === 0) {
16
+ info("暂无服务器");
17
+ return;
18
+ }
19
+ list.forEach((s) => {
20
+ info(`${s.id}\t${s.name}\t${s.ip}\t${s.username}`);
21
+ });
22
+ }
23
+ export async function runServerAdd(opts) {
24
+ const res = await serverManagementFetch("api/servers", {
25
+ method: "POST",
26
+ body: {
27
+ name: opts.name,
28
+ ip: opts.ip,
29
+ username: opts.username,
30
+ sshKey: opts.sshKey,
31
+ },
32
+ });
33
+ const server = await parseJson(res);
34
+ success(`已创建服务器: ${server.name} (id: ${server.id})`);
35
+ }
36
+ export async function runServerShow(id) {
37
+ const res = await serverManagementFetch(`api/servers/${encodeURIComponent(id)}`);
38
+ const server = await parseJson(res);
39
+ info(`id: ${server.id}`);
40
+ info(`name: ${server.name}`);
41
+ info(`ip: ${server.ip}`);
42
+ info(`username: ${server.username}`);
43
+ info(`sshKey: (已保存,不在此显示)`);
44
+ }
45
+ export async function runServerUpdate(id, opts) {
46
+ const body = {};
47
+ if (opts.name !== undefined)
48
+ body.name = opts.name;
49
+ if (opts.ip !== undefined)
50
+ body.ip = opts.ip;
51
+ if (opts.username !== undefined)
52
+ body.username = opts.username;
53
+ if (opts.sshKey !== undefined)
54
+ body.sshKey = opts.sshKey;
55
+ if (Object.keys(body).length === 0) {
56
+ error("请至少指定一个要更新的字段: --name, --ip, --username, --ssh-key");
57
+ process.exit(1);
58
+ }
59
+ await serverManagementFetch(`api/servers/${encodeURIComponent(id)}`, {
60
+ method: "PATCH",
61
+ body,
62
+ });
63
+ success(`已更新服务器: ${id}`);
64
+ }
65
+ export async function runServerDelete(id) {
66
+ await serverManagementFetch(`api/servers/${encodeURIComponent(id)}`, {
67
+ method: "DELETE",
68
+ });
69
+ success(`已删除服务器: ${id}`);
70
+ }
71
+ /**
72
+ * Read ssh key from file path. Used by add/update.
73
+ */
74
+ export function readSshKeyFromFile(filePath) {
75
+ if (!fs.existsSync(filePath)) {
76
+ throw new Error(`SSH 密钥文件不存在: ${filePath}`);
77
+ }
78
+ return fs.readFileSync(filePath, "utf8").trim();
79
+ }
80
+ //# sourceMappingURL=servers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"servers.js","sourceRoot":"","sources":["../../src/commands/servers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * n2 ssh <server-name>: fetch server config from API and run ssh -i key user@ip.
3
+ */
4
+ export interface ServerSshConfig {
5
+ id: string;
6
+ name: string;
7
+ ip: string;
8
+ username: string;
9
+ sshKey: string;
10
+ accountId: string;
11
+ }
12
+ export declare function runSsh(serverName: string): Promise<void>;
13
+ //# sourceMappingURL=ssh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmE9D"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * n2 ssh <server-name>: fetch server config from API and run ssh -i key user@ip.
3
+ */
4
+ import { spawn } from "node:child_process";
5
+ import fs from "node:fs";
6
+ import os from "node:os";
7
+ import path from "node:path";
8
+ import { serverManagementFetch } from "../lib/api.js";
9
+ import { error } from "../lib/logger.js";
10
+ export async function runSsh(serverName) {
11
+ let res;
12
+ try {
13
+ res = await serverManagementFetch("api/servers/by-name/" + encodeURIComponent(serverName));
14
+ }
15
+ catch {
16
+ error("未找到该名称的服务器或无权访问");
17
+ process.exit(1);
18
+ }
19
+ const body = (await res.json());
20
+ const server = body.data;
21
+ if (!server?.ip || !server?.username || typeof server?.sshKey !== "string") {
22
+ error("未找到该名称的服务器或无权访问");
23
+ process.exit(1);
24
+ }
25
+ const tmpDir = os.tmpdir();
26
+ const tmpKeyPath = path.join(tmpDir, `n2-ssh-key-${process.pid}-${Date.now()}.tmp`);
27
+ try {
28
+ fs.writeFileSync(tmpKeyPath, server.sshKey, { mode: 0o600 });
29
+ }
30
+ catch (e) {
31
+ error(`无法写入临时密钥文件: ${e}`);
32
+ process.exit(1);
33
+ }
34
+ const cleanup = () => {
35
+ try {
36
+ if (fs.existsSync(tmpKeyPath))
37
+ fs.unlinkSync(tmpKeyPath);
38
+ }
39
+ catch {
40
+ // ignore
41
+ }
42
+ };
43
+ process.on("exit", cleanup);
44
+ process.on("SIGINT", () => {
45
+ cleanup();
46
+ process.exit(130);
47
+ });
48
+ process.on("SIGTERM", () => {
49
+ cleanup();
50
+ process.exit(143);
51
+ });
52
+ const target = `${server.username}@${server.ip}`;
53
+ const child = spawn("ssh", ["-i", tmpKeyPath, "-o", "StrictHostKeyChecking=accept-new", target], {
54
+ stdio: "inherit",
55
+ });
56
+ child.on("close", (code, signal) => {
57
+ cleanup();
58
+ if (code !== null && code !== 0) {
59
+ process.exit(code);
60
+ }
61
+ if (signal) {
62
+ process.kill(process.pid, signal);
63
+ }
64
+ });
65
+ child.on("error", (err) => {
66
+ cleanup();
67
+ error(`执行 ssh 失败: ${err.message}`);
68
+ process.exit(1);
69
+ });
70
+ }
71
+ //# sourceMappingURL=ssh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/commands/ssh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Server URL and auth headers for API requests.
3
+ */
4
+ import { type Credentials } from "./credentials.js";
5
+ /** Base URL for server management (servers CRUD + ssh). All n2 server / n2 ssh use this. */
6
+ export declare const SERVER_MANAGEMENT_BASE_URL = "https://n2-server.cdqxtech.com";
7
+ export declare function getDefaultServerUrl(): string;
8
+ /**
9
+ * Resolve server URL: from options, then credentials, then env, then default.
10
+ */
11
+ export declare function getServerUrl(optionServerUrl?: string): string;
12
+ /**
13
+ * Auth headers for API requests. Returns null if not logged in.
14
+ */
15
+ export declare function getAuthHeaders(optionServerUrl?: string): Record<string, string> | null;
16
+ /**
17
+ * Check if logged in (has valid-looking credentials for the given or default server).
18
+ */
19
+ export declare function isLoggedIn(optionServerUrl?: string): boolean;
20
+ export declare function requireAuth(optionServerUrl?: string): Credentials;
21
+ /** Options for serverManagementFetch; body can be object (will be JSON.stringify'd). */
22
+ export interface ServerManagementFetchOptions {
23
+ method?: string;
24
+ headers?: Record<string, string>;
25
+ body?: string | object;
26
+ }
27
+ /**
28
+ * Fetch against server management API (base URL fixed). Throws on non-OK with message from body.
29
+ */
30
+ export declare function serverManagementFetch(path: string, options?: ServerManagementFetchOptions): Promise<Response>;
31
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAI1B,4FAA4F;AAC5F,eAAO,MAAM,0BAA0B,mCAAmC,CAAC;AAE3E,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAStF;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,WAAW,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,WAAW,CASjE;AAED,wFAAwF;AACxF,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,QAAQ,CAAC,CA2BnB"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Server URL and auth headers for API requests.
3
+ */
4
+ import { readCredentials, } from "./credentials.js";
5
+ const DEFAULT_SERVER_URL = "http://localhost:20000";
6
+ /** Base URL for server management (servers CRUD + ssh). All n2 server / n2 ssh use this. */
7
+ export const SERVER_MANAGEMENT_BASE_URL = "https://n2-server.cdqxtech.com";
8
+ export function getDefaultServerUrl() {
9
+ return process.env.N2_SERVER_URL ?? DEFAULT_SERVER_URL;
10
+ }
11
+ /**
12
+ * Resolve server URL: from options, then credentials, then env, then default.
13
+ */
14
+ export function getServerUrl(optionServerUrl) {
15
+ if (optionServerUrl)
16
+ return optionServerUrl;
17
+ const creds = readCredentials();
18
+ if (creds?.serverUrl)
19
+ return creds.serverUrl;
20
+ return getDefaultServerUrl();
21
+ }
22
+ /**
23
+ * Auth headers for API requests. Returns null if not logged in.
24
+ */
25
+ export function getAuthHeaders(optionServerUrl) {
26
+ const creds = readCredentials();
27
+ if (!creds?.accessToken)
28
+ return null;
29
+ if (optionServerUrl && creds.serverUrl !== optionServerUrl) {
30
+ return null;
31
+ }
32
+ return {
33
+ Authorization: `Bearer ${creds.accessToken}`,
34
+ };
35
+ }
36
+ /**
37
+ * Check if logged in (has valid-looking credentials for the given or default server).
38
+ */
39
+ export function isLoggedIn(optionServerUrl) {
40
+ return getAuthHeaders(optionServerUrl) !== null;
41
+ }
42
+ export function requireAuth(optionServerUrl) {
43
+ const creds = readCredentials();
44
+ if (!creds?.accessToken) {
45
+ throw new Error("未登录,请先执行: n2 login");
46
+ }
47
+ if (optionServerUrl && creds.serverUrl !== optionServerUrl) {
48
+ throw new Error("当前保存的服务器与指定不一致,请重新登录: n2 login --server-url " + optionServerUrl);
49
+ }
50
+ return creds;
51
+ }
52
+ /**
53
+ * Fetch against server management API (base URL fixed). Throws on non-OK with message from body.
54
+ */
55
+ export async function serverManagementFetch(path, options = {}) {
56
+ const creds = requireAuth(SERVER_MANAGEMENT_BASE_URL);
57
+ const url = path.startsWith("http") ? path : SERVER_MANAGEMENT_BASE_URL.replace(/\/$/, "") + "/" + path.replace(/^\//, "");
58
+ const { body, ...rest } = options;
59
+ const init = {
60
+ ...rest,
61
+ headers: {
62
+ Authorization: `Bearer ${creds.accessToken}`,
63
+ "Content-Type": "application/json",
64
+ ...options.headers,
65
+ },
66
+ };
67
+ if (body !== undefined) {
68
+ init.body = typeof body === "string" ? body : JSON.stringify(body);
69
+ }
70
+ const res = await fetch(url, init);
71
+ if (!res.ok) {
72
+ let msg = res.statusText;
73
+ try {
74
+ const data = (await res.json());
75
+ msg = data.message ?? data.error ?? msg;
76
+ }
77
+ catch {
78
+ // ignore
79
+ }
80
+ throw new Error(msg);
81
+ }
82
+ return res;
83
+ }
84
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CLI credentials: server URL and access token stored in ~/.n2-server/credentials.json.
3
+ */
4
+ export interface Credentials {
5
+ serverUrl: string;
6
+ accessToken: string;
7
+ }
8
+ export declare function getCredentialsPath(): string;
9
+ export declare function readCredentials(): Credentials | null;
10
+ export declare function writeCredentials(serverUrl: string, accessToken: string): void;
11
+ export declare function clearCredentials(): void;
12
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAiBpD;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,IAAI,CAQN;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * CLI credentials: server URL and access token stored in ~/.n2-server/credentials.json.
3
+ */
4
+ import fs from "node:fs";
5
+ import os from "node:os";
6
+ import path from "node:path";
7
+ const CREDENTIALS_DIR = path.join(os.homedir(), ".n2-server");
8
+ const CREDENTIALS_FILE = path.join(CREDENTIALS_DIR, "credentials.json");
9
+ function ensureDir() {
10
+ if (!fs.existsSync(CREDENTIALS_DIR)) {
11
+ fs.mkdirSync(CREDENTIALS_DIR, { recursive: true });
12
+ }
13
+ }
14
+ export function getCredentialsPath() {
15
+ return CREDENTIALS_FILE;
16
+ }
17
+ export function readCredentials() {
18
+ if (!fs.existsSync(CREDENTIALS_FILE)) {
19
+ return null;
20
+ }
21
+ try {
22
+ const raw = fs.readFileSync(CREDENTIALS_FILE, "utf8");
23
+ const data = JSON.parse(raw);
24
+ if (typeof data.serverUrl !== "string" ||
25
+ typeof data.accessToken !== "string") {
26
+ return null;
27
+ }
28
+ return data;
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ export function writeCredentials(serverUrl, accessToken) {
35
+ ensureDir();
36
+ const data = { serverUrl, accessToken };
37
+ fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(data, null, 2), "utf8");
38
+ }
39
+ export function clearCredentials() {
40
+ if (fs.existsSync(CREDENTIALS_FILE)) {
41
+ fs.unlinkSync(CREDENTIALS_FILE);
42
+ }
43
+ }
44
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;AAC9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;AAOxE,SAAS,SAAS;IAChB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;QAC5C,IACE,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;YAClC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EACpC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,WAAmB;IAEnB,SAAS,EAAE,CAAC;IACZ,MAAM,IAAI,GAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;IACrD,EAAE,CAAC,aAAa,CACd,gBAAgB,EAChB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7B,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACpC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"nginx.d.ts","sourceRoot":"","sources":["../../src/lib/nginx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA8DlD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA4B/D"}
1
+ {"version":3,"file":"nginx.d.ts","sourceRoot":"","sources":["../../src/lib/nginx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAmElD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA4B/D"}
package/dist/lib/nginx.js CHANGED
@@ -2,6 +2,10 @@
2
2
  * Generate nginx n2.conf from domains config.
3
3
  * 后端与前端同域:每个应用域名下 /api 反向代理到后端,不再为 API 单独配置 server。
4
4
  */
5
+ const FILE_HEADER = `# Nginx server 示例:前端 + 同域 /api 反代
6
+ # 部署时复制到服务器并改名为 .conf,或合并到现有 server 块
7
+
8
+ `;
5
9
  function appServerBlock(domain, appName, backendPort) {
6
10
  const root = `/var/www/${appName}`;
7
11
  return `# HTTPS - ${appName} (${domain}),/api 代理到后端
@@ -24,8 +28,8 @@ server {
24
28
  access_log /var/log/nginx/${appName}-access.log;
25
29
  error_log /var/log/nginx/${appName}-error.log;
26
30
 
27
- # 后端接口:优先匹配 /api,与前端同域
28
- location /api {
31
+ # 后端接口:^~ 保证 /api 优先于 location /,避免 POST 被 try_files 当静态返回 405
32
+ location ^~ /api {
29
33
  proxy_pass http://127.0.0.1:${backendPort};
30
34
  proxy_http_version 1.1;
31
35
  proxy_set_header Host $host;
@@ -81,6 +85,6 @@ server {
81
85
  return 301 https://$host$request_uri;
82
86
  }
83
87
  `;
84
- return blocks.join("\n") + "\n" + redirectBlock;
88
+ return FILE_HEADER + blocks.join("\n") + "\n" + redirectBlock;
85
89
  }
86
90
  //# sourceMappingURL=nginx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"nginx.js","sourceRoot":"","sources":["../../src/lib/nginx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,SAAS,cAAc,CACrB,MAAc,EACd,OAAe,EACf,WAAmB;IAEnB,MAAM,IAAI,GAAG,YAAY,OAAO,EAAE,CAAC;IACnC,OAAO,aAAa,OAAO,KAAK,MAAM;;;kBAGtB,MAAM;;WAEb,IAAI;;;qCAGsB,MAAM;yCACF,MAAM;;;;;;;;gCAQf,OAAO;+BACR,OAAO;;;;sCAIA,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO;QACvB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO;QACxB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO;KACzB,CAAC;IACF,MAAM,aAAa,GAAG;;;kBAGN,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;;;CAGrC,CAAC;IAEA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,aAAa,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"nginx.js","sourceRoot":"","sources":["../../src/lib/nginx.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,GAAG;;;CAGnB,CAAC;AAEF,SAAS,cAAc,CACrB,MAAc,EACd,OAAe,EACf,WAAmB;IAEnB,MAAM,IAAI,GAAG,YAAY,OAAO,EAAE,CAAC;IACnC,OAAO,aAAa,OAAO,KAAK,MAAM;;;kBAGtB,MAAM;;WAEb,IAAI;;;qCAGsB,MAAM;yCACF,MAAM;;;;;;;;gCAQf,OAAO;+BACR,OAAO;;;;sCAIA,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BhD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,UAAU,GAAG;QACjB,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO;QACvB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO;QACxB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO;KACzB,CAAC;IACF,MAAM,aAAa,GAAG;;;kBAGN,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;;;CAGrC,CAAC;IAEA,OAAO,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,aAAa,CAAC;AAChE,CAAC"}
@@ -28,7 +28,7 @@ describe("nginx", () => {
28
28
  expect(out).toContain("/var/www/admin");
29
29
  expect(out).toContain("/var/www/tenant");
30
30
  expect(out).toContain("/var/www/client");
31
- expect(out).toContain("location /api");
31
+ expect(out).toContain("location ^~ /api");
32
32
  expect(out).toContain("ssl_certificate ");
33
33
  expect(out).toContain("server_name admin.example.com tenant.example.com client.example.com");
34
34
  });
@@ -1 +1 @@
1
- {"version":3,"file":"nginx.test.js","sourceRoot":"","sources":["../../src/lib/nginx.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAkB;YAC5B,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACtB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACvB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;SACxB,CAAC;QACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,MAAM,GAAkB;YAC5B,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE;YACzC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE;YAC3C,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE;SAC5C,CAAC;QACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qEAAqE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAkB;YAC5B,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;YAC7B,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACvB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;SACxB,CAAC;QACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"nginx.test.js","sourceRoot":"","sources":["../../src/lib/nginx.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAkB;YAC5B,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACtB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACvB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;SACxB,CAAC;QACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,MAAM,GAAkB;YAC5B,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,mBAAmB,CAAC,EAAE;YACzC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE;YAC3C,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,oBAAoB,CAAC,EAAE;SAC5C,CAAC;QACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qEAAqE,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAAkB;YAC5B,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACxC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE;YAC7B,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACvB,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;SACxB,CAAC;QACF,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aaricchen1991/n2-cli",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "CLI for server init, nginx config, and SSL certificate management",
5
5
  "type": "module",
6
6
  "bin": {