@aaricchen1991/n2-cli 1.0.4 → 1.0.6

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.
Files changed (40) hide show
  1. package/README.md +2 -2
  2. package/assets/deploy/ssl/README.md +1 -1
  3. package/dist/cli.d.ts +1 -1
  4. package/dist/cli.js +126 -6
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/config.js +1 -1
  7. package/dist/commands/login.d.ts +10 -0
  8. package/dist/commands/login.d.ts.map +1 -0
  9. package/dist/commands/login.js +106 -0
  10. package/dist/commands/login.js.map +1 -0
  11. package/dist/commands/servers.d.ts +34 -0
  12. package/dist/commands/servers.d.ts.map +1 -0
  13. package/dist/commands/servers.js +80 -0
  14. package/dist/commands/servers.js.map +1 -0
  15. package/dist/commands/ssh.d.ts +13 -0
  16. package/dist/commands/ssh.d.ts.map +1 -0
  17. package/dist/commands/ssh.js +71 -0
  18. package/dist/commands/ssh.js.map +1 -0
  19. package/dist/commands/ssl.js +1 -1
  20. package/dist/lib/api.d.ts +33 -0
  21. package/dist/lib/api.d.ts.map +1 -0
  22. package/dist/lib/api.js +85 -0
  23. package/dist/lib/api.js.map +1 -0
  24. package/dist/lib/config-store.d.ts +1 -1
  25. package/dist/lib/config-store.js +1 -1
  26. package/dist/lib/credentials.d.ts +12 -0
  27. package/dist/lib/credentials.d.ts.map +1 -0
  28. package/dist/lib/credentials.js +48 -0
  29. package/dist/lib/credentials.js.map +1 -0
  30. package/dist/lib/domains.d.ts +1 -1
  31. package/dist/lib/domains.js +1 -1
  32. package/dist/lib/nginx.test.js +1 -1
  33. package/dist/lib/nginx.test.js.map +1 -1
  34. package/dist/lib/paths.d.ts +4 -2
  35. package/dist/lib/paths.d.ts.map +1 -1
  36. package/dist/lib/paths.js +7 -3
  37. package/dist/lib/paths.js.map +1 -1
  38. package/dist/lib/paths.test.js +10 -5
  39. package/dist/lib/paths.test.js.map +1 -1
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -34,7 +34,7 @@ pnpm run build
34
34
  pnpm run cli -- <command> [options]
35
35
  ```
36
36
 
37
- 默认从 **~/.deploy/config.yaml** 读取配置,也可通过 `-c, --config` 指定路径。
37
+ 默认从 **~/.n2/cli/config.yaml** 读取配置,也可通过 `-c, --config` 指定路径。
38
38
 
39
39
  ### 发布为 npm 包后
40
40
 
@@ -48,7 +48,7 @@ n2 --help
48
48
 
49
49
  ## 配置文件
50
50
 
51
- 默认 **~/.deploy/config.yaml**,格式与包内 `assets/deploy/domains.yaml` 兼容。
51
+ 默认 **~/.n2/cli/config.yaml**,格式与包内 `assets/deploy/domains.yaml` 兼容。
52
52
 
53
53
  **示例:**
54
54
 
@@ -58,7 +58,7 @@ cd /path/to/deploy-package/assets/deploy/ssl
58
58
  sudo ./setup-ssl.sh --domains "your-domain.com"
59
59
  ```
60
60
 
61
- 域名列表由部署配置(如 `~/.deploy/config.yaml` 或包内 `assets/deploy/domains.yaml`)管理;执行 `n2 init` 或 `n2 ssl` 会根据配置生成/更新 `domains.txt`。`check-and-setup-ssl.sh` 会按 `domains.txt` 自动为所有域名申请证书。
61
+ 域名列表由部署配置(如 `~/.n2/cli/config.yaml` 或包内 `assets/deploy/domains.yaml`)管理;执行 `n2 init` 或 `n2 ssl` 会根据配置生成/更新 `domains.txt`。`check-and-setup-ssl.sh` 会按 `domains.txt` 自动为所有域名申请证书。
62
62
 
63
63
  脚本会自动:
64
64
 
package/dist/cli.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * n2 CLI: server init, nginx config, SSL management.
4
- * Config: default ~/.deploy/config.yaml (ALIYUN keys + domains).
4
+ * Config: default ~/.n2/cli/config.yaml (ALIYUN keys + domains).
5
5
  */
6
6
  export {};
