Skip to content

Commit addefcf

Browse files
authored
Add debug command documentation (#421)
* Add debug command documentation * Optimize dev docker file
1 parent 859a253 commit addefcf

File tree

4 files changed

+261
-27
lines changed

4 files changed

+261
-27
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,7 @@ build/
1212
# docker
1313
docker/app-platform-tmp
1414
docker/.env
15-
docker/sql/init/data/tr_init_models.sql
15+
docker/sql/init/data/tr_init_models.sql
16+
17+
# Claude Code settings
18+
.claude/

README.md

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,6 @@ app-builder/
147147
│ └── template.zip
148148
```
149149

150-
151150
加入数据库配置项,修改后的配置项如下所示:
152151

153152
```yml
@@ -182,13 +181,21 @@ app-engine:
182181
**启动命令**
183182

184183
```
185-
fit start -Dfit.profiles.active=prod
184+
fit start
186185
```
187186
188187
> 这里直接使用了 `fit` 命令,该命令请参考 `fit-framework` 项目的[指导手册](https://github.com/ModelEngine-Group/fit-framework/blob/main/docs/framework/fit/java/quick-start-guide/03.%20%E4%BD%BF%E7%94%A8%E6%8F%92%E4%BB%B6%E7%9A%84%E7%83%AD%E6%8F%92%E6%8B%94%E8%83%BD%E5%8A%9B.md)。
189188
>
190189
> 当前,`app-platform` 使用了 `fit` 的 3.5.1 版本,因此,如果采用手动编译,需要在 `fit-framework` 仓库中切换到 `v3.5.1` 标签处进行编译构建操作。
191190
191+
**调试命令**
192+
193+
```
194+
fit debug
195+
```
196+
197+
> 这里的调试命令背后使用了 Java 内置的远程调试命令,通过该技术,可以在进程启动之后,在 `IDEA` 中绑定启动端口进行远程调试。
198+
192199
---------
193200
194201
### 前端环境配置
@@ -253,15 +260,15 @@ npm run start
253260

254261
在对话中使用大模型功能,需要对模型进行配置,包括大模型的地址和鉴权信息。
255262
首先在首页的`应用市场`一栏中找到 `模型配置应用`,并点击该应用。点击右上角`创意灵感``开始配置`,如下图所示:
256-
![image-20250508203127410](doc/images/readme/model_config_inspiration.png)
263+
![image_config_model](doc/images/readme/model_config_inspiration.png)
257264
然后点击回答的 `添加模型` 按钮,输入模型名称、API Key 和模型地址,并点击确认。此时模型添加成功。
258265

259266
**应用创建**
260267

261268
在首页的`应用开发`一栏中点击`创建空白应用`。如下所示:
262-
![image-20250508204618312](doc/images/readme/app_create.png)
269+
![image_create_app](doc/images/readme/app_create.png)
263270
输入所要创建的应用名称和简介,并点击 `创建`按钮,即可创建 AI 应用。接着在跳转后的应用配置页面上,在 `大模型` 一栏中选择自定义配置的模型。此时即可在对话框进行对话。如下所示:
264-
![image-20250508205124203](doc/images/readme/app_chat.png)
271+
![image_app_chat](doc/images/readme/app_chat.png)
265272

266273
## 文档
267274

docker/dev-app-builder.sh

Lines changed: 76 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,89 @@ SHARED_DIR="${WORKSPACE}/../build/shared"
88
cd ${WORKSPACE}
99
source .env
1010

11-
# 临时启动容器
12-
docker run -d --name app-builder-tmp --entrypoint sleep modelengine/app-builder:$VERSION infinity
11+
# Generate development version tag
12+
BASE_VERSION=${VERSION}
13+
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
14+
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
15+
DEV_VERSION="${BASE_VERSION}-dev-${TIMESTAMP}-${GIT_COMMIT}"
1316

14-
# 拷贝本地编译产物到容器
15-
if [ -d "$PLUGINS_DIR" ] && [ -n "$(ls -A "$PLUGINS_DIR")" ]; then
16-
ls | grep -E '\.jar$' | grep -v -E '^(fit|fel)' | xargs rm -f
17-
docker cp "$PLUGINS_DIR"/. app-builder-tmp:/opt/fit-framework/plugins/
18-
else
19-
echo "Error: plugins directory is empty or doesn't exist, skipped copy."
17+
echo "=== Version Information ==="
18+
echo "Base Version: ${BASE_VERSION}"
19+
echo "Development Version: ${DEV_VERSION}"
20+
echo "Git Commit: ${GIT_COMMIT}"
21+
22+
# Check local build artifacts
23+
if [ ! -d "$PLUGINS_DIR" ] || [ -z "$(ls -A "$PLUGINS_DIR" 2>/dev/null)" ]; then
24+
echo "Error: plugins directory is empty or does not exist: $PLUGINS_DIR"
25+
exit 1
2026
fi
2127

22-
if [ -d "$SHARED_DIR" ] && [ -n "$(ls -A "$SHARED_DIR")" ]; then
23-
ls | grep -E '\.jar$' | grep -v '^(opentelemetry)' | xargs rm -f
24-
docker cp "$SHARED_DIR"/. app-builder-tmp:/opt/fit-framework/shared/
25-
else
26-
echo "Error: shared directory is empty or doesn't exist, skipped copy."
28+
if [ ! -d "$SHARED_DIR" ] || [ -z "$(ls -A "$SHARED_DIR" 2>/dev/null)" ]; then
29+
echo "Error: shared directory is empty or does not exist: $SHARED_DIR"
30+
exit 1
2731
fi
2832

29-
# 提交镜像
30-
docker commit --change='ENTRYPOINT ["/opt/fit-framework/bin/start.sh"]' app-builder-tmp modelengine/app-builder:$VERSION
31-
docker commit --change='ENTRYPOINT ["/opt/fit-framework/bin/start.sh"]' app-builder-tmp app-builder:$VERSION
33+
echo "=== Stopping app-builder service ==="
34+
docker-compose stop app-builder
35+
36+
echo "=== Creating development version image ==="
37+
# Use stable version as base
38+
docker run -d --name app-builder-tmp --entrypoint sleep modelengine/app-builder:${BASE_VERSION} infinity
39+
40+
# Copy files
41+
echo "Copying plugins..."
42+
docker cp "$PLUGINS_DIR"/. app-builder-tmp:/opt/fit-framework/plugins/
43+
44+
echo "Copying shared libraries..."
45+
docker cp "$SHARED_DIR"/. app-builder-tmp:/opt/fit-framework/shared/
46+
47+
# Commit as development version
48+
echo "Committing development version image: ${DEV_VERSION}"
49+
docker commit --change='ENTRYPOINT ["/opt/fit-framework/bin/start.sh"]' app-builder-tmp modelengine/app-builder:${DEV_VERSION}
3250

51+
# Create development tag (for docker-compose convenience)
52+
docker tag modelengine/app-builder:${DEV_VERSION} modelengine/app-builder:dev-latest
53+
54+
echo "=== Cleaning up temporary container ==="
3355
docker stop app-builder-tmp
3456
docker rm app-builder-tmp
3557

36-
# 重启服务
37-
docker-compose down
38-
echo "Service stopped."
58+
echo "=== Updating docker-compose configuration ==="
59+
# Create docker-compose configuration for development
60+
cp docker-compose.yml docker-compose.dev.yml
61+
if [[ "$(uname -s)" == "Darwin" ]]; then
62+
sed -i '.bak' "s/modelengine\/app-builder:\${VERSION}/modelengine\/app-builder:dev-latest/g" docker-compose.dev.yml
63+
rm -f docker-compose.dev.yml.bak
64+
else
65+
sed -i "s/modelengine\/app-builder:\${VERSION}/modelengine\/app-builder:dev-latest/g" docker-compose.dev.yml
66+
fi
67+
68+
echo "=== Restarting services ==="
69+
docker-compose -f docker-compose.dev.yml -p app-platform up -d app-builder
70+
71+
echo "=== Waiting for services to be ready ==="
72+
# Use gtimeout on macOS or implement timeout logic ourselves
73+
MAX_WAIT=800
74+
WAITED=0
75+
while [ $WAITED -lt $MAX_WAIT ]; do
76+
if docker-compose -f docker-compose.dev.yml -p app-platform ps app-builder | grep -q "healthy"; then
77+
echo "Services are ready!"
78+
break
79+
fi
80+
sleep 5
81+
WAITED=$((WAITED + 5))
82+
echo -n "."
83+
done
84+
85+
if [ $WAITED -ge $MAX_WAIT ]; then
86+
echo "Warning: Service startup timeout, but continuing execution..."
87+
fi
3988

40-
docker-compose up -d
41-
echo "Service restarted."
89+
echo ""
90+
echo "=== Completed! ==="
91+
echo "Development version deployed: ${DEV_VERSION}"
92+
echo "Current tag in use: dev-latest"
93+
echo "Service URL: http://localhost:8001"
94+
echo ""
95+
echo "=== Version Management Commands ==="
96+
echo "View all versions: docker images modelengine/app-builder"

docker/docker-compose.dev.yml

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
services:
2+
jade-db:
3+
container_name: jade-db
4+
hostname: jade-db
5+
image: modelengine/postgres:15.2-${VERSION}
6+
healthcheck:
7+
test: [ "CMD-SHELL", "pg_isready -U postgres" ]
8+
interval: 10s
9+
timeout: 5s
10+
retries: 30
11+
start_period: 30s
12+
networks:
13+
my-net:
14+
ipv4_address: 172.0.0.98
15+
environment:
16+
POSTGRES_USER: postgres
17+
POSTGRES_PASSWORD: ${DB_PASSWORD}
18+
LOG_HOME: /log/app
19+
volumes:
20+
- ./sql:/home/sql
21+
- ./shell/initDB.sh:/home/initDB.sh
22+
- "./app-platform-tmp/jade-db:/var/lib/postgresql/data"
23+
- "./app-platform-tmp/log:/log/app/postgresql"
24+
ports:
25+
- "${DB_PORT}:5432"
26+
27+
db-initializer:
28+
container_name: db-initializer
29+
hostname: db-initializer
30+
image: modelengine/postgres:15.2-${VERSION}
31+
networks:
32+
my-net:
33+
ipv4_address: 172.0.0.99
34+
environment:
35+
POSTGRES_USER: postgres
36+
POSTGRES_PASSWORD: "ModelEngine@123"
37+
LOG_HOME: /log/app
38+
DB_HOST: jade-db
39+
DB_PORT: 5432
40+
DB_USER: postgres
41+
IS_UPGRADE: ${IS_UPGRADE}
42+
volumes:
43+
- ./shell/initDB.sh:/home/initDB.sh
44+
- ./sql:/home/sql
45+
entrypoint: ["/bin/bash", "-c"]
46+
command: |
47+
" chmod +x /home/initDB.sh
48+
bash /home/initDB.sh app_builder /home/sql
49+
"
50+
restart: "no"
51+
52+
app-builder:
53+
container_name: app-builder
54+
hostname: app-builder
55+
image: modelengine/app-builder:dev-latest
56+
depends_on:
57+
jade-db:
58+
condition: service_healthy
59+
healthcheck:
60+
test: ["CMD", "curl", "-f", "http://app-builder:8004/fit/check"]
61+
interval: 30s
62+
timeout: 10s
63+
retries: 20
64+
start_period: 180s
65+
networks:
66+
my-net:
67+
ipv4_address: 172.0.0.100
68+
environment:
69+
worker.host: localhost
70+
server.http.port: 8004
71+
matata.registry.host: localhost
72+
matata.registry.port: 8004
73+
fit.profiles.active: prod
74+
fit.datasource.primary: app-engine
75+
fit.datasource.instances.app-engine.mode: shared
76+
fit.datasource.instances.app-engine.url: jdbc:postgresql://jade-db/app_builder?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true&allowPublicKeyRetrieval=true&useAffectedRows=true&connectTimeout=60000&socketTimeout=60000
77+
fit.datasource.instances.app-engine.username: postgres
78+
fit.datasource.instances.app-engine.password: "ModelEngine@123"
79+
openai-urls.internal: https://model-lite-router:8009/v1
80+
app-engine.pathPrefix: /api/jober
81+
LOG_HOME: /log/app
82+
LOG_NUM: 4320
83+
LOG_SIZE: "50M"
84+
app-engine.ttl.businessData: 15
85+
app-engine.ttl.nonBusinessData: 1
86+
volumes:
87+
- "./app-platform-tmp/fit-runtime:/var/store/tools"
88+
- "./app-platform-tmp/log:/log/app/app-builder"
89+
- "./app-platform-tmp/jade-db:/var/jade-db"
90+
- "./app-platform-tmp/app-builder:/var/share"
91+
ports:
92+
- "8004:8004"
93+
94+
fit-runtime-java:
95+
container_name: fit-runtime-java
96+
hostname: fit-runtime-java
97+
image: modelengine/fit-runtime-java:${VERSION}
98+
depends_on:
99+
app-builder:
100+
condition: service_healthy
101+
networks:
102+
my-net:
103+
ipv4_address: 172.0.0.101
104+
environment:
105+
worker.id: fit-runtime-java
106+
worker.environment: prod
107+
worker.host: 172.0.0.101
108+
matata.registry.host: app-builder
109+
matata.registry.port: 8004
110+
matata.registry.environment: prod
111+
ENTRY_PLUGINS_PATH: /entry
112+
LOG_HOME: /log/app
113+
volumes:
114+
- "./app-platform-tmp/app-builder:/var/share"
115+
- "./app-platform-tmp/fit-runtime:/entry"
116+
- "./app-platform-tmp/log:/log/app/runtime-java"
117+
ports:
118+
- "8090:8090"
119+
120+
fit-runtime-python:
121+
container_name: fit-runtime-python
122+
hostname: fit-runtime-python
123+
image: modelengine/fit-runtime-python:${VERSION}
124+
depends_on:
125+
app-builder:
126+
condition: service_healthy
127+
networks:
128+
my-net:
129+
ipv4_address: 172.0.0.102
130+
environment:
131+
WORKER_ID: fit-runtime-python
132+
WORK_ENV: prod
133+
LOCAL_IP: 172.0.0.102
134+
REGISTRY_HOST: app-builder
135+
REGISTRY_PORT: 8004
136+
matata.registry.environment: prod
137+
USER_PLUGINS_PATH: 'custom_dynamic_plugins/python'
138+
LOG_HOME: /log/app
139+
volumes:
140+
- "./app-platform-tmp/app-builder:/var/share"
141+
- "./app-platform-tmp/fit-runtime:/app/python/custom_dynamic_plugins"
142+
- "./app-platform-tmp/log:/log/app/runtime-python"
143+
ports:
144+
- "9666:9666"
145+
146+
web:
147+
container_name: web
148+
hostname: web
149+
image: modelengine/jade-web:${VERSION}
150+
depends_on:
151+
app-builder:
152+
condition: service_healthy
153+
networks:
154+
my-net:
155+
ipv4_address: 172.0.0.103
156+
environment:
157+
LOG_HOME: /log/app
158+
volumes:
159+
- "./app-platform-tmp/log:/log/app/web"
160+
ports:
161+
- "${WEB_PORT}:8001"
162+
163+
networks:
164+
my-net:
165+
driver: bridge
166+
ipam:
167+
config:
168+
- subnet: 172.0.0.0/24
169+
gateway: 172.0.0.1

0 commit comments

Comments
 (0)