nodebbs 0.0.8 → 0.1.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 +19 -17
- package/dist/commands/clean/index.d.ts +1 -0
- package/dist/commands/clean/index.js +15 -2
- package/dist/commands/db/import.d.ts +10 -0
- package/dist/commands/db/import.js +87 -0
- package/dist/commands/pack/index.js +5 -11
- package/dist/commands/rebuild/index.js +3 -3
- package/dist/commands/restart/index.js +1 -2
- package/dist/commands/start/index.d.ts +1 -1
- package/dist/commands/start/index.js +71 -63
- package/dist/commands/stop/index.js +1 -3
- package/dist/interactive.js +2 -2
- package/dist/templates/docker-compose.lowmem.yml +3 -49
- package/dist/templates/docker-compose.yml +91 -34
- package/dist/templates/env +26 -11
- package/dist/utils/docker.d.ts +47 -0
- package/dist/utils/docker.js +57 -6
- package/dist/utils/env.d.ts +1 -1
- package/dist/utils/env.js +102 -20
- package/dist/utils/selection.d.ts +1 -1
- package/dist/utils/selection.js +7 -7
- package/oclif.manifest.json +100 -60
- package/package.json +1 -1
- package/dist/templates/docker-compose.prod.yml +0 -120
- package/dist/templates/init-db.sql +0 -14
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
# 低内存环境 Docker Compose 覆盖配置
|
|
2
|
-
# 适用于 1C1G 或 1C2G 的低配服务器
|
|
3
|
-
# 使用方式: docker compose -f docker-compose.yml -f docker-compose.lowmem.yml up -d
|
|
4
|
-
|
|
5
1
|
services:
|
|
6
2
|
# PostgreSQL 数据库 - 低内存优化
|
|
7
3
|
postgres:
|
|
8
|
-
restart: always
|
|
9
|
-
ports: [] # 不暴露端口到主机,只在内部网络访问
|
|
10
|
-
environment:
|
|
11
|
-
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
12
|
-
healthcheck:
|
|
13
|
-
interval: 30s
|
|
14
|
-
timeout: 10s
|
|
15
|
-
retries: 5
|
|
16
|
-
start_period: 40s
|
|
17
4
|
deploy:
|
|
18
5
|
resources:
|
|
19
6
|
limits:
|
|
@@ -23,14 +10,13 @@ services:
|
|
|
23
10
|
cpus: '0.1'
|
|
24
11
|
memory: 128M
|
|
25
12
|
logging:
|
|
26
|
-
driver: "json-file"
|
|
27
13
|
options:
|
|
28
14
|
max-size: "5m"
|
|
29
15
|
max-file: "2"
|
|
30
16
|
|
|
31
17
|
# Redis 缓存 - 低内存优化
|
|
32
18
|
redis:
|
|
33
|
-
|
|
19
|
+
# 降低内存限制
|
|
34
20
|
command: >
|
|
35
21
|
redis-server
|
|
36
22
|
--requirepass ${REDIS_PASSWORD}
|
|
@@ -40,12 +26,6 @@ services:
|
|
|
40
26
|
--maxmemory-policy allkeys-lru
|
|
41
27
|
--save 900 1
|
|
42
28
|
--save 300 10
|
|
43
|
-
ports: [] # 不暴露端口到主机
|
|
44
|
-
healthcheck:
|
|
45
|
-
interval: 30s
|
|
46
|
-
timeout: 10s
|
|
47
|
-
retries: 5
|
|
48
|
-
start_period: 20s
|
|
49
29
|
deploy:
|
|
50
30
|
resources:
|
|
51
31
|
limits:
|
|
@@ -55,23 +35,15 @@ services:
|
|
|
55
35
|
cpus: '0.1'
|
|
56
36
|
memory: 64M
|
|
57
37
|
logging:
|
|
58
|
-
driver: "json-file"
|
|
59
38
|
options:
|
|
60
39
|
max-size: "5m"
|
|
61
40
|
max-file: "2"
|
|
62
41
|
|
|
63
42
|
# API 服务 - 低内存优化
|
|
64
43
|
api:
|
|
65
|
-
restart: always
|
|
66
44
|
environment:
|
|
67
|
-
|
|
68
|
-
JWT_SECRET: ${JWT_SECRET}
|
|
69
|
-
CORS_ORIGIN: ${CORS_ORIGIN}
|
|
70
|
-
APP_URL: ${APP_URL}
|
|
71
|
-
# Node.js 内存限制
|
|
45
|
+
# 降低 Node.js 内存限制
|
|
72
46
|
NODE_OPTIONS: "--max-old-space-size=384"
|
|
73
|
-
volumes:
|
|
74
|
-
- api_uploads:/app/apps/api/uploads
|
|
75
47
|
healthcheck:
|
|
76
48
|
start_period: 90s # 低内存环境启动更慢
|
|
77
49
|
interval: 60s
|
|
@@ -84,22 +56,13 @@ services:
|
|
|
84
56
|
cpus: '0.2'
|
|
85
57
|
memory: 256M
|
|
86
58
|
logging:
|
|
87
|
-
driver: "json-file"
|
|
88
59
|
options:
|
|
89
60
|
max-size: "10m"
|
|
90
|
-
max-file: "3"
|
|
91
61
|
|
|
92
62
|
# Web 前端服务 - 低内存优化
|
|
93
63
|
web:
|
|
94
|
-
restart: always
|
|
95
|
-
build:
|
|
96
|
-
args:
|
|
97
|
-
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL}
|
|
98
|
-
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL}
|
|
99
64
|
environment:
|
|
100
|
-
|
|
101
|
-
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL}
|
|
102
|
-
# Node.js 内存限制
|
|
65
|
+
# 降低 Node.js 内存限制
|
|
103
66
|
NODE_OPTIONS: "--max-old-space-size=384"
|
|
104
67
|
healthcheck:
|
|
105
68
|
start_period: 90s # 低内存环境启动更慢
|
|
@@ -113,14 +76,5 @@ services:
|
|
|
113
76
|
cpus: '0.2'
|
|
114
77
|
memory: 256M
|
|
115
78
|
logging:
|
|
116
|
-
driver: "json-file"
|
|
117
79
|
options:
|
|
118
80
|
max-size: "10m"
|
|
119
|
-
max-file: "3"
|
|
120
|
-
|
|
121
|
-
# 网络配置
|
|
122
|
-
networks:
|
|
123
|
-
nodebbs-network:
|
|
124
|
-
ipam:
|
|
125
|
-
config:
|
|
126
|
-
- subnet: 172.28.0.0/16
|
|
@@ -3,22 +3,37 @@ services:
|
|
|
3
3
|
postgres:
|
|
4
4
|
image: postgres:16-alpine
|
|
5
5
|
container_name: nodebbs-postgres
|
|
6
|
-
restart:
|
|
6
|
+
restart: always
|
|
7
7
|
environment:
|
|
8
8
|
POSTGRES_USER: postgres
|
|
9
|
-
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD
|
|
9
|
+
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
10
10
|
POSTGRES_DB: ${POSTGRES_DB:-nodebbs}
|
|
11
|
-
TZ: Asia/Shanghai
|
|
11
|
+
TZ: ${TZ:-Asia/Shanghai}
|
|
12
12
|
volumes:
|
|
13
13
|
- postgres_data:/var/lib/postgresql/data
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
# 生产环境默认不暴露数据库端口到主机,只在 Docker 网络内部访问
|
|
15
|
+
# 如果需要外部访问 (如开发调试),可以将下面两行取消注释
|
|
16
|
+
# ports:
|
|
17
|
+
# - "${POSTGRES_PORT:-5432}:5432"
|
|
17
18
|
healthcheck:
|
|
18
19
|
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
|
19
|
-
interval:
|
|
20
|
-
timeout:
|
|
20
|
+
interval: 30s
|
|
21
|
+
timeout: 10s
|
|
21
22
|
retries: 5
|
|
23
|
+
start_period: 40s
|
|
24
|
+
deploy:
|
|
25
|
+
resources:
|
|
26
|
+
limits:
|
|
27
|
+
cpus: '1'
|
|
28
|
+
memory: 512M
|
|
29
|
+
reservations:
|
|
30
|
+
cpus: '0.25'
|
|
31
|
+
memory: 256M
|
|
32
|
+
logging:
|
|
33
|
+
driver: "json-file"
|
|
34
|
+
options:
|
|
35
|
+
max-size: "10m"
|
|
36
|
+
max-file: "3"
|
|
22
37
|
networks:
|
|
23
38
|
- nodebbs-network
|
|
24
39
|
|
|
@@ -26,45 +41,62 @@ services:
|
|
|
26
41
|
redis:
|
|
27
42
|
image: redis:7-alpine
|
|
28
43
|
container_name: nodebbs-redis
|
|
29
|
-
restart:
|
|
30
|
-
command:
|
|
31
|
-
|
|
32
|
-
|
|
44
|
+
restart: always
|
|
45
|
+
command: >
|
|
46
|
+
redis-server
|
|
47
|
+
--requirepass ${REDIS_PASSWORD}
|
|
48
|
+
--appendonly yes
|
|
49
|
+
--appendfsync everysec
|
|
50
|
+
--maxmemory 256mb
|
|
51
|
+
--maxmemory-policy allkeys-lru
|
|
33
52
|
volumes:
|
|
34
53
|
- redis_data:/data
|
|
35
|
-
|
|
36
|
-
|
|
54
|
+
# 生产环境默认不暴露 Redis 端口到主机
|
|
55
|
+
# ports:
|
|
56
|
+
# - "${REDIS_PORT:-6379}:6379"
|
|
37
57
|
healthcheck:
|
|
38
58
|
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
|
|
39
|
-
interval:
|
|
40
|
-
timeout:
|
|
59
|
+
interval: 30s
|
|
60
|
+
timeout: 10s
|
|
41
61
|
retries: 5
|
|
62
|
+
start_period: 20s
|
|
63
|
+
deploy:
|
|
64
|
+
resources:
|
|
65
|
+
limits:
|
|
66
|
+
cpus: '0.5'
|
|
67
|
+
memory: 256M
|
|
68
|
+
reservations:
|
|
69
|
+
cpus: '0.1'
|
|
70
|
+
memory: 128M
|
|
71
|
+
logging:
|
|
72
|
+
driver: "json-file"
|
|
73
|
+
options:
|
|
74
|
+
max-size: "10m"
|
|
75
|
+
max-file: "3"
|
|
42
76
|
networks:
|
|
43
77
|
- nodebbs-network
|
|
44
78
|
|
|
45
79
|
# API 服务
|
|
46
80
|
api:
|
|
47
|
-
|
|
48
|
-
context: . # 从 monorepo 根目录构建(turbo prune 需要完整的 workspace)
|
|
49
|
-
dockerfile: apps/api/Dockerfile
|
|
81
|
+
image: ${API_IMAGE:-ghcr.io/aiprojecthub/nodebbs-api:latest}
|
|
50
82
|
container_name: nodebbs-api
|
|
51
|
-
restart:
|
|
83
|
+
restart: always
|
|
52
84
|
environment:
|
|
53
85
|
NODE_ENV: production
|
|
54
86
|
APP_NAME: ${APP_NAME:-nodebbs}
|
|
55
87
|
HOST: 0.0.0.0
|
|
56
88
|
PORT: 7100
|
|
57
|
-
DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD
|
|
58
|
-
REDIS_URL: redis://default:${REDIS_PASSWORD
|
|
59
|
-
USER_CACHE_TTL: ${USER_CACHE_TTL:-
|
|
60
|
-
JWT_SECRET: ${JWT_SECRET
|
|
89
|
+
DATABASE_URL: postgres://postgres:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB:-nodebbs}
|
|
90
|
+
REDIS_URL: redis://default:${REDIS_PASSWORD}@redis:6379/0
|
|
91
|
+
USER_CACHE_TTL: ${USER_CACHE_TTL:-300}
|
|
92
|
+
JWT_SECRET: ${JWT_SECRET}
|
|
61
93
|
JWT_ACCESS_TOKEN_EXPIRES_IN: ${JWT_ACCESS_TOKEN_EXPIRES_IN:-1y}
|
|
62
94
|
CORS_ORIGIN: ${CORS_ORIGIN:-*}
|
|
63
95
|
APP_URL: ${APP_URL:-http://localhost:3100}
|
|
64
|
-
TZ: Asia/Shanghai
|
|
96
|
+
TZ: ${TZ:-Asia/Shanghai}
|
|
97
|
+
NODE_OPTIONS: "--max-old-space-size=512"
|
|
65
98
|
volumes:
|
|
66
99
|
- api_uploads:/app/apps/api/uploads
|
|
67
|
-
- ./apps/api/src:/app/apps/api/src:ro
|
|
68
100
|
ports:
|
|
69
101
|
- "${API_PORT:-7100}:7100"
|
|
70
102
|
depends_on:
|
|
@@ -78,26 +110,35 @@ services:
|
|
|
78
110
|
timeout: 10s
|
|
79
111
|
retries: 3
|
|
80
112
|
start_period: 40s
|
|
113
|
+
deploy:
|
|
114
|
+
resources:
|
|
115
|
+
limits:
|
|
116
|
+
cpus: '1'
|
|
117
|
+
memory: 768M
|
|
118
|
+
reservations:
|
|
119
|
+
cpus: '0.3'
|
|
120
|
+
memory: 384M
|
|
121
|
+
logging:
|
|
122
|
+
driver: "json-file"
|
|
123
|
+
options:
|
|
124
|
+
max-size: "20m"
|
|
125
|
+
max-file: "5"
|
|
81
126
|
networks:
|
|
82
127
|
- nodebbs-network
|
|
83
128
|
|
|
84
129
|
# Web 前端服务
|
|
85
130
|
web:
|
|
86
|
-
|
|
87
|
-
context: . # 从 monorepo 根目录构建(turbo prune 需要完整的 workspace)
|
|
88
|
-
dockerfile: apps/web/Dockerfile
|
|
89
|
-
args:
|
|
90
|
-
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:7100}
|
|
91
|
-
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3100}
|
|
131
|
+
image: ${WEB_IMAGE:-ghcr.io/aiprojecthub/nodebbs-web:latest}
|
|
92
132
|
container_name: nodebbs-web
|
|
93
|
-
restart:
|
|
133
|
+
restart: always
|
|
94
134
|
environment:
|
|
95
135
|
NODE_ENV: production
|
|
96
136
|
APP_NAME: ${APP_NAME:-nodebbs}
|
|
97
137
|
PORT: 3100
|
|
98
138
|
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:7100}
|
|
99
139
|
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3100}
|
|
100
|
-
TZ: Asia/Shanghai
|
|
140
|
+
TZ: ${TZ:-Asia/Shanghai}
|
|
141
|
+
NODE_OPTIONS: "--max-old-space-size=512"
|
|
101
142
|
ports:
|
|
102
143
|
- "${WEB_PORT:-3100}:3100"
|
|
103
144
|
depends_on:
|
|
@@ -109,6 +150,19 @@ services:
|
|
|
109
150
|
timeout: 10s
|
|
110
151
|
retries: 3
|
|
111
152
|
start_period: 40s
|
|
153
|
+
deploy:
|
|
154
|
+
resources:
|
|
155
|
+
limits:
|
|
156
|
+
cpus: '1'
|
|
157
|
+
memory: 768M
|
|
158
|
+
reservations:
|
|
159
|
+
cpus: '0.3'
|
|
160
|
+
memory: 384M
|
|
161
|
+
logging:
|
|
162
|
+
driver: "json-file"
|
|
163
|
+
options:
|
|
164
|
+
max-size: "20m"
|
|
165
|
+
max-file: "5"
|
|
112
166
|
networks:
|
|
113
167
|
- nodebbs-network
|
|
114
168
|
|
|
@@ -125,3 +179,6 @@ volumes:
|
|
|
125
179
|
networks:
|
|
126
180
|
nodebbs-network:
|
|
127
181
|
driver: bridge
|
|
182
|
+
ipam:
|
|
183
|
+
config:
|
|
184
|
+
- subnet: 172.28.0.0/16
|
package/dist/templates/env
CHANGED
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
# ========================================
|
|
2
|
-
# NodeBBS
|
|
2
|
+
# NodeBBS 部署环境变量配置示例
|
|
3
3
|
# ========================================
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# ========================================
|
|
6
|
+
# 基础配置
|
|
7
|
+
# ========================================
|
|
8
|
+
# 应用名称(用于 Docker 容器前缀)
|
|
6
9
|
APP_NAME=nodebbs
|
|
7
10
|
|
|
11
|
+
# 部署环境 (prod, dev)
|
|
12
|
+
NODE_ENV=production
|
|
13
|
+
|
|
14
|
+
# 镜像配置
|
|
15
|
+
# 默认为 GitHub Container Registry
|
|
16
|
+
# 注意:使用 `nodebbs start` 时,可以选择版本 tag 覆盖此处的默认 latest tag
|
|
17
|
+
# 如果需要固定特定版本 (如 v1.0),请修改以下配置或在部署时输入对应的 tag
|
|
18
|
+
API_IMAGE=ghcr.io/aiprojecthub/nodebbs-api:latest
|
|
19
|
+
WEB_IMAGE=ghcr.io/aiprojecthub/nodebbs-web:latest
|
|
20
|
+
|
|
8
21
|
# ========================================
|
|
9
22
|
# 数据库配置
|
|
10
23
|
# ========================================
|
|
24
|
+
# 务必修改为强密码!
|
|
11
25
|
POSTGRES_PASSWORD=your_secure_postgres_password_here
|
|
12
26
|
POSTGRES_DB=nodebbs
|
|
13
27
|
POSTGRES_PORT=5432
|
|
@@ -15,6 +29,7 @@ POSTGRES_PORT=5432
|
|
|
15
29
|
# ========================================
|
|
16
30
|
# Redis 配置
|
|
17
31
|
# ========================================
|
|
32
|
+
# 务必修改为强密码!
|
|
18
33
|
REDIS_PASSWORD=your_secure_redis_password_here
|
|
19
34
|
REDIS_PORT=6379
|
|
20
35
|
|
|
@@ -24,8 +39,8 @@ REDIS_PORT=6379
|
|
|
24
39
|
API_PORT=7100
|
|
25
40
|
|
|
26
41
|
# 用户缓存 TTL(秒)
|
|
27
|
-
#
|
|
28
|
-
USER_CACHE_TTL=
|
|
42
|
+
# 生产环境建议: 120-300
|
|
43
|
+
USER_CACHE_TTL=300
|
|
29
44
|
|
|
30
45
|
# JWT 配置
|
|
31
46
|
# 使用 `openssl rand -base64 32` 生成安全的密钥
|
|
@@ -37,6 +52,7 @@ JWT_ACCESS_TOKEN_EXPIRES_IN=1y
|
|
|
37
52
|
CORS_ORIGIN=*
|
|
38
53
|
|
|
39
54
|
# 应用 URL(OAuth 回调使用)
|
|
55
|
+
# 生产环境请修改为公网域名
|
|
40
56
|
APP_URL=http://localhost:3100
|
|
41
57
|
|
|
42
58
|
# ========================================
|
|
@@ -45,17 +61,16 @@ APP_URL=http://localhost:3100
|
|
|
45
61
|
WEB_PORT=3100
|
|
46
62
|
|
|
47
63
|
# API 地址(公网访问地址)
|
|
48
|
-
#
|
|
49
|
-
#
|
|
50
|
-
|
|
51
|
-
NEXT_PUBLIC_API_URL=http://192.168.0.100:7100
|
|
64
|
+
# 生产环境请修改为公网域名,例如: https://api.yourdomain.com
|
|
65
|
+
# 或者是 Nginx 反向代理后的地址,例如: https://yourdomain.com/api
|
|
66
|
+
NEXT_PUBLIC_API_URL=http://localhost:7100
|
|
52
67
|
|
|
53
68
|
# 应用 URL(公网访问地址)
|
|
54
|
-
#
|
|
55
|
-
# 生产环境: https://yourdomain.com
|
|
69
|
+
# 生产环境请修改为公网域名,例如: https://yourdomain.com
|
|
56
70
|
NEXT_PUBLIC_APP_URL=http://localhost:3100
|
|
57
71
|
|
|
58
72
|
# ========================================
|
|
59
|
-
#
|
|
73
|
+
# 其他配置
|
|
60
74
|
# ========================================
|
|
75
|
+
# 时区
|
|
61
76
|
TZ=Asia/Shanghai
|
package/dist/utils/docker.d.ts
CHANGED
|
@@ -1,8 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取 Docker Compose 文件路径配置
|
|
3
|
+
*
|
|
4
|
+
* 自动检测当前目录是否存在 `docker-compose.yml`。
|
|
5
|
+
* - 如果存在,则优先使用项目根目录的配置。
|
|
6
|
+
* - 如果不存在,则使用 CLI 内置的模板文件。
|
|
7
|
+
*
|
|
8
|
+
* @param env - 运行环境 ('production' | 'lowmem')
|
|
9
|
+
* @returns 对象包含文件路径数组和是否使用内置模板的标志
|
|
10
|
+
*/
|
|
1
11
|
export declare function getComposeFiles(env: string): Promise<{
|
|
2
12
|
files: string[];
|
|
3
13
|
isBuiltIn: boolean;
|
|
4
14
|
}>;
|
|
15
|
+
/**
|
|
16
|
+
* 检查 Docker 环境是否可用
|
|
17
|
+
*
|
|
18
|
+
* 验证 `docker` 和 `docker compose` 命令是否已安装并能正常响应。
|
|
19
|
+
* 如果检查失败,会抛出错误并提示用户安装。
|
|
20
|
+
*/
|
|
5
21
|
export declare function checkDocker(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* 执行 Docker Compose 管理命令 (Lifecycle Commands)
|
|
24
|
+
*
|
|
25
|
+
* 用于执行如 `up`, `down`, `logs`, `build` 等管理整个服务堆栈的命令。
|
|
26
|
+
* 如果使用的是内置模板,会自动注入必要的环境变量(如数据库初始化脚本路径)。
|
|
27
|
+
*
|
|
28
|
+
* @param files - Docker Compose 文件路径数组
|
|
29
|
+
* @param args - 传递给 docker compose 的参数列表 (e.g. `['up', '-d']`)
|
|
30
|
+
* @param isBuiltIn - 是否使用内置模板 (决定是否注入额外环境变量)
|
|
31
|
+
*/
|
|
6
32
|
export declare function runCompose(files: string[], args: string[], isBuiltIn?: boolean): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* 在容器内执行命令 (Exec)
|
|
35
|
+
*
|
|
36
|
+
* 相当于执行 `docker compose exec [service] [command]`。
|
|
37
|
+
* 用于在正在运行的容器中运行脚本或命令(例如数据库迁移、种子数据填充)。
|
|
38
|
+
*
|
|
39
|
+
* @param files - Docker Compose 文件路径数组
|
|
40
|
+
* @param service - 目标服务名称 (e.g. 'api', 'postgres')
|
|
41
|
+
* @param command - 要执行的命令数组 (e.g. `['npm', 'run', 'seed']`)
|
|
42
|
+
* @param isBuiltIn - 是否使用内置模板
|
|
43
|
+
*/
|
|
7
44
|
export declare function execCompose(files: string[], service: string, command: string[], isBuiltIn?: boolean): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* 等待服务健康检查通过
|
|
47
|
+
*
|
|
48
|
+
* 轮询关键服务 (PostgreSQL, Redis, API) 直到它们准备就绪或超时。
|
|
49
|
+
* - PostgreSQL: 使用 `pg_isready` 检查
|
|
50
|
+
* - Redis & API: 使用简单的延时等待 (后续可优化为端口/API探测)
|
|
51
|
+
*
|
|
52
|
+
* @param files - Docker Compose 文件路径数组
|
|
53
|
+
* @param isBuiltIn - 是否使用内置模板
|
|
54
|
+
*/
|
|
8
55
|
export declare function waitForHealth(files: string[], isBuiltIn?: boolean): Promise<void>;
|
package/dist/utils/docker.js
CHANGED
|
@@ -5,6 +5,16 @@ import { exists } from 'node:fs';
|
|
|
5
5
|
import { promisify } from 'node:util';
|
|
6
6
|
import { getTemplateDir, getTemplatePath } from './template.js';
|
|
7
7
|
const fileExists = promisify(exists);
|
|
8
|
+
/**
|
|
9
|
+
* 获取 Docker Compose 文件路径配置
|
|
10
|
+
*
|
|
11
|
+
* 自动检测当前目录是否存在 `docker-compose.yml`。
|
|
12
|
+
* - 如果存在,则优先使用项目根目录的配置。
|
|
13
|
+
* - 如果不存在,则使用 CLI 内置的模板文件。
|
|
14
|
+
*
|
|
15
|
+
* @param env - 运行环境 ('production' | 'lowmem')
|
|
16
|
+
* @returns 对象包含文件路径数组和是否使用内置模板的标志
|
|
17
|
+
*/
|
|
8
18
|
export async function getComposeFiles(env) {
|
|
9
19
|
const workDir = process.cwd();
|
|
10
20
|
let isBuiltIn = false;
|
|
@@ -19,13 +29,19 @@ export async function getComposeFiles(env) {
|
|
|
19
29
|
}
|
|
20
30
|
const files = [baseFile];
|
|
21
31
|
if (env === 'production') {
|
|
22
|
-
|
|
32
|
+
// Production now uses the default file (merged config)
|
|
23
33
|
}
|
|
24
34
|
else if (env === 'lowmem') {
|
|
25
35
|
files.push(path.join(templateDir, 'docker-compose.lowmem.yml'));
|
|
26
36
|
}
|
|
27
37
|
return { files, isBuiltIn };
|
|
28
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* 检查 Docker 环境是否可用
|
|
41
|
+
*
|
|
42
|
+
* 验证 `docker` 和 `docker compose` 命令是否已安装并能正常响应。
|
|
43
|
+
* 如果检查失败,会抛出错误并提示用户安装。
|
|
44
|
+
*/
|
|
29
45
|
export async function checkDocker() {
|
|
30
46
|
logger.info('正在检查 Docker 环境...');
|
|
31
47
|
try {
|
|
@@ -38,26 +54,61 @@ export async function checkDocker() {
|
|
|
38
54
|
throw error;
|
|
39
55
|
}
|
|
40
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* 执行 Docker Compose 管理命令 (Lifecycle Commands)
|
|
59
|
+
*
|
|
60
|
+
* 用于执行如 `up`, `down`, `logs`, `build` 等管理整个服务堆栈的命令。
|
|
61
|
+
* 如果使用的是内置模板,会自动注入必要的环境变量(如数据库初始化脚本路径)。
|
|
62
|
+
*
|
|
63
|
+
* @param files - Docker Compose 文件路径数组
|
|
64
|
+
* @param args - 传递给 docker compose 的参数列表 (e.g. `['up', '-d']`)
|
|
65
|
+
* @param isBuiltIn - 是否使用内置模板 (决定是否注入额外环境变量)
|
|
66
|
+
*/
|
|
41
67
|
export async function runCompose(files, args, isBuiltIn = false) {
|
|
42
68
|
const composeArgs = files.flatMap(f => ['-f', f]);
|
|
43
69
|
if (isBuiltIn) {
|
|
44
70
|
composeArgs.push('--project-directory', process.cwd());
|
|
45
|
-
// 将 INIT_DB_PATH 设置为内置 sql 文件
|
|
46
|
-
const templateDir = path.dirname(files[0]);
|
|
47
|
-
process.env.INIT_DB_PATH = path.join(templateDir, 'init-db.sql');
|
|
48
71
|
}
|
|
49
72
|
composeArgs.push(...args);
|
|
50
73
|
// 使用 stdio: 'inherit' 实时显示输出
|
|
51
|
-
|
|
74
|
+
// 设置 COMPOSE_LOG_LEVEL=ERROR 抑制变量未设置的警告
|
|
75
|
+
await execa('docker', ['compose', ...composeArgs], {
|
|
76
|
+
stdio: 'inherit',
|
|
77
|
+
env: { ...process.env, COMPOSE_LOG_LEVEL: 'ERROR' }
|
|
78
|
+
});
|
|
52
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* 在容器内执行命令 (Exec)
|
|
82
|
+
*
|
|
83
|
+
* 相当于执行 `docker compose exec [service] [command]`。
|
|
84
|
+
* 用于在正在运行的容器中运行脚本或命令(例如数据库迁移、种子数据填充)。
|
|
85
|
+
*
|
|
86
|
+
* @param files - Docker Compose 文件路径数组
|
|
87
|
+
* @param service - 目标服务名称 (e.g. 'api', 'postgres')
|
|
88
|
+
* @param command - 要执行的命令数组 (e.g. `['npm', 'run', 'seed']`)
|
|
89
|
+
* @param isBuiltIn - 是否使用内置模板
|
|
90
|
+
*/
|
|
53
91
|
export async function execCompose(files, service, command, isBuiltIn = false) {
|
|
54
92
|
const composeArgs = files.flatMap(f => ['-f', f]);
|
|
55
93
|
if (isBuiltIn) {
|
|
56
94
|
composeArgs.push('--project-directory', process.cwd());
|
|
57
95
|
}
|
|
58
96
|
composeArgs.push('exec', service, ...command);
|
|
59
|
-
await execa('docker', ['compose', ...composeArgs], {
|
|
97
|
+
await execa('docker', ['compose', ...composeArgs], {
|
|
98
|
+
stdio: 'inherit',
|
|
99
|
+
env: { ...process.env, COMPOSE_LOG_LEVEL: 'ERROR' }
|
|
100
|
+
});
|
|
60
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* 等待服务健康检查通过
|
|
104
|
+
*
|
|
105
|
+
* 轮询关键服务 (PostgreSQL, Redis, API) 直到它们准备就绪或超时。
|
|
106
|
+
* - PostgreSQL: 使用 `pg_isready` 检查
|
|
107
|
+
* - Redis & API: 使用简单的延时等待 (后续可优化为端口/API探测)
|
|
108
|
+
*
|
|
109
|
+
* @param files - Docker Compose 文件路径数组
|
|
110
|
+
* @param isBuiltIn - 是否使用内置模板
|
|
111
|
+
*/
|
|
61
112
|
export async function waitForHealth(files, isBuiltIn = false) {
|
|
62
113
|
logger.info('正在等待服务就绪...');
|
|
63
114
|
// 等待 Postgres
|
package/dist/utils/env.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare function initEnv(): Promise<void>;
|
|
2
|
-
export declare function checkEnv(envType: 'production' | 'lowmem'
|
|
2
|
+
export declare function checkEnv(envType: 'production' | 'lowmem'): Promise<void>;
|