7
7
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * n2 CLI: server init, nginx config, SSL management.
4
- * Config: default ~/.deploy/config.yaml (ALIYUN keys + domains).
4
+ * Config: default ~/.n2/cli/config.yaml (ALIYUN keys + domains).
5
5
  */
6
6
  import { createRequire } from "node:module";
7
7
  import { fileURLToPath } from "node:url";
@@ -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();
@@ -26,7 +29,7 @@ program
26
29
  const configCmd = program
27
30
  .command("config")
28
31
  .description("配置管理:初始化、查看、设置、删除配置项")
29
- .option("-c, --config <path>", "配置文件路径(默认 ~/.deploy/config.yaml)", defaultConfig);
32
+ .option("-c, --config <path>", "配置文件路径(默认 ~/.n2/cli/config.yaml)", defaultConfig);
30
33
  function configPathFromCmd(cmd) {
31
34
  const selfOpts = cmd.opts?.() ?? {};
32
35
  const parentOpts = cmd.parent?.opts?.() ?? {};
@@ -36,7 +39,7 @@ function configPathFromCmd(cmd) {
36
39
  }
37
40
  configCmd
38
41
  .command("init")
39
- .description("初始化配置文件(创建 ~/.deploy/config.yaml 默认模板)")
42
+ .description("初始化配置文件(创建 ~/.n2/cli/config.yaml 默认模板)")
40
43
  .option("-c, --config <path>", "配置文件路径", defaultConfig)
41
44
  .option("-f, --force", "已存在时覆盖")
42
45
  .action(async (opts, cmd) => {
@@ -109,10 +112,29 @@ configCmd
109
112
  process.exit(1);
110
113
  }
111
114
  });
115
+ program
116
+ .command("login")
117
+ .description("登录 n2-devops 服务器,保存 access token 至 ~/.n2/cli/credentials.json")
118
+ .option("--server-url <url>", "服务器地址(默认 N2_SERVER_URL 或 https://n2-server.cdqxtech.com)")
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、占位证书")
115
- .option("-c, --config <path>", "配置文件路径(默认 ~/.deploy/config.yaml)", defaultConfig)
137
+ .option("-c, --config <path>", "配置文件路径(默认 ~/.n2/cli/config.yaml)", defaultConfig)
116
138
  .option("--scripts-dir <path>", "部署脚本目录(默认 N2_DEPLOY_SCRIPTS_DIR 或包内 assets/deploy)")
