@aaricchen1991/n2-cli 1.0.0

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 (92) hide show
  1. package/README.md +92 -0
  2. package/assets/deploy/deploy.sh +172 -0
  3. package/assets/deploy/domains.yaml +18 -0
  4. package/assets/deploy/lib/common.sh +62 -0
  5. package/assets/deploy/nginx/n2.conf +162 -0
  6. package/assets/deploy/server-setup.sh +285 -0
  7. package/assets/deploy/ssl/README.md +320 -0
  8. package/assets/deploy/ssl/check-and-setup-ssl.sh +222 -0
  9. package/assets/deploy/ssl/domains.txt +3 -0
  10. package/assets/deploy/ssl/renew-ssl.sh +236 -0
  11. package/assets/deploy/ssl/setup-ssl.sh +474 -0
  12. package/dist/cli.d.ts +7 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +186 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/commands/config.d.ts +29 -0
  17. package/dist/commands/config.d.ts.map +1 -0
  18. package/dist/commands/config.js +134 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/config.test.d.ts +2 -0
  21. package/dist/commands/config.test.d.ts.map +1 -0
  22. package/dist/commands/config.test.js +215 -0
  23. package/dist/commands/config.test.js.map +1 -0
  24. package/dist/commands/init.d.ts +10 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +106 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/init.test.d.ts +2 -0
  29. package/dist/commands/init.test.d.ts.map +1 -0
  30. package/dist/commands/init.test.js +70 -0
  31. package/dist/commands/init.test.js.map +1 -0
  32. package/dist/commands/nginx.d.ts +10 -0
  33. package/dist/commands/nginx.d.ts.map +1 -0
  34. package/dist/commands/nginx.js +72 -0
  35. package/dist/commands/nginx.js.map +1 -0
  36. package/dist/commands/nginx.test.d.ts +2 -0
  37. package/dist/commands/nginx.test.d.ts.map +1 -0
  38. package/dist/commands/nginx.test.js +75 -0
  39. package/dist/commands/nginx.test.js.map +1 -0
  40. package/dist/commands/ssl-logs.d.ts +17 -0
  41. package/dist/commands/ssl-logs.d.ts.map +1 -0
  42. package/dist/commands/ssl-logs.js +55 -0
  43. package/dist/commands/ssl-logs.js.map +1 -0
  44. package/dist/commands/ssl-logs.test.d.ts +2 -0
  45. package/dist/commands/ssl-logs.test.d.ts.map +1 -0
  46. package/dist/commands/ssl-logs.test.js +54 -0
  47. package/dist/commands/ssl-logs.test.js.map +1 -0
  48. package/dist/commands/ssl.d.ts +16 -0
  49. package/dist/commands/ssl.d.ts.map +1 -0
  50. package/dist/commands/ssl.js +105 -0
  51. package/dist/commands/ssl.js.map +1 -0
  52. package/dist/commands/ssl.test.d.ts +2 -0
  53. package/dist/commands/ssl.test.d.ts.map +1 -0
  54. package/dist/commands/ssl.test.js +95 -0
  55. package/dist/commands/ssl.test.js.map +1 -0
  56. package/dist/lib/config-store.d.ts +14 -0
  57. package/dist/lib/config-store.d.ts.map +1 -0
  58. package/dist/lib/config-store.js +111 -0
  59. package/dist/lib/config-store.js.map +1 -0
  60. package/dist/lib/config-store.test.d.ts +2 -0
  61. package/dist/lib/config-store.test.d.ts.map +1 -0
  62. package/dist/lib/config-store.test.js +173 -0
  63. package/dist/lib/config-store.test.js.map +1 -0
  64. package/dist/lib/domains.d.ts +37 -0
  65. package/dist/lib/domains.d.ts.map +1 -0
  66. package/dist/lib/domains.js +134 -0
  67. package/dist/lib/domains.js.map +1 -0
  68. package/dist/lib/domains.test.d.ts +2 -0
  69. package/dist/lib/domains.test.d.ts.map +1 -0
  70. package/dist/lib/domains.test.js +141 -0
  71. package/dist/lib/domains.test.js.map +1 -0
  72. package/dist/lib/logger.d.ts +19 -0
  73. package/dist/lib/logger.d.ts.map +1 -0
  74. package/dist/lib/logger.js +58 -0
  75. package/dist/lib/logger.js.map +1 -0
  76. package/dist/lib/nginx.d.ts +7 -0
  77. package/dist/lib/nginx.d.ts.map +1 -0
  78. package/dist/lib/nginx.js +86 -0
  79. package/dist/lib/nginx.js.map +1 -0
  80. package/dist/lib/nginx.test.d.ts +2 -0
  81. package/dist/lib/nginx.test.d.ts.map +1 -0
  82. package/dist/lib/nginx.test.js +46 -0
  83. package/dist/lib/nginx.test.js.map +1 -0
  84. package/dist/lib/paths.d.ts +13 -0
  85. package/dist/lib/paths.d.ts.map +1 -0
  86. package/dist/lib/paths.js +36 -0
  87. package/dist/lib/paths.js.map +1 -0
  88. package/dist/lib/paths.test.d.ts +2 -0
  89. package/dist/lib/paths.test.d.ts.map +1 -0
  90. package/dist/lib/paths.test.js +52 -0
  91. package/dist/lib/paths.test.js.map +1 -0
  92. package/package.json +34 -0
