@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.
- package/README.md +92 -0
- package/assets/deploy/deploy.sh +172 -0
- package/assets/deploy/domains.yaml +18 -0
- package/assets/deploy/lib/common.sh +62 -0
- package/assets/deploy/nginx/n2.conf +162 -0
- package/assets/deploy/server-setup.sh +285 -0
- package/assets/deploy/ssl/README.md +320 -0
- package/assets/deploy/ssl/check-and-setup-ssl.sh +222 -0
- package/assets/deploy/ssl/domains.txt +3 -0
- package/assets/deploy/ssl/renew-ssl.sh +236 -0
- package/assets/deploy/ssl/setup-ssl.sh +474 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +186 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +29 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +134 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/config.test.d.ts +2 -0
- package/dist/commands/config.test.d.ts.map +1 -0
- package/dist/commands/config.test.js +215 -0
- package/dist/commands/config.test.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +106 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +70 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/nginx.d.ts +10 -0
- package/dist/commands/nginx.d.ts.map +1 -0
- package/dist/commands/nginx.js +72 -0
- package/dist/commands/nginx.js.map +1 -0
- package/dist/commands/nginx.test.d.ts +2 -0
- package/dist/commands/nginx.test.d.ts.map +1 -0
- package/dist/commands/nginx.test.js +75 -0
- package/dist/commands/nginx.test.js.map +1 -0
- package/dist/commands/ssl-logs.d.ts +17 -0
- package/dist/commands/ssl-logs.d.ts.map +1 -0
- package/dist/commands/ssl-logs.js +55 -0
- package/dist/commands/ssl-logs.js.map +1 -0
- package/dist/commands/ssl-logs.test.d.ts +2 -0
- package/dist/commands/ssl-logs.test.d.ts.map +1 -0
- package/dist/commands/ssl-logs.test.js +54 -0
- package/dist/commands/ssl-logs.test.js.map +1 -0
- package/dist/commands/ssl.d.ts +16 -0
- package/dist/commands/ssl.d.ts.map +1 -0
- package/dist/commands/ssl.js +105 -0
- package/dist/commands/ssl.js.map +1 -0
- package/dist/commands/ssl.test.d.ts +2 -0
- package/dist/commands/ssl.test.d.ts.map +1 -0
- package/dist/commands/ssl.test.js +95 -0
- package/dist/commands/ssl.test.js.map +1 -0
- package/dist/lib/config-store.d.ts +14 -0
- package/dist/lib/config-store.d.ts.map +1 -0
- package/dist/lib/config-store.js +111 -0
- package/dist/lib/config-store.js.map +1 -0
- package/dist/lib/config-store.test.d.ts +2 -0
- package/dist/lib/config-store.test.d.ts.map +1 -0
- package/dist/lib/config-store.test.js +173 -0
- package/dist/lib/config-store.test.js.map +1 -0
- package/dist/lib/domains.d.ts +37 -0
- package/dist/lib/domains.d.ts.map +1 -0
- package/dist/lib/domains.js +134 -0
- package/dist/lib/domains.js.map +1 -0
- package/dist/lib/domains.test.d.ts +2 -0
- package/dist/lib/domains.test.d.ts.map +1 -0
- package/dist/lib/domains.test.js +141 -0
- package/dist/lib/domains.test.js.map +1 -0
- package/dist/lib/logger.d.ts +19 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +58 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/nginx.d.ts +7 -0
- package/dist/lib/nginx.d.ts.map +1 -0
- package/dist/lib/nginx.js +86 -0
- package/dist/lib/nginx.js.map +1 -0
- package/dist/lib/nginx.test.d.ts +2 -0
- package/dist/lib/nginx.test.d.ts.map +1 -0
- package/dist/lib/nginx.test.js +46 -0
- package/dist/lib/nginx.test.js.map +1 -0
- package/dist/lib/paths.d.ts +13 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +36 -0
- package/dist/lib/paths.js.map +1 -0
- package/dist/lib/paths.test.d.ts +2 -0
- package/dist/lib/paths.test.d.ts.map +1 -0
- package/dist/lib/paths.test.js +52 -0
- package/dist/lib/paths.test.js.map +1 -0
- 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
|
+
}
|