speccore 8.3.290 → 8.3.296

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 (101) hide show
  1. package/README.en.md +16 -3
  2. package/README.md +9 -7
  3. package/dist/cli.js +11 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/about.d.ts.map +1 -1
  6. package/dist/commands/about.js +5 -0
  7. package/dist/commands/about.js.map +1 -1
  8. package/dist/commands/analyze.d.ts.map +1 -1
  9. package/dist/commands/analyze.js +77 -5
  10. package/dist/commands/analyze.js.map +1 -1
  11. package/dist/commands/ask.js +2 -2
  12. package/dist/commands/ask.js.map +1 -1
  13. package/dist/commands/execute.js +1 -0
  14. package/dist/commands/execute.js.map +1 -1
  15. package/dist/commands/init.d.ts.map +1 -1
  16. package/dist/commands/init.js +25 -4
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/commands/iteration/taskify.d.ts.map +1 -1
  19. package/dist/commands/iteration/taskify.js +132 -7
  20. package/dist/commands/iteration/taskify.js.map +1 -1
  21. package/dist/commands/status-panel.d.ts +1 -0
  22. package/dist/commands/status-panel.d.ts.map +1 -1
  23. package/dist/commands/status-panel.js +65 -17
  24. package/dist/commands/status-panel.js.map +1 -1
  25. package/dist/commands/update-env-configs.d.ts.map +1 -1
  26. package/dist/commands/update-env-configs.js +6 -0
  27. package/dist/commands/update-env-configs.js.map +1 -1
  28. package/dist/commands/verify.d.ts.map +1 -1
  29. package/dist/commands/verify.js +78 -1
  30. package/dist/commands/verify.js.map +1 -1
  31. package/dist/core/deploy/engine.d.ts +11 -0
  32. package/dist/core/deploy/engine.d.ts.map +1 -1
  33. package/dist/core/deploy/engine.js +35 -7
  34. package/dist/core/deploy/engine.js.map +1 -1
  35. package/dist/core/git-integration.d.ts +2 -1
  36. package/dist/core/git-integration.d.ts.map +1 -1
  37. package/dist/core/git-integration.js +38 -14
  38. package/dist/core/git-integration.js.map +1 -1
  39. package/dist/core/global-counters.d.ts +3 -0
  40. package/dist/core/global-counters.d.ts.map +1 -1
  41. package/dist/core/global-counters.js +3 -1
  42. package/dist/core/global-counters.js.map +1 -1
  43. package/dist/core/prompt-builder.d.ts.map +1 -1
  44. package/dist/core/prompt-builder.js +7 -6
  45. package/dist/core/prompt-builder.js.map +1 -1
  46. package/dist/core/spec-paths.d.ts.map +1 -1
  47. package/dist/core/spec-paths.js +3 -0
  48. package/dist/core/spec-paths.js.map +1 -1
  49. package/dist/core/spec-skeleton.d.ts.map +1 -1
  50. package/dist/core/spec-skeleton.js +6 -2
  51. package/dist/core/spec-skeleton.js.map +1 -1
  52. package/dist/core/state.d.ts +11 -0
  53. package/dist/core/state.d.ts.map +1 -1
  54. package/dist/core/state.js +33 -2
  55. package/dist/core/state.js.map +1 -1
  56. package/dist/core/ui-verify/index.d.ts +2 -2
  57. package/dist/core/ui-verify/index.d.ts.map +1 -1
  58. package/dist/core/ui-verify/index.js +3 -1
  59. package/dist/core/ui-verify/index.js.map +1 -1
  60. package/dist/core/ui-verify/smoke-engine.d.ts.map +1 -1
  61. package/dist/core/ui-verify/smoke-engine.js +36 -0
  62. package/dist/core/ui-verify/smoke-engine.js.map +1 -1
  63. package/dist/core/ui-verify/spec-generator.d.ts +32 -1
  64. package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
  65. package/dist/core/ui-verify/spec-generator.js +205 -21
  66. package/dist/core/ui-verify/spec-generator.js.map +1 -1
  67. package/dist/core/ui-verify/types.d.ts +2 -0
  68. package/dist/core/ui-verify/types.d.ts.map +1 -1
  69. package/package.json +3 -2
  70. package/templates/api-design-example.md +338 -0
  71. package/templates/ci/github-actions.yml +44 -0
  72. package/templates/database-example.md +223 -0
  73. package/templates/deploy-docker/README.md +296 -0
  74. package/templates/deploy-docker/backend-node.Dockerfile +52 -0
  75. package/templates/deploy-docker/deploy-remote.sh +79 -0
  76. package/templates/deploy-docker/docker-compose.yml +113 -0
  77. package/templates/deploy-docker/frontend.Dockerfile +43 -0
  78. package/templates/deploy-docker/nginx.conf +30 -0
  79. package/templates/deploy-examples.yaml +511 -0
  80. package/templates/deploy-java/Dockerfile +50 -0
  81. package/templates/deploy-java/README.md +212 -0
  82. package/templates/deploy-java/deploy.sh +120 -0
  83. package/templates/deploy-java/spring-boot.service +35 -0
  84. package/templates/deploy-nginx/README.md +59 -0
  85. package/templates/deploy-nginx/nginx-site.conf +103 -0
  86. package/templates/deploy-scripts/README.md +61 -0
  87. package/templates/deploy-scripts/deploy-compose.sh +19 -0
  88. package/templates/deploy-scripts/deploy-ftp.sh +28 -0
  89. package/templates/deploy-scripts/deploy-password-ssh.sh +26 -0
  90. package/templates/deploy-scripts/deploy-python.sh +30 -0
  91. package/templates/deploy-scripts/trigger-jenkins.sh +30 -0
  92. package/templates/html/speccore-ask-explain.html +10 -0
  93. package/templates/html/speccore-ask-guide.html +10 -0
  94. package/templates/html/speccore-ask-match.html +10 -0
  95. package/templates/html/speccore-ask-pipeline.html +1 -0
  96. package/templates/html/speccore-ask-result.html +10 -0
  97. package/templates/html/speccore-help.html +241 -0
  98. package/templates/html/speccore-setup-guide.html +289 -0
  99. package/templates/security-example.md +226 -0
  100. package/templates/speccore-yml-example.yml +222 -0
  101. package/templates/verify-spec-example.yaml +142 -0