package/README.md ADDED
@@ -0,0 +1,92 @@
1
+ # @n2-devops/cli
2
+
3
+ 服务器部署与运维 CLI(命令 `n2`):服务器初始化、Nginx 配置生成、SSL 证书申请/续期及日志查看。设计为在**部署服务器上**执行(或从本机指定配置生成文件)。
4
+
5
+ 本包位于 monorepo 的 `packages/cli`,根目录说明见 [README](../../README.md)。
6
+
7
+ ## 功能概览
8
+
9
+ | 命令 / 子命令 | 说明 |
10
+ | ------------- | ------------------------------------------------------------------------------------ |
11
+ | `config` | 配置管理:初始化、查看、设置、删除配置项(见下方「配置管理」)。 |
12
+ | `init` | 服务器初始化(幂等):安装 Nginx、创建目录、安装 `deploy.sh`、占位证书。可重复执行。 |
13
+ | `nginx` | 根据域名配置文件生成 Nginx 配置;可选安装到系统并 reload。 |
14
+ | `ssl` | 为配置中的全部域名申请/续期 SSL 证书(acme.sh + 阿里云 DNS),并写入统一日志。 |
15
+ | `ssl-logs` | 查看 SSL 操作日志(创建、续期、成功、失败),支持行数、跟随、按动作/结果过滤。 |
16
+
17
+ ## 安装与使用
18
+
19
+ ### 在 monorepo 内
20
+
21
+ ```bash
22
+ # 根目录
23
+ pnpm install
24
+ pnpm run build
25
+ pnpm run dev:cli -- <command> [options]
26
+ ```
27
+
28
+ 或进入本包:
29
+
30
+ ```bash
31
+ cd packages/cli
32
+ pnpm install
33
+ pnpm run build
34
+ pnpm run cli -- <command> [options]
35
+ ```
36
+
37
+ 默认从 **~/.deploy/config.yaml** 读取配置,也可通过 `-c, --config` 指定路径。
38
+
39
+ ### 发布为 npm 包后
40
+
41
+ ```bash
42
+ npx @n2-devops/cli --help
43
+ npm install -g @n2-devops/cli
44
+ n2 --help
45
+ ```
46
+
47
+ 发布步骤见 [docs/publishing.md](../../docs/publishing.md)。
48
+
49
+ ## 配置文件
50
+
51
+ 默认 **~/.deploy/config.yaml**,格式与包内 `assets/deploy/domains.yaml` 兼容。
52
+
53
+ **示例:**
54
+
55
+ ```yaml
56
+ aliyun_access_key_id: "your_key"
57
+ aliyun_access_key_secret: "your_secret"
58
+
59
+ api:
60
+ backend_port: 3000
61
+
62
+ admin:
63
+ domains:
64
+ - n2-admin.example.com
65
+
66
+ tenant:
67
+ domains:
68
+ - n2-tenant.example.com
69
+
70
+ client:
71
+ domains:
72
+ - n2-client.example.com
73
+ ```
74
+
75
+ ### 配置管理(config)
76
+
77
+ | 子命令 | 说明 |
78
+ | ------ | ---- |
79
+ | `config init` | 初始化配置文件,`-f` 覆盖已存在 |
80
+ | `config list` | 列出所有配置项 |
81
+ | `config get [key]` | 查看配置项 |
82
+ | `config set <key> [values...]` | 设置配置项 |
83
+ | `config delete <key>` | 删除/清空配置项 |
84
+
85
+ ## 命令速览
86
+
87
+ - **init**:`n2 init [-c config] [--scripts-dir path]` — 服务器初始化
88
+ - **nginx**:`n2 nginx [-c config] [-o output] [-i install]` — 生成/安装 Nginx 配置
89
+ - **ssl**:`n2 ssl [-c config] [--ali-key] [--ali-secret] [--log-file] [--scripts-dir]` — SSL 申请/续期
90
+ - **ssl-logs**:`n2 ssl-logs [--log-file] [-n lines] [-f follow] [--action] [--result]` — 查看 SSL 日志
91
+
92
+ 环境变量:`N2_DEPLOY_SCRIPTS_DIR`、`ALIYUN_ACCESS_KEY_ID`、`ALIYUN_ACCESS_KEY_SECRET` 等见根目录 [README](../../README.md) 与 [docs/development-testing.md](../../docs/development-testing.md)。
@@ -0,0 +1,172 @@
1
+ #!/bin/bash
2
+ # 通用部署脚本
3
+ # 使用方法: deploy.sh <app_name> [version]
4
+ # 示例: deploy.sh tools fcba3e21
5
+ # deploy.sh website 20240101
6
+
7
+ set -e
8
+
9
+ APP_NAME=${1}
10
+ VERSION=${2:-$(date +%Y%m%d%H%M%S)}
11
+
12
+ if [ -z "$APP_NAME" ]; then
13
+ echo "错误: 请指定应用名称 (admin, tenant, client, tools, website)" >&2
14
+ echo "使用方法: $0 <app_name> [version]" >&2
15
+ exit 1
16
+ fi
17
+
18
+ DEPLOY_DIR="/var/www/${APP_NAME}"
19
+ BACKUP_DIR="/var/www/backups/${APP_NAME}"
20
+ TEMP_DIR="/tmp/deploy-${APP_NAME}"
21
+ ARCHIVE_FILE="${TEMP_DIR}/${APP_NAME}-dist.tar.gz"
22
+ NEW_DEPLOY_DIR="${DEPLOY_DIR}-new"
23
+ OLD_DEPLOY_DIR="${DEPLOY_DIR}-old"
24
+
25
+ # 颜色输出
26
+ RED='\033[0;31m'
27
+ GREEN='\033[0;32m'
28
+ YELLOW='\033[1;33m'
29
+ NC='\033[0m' # No Color
30
+
31
+ log() {
32
+ echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
33
+ }
34
+
35
+ error() {
36
+ echo -e "${RED}[ERROR]${NC} $1" >&2
37
+ }
38
+
39
+ warning() {
40
+ echo -e "${YELLOW}[WARNING]${NC} $1"
41
+ }
42
+
43
+ # 检测 Nginx 用户组
44
+ detect_nginx_user() {
45
+ # 优先检测 nginx 用户(Alibaba Cloud Linux 3 / CentOS/RHEL)
46
+ if id nginx >/dev/null 2>&1; then
47
+ NGINX_USER="nginx"
48
+ NGINX_GROUP="nginx"
49
+ # 其次检测 www-data 用户(Ubuntu/Debian)
50
+ elif id www-data >/dev/null 2>&1; then
51
+ NGINX_USER="www-data"
52
+ NGINX_GROUP="www-data"
53
+ else
54
+ # 默认使用 nginx(Alibaba Cloud Linux 3 兼容)
55
+ warning "无法检测 Nginx 用户,使用默认值: nginx"
56
+ NGINX_USER="nginx"
57
+ NGINX_GROUP="nginx"
58
+ fi
59
+ }
60
+
61
+ # 检测 Nginx 用户组
62
+ detect_nginx_user
63
+
64
+ # 检查归档文件是否存在
65
+ if [ ! -f "$ARCHIVE_FILE" ]; then
66
+ error "归档文件不存在: $ARCHIVE_FILE"
67
+ exit 1
68
+ fi
69
+
70
+ log "开始部署 ${APP_NAME} (版本: ${VERSION})"
71
+
72
+ # 创建必要的目录
73
+ mkdir -p "$DEPLOY_DIR" "$BACKUP_DIR" "$TEMP_DIR"
74
+
75
+ # 解压到临时目录
76
+ log "解压部署包..."
77
+ rm -rf "$NEW_DEPLOY_DIR"
78
+ mkdir -p "$NEW_DEPLOY_DIR"
79
+ tar -xzf "$ARCHIVE_FILE" -C "$NEW_DEPLOY_DIR"
80
+
81
+ # 验证部署文件
82
+ if [ ! -f "$NEW_DEPLOY_DIR/index.html" ]; then
83
+ error "部署文件验证失败: index.html 不存在"
84
+ rm -rf "$NEW_DEPLOY_DIR"
85
+ exit 1
86
+ fi
87
+
88
+ # 备份当前版本(如果存在)
89
+ if [ -d "$DEPLOY_DIR" ] && [ "$(ls -A $DEPLOY_DIR)" ]; then
90
+ log "备份当前版本..."
91
+ BACKUP_FILE="${BACKUP_DIR}/backup-${VERSION}-$(date +%Y%m%d%H%M%S).tar.gz"
92
+ tar -czf "$BACKUP_FILE" -C "$DEPLOY_DIR" .
93
+ log "备份完成: $BACKUP_FILE"
94
+
95
+ # 保留最近 5 个备份
96
+ ls -t "$BACKUP_DIR"/*.tar.gz 2>/dev/null | tail -n +6 | xargs rm -f 2>/dev/null || true
97
+ fi
98
+
99
+ # 原子性切换:先移动到 old,再移动 new 到正式目录
100
+ log "执行原子性切换..."
101
+ if [ -d "$DEPLOY_DIR" ]; then
102
+ rm -rf "$OLD_DEPLOY_DIR"
103
+ mv "$DEPLOY_DIR" "$OLD_DEPLOY_DIR"
104
+ fi
105
+
106
+ mv "$NEW_DEPLOY_DIR" "$DEPLOY_DIR"
107
+
108
+ # 设置正确的权限
109
+ log "设置文件权限 (用户组: ${NGINX_USER}:${NGINX_GROUP})..."
110
+ chown -R ${NGINX_USER}:${NGINX_GROUP} "$DEPLOY_DIR"
111
+ chmod -R 755 "$DEPLOY_DIR"
112
+
113
+ # 清理旧版本
114
+ if [ -d "$OLD_DEPLOY_DIR" ]; then
115
+ log "清理旧版本..."
116
+ rm -rf "$OLD_DEPLOY_DIR"
117
+ fi
118
+
119
+ # 清理临时文件
120
+ rm -f "$ARCHIVE_FILE"
121
+
122
+ # 重新加载 Nginx(不重启,避免影响其他服务)
123
+ log "重新加载 Nginx 配置..."
124
+ # 优先使用 systemctl(更稳健,处理 PID 文件问题)
125
+ if command -v systemctl >/dev/null 2>&1 && systemctl is-active --quiet nginx 2>/dev/null; then
126
+ # Nginx 正在运行,使用 systemctl reload
127
+ if systemctl reload nginx >/dev/null 2>&1; then
128
+ log "Nginx 重新加载成功"
129
+ else
130
+ warning "Nginx 重新加载失败,但部署已完成"
131
+ fi
132
+ elif command -v systemctl >/dev/null 2>&1; then
133
+ # Nginx 未运行,尝试启动
134
+ if systemctl start nginx >/dev/null 2>&1; then
135
+ log "Nginx 启动成功"
136
+ else
137
+ warning "Nginx 启动失败,但部署已完成"
138
+ fi
139
+ else
140
+ # 回退到直接使用 nginx 命令
141
+ NGINX_CMD=$(command -v nginx || echo "/usr/sbin/nginx")
142
+ if [ -x "$NGINX_CMD" ]; then
143
+ # 先测试配置
144
+ if $NGINX_CMD -t >/dev/null 2>&1; then
145
+ # 检查 nginx 是否在运行
146
+ if pgrep -x nginx >/dev/null 2>&1; then
147
+ # 如果运行,尝试重载
148
+ if $NGINX_CMD -s reload >/dev/null 2>&1; then
149
+ log "Nginx 重新加载成功"
150
+ else
151
+ warning "Nginx 重新加载失败,但部署已完成"
152
+ fi
153
+ else
154
+ # 如果未运行,尝试启动
155
+ if $NGINX_CMD >/dev/null 2>&1; then
156
+ log "Nginx 启动成功"
157
+ else
158
+ warning "Nginx 启动失败,但部署已完成"
159
+ fi
160
+ fi
161
+ else
162
+ error "Nginx 配置测试失败"
163
+ exit 1
164
+ fi
165
+ else
166
+ warning "无法找到 nginx 命令,跳过 Nginx 重载"
167
+ fi
168
+ fi
169
+
170
+ log "部署完成: ${APP_NAME} (版本: ${VERSION})"
171
+ log "部署目录: $DEPLOY_DIR"
172
+
@@ -0,0 +1,18 @@
1
+ # N2 端口与域名映射(唯一数据源)
2
+ # 用于生成 nginx n2.conf 与 SSL 域名列表(domains.txt)
3
+ # 后端与前端同域:各应用域名下 /api 代理到后端,不再为 API 单独配置域名与 SSL
4
+
5
+ api:
6
+ backend_port: 3000
7
+
8
+ admin:
9
+ domains:
10
+ - n2-admin.cdqxtech.com
11
+
12
+ tenant:
13
+ domains:
14
+ - n2-tenant.cdqxtech.com
15
+
16
+ client:
17
+ domains:
18
+ - n2-client.cdqxtech.com
@@ -0,0 +1,62 @@
1
+ # 部署脚本公共函数与变量
2
+ # 被 server-setup / ssl 脚本通过 source 引入
3
+ # 使用前需设置 SCRIPT_DIR 或通过 get_domains_file 查找 domains.txt
4
+
5
+ # 颜色输出
6
+ RED='\033[0;31m'
7
+ GREEN='\033[0;32m'
8
+ YELLOW='\033[1;33m'
9
+ NC='\033[0m'
10
+
11
+ log() {
12
+ echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
13
+ }
14
+
15
+ error() {
16
+ echo -e "${RED}[ERROR]${NC} $1" >&2
17
+ }
18
+
19
+ warning() {
20
+ echo -e "${YELLOW}[WARNING]${NC} $1"
21
+ }
22
+
23
+ # 解析域名列表文件路径(domains.txt,与 domains.yaml 生成结果一致)
24
+ # 优先使用环境变量 DOMAINS_FILE,否则按部署位置查找
25
+ get_domains_file() {
26
+ if [ -n "$DOMAINS_FILE" ] && [ -f "$DOMAINS_FILE" ]; then
27
+ echo "$DOMAINS_FILE"
28
+ return 0
29
+ fi
30
+ if [ -f "/opt/ssl/domains.txt" ]; then
31
+ echo "/opt/ssl/domains.txt"
32
+ return 0
33
+ fi
34
+ if [ -f "/tmp/server-init/ssl/domains.txt" ]; then
35
+ echo "/tmp/server-init/ssl/domains.txt"
36
+ return 0
37
+ fi
38
+ local script_dir
39
+ # 当前执行的脚本(可能是 check-and-setup-ssl.sh 或 renew-ssl.sh)所在目录
40
+ script_dir="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" 2>/dev/null && pwd)"
41
+ if [ -n "$script_dir" ] && [ -f "${script_dir}/domains.txt" ]; then
42
+ echo "${script_dir}/domains.txt"
43
+ return 0
44
+ fi
45
+ if [ -n "$script_dir" ] && [ -f "${script_dir}/../ssl/domains.txt" ]; then
46
+ echo "${script_dir}/../ssl/domains.txt"
47
+ return 0
48
+ fi
49
+ return 1
50
+ }
51
+
52
+ # 输出域名列表(每行一个),跳过空行与注释
53
+ read_domains_list() {
54
+ local f
55
+ f=$(get_domains_file) || return 1
56
+ while IFS= read -r line || [ -n "$line" ]; do
57
+ line=$(echo "$line" | tr -d '\r')
58
+ [ -z "$line" ] && continue
59
+ echo "$line" | grep -q '^#' && continue
60
+ echo "$line"
61
+ done < "$f"
62
+ }
@@ -0,0 +1,162 @@
1
+ # HTTPS - admin (n2-admin.cdqxtech.com),/api 代理到后端
2
+ server {
3
+ listen 443 ssl http2;
4
+ server_name n2-admin.cdqxtech.com;
5
+
6
+ root /var/www/admin;
7
+ index index.html;
8
+
9
+ ssl_certificate /etc/nginx/ssl/n2-admin.cdqxtech.com.crt;
10
+ ssl_certificate_key /etc/nginx/ssl/n2-admin.cdqxtech.com.key;
11
+
12
+ ssl_protocols TLSv1.2 TLSv1.3;
13
+ ssl_ciphers HIGH:!aNULL:!MD5;
14
+ ssl_prefer_server_ciphers on;
15
+ ssl_session_cache shared:SSL:10m;
16
+ ssl_session_timeout 10m;
17
+
18
+ access_log /var/log/nginx/admin-access.log;
19
+ error_log /var/log/nginx/admin-error.log;
20
+
21
+ # 后端接口:优先匹配 /api,与前端同域
22
+ location /api {
23
+ proxy_pass http://127.0.0.1:3000;
24
+ proxy_http_version 1.1;
25
+ proxy_set_header Host $host;
26
+ proxy_set_header X-Real-IP $remote_addr;
27
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
28
+ proxy_set_header X-Forwarded-Proto $scheme;
29
+ }
30
+
31
+ gzip on;
32
+ gzip_vary on;
33
+ gzip_min_length 1024;
34
+ gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
35
+
36
+ location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot|mp3)$ {
37
+ expires 1y;
38
+ add_header Cache-Control "public, immutable";
39
+ access_log off;
40
+ }
41
+
42
+ location / {
43
+ try_files $uri $uri/ /index.html;
44
+ }
45
+
46
+ add_header X-Frame-Options "SAMEORIGIN" always;
47
+ add_header X-Content-Type-Options "nosniff" always;
48
+ add_header X-XSS-Protection "1; mode=block" always;
49
+ add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
50
+ }
51
+
52
+
53
+ # HTTPS - tenant (n2-tenant.cdqxtech.com),/api 代理到后端
54
+ server {
55
+ listen 443 ssl http2;
56
+ server_name n2-tenant.cdqxtech.com;
57
+
58
+ root /var/www/tenant;
59
+ index index.html;
60
+
61
+ ssl_certificate /etc/nginx/ssl/n2-tenant.cdqxtech.com.crt;
62
+ ssl_certificate_key /etc/nginx/ssl/n2-tenant.cdqxtech.com.key;
63
+
64
+ ssl_protocols TLSv1.2 TLSv1.3;
65
+ ssl_ciphers HIGH:!aNULL:!MD5;
66
+ ssl_prefer_server_ciphers on;
67
+ ssl_session_cache shared:SSL:10m;
68
+ ssl_session_timeout 10m;
69
+
70
+ access_log /var/log/nginx/tenant-access.log;
71
+ error_log /var/log/nginx/tenant-error.log;
72
+
73
+ # 后端接口:优先匹配 /api,与前端同域
74
+ location /api {
75
+ proxy_pass http://127.0.0.1:3000;
76
+ proxy_http_version 1.1;
77
+ proxy_set_header Host $host;
78
+ proxy_set_header X-Real-IP $remote_addr;
79
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
80
+ proxy_set_header X-Forwarded-Proto $scheme;
81
+ }
82
+
83
+ gzip on;
84
+ gzip_vary on;
85
+ gzip_min_length 1024;
86
+ gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
87
+
88
+ location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot|mp3)$ {
89
+ expires 1y;
90
+ add_header Cache-Control "public, immutable";
91
+ access_log off;
92
+ }
93
+
94
+ location / {
95
+ try_files $uri $uri/ /index.html;
96
+ }
97
+
98
+ add_header X-Frame-Options "SAMEORIGIN" always;
99
+ add_header X-Content-Type-Options "nosniff" always;
100
+ add_header X-XSS-Protection "1; mode=block" always;
101
+ add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
102
+ }
103
+
104
+
105
+ # HTTPS - client (n2-client.cdqxtech.com),/api 代理到后端
106
+ server {
107
+ listen 443 ssl http2;
108
+ server_name n2-client.cdqxtech.com;
109
+
110
+ root /var/www/client;
111
+ index index.html;
112
+
113
+ ssl_certificate /etc/nginx/ssl/n2-client.cdqxtech.com.crt;
114
+ ssl_certificate_key /etc/nginx/ssl/n2-client.cdqxtech.com.key;
115
+
116
+ ssl_protocols TLSv1.2 TLSv1.3;
117
+ ssl_ciphers HIGH:!aNULL:!MD5;
118
+ ssl_prefer_server_ciphers on;
119
+ ssl_session_cache shared:SSL:10m;
120
+ ssl_session_timeout 10m;
121
+
122
+ access_log /var/log/nginx/client-access.log;
123
+ error_log /var/log/nginx/client-error.log;
124
+
125
+ # 后端接口:优先匹配 /api,与前端同域
126
+ location /api {
127
+ proxy_pass http://127.0.0.1:3000;
128
+ proxy_http_version 1.1;
129
+ proxy_set_header Host $host;
130
+ proxy_set_header X-Real-IP $remote_addr;
131
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
132
+ proxy_set_header X-Forwarded-Proto $scheme;
133
+ }
134
+
135
+ gzip on;
136
+ gzip_vary on;
137
+ gzip_min_length 1024;
138
+ gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
139
+
140
+ location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot|mp3)$ {
141
+ expires 1y;
142
+ add_header Cache-Control "public, immutable";
143
+ access_log off;
144
+ }
145
+
146
+ location / {
147
+ try_files $uri $uri/ /index.html;
148
+ }
149
+
150
+ add_header X-Frame-Options "SAMEORIGIN" always;
151
+ add_header X-Content-Type-Options "nosniff" always;
152
+ add_header X-XSS-Protection "1; mode=block" always;
153
+ add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
154
+ }
155
+
156
+
157
+ # HTTP to HTTPS redirect
158
+ server {
159
+ listen 80;
160
+ server_name n2-admin.cdqxtech.com n2-tenant.cdqxtech.com n2-client.cdqxtech.com;
161
+ return 301 https://$host$request_uri;
162
+ }