117
139
  .action(async (opts) => {
118
140
  try {
@@ -126,7 +148,7 @@ program
126
148
  program
127
149
  .command("nginx")
128
150
  .description("Generate nginx config from domains config; optionally install and reload")
129
- .option("-c, --config <path>", "Path to deploy config (default: ~/.deploy/config.yaml)", defaultConfig)
151
+ .option("-c, --config <path>", "Path to deploy config (default: ~/.n2/cli/config.yaml)", defaultConfig)
130
152
  .option("-o, --output <path>", "Output path for nginx config", "nginx/n2.conf")
131
153
  .option("-i, --install", "Install to system nginx dir and reload")
132
154
  .action(async (opts) => {
@@ -145,7 +167,7 @@ program
145
167
  program
146
168
  .command("ssl")
147
169
  .description("Setup/renew SSL certificates for all domains (acme.sh + Aliyun DNS)")
148
- .option("-c, --config <path>", "Path to deploy config (default: ~/.deploy/config.yaml)", defaultConfig)
170
+ .option("-c, --config <path>", "Path to deploy config (default: ~/.n2/cli/config.yaml)", defaultConfig)
149
171
  .option("--ali-key <key>", "Aliyun Access Key ID (or set ALIYUN_ACCESS_KEY_ID)")
150
172
  .option("--ali-secret <secret>", "Aliyun Access Key Secret (or set ALIYUN_ACCESS_KEY_SECRET)")
151
173
  .option("--log-file <path>", "SSL log file path", "/opt/deploy/logs/ssl.log")
@@ -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":"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"}
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,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,aAAa,EACb,aAAa,EACb,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,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,OAAO,CAAC;KAChB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,oBAAoB,EAAE,0DAA0D,CAAC;KACxF,MAAM,CAAC,uBAAuB,EAAE,KAAK,CAAC;KACtC,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;KACjD,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,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,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,MAAM,SAAS,GAAG,OAAO;KACtB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC,CAAC;AAE1D,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,YAAY,CAAC;KACzB,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,EAAE,CAAC;IACxB,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,KAAK,CAAC;KACd,WAAW,CAAC,OAAO,CAAC;KACpB,cAAc,CAAC,mBAAmB,EAAE,WAAW,CAAC;KAChD,cAAc,CAAC,WAAW,EAAE,OAAO,CAAC;KACpC,cAAc,CAAC,uBAAuB,EAAE,SAAS,CAAC;KAClD,cAAc,CAAC,kBAAkB,EAAE,YAAY,CAAC;KAChD,MAAM,CAAC,KAAK,EAAC,IAAI,EAAC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,YAAY,CAAC;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM;SACP,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,WAAW,CAAC;KACpB,WAAW,CAAC,WAAW,CAAC;KACxB,MAAM,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1B,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,aAAa,CAAC;KACtB,WAAW,CAAC,iBAAiB,CAAC;KAC9B,MAAM,CAAC,mBAAmB,EAAE,WAAW,CAAC;KACxC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC;KAC5B,MAAM,CAAC,uBAAuB,EAAE,SAAS,CAAC;KAC1C,MAAM,CAAC,kBAAkB,EAAE,YAAY,CAAC;KACxC,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IACzB,IAAI,CAAC;QACH,MAAM,UAAU,GAAuE,EAAE,CAAC;QAC1F,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACzD,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS;YAAE,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;YAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACrE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,UAAU,CAAC,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnF,MAAM,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACxC,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,aAAa,CAAC;KACtB,WAAW,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,KAAK,EAAC,EAAE,EAAC,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAC5B,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,mBAAmB,CAAC;KAC5B,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAC,UAAU,EAAC,EAAE;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,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"}
@@ -6,7 +6,7 @@ import fs from "node:fs";
6
6
  import path from "node:path";
7
7
  import { deleteConfigValue, getConfigValue, isValidConfigKey, loadConfig, saveConfig, setConfigValue, } from "../lib/config-store.js";
8
8
  import { getDefaultConfigPath, resolveConfigPath } from "../lib/paths.js";
9
- const DEFAULT_TEMPLATE = `# n2 配置 (~/.deploy/config.yaml)
9
+ const DEFAULT_TEMPLATE = `# n2 配置 (~/.n2/cli/config.yaml)
10
10
  # 阿里云 DNS API(用于 ACME 申请证书)
11
11
  # aliyun_access_key_id: "your-key"
12
12
  # aliyun_access_key_secret: "your-secret"
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Login to n2-devops server; save access token to ~/.n2/cli/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/cli/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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"}
@@ -28,7 +28,7 @@ export async function runSsl(opts) {
28
28
  process.env.Ali_Secret;
29
29
  if (!aliKey || !aliSecret) {
30
30
  error("缺少阿里云 API 凭证");
31
- info("请在配置 (~/.deploy/config.yaml)、--ali-key/--ali-secret 或环境变量 ALIYUN_ACCESS_KEY_ID/ALIYUN_ACCESS_KEY_SECRET 中设置");
31
+ info("请在配置 (~/.n2/cli/config.yaml)、--ali-key/--ali-secret 或环境变量 ALIYUN_ACCESS_KEY_ID/ALIYUN_ACCESS_KEY_SECRET 中设置");
32
32
  process.exit(1);
33
33
  }
34
34
  const domains = getAllDomains(domainsConfig);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Server URL and auth headers for API requests.
3
+ */
4
+ import { type Credentials } from "./credentials.js";
5
+ /** Default / production server URL (used when N2_SERVER_URL and credentials are not set). */
6
+ export declare const DEFAULT_SERVER_URL = "https://n2-server.cdqxtech.com";
7
+ /** Base URL for server management (servers CRUD + ssh). All n2 server / n2 ssh use this. */
8
+ export declare const SERVER_MANAGEMENT_BASE_URL = "https://n2-server.cdqxtech.com";
9
+ export declare function getDefaultServerUrl(): string;
10
+ /**
11
+ * Resolve server URL: from options, then credentials, then env, then default.
12
+ */
13
+ export declare function getServerUrl(optionServerUrl?: string): string;
14
+ /**
15
+ * Auth headers for API requests. Returns null if not logged in.
16
+ */
17
+ export declare function getAuthHeaders(optionServerUrl?: string): Record<string, string> | null;
18
+ /**
19
+ * Check if logged in (has valid-looking credentials for the given or default server).
20
+ */
21
+ export declare function isLoggedIn(optionServerUrl?: string): boolean;
22
+ export declare function requireAuth(optionServerUrl?: string): Credentials;
23
+ /** Options for serverManagementFetch; body can be object (will be JSON.stringify'd). */
24
+ export interface ServerManagementFetchOptions {
25
+ method?: string;
26
+ headers?: Record<string, string>;
27
+ body?: string | object;
28
+ }
29
+ /**
30
+ * Fetch against server management API (base URL fixed). Throws on non-OK with message from body.
31
+ */
32
+ export declare function serverManagementFetch(path: string, options?: ServerManagementFetchOptions): Promise<Response>;
33
+ //# 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;AAE1B,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AAEnE,4FAA4F;AAC5F,eAAO,MAAM,0BAA0B,mCAAqB,CAAC;AAE7D,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,85 @@
1
+ /**
2
+ * Server URL and auth headers for API requests.
3
+ */
4
+ import { readCredentials, } from "./credentials.js";
5
+ /** Default / production server URL (used when N2_SERVER_URL and credentials are not set). */
6
+ export const DEFAULT_SERVER_URL = "https://n2-server.cdqxtech.com";
7
+ /** Base URL for server management (servers CRUD + ssh). All n2 server / n2 ssh use this. */
8
+ export const SERVER_MANAGEMENT_BASE_URL = DEFAULT_SERVER_URL;
9
+ export function getDefaultServerUrl() {
10
+ return process.env.N2_SERVER_URL ?? DEFAULT_SERVER_URL;
11
+ }
12
+ /**
13
+ * Resolve server URL: from options, then credentials, then env, then default.
14
+ */
15
+ export function getServerUrl(optionServerUrl) {
16
+ if (optionServerUrl)
17
+ return optionServerUrl;
18
+ const creds = readCredentials();
19
+ if (creds?.serverUrl)
20
+ return creds.serverUrl;
21
+ return getDefaultServerUrl();
22
+ }
23
+ /**
24
+ * Auth headers for API requests. Returns null if not logged in.
25
+ */
26
+ export function getAuthHeaders(optionServerUrl) {
27
+ const creds = readCredentials();
28
+ if (!creds?.accessToken)
29
+ return null;
30
+ if (optionServerUrl && creds.serverUrl !== optionServerUrl) {
31
+ return null;
32
+ }
33
+ return {
34
+ Authorization: `Bearer ${creds.accessToken}`,
35
+ };
36
+ }
37
+ /**
38
+ * Check if logged in (has valid-looking credentials for the given or default server).
39
+ */
40
+ export function isLoggedIn(optionServerUrl) {
41
+ return getAuthHeaders(optionServerUrl) !== null;
42
+ }
43
+ export function requireAuth(optionServerUrl) {
44
+ const creds = readCredentials();
45
+ if (!creds?.accessToken) {
46
+ throw new Error("未登录,请先执行: n2 login");
47
+ }
48
+ if (optionServerUrl && creds.serverUrl !== optionServerUrl) {
49
+ throw new Error("当前保存的服务器与指定不一致,请重新登录: n2 login --server-url " + optionServerUrl);
50
+ }
51
+ return creds;
52
+ }
53
+ /**
54
+ * Fetch against server management API (base URL fixed). Throws on non-OK with message from body.
55
+ */
56
+ export async function serverManagementFetch(path, options = {}) {
57
+ const creds = requireAuth(SERVER_MANAGEMENT_BASE_URL);
58
+ const url = path.startsWith("http") ? path : SERVER_MANAGEMENT_BASE_URL.replace(/\/$/, "") + "/" + path.replace(/^\//, "");
59
+ const { body, ...rest } = options;
60
+ const init = {
61
+ ...rest,
62
+ headers: {
63
+ Authorization: `Bearer ${creds.accessToken}`,
64
+ "Content-Type": "application/json",
65
+ ...options.headers,
66
+ },
67
+ };
68
+ if (body !== undefined) {
69
+ init.body = typeof body === "string" ? body : JSON.stringify(body);
70
+ }
71
+ const res = await fetch(url, init);
72
+ if (!res.ok) {
73
+ let msg = res.statusText;
74
+ try {
75
+ const data = (await res.json());
76
+ msg = data.message ?? data.error ?? msg;
77
+ }
78
+ catch {
79
+ // ignore
80
+ }
81
+ throw new Error(msg);
82
+ }
83
+ return res;
84
+ }
85
+ //# 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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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Config file CRUD: load, get, set, delete, save for ~/.deploy/config.yaml.
2
+ * Config file CRUD: load, get, set, delete, save for ~/.n2/cli/config.yaml.
3
3
  * Keys: aliyun_access_key_id, aliyun_access_key_secret, api.backend_port,
4
4
  * api.domains, admin.domains, tenant.domains, client.domains
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Config file CRUD: load, get, set, delete, save for ~/.deploy/config.yaml.
2
+ * Config file CRUD: load, get, set, delete, save for ~/.n2/cli/config.yaml.
3
3
  * Keys: aliyun_access_key_id, aliyun_access_key_secret, api.backend_port,
4
4
  * api.domains, admin.domains, tenant.domains, client.domains
5
5
  */
@@ -0,0 +1,12 @@
1
+ /**
2
+ * CLI credentials: server URL and access token stored in ~/.n2/cli/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;AAUH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AASD,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,eAAe,IAAI,WAAW,GAAG,IAAI,CAkBpD;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,IAAI,CAQN;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * CLI credentials: server URL and access token stored in ~/.n2/cli/credentials.json.
3
+ */
4
+ import fs from "node:fs";
5
+ import path from "node:path";
6
+ import { getCliDir } from "./paths.js";
7
+ function getCredentialsFile() {
8
+ return path.join(getCliDir(), "credentials.json");
9
+ }
10
+ function ensureDir() {
11
+ const dir = getCliDir();
12
+ if (!fs.existsSync(dir)) {
13
+ fs.mkdirSync(dir, { recursive: true });
14
+ }
15
+ }
16
+ export function getCredentialsPath() {
17
+ return getCredentialsFile();
18
+ }
19
+ export function readCredentials() {
20
+ const file = getCredentialsFile();
21
+ if (!fs.existsSync(file)) {
22
+ return null;
23
+ }
24
+ try {
25
+ const raw = fs.readFileSync(file, "utf8");
26
+ const data = JSON.parse(raw);
27
+ if (typeof data.serverUrl !== "string" ||
28
+ typeof data.accessToken !== "string") {
29
+ return null;
30
+ }
31
+ return data;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ export function writeCredentials(serverUrl, accessToken) {
38
+ ensureDir();
39
+ const data = { serverUrl, accessToken };
40
+ fs.writeFileSync(getCredentialsFile(), JSON.stringify(data, null, 2), "utf8");
41
+ }
42
+ export function clearCredentials() {
43
+ const file = getCredentialsFile();
44
+ if (fs.existsSync(file)) {
45
+ fs.unlinkSync(file);
46
+ }
47
+ }
48
+ //# 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,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,SAAS,kBAAkB;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC;AACpD,CAAC;AAOD,SAAS,SAAS;IAChB,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,kBAAkB,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,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,kBAAkB,EAAE,EACpB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAC7B,MAAM,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAClC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Parse domains.yaml / deploy config format.
3
- * Deploy config (~/.deploy/config.yaml) may include ALIYUN_ACCESS_KEY_ID, ALIYUN_ACCESS_KEY_SECRET and domain sections.
3
+ * Deploy config (~/.n2/cli/config.yaml) may include ALIYUN_ACCESS_KEY_ID, ALIYUN_ACCESS_KEY_SECRET and domain sections.
4
4
  */
5
5
  export interface DomainsConfig {
6
6
  api: {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Parse domains.yaml / deploy config format.
3
- * Deploy config (~/.deploy/config.yaml) may include ALIYUN_ACCESS_KEY_ID, ALIYUN_ACCESS_KEY_SECRET and domain sections.
3
+ * Deploy config (~/.n2/cli/config.yaml) may include ALIYUN_ACCESS_KEY_ID, ALIYUN_ACCESS_KEY_SECRET and domain sections.
4
4
  */
5
5
  const DEFAULT_CONFIG = {
6
6
  api: { backend_port: 3000, domains: [] },
@@ -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"}
@@ -3,9 +3,11 @@
3
3
  * 1) N2_DEPLOY_SCRIPTS_DIR env
4
4
  * 2) package assets (assets/deploy in this package)
5
5
  *
6
- * Deploy config: default path ~/.deploy/config.yaml (ALIYUN keys + domains).
6
+ * CLI config: default dir ~/.n2/cli (config.yaml, credentials.json).
7
7
  */
8
- /** Default deploy config path: ~/.deploy/config.yaml */
8
+ /** Default CLI data directory: ~/.n2/cli (overridable by N2_CLI_DIR). */
9
+ export declare function getCliDir(): string;
10
+ /** Default config file path: ~/.n2/cli/config.yaml */
9
11
  export declare function getDefaultConfigPath(): string;
10
12
  /** Resolve config path: expand ~ to homedir, otherwise resolve against cwd. */
11
13
  export declare function resolveConfigPath(configPath: string, cwd?: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,wDAAwD;AACxD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAsB,GAC1B,MAAM,CAKR;AAID,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW1D"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,yEAAyE;AACzE,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,sDAAsD;AACtD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAsB,GAC1B,MAAM,CAKR;AAID,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW1D"}
package/dist/lib/paths.js CHANGED
@@ -3,15 +3,19 @@
3
3
  * 1) N2_DEPLOY_SCRIPTS_DIR env
4
4
  * 2) package assets (assets/deploy in this package)
5
5
  *
6
- * Deploy config: default path ~/.deploy/config.yaml (ALIYUN keys + domains).
6
+ * CLI config: default dir ~/.n2/cli (config.yaml, credentials.json).
7
7
  */
8
8
  import fs from "node:fs";
9
9
  import os from "node:os";
10
10
  import path from "node:path";
11
11
  import { fileURLToPath } from "node:url";
12
- /** Default deploy config path: ~/.deploy/config.yaml */
12
+ /** Default CLI data directory: ~/.n2/cli (overridable by N2_CLI_DIR). */
13
+ export function getCliDir() {
14
+ return process.env.N2_CLI_DIR ?? path.join(os.homedir(), ".n2", "cli");
15
+ }
16
+ /** Default config file path: ~/.n2/cli/config.yaml */
13
17
  export function getDefaultConfigPath() {
14
- return path.join(os.homedir(), ".deploy", "config.yaml");
18
+ return path.join(getCliDir(), "config.yaml");
15
19
  }
16
20
  /** Resolve config path: expand ~ to homedir, otherwise resolve against cwd. */
17
21
  export function resolveConfigPath(configPath, cwd = process.cwd()) {
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,wDAAwD;AACxD,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAC3D,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,IAAI,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,yEAAyE;AACzE,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,iBAAiB,CAC/B,UAAkB,EAClB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/D,MAAM,UAAU,aAAa,CAAC,IAAa;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,IAAI,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -2,18 +2,23 @@ import { describe, it, expect, vi, afterEach } from "vitest";
2
2
  import path from "node:path";
3
3
  import os from "node:os";
4
4
  import fs from "node:fs";
5
- import { getDefaultConfigPath, resolveConfigPath, getScriptsDir, } from "./paths.js";
5
+ import { getCliDir, getDefaultConfigPath, resolveConfigPath, getScriptsDir, } from "./paths.js";
6
6
  describe("paths", () => {
7
+ describe("getCliDir", () => {
8
+ it("returns homedir/.n2/cli by default", () => {
9
+ expect(getCliDir()).toBe(path.join(os.homedir(), ".n2", "cli"));
10
+ });
11
+ });
7
12
  describe("getDefaultConfigPath", () => {
8
- it("returns homedir/.deploy/config.yaml", () => {
13
+ it("returns homedir/.n2/cli/config.yaml", () => {
9
14
  const p = getDefaultConfigPath();
10
- expect(p).toBe(path.join(os.homedir(), ".deploy", "config.yaml"));
15
+ expect(p).toBe(path.join(os.homedir(), ".n2", "cli", "config.yaml"));
11
16
  });
12
17
  });
13
18
  describe("resolveConfigPath", () => {
14
19
  it("expands ~ to homedir", () => {
15
- const p = resolveConfigPath("~/.deploy/config.yaml");
16
- expect(p).toBe(path.join(os.homedir(), ".deploy", "config.yaml"));
20
+ const p = resolveConfigPath("~/.n2/cli/config.yaml");
21
+ expect(p).toBe(path.join(os.homedir(), ".n2", "cli", "config.yaml"));
17
22
  });
18
23
  it("resolves relative path against cwd", () => {
19
24
  const cwd = "/tmp/foo";
@@ -1 +1 @@
1
- {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../src/lib/paths.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.test.js","sourceRoot":"","sources":["../../src/lib/paths.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aaricchen1991/n2-cli",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "CLI for server init, nginx config, and SSL certificate management",
5
5
  "type": "module",
6
6
  "bin": {