@@ -0,0 +1,296 @@
1
+ # Docker 部署指南
2
+
3
+ > 本目录提供前后端 Docker 部署的模板和示例,涵盖本地构建、镜像仓库推送、远程服务器拉取运行全流程。
4
+
5
+ ---
6
+
7
+ ## 目录结构
8
+
9
+ ```
10
+ deploy-docker/
11
+ ├── frontend.Dockerfile # 前端 Nginx 多阶段构建示例
12
+ ├── backend-node.Dockerfile # Node.js 后端多阶段构建示例(Express/NestJS/Koa)
13
+ ├── nginx.conf # Nginx 自定义配置(SPA 路由 + API 代理 + 静态缓存)
14
+ ├── docker-compose.yml # 前后端 + MySQL + Redis 编排示例
15
+ ├── deploy-remote.sh # 服务器端 Docker 部署脚本
16
+ └── README.md # 本文件
17
+ ```
18
+
19
+ > Java 后端 Dockerfile 见 `templates/deploy-java/Dockerfile`;
20
+ > 纯服务器 Nginx 站点配置(非容器)见 `templates/deploy-nginx/nginx-site.conf`。
21
+
22
+ ---
23
+
24
+ ## 核心问题解答
25
+
26
+ ### Q1: Docker 部署是否需要上传文件?
27
+
28
+ **不需要传统意义上的 SCP 文件上传**,但有三种等价的"文件传输"方式:
29
+
30
+ | 方式 | 说明 | 适用场景 |
31
+ |------|------|----------|
32
+ | **镜像仓库**(推荐) | `docker build` → `docker push` → 远程 `docker pull` | 有私有 registry(Harbor/Nexus/阿里云 ACR) |
33
+ | **docker save + scp** | `docker save` 导出 tar → scp 到服务器 → `docker load` | 无 registry 的内网环境 |
34
+ | **远程 build** | SSH 到服务器,在服务器上 `docker build` | 服务器性能强于本地 |
35
+
36
+ speccore `docker` 类型默认采用**镜像仓库方式**(推荐)。
37
+
38
+ ### Q2: 远程服务器上如何部署?
39
+
40
+ speccore `docker` 类型现已支持 `host` 字段,部署流程如下:
41
+
42
+ ```yaml
43
+ deploy:
44
+ staging:
45
+ type: docker
46
+ dockerfile: ./Dockerfile
47
+ registry: registry.example.com # 镜像仓库(远程部署必填)
48
+ image: my-project/order-service
49
+ tag: staging
50
+ host: deployer@staging-server.com # 远程服务器(新增支持)
51
+ key: ~/.ssh/id_rsa
52
+ # script: 自定义远程命令(可选,默认执行 pull → stop → rm → run)
53
+ ```
54
+
55
+ 执行流程:
56
+ 1. **本地** `docker build`
57
+ 2. **本地** `docker push registry.example.com/my-project/order-service:staging`
58
+ 3. **SSH 远程** `docker pull && docker stop && docker rm && docker run`
59
+
60
+ ### Q3: 前端 + 后端都有 Docker,怎么一起部署?
61
+
62
+ **方式 A:分别部署(推荐,解耦前后端发布节奏)**
63
+
64
+ ```yaml
65
+ # PROJECT.yaml
66
+ platforms:
67
+ - name: admin-web
68
+ type: frontend
69
+ code_path: ./admin-web
70
+ deploy:
71
+ staging:
72
+ type: docker
73
+ dockerfile: ./Dockerfile
74
+ registry: registry.example.com
75
+ image: my-project/admin-web
76
+ tag: staging
77
+ host: deployer@staging-server.com
78
+ key: ~/.ssh/id_rsa
79
+ # 自定义端口映射
80
+ script: "docker pull registry.example.com/my-project/admin-web:staging && docker stop admin-web 2>/dev/null; docker rm admin-web 2>/dev/null; docker run -d --name admin-web --restart always -p 80:80 registry.example.com/my-project/admin-web:staging"
81
+
82
+ - name: order-service
83
+ type: backend
84
+ code_path: ./order-service
85
+ deploy:
86
+ staging:
87
+ type: docker
88
+ dockerfile: ./Dockerfile
89
+ registry: registry.example.com
90
+ image: my-project/order-service
91
+ tag: staging
92
+ host: deployer@staging-server.com
93
+ key: ~/.ssh/id_rsa
94
+ script: "docker pull registry.example.com/my-project/order-service:staging && docker stop order-service 2>/dev/null; docker rm order-service 2>/dev/null; docker run -d --name order-service --restart always -p 8080:8080 registry.example.com/my-project/order-service:staging"
95
+ ```
96
+
97
+ 分别执行:
98
+ ```bash
99
+ speccore deploy --env staging --platform admin-web
100
+ speccore deploy --env staging --platform order-service
101
+ ```
102
+
103
+ **方式 B:Docker Compose 统一部署**
104
+
105
+ 将 `docker-compose.yml` 放到服务器,speccore 负责 push 镜像,服务器端执行 compose:
106
+
107
+ ```yaml
108
+ # PROJECT.yaml
109
+ platforms:
110
+ - name: fullstack
111
+ type: infra
112
+ code_path: ./infra/docker
113
+ deploy:
114
+ staging:
115
+ type: script
116
+ script: ./scripts/deploy-compose.sh
117
+ ```
118
+
119
+ ```bash
120
+ # scripts/deploy-compose.sh(在服务器上执行)
121
+ docker-compose -f /opt/deploy/docker-compose.yml pull
122
+ docker-compose -f /opt/deploy/docker-compose.yml up -d
123
+ ```
124
+
125
+ ---
126
+
127
+ ## 各文件说明
128
+
129
+ ### frontend.Dockerfile
130
+
131
+ 前端多阶段构建:
132
+ - **阶段 1**(Node):`npm ci && npm run build`
133
+ - **阶段 2**(Nginx):托管 `dist/` 静态资源
134
+
135
+ 支持通过 `BUILD_ENV` 构建参数切换环境:
136
+ ```bash
137
+ docker build --build-arg BUILD_ENV=staging -t admin-web:staging .
138
+ ```
139
+
140
+ ### backend-node.Dockerfile
141
+
142
+ Node.js 后端多阶段构建(Express / NestJS / Koa):
143
+ - **阶段 1**(Node):`npm ci && npm run build`
144
+ - **阶段 2**(Node):仅生产依赖 + `dist/`,非 root 用户运行
145
+
146
+ 内置健康检查(`/healthz`,按实际路由调整),与 docker-compose 的 healthcheck 联动。
147
+
148
+ ### nginx.conf
149
+
150
+ - SPA 路由回退(`try_files`)
151
+ - 静态资源长期缓存
152
+ - `/api/` 代理到后端容器
153
+
154
+ ### docker-compose.yml
155
+
156
+ 完整编排示例,包含:
157
+ - `frontend`(Nginx)
158
+ - `backend`(Spring Boot / Node)
159
+ - `mysql`(数据库,可选)
160
+ - `redis`(缓存,可选)
161
+
162
+ 通过 `.env` 文件注入敏感配置:
163
+ ```bash
164
+ # .env
165
+ REGISTRY=registry.example.com
166
+ TAG=staging
167
+ PROFILE=staging
168
+ DB_PASSWORD=your-db-pass
169
+ REDIS_PASSWORD=your-redis-pass
170
+ ```
171
+
172
+ ### deploy-remote.sh
173
+
174
+ 服务器端容器管理脚本:
175
+ - 拉取最新镜像
176
+ - 停止并删除旧容器
177
+ - 清理旧镜像(保留最近 3 个标签)
178
+ - 启动新容器
179
+ - 状态检查
180
+
181
+ ---
182
+
183
+ ## 快速开始
184
+
185
+ ### 场景 1:前端 Docker 部署到远程服务器
186
+
187
+ ```bash
188
+ # 1. 复制 Dockerfile
189
+ cp templates/deploy-docker/frontend.Dockerfile admin-web/Dockerfile
190
+ cp templates/deploy-docker/nginx.conf admin-web/nginx.conf
191
+
192
+ # 2. 配置 PROJECT.yaml
193
+ # type: docker, host: 服务器地址, registry: 镜像仓库
194
+
195
+ # 3. 部署
196
+ speccore deploy --env staging --platform admin-web
197
+ ```
198
+
199
+ ### 场景 2:后端 Java Docker 部署
200
+
201
+ 见 `templates/deploy-java/Dockerfile`(已包含多阶段构建)。
202
+
203
+ ### 场景 3:前后端 + 数据库一次性启动
204
+
205
+ ```bash
206
+ # 在服务器上
207
+ scp templates/deploy-docker/docker-compose.yml deployer@server:/opt/deploy/
208
+ scp templates/deploy-docker/.env deployer@server:/opt/deploy/
209
+
210
+ ssh deployer@server "cd /opt/deploy && docker-compose up -d"
211
+ ```
212
+
213
+ ---
214
+
215
+ ## 数据库 / Redis 配置
216
+
217
+ ### 方式 1:独立数据库(推荐生产环境)
218
+
219
+ 数据库和 Redis 由运维独立维护,应用通过环境变量连接:
220
+
221
+ ```yaml
222
+ # docker-compose.yml 中 backend 的 environment
223
+ - DB_HOST=prod-mysql.internal
224
+ - DB_PORT=3306
225
+ - DB_NAME=order_db
226
+ - DB_USER=order_user
227
+ - DB_PASS=${DB_PASSWORD}
228
+ - REDIS_HOST=prod-redis.internal
229
+ - REDIS_PORT=6379
230
+ ```
231
+
232
+ ### 方式 2:Docker Compose 内置数据库(推荐测试环境)
233
+
234
+ 直接使用 `docker-compose.yml` 中的 `mysql` 和 `redis` 服务,应用通过服务名连接:
235
+
236
+ ```yaml
237
+ # backend 的 environment
238
+ - DB_HOST=mysql # Docker 网络内服务名即主机名
239
+ - REDIS_HOST=redis
240
+ ```
241
+
242
+ ### 方式 3:Spring Boot 多环境配置
243
+
244
+ ```yaml
245
+ # src/main/resources/application-staging.yml
246
+ spring:
247
+ datasource:
248
+ url: jdbc:mysql://${DB_HOST:mysql}:${DB_PORT:3306}/${DB_NAME:order_db}
249
+ username: ${DB_USER:root}
250
+ password: ${DB_PASS:}
251
+ data:
252
+ redis:
253
+ host: ${REDIS_HOST:redis}
254
+ port: ${REDIS_PORT:6379}
255
+ password: ${REDIS_PASS:}
256
+ ```
257
+
258
+ ---
259
+
260
+ ## 常见问题
261
+
262
+ **Q: 没有镜像仓库怎么办?**
263
+
264
+ 使用 `docker save + scp + docker load`:
265
+
266
+ ```bash
267
+ # 本地
268
+ docker build -t order-service:staging .
269
+ docker save order-service:staging | gzip > order-service-staging.tar.gz
270
+ scp order-service-staging.tar.gz deployer@server:/tmp/
271
+
272
+ # 远程
273
+ ssh deployer@server "gunzip -c /tmp/order-service-staging.tar.gz | docker load"
274
+ ssh deployer@server "docker stop order-service; docker rm order-service; docker run -d --name order-service -p 8080:8080 order-service:staging"
275
+ ```
276
+
277
+ 或改用 `script` 类型,将上述命令写入脚本由 speccore 执行。
278
+
279
+ **Q: 如何查看远程容器日志?**
280
+
281
+ ```bash
282
+ ssh deployer@server "docker logs -f order-service --tail 100"
283
+ ```
284
+
285
+ **Q: 如何回滚?**
286
+
287
+ ```bash
288
+ # 重新部署上一个标签
289
+ speccore deploy --env staging --platform order-service --skip-build
290
+ # 然后手动在服务器上 docker run 指定旧标签
291
+ ```
292
+
293
+ 或保留多个标签版本:
294
+ ```bash
295
+ ssh deployer@server "docker stop order-service; docker rm order-service; docker run -d --name order-service order-service:v1.2.3"
296
+ ```
@@ -0,0 +1,52 @@
1
+ # ═══════════════════════════════════════════════════════════
2
+ # Node.js 后端 Docker 多阶段构建示例(Express / NestJS / Koa)
3
+ # ═══════════════════════════════════════════════════════════
4
+ #
5
+ # 用法:
6
+ # 1. 将本文件复制到后端工程根目录,重命名为 Dockerfile
7
+ # 2. 在 PROJECT.yaml 中配置 docker 类型部署:
8
+ # type: docker
9
+ # dockerfile: ./Dockerfile
10
+ # registry: <镜像仓库>
11
+ # image: <镜像名>
12
+ # tag: staging
13
+ # 3. 执行: speccore deploy --env staging --platform <后端端名>
14
+ #
15
+ # 多阶段构建:Node 编译 → 精简运行镜像
16
+ # ═══════════════════════════════════════════════════════════
17
+
18
+ # ── 阶段 1:依赖安装 + 构建 ──
19
+ FROM node:20-alpine AS builder
20
+ WORKDIR /app
21
+
22
+ # 先复制依赖文件(利用 Docker 缓存层)
23
+ COPY package*.json ./
24
+ RUN npm ci
25
+
26
+ # 复制源码并构建
27
+ COPY . .
28
+ RUN npm run build
29
+
30
+ # ── 阶段 2:运行(只装生产依赖,镜像更小)──
31
+ FROM node:20-alpine
32
+ WORKDIR /app
33
+
34
+ ENV NODE_ENV=production
35
+
36
+ # 复制依赖与构建产物
37
+ COPY --from=builder /app/package*.json ./
38
+ RUN npm ci --omit=dev
39
+ COPY --from=builder /app/dist ./dist
40
+
41
+ # 非 root 用户运行(安全最佳实践)
42
+ RUN addgroup -S app && adduser -S app -G app
43
+ USER app
44
+
45
+ # 健康检查(按实际端口调整,Express 项目可用 /healthz 路由)
46
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
47
+ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/healthz || exit 1
48
+
49
+ EXPOSE 3000
50
+
51
+ # 启动命令(按实际入口调整,如 dist/main.js、dist/server.js)
52
+ CMD ["node", "dist/main.js"]
@@ -0,0 +1,79 @@
1
+ #!/bin/bash
2
+ # ═══════════════════════════════════════════════════════════
3
+ # Docker 远程部署脚本(服务器端执行)
4
+ # ═══════════════════════════════════════════════════════════
5
+ #
6
+ # 用法:
7
+ # ./deploy-remote.sh <image> <container-name> [run-args]
8
+ #
9
+ # 示例:
10
+ # ./deploy-remote.sh registry.example.com/order-service:staging order-service "-p 8080:8080 -e SPRING_PROFILES_ACTIVE=staging"
11
+ #
12
+ # 该脚本用于服务器端手动更新容器,也可作为 speccore deploy script 的远程命令。
13
+ # ═══════════════════════════════════════════════════════════
14
+
15
+ set -euo pipefail
16
+
17
+ IMAGE="${1:-}"
18
+ NAME="${2:-}"
19
+ RUN_ARGS="${3:-}"
20
+
21
+ if [ -z "$IMAGE" ] || [ -z "$NAME" ]; then
22
+ echo "用法: $0 <image> <container-name> [run-args]"
23
+ echo "示例: $0 registry.example.com/order-service:staging order-service \"-p 8080:8080\""
24
+ exit 1
25
+ fi
26
+
27
+ echo "========================================"
28
+ echo "Docker 远程部署"
29
+ echo "镜像: $IMAGE"
30
+ echo "容器: $NAME"
31
+ echo "========================================"
32
+
33
+ # ── 1. 拉取最新镜像 ──
34
+ echo "📥 拉取镜像..."
35
+ docker pull "$IMAGE"
36
+
37
+ # ── 2. 停止并删除旧容器 ──
38
+ if docker ps -a --format '{{.Names}}' | grep -q "^${NAME}$"; then
39
+ echo "🛑 停止旧容器: $NAME"
40
+ docker stop "$NAME" || true
41
+ echo "🗑️ 删除旧容器: $NAME"
42
+ docker rm "$NAME" || true
43
+ else
44
+ echo "ℹ️ 无旧容器需要清理"
45
+ fi
46
+
47
+ # ── 3. 清理旧镜像(保留最近 3 个标签) ──
48
+ echo "🧹 清理旧镜像..."
49
+ IMAGE_BASE=$(echo "$IMAGE" | cut -d: -f1)
50
+ docker images "$IMAGE_BASE" --format '{{.Repository}}:{{.Tag}}' | tail -n +4 | xargs -r docker rmi || true
51
+
52
+ # ── 4. 启动新容器 ──
53
+ echo "🚀 启动新容器..."
54
+ if [ -n "$RUN_ARGS" ]; then
55
+ # shellcheck disable=SC2086
56
+ docker run -d --name "$NAME" --restart always $RUN_ARGS "$IMAGE"
57
+ else
58
+ docker run -d --name "$NAME" --restart always "$IMAGE"
59
+ fi
60
+
61
+ # ── 5. 等待并检查状态 ──
62
+ echo "⏳ 等待容器启动..."
63
+ sleep 3
64
+
65
+ if docker ps --format '{{.Names}}' | grep -q "^${NAME}$"; then
66
+ echo "✅ 容器已启动: $NAME"
67
+ else
68
+ echo "❌ 容器启动失败"
69
+ echo "📋 日志:"
70
+ docker logs "$NAME" --tail 50 || true
71
+ exit 1
72
+ fi
73
+
74
+ # ── 6. 显示状态 ──
75
+ echo ""
76
+ echo "========================================"
77
+ echo "📋 部署完成"
78
+ echo "========================================"
79
+ docker ps --filter "name=$NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
@@ -0,0 +1,113 @@
1
+ # ═══════════════════════════════════════════════════════════
2
+ # 前后端 Docker Compose 编排示例
3
+ # ═══════════════════════════════════════════════════════════
4
+ #
5
+ # 适用场景:一台服务器上同时部署前端 + 后端 + 数据库/Redis
6
+ #
7
+ # 用法:
8
+ # 1. 将本文件复制到服务器上的部署目录
9
+ # 2. 配置 .env 文件(数据库密码等敏感信息)
10
+ # 3. 执行: docker-compose up -d
11
+ #
12
+ # 与 speccore deploy 结合:
13
+ # - speccore 负责 build && push 镜像
14
+ # - 服务器端手动或通过 CI 执行 docker-compose pull && up -d
15
+ # - 也可将 docker-compose 作为 speccore 的 script 部署方式执行
16
+ # ═══════════════════════════════════════════════════════════
17
+
18
+ version: "3.8"
19
+
20
+ services:
21
+ # ── 前端 ──
22
+ frontend:
23
+ image: ${REGISTRY:-registry.example.com}/my-project/admin-web:${TAG:-staging}
24
+ container_name: admin-web
25
+ restart: unless-stopped
26
+ ports:
27
+ - "80:80"
28
+ networks:
29
+ - app-network
30
+ depends_on:
31
+ - backend
32
+ healthcheck:
33
+ test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost/"]
34
+ interval: 30s
35
+ timeout: 3s
36
+ retries: 3
37
+ start_period: 10s
38
+
39
+ # ── 后端 ──
40
+ backend:
41
+ image: ${REGISTRY:-registry.example.com}/my-project/order-service:${TAG:-staging}
42
+ container_name: order-service
43
+ restart: unless-stopped
44
+ ports:
45
+ - "8080:8080"
46
+ environment:
47
+ - SPRING_PROFILES_ACTIVE=${PROFILE:-staging}
48
+ - JAVA_OPTS=-Xms512m -Xmx1024m
49
+ # 数据库连接(建议通过 .env 或 Docker Secrets 注入密码)
50
+ - DB_HOST=mysql
51
+ - DB_PORT=3306
52
+ - DB_NAME=order_db
53
+ - DB_USER=root
54
+ - DB_PASS=${DB_PASSWORD:-secret}
55
+ # Redis 连接
56
+ - REDIS_HOST=redis
57
+ - REDIS_PORT=6379
58
+ - REDIS_PASS=${REDIS_PASSWORD:-}
59
+ networks:
60
+ - app-network
61
+ depends_on:
62
+ mysql:
63
+ condition: service_healthy
64
+ redis:
65
+ condition: service_started
66
+ healthcheck:
67
+ test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/actuator/health"]
68
+ interval: 30s
69
+ timeout: 5s
70
+ retries: 5
71
+ start_period: 60s
72
+
73
+ # ── MySQL(如需内置数据库,否则删除此段) ──
74
+ mysql:
75
+ image: mysql:8.0
76
+ container_name: mysql
77
+ restart: unless-stopped
78
+ environment:
79
+ - MYSQL_ROOT_PASSWORD=${DB_PASSWORD:-secret}
80
+ - MYSQL_DATABASE=order_db
81
+ ports:
82
+ - "3306:3306"
83
+ volumes:
84
+ - mysql-data:/var/lib/mysql
85
+ # - ./init.sql:/docker-entrypoint-initdb.d/init.sql
86
+ networks:
87
+ - app-network
88
+ healthcheck:
89
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
90
+ interval: 10s
91
+ timeout: 5s
92
+ retries: 5
93
+
94
+ # ── Redis(如需内置缓存,否则删除此段) ──
95
+ redis:
96
+ image: redis:7-alpine
97
+ container_name: redis
98
+ restart: unless-stopped
99
+ command: redis-server --requirepass ${REDIS_PASSWORD:-}
100
+ ports:
101
+ - "6379:6379"
102
+ volumes:
103
+ - redis-data:/data
104
+ networks:
105
+ - app-network
106
+
107
+ networks:
108
+ app-network:
109
+ driver: bridge
110
+
111
+ volumes:
112
+ mysql-data:
113
+ redis-data:
@@ -0,0 +1,43 @@
1
+ # ═══════════════════════════════════════════════════════════
2
+ # 前端 Docker 构建示例(Nginx 多阶段构建)
3
+ # ═══════════════════════════════════════════════════════════
4
+ #
5
+ # 用法:
6
+ # 1. 将本文件复制到前端工程根目录
7
+ # 2. 如有自定义 nginx 配置,一并复制 nginx.conf 到同目录
8
+ # 3. 在 PROJECT.yaml 中配置 docker 类型部署
9
+ # 4. 执行: speccore deploy --env staging --platform admin-web
10
+ #
11
+ # 多阶段构建:Node 编译 → Nginx 托管静态资源
12
+ # ═══════════════════════════════════════════════════════════
13
+
14
+ # ── 阶段 1:构建 ──
15
+ FROM node:18-alpine AS builder
16
+ WORKDIR /app
17
+
18
+ # 先复制依赖文件(利用 Docker 缓存层)
19
+ COPY package*.json ./
20
+ RUN npm ci
21
+
22
+ # 复制源码并构建
23
+ COPY . .
24
+ ARG BUILD_ENV=staging
25
+ RUN npm run build:$BUILD_ENV
26
+
27
+ # ── 阶段 2:运行 ──
28
+ FROM nginx:alpine
29
+ WORKDIR /usr/share/nginx/html
30
+
31
+ # 复制构建产物
32
+ COPY --from=builder /app/dist .
33
+
34
+ # 复制自定义 nginx 配置(可选,没有则使用 Nginx 默认配置)
35
+ # COPY nginx.conf /etc/nginx/conf.d/default.conf
36
+
37
+ # 健康检查
38
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
39
+ CMD wget --no-verbose --tries=1 --spider http://localhost/ || exit 1
40
+
41
+ EXPOSE 80
42
+
43
+ CMD ["nginx", "-g", "daemon off;"]
@@ -0,0 +1,30 @@
1
+ server {
2
+ listen 80;
3
+ server_name localhost;
4
+ root /usr/share/nginx/html;
5
+ index index.html;
6
+
7
+ # 前端路由支持(SPA 应用)
8
+ location / {
9
+ try_files $uri $uri/ /index.html;
10
+ }
11
+
12
+ # 静态资源缓存
13
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
14
+ expires 1y;
15
+ add_header Cache-Control "public, immutable";
16
+ }
17
+
18
+ # API 代理到后端(按需配置)
19
+ location /api/ {
20
+ proxy_pass http://backend:8080/api/;
21
+ proxy_set_header Host $host;
22
+ proxy_set_header X-Real-IP $remote_addr;
23
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
24
+ }
25
+
26
+ # 禁止访问隐藏文件
27
+ location ~ /\. {
28
+ deny all;
29
+ }
30
+ }