在服务器上部署进行上线
2025年10月21日...大约 4 分钟
一、介绍
在 2 核 4GB 云服务器上完成 AI Agent 的整体部署,包含前端(HTML)、管理端(React)、后端(Java),以及 MySQL 与 PostgreSQL 向量数据库环境的搭建与配置。
二、部署过程
如图,为本次的部署过程;

- 注意在云服务器上,需要开放端口 9000(Portainer)、8099(服务端)、3002(管理端)、8899(mysql管理端) 等你需要对外的端口。
三、工程结构
1. 服务端(含用户端)

构建整个工程,分为1步 ~ 4步,前面3步是构建和上传镜像,第4步,是部署项目。教程里的第4步会在云服务器操作。
2. 管理端

管理端部署前需调整 api.ts 中的 API 地址,修改完成后再进行构建。 若企业环境中已接入统一的 API 网关,则无需修改 IP,系统会通过网关域名自动路由至对应服务。完成配置后,依次执行以下命令进行镜像的构建与推送:
./build.sh
./push.sh四、部署
1. 镜像构建
1.1 服务端
docker build -t cactuslixf/ai-agent-station-study-app:1.0 -f ./Dockerfile .
[+] Building 0.3s (10/10) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 1.29kB
=> WARN: MaintainerDeprecated: Maintainer instruction is deprecated in favor of using label (line 5)
=> [internal] load metadata for docker.io/library/openjdk:17-ea-17-jdk-slim-buster
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [1/5] FROM docker.io/library/openjdk:17-ea-17-jdk-slim-buster
=> [internal] load build context
=> => transferring context: 87B
=> CACHED [2/5] RUN ln -snf /usr/share/zoneinfo/PRC /etc/localtime && echo PRC > /etc/timezone
=> CACHED [3/5] RUN echo "deb http://archive.debian.org/debian buster main" > /etc/apt/sources.list && echo "deb http://archive.debian.org/debian-se 0.0s
=> CACHED [4/5] RUN node -v && npm -v
=> CACHED [5/5] ADD target/ai-agent-station-study-app.jar /ai-agent-station-study-app.jar
=> exporting to image
=> => exporting layers
=> => writing image sha256:7a8f62a8ddb574a5e5456275a998f6ca418c819445086c118b643f73da968b12
=> => naming to docker.io/cactuslixf/ai-agent-station-study-app:1.0docker push cactuslixf/ai-agent-station-study-app:1.0
The push refers to repository [docker.io/cactuslixf/ai-agent-station-study-app]
2c3da3a39327: Pushed
12656d7bae56: Pushed
91bc063eac36: Pushed
7494202df645: Pushed
06379473cd2c: Mounted from library/openjdk
2651e73b1464: Mounted from library/openjdk
7e718b9c0c8c: Mounted from library/openjdk
1.0: digest: sha256:6d643f8d11dee4e2bfe913827493b03418687c262a05f0eb880aef2a9ac44639 size: 1791- 执行了构建脚本,并上传镜像到 Docker Hub镜像库。
1.2 管理端
docker build -t cactuslixf/ai-agent-station-admin-app:1.0 -f ./Dockerfile .
[+] Building 109.2s (22/22) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 2.90kB
=> WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2)
=> [internal] load metadata for docker.io/library/nginx:1.25.1
=> [internal] load metadata for docker.io/library/node:20-alpine
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load build context
=> => transferring context: 4.12MB
=> [base 1/1] FROM docker.io/library/node:20-alpine
=> [runner 1/5] FROM docker.io/library/nginx:1.25.1
=> CACHED [runner 2/5] WORKDIR /usr/share/nginx/html
=> CACHED [runner 3/5] RUN rm -rf ./*
=> CACHED [deps 1/6] RUN apk add --no-cache libc6-compat
=> CACHED [deps 2/6] WORKDIR /app
=> CACHED [deps 3/6] COPY package.json ./
=> CACHED [deps 4/6] COPY pnpm-lock.yaml* yarn.lock* package-lock.json* ./
=> [deps 5/6] RUN npm install
=> [deps 6/6] RUN npm install @rspack/[email protected] @rspack/[email protected] --save-dev
=> CACHED [builder 1/4] WORKDIR /app
=> CACHED [builder 2/4] COPY --from=deps /app/node_modules ./node_modules
=> [builder 3/4] COPY . .
=> [builder 4/4] RUN npx rsbuild build
=> [runner 4/5] COPY --from=builder /app/dist .
=> [runner 5/5] RUN echo 'server {' > /etc/nginx/conf.d/default.conf && echo ' listen 3002;' >> /etc/nginx/conf.d/default.conf && echo ' server_name local 0.5s
=> exporting to image
=> => exporting layers
=> => writing image sha256:e1c2345f35f3d343985493d7b73acc9d3d3141c3e65926714a1ca216db637135
=> => naming to docker.io/cactuslixf/ai-agent-station-admin-app:1.0
1 warning found (use docker --debug to expand):
- FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 2)
'cactuslixf/ai-agent-station-admin-app:1.0 Dockerfile: Dockerfile' has been deployed successfully.docker push cactuslixf/ai-agent-station-admin-app:1.0
The push refers to repository [docker.io/cactuslixf/ai-agent-station-admin-app]
b51e08b6b4a1: Pushed
1a196142f820: Pushed
046cf5bb583e: Pushed
5f70bf18a086: Mounted from jiangjuhong/dujiaoka
922d16116201: Mounted from library/nginx
abc3beec4b30: Mounted from library/nginx
c88d3a8ff009: Mounted from library/nginx
8aedfcd777c7: Mounted from library/nginx
4deafab383fa: Mounted from library/nginx
24ee1d7d6a62: Mounted from library/nginx
c6e34807c2d5: Mounted from library/nginx
1.0: digest: sha256:ced4a7960f7349706b6ed2025efda1b084caebb8cbde5c37b39e6a84aed120fd size: 2609- 执行了构建脚本,并上传镜像到 Docker Hub镜像库。
2. 服务部署
2.1 部署脚本
# /usr/local/bin/docker-compose -f /docs/dev-ops/environment/environment-docker-compose-app.yml up -d
version: '3.8'
# docker-compose -f docker-compose-app.yml up -d
services:
# 部署前端项目
ai-agent-station-front-app:
image: cactuslixf/ai-agent-station-front-app
container_name: ai-agent-station-front-app
restart: always
ports:
- '80:80'
volumes:
- ./nginx/html:/usr/share/nginx/html
privileged: true
networks:
- my-network
# 管理后台
ai-agent-station-admin-app:
image: cactuslixf/ai-agent-station-admin-app:1.0
container_name: ai-agent-station-admin-app
ports:
- "3002:3002"
restart: unless-stopped
networks:
- my-network
healthcheck:
test: [ "CMD", "curl", "-f", "http://localhost:3002" ]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
labels:
- "traefik.enable=true"
- "traefik.http.routers.ai-agent-front.rule=Host(`localhost`)"
- "traefik.http.services.ai-agent-front.loadbalancer.server.port=3002"
# 进入后端命令 docker exec -it ai-agent-station-study-app /bin/bash
ai-agent-station-study-app:
image: cactuslixf/ai-agent-station-study-app:1.1
container_name: ai-agent-station-study-app
restart: on-failure
ports:
- "8099:8099"
environment:
- TZ=PRC
- SERVER_PORT=8091
- SPRING_DATASOURCE_MYSQL_USERNAME=root
- SPRING_DATASOURCE_MYSQL_PASSWORD=123456
- SPRING_DATASOURCE_MYSQL_URL=jdbc:mysql://mysql:3306/ai-agent-station-study?serverTimezone=UTC&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai
- SPRING_DATASOURCE_MYSQL_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
- SPRING_DATASOURCE_PGVECTOR_DRIVER_CLASS_NAME=org.postgresql.Driver
- SPRING_DATASOURCE_PGVECTOR_USERNAME=postgres
- SPRING_DATASOURCE_PGVECTOR_PASSWORD=postgres
- SPRING_DATASOURCE_PGVECTOR_URL=jdbc:postgresql://vector_db:5432/ai-rag-knowledge?connectTimeout=120
- SPRING_AI_OPENAI_BASE_URL=https://apis.itedus.cn
- SPRING_AI_OPENAI_API_KEY=sk-Vb7vnKNtGFAsKGhz6765DfE3F1974908Bb6650D7169d5aD7
- SPRING_AI_OPENAI_AGENT_AUTO-CONFIG_ENABLED=true
volumes:
- ./log:/data/log
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- my-network
networks:
my-network:
driver: bridge- ai-agent-station-front-app,是通过 nginx 部署的前端 html 页面。
- ai-agent-station-admin-app,是部署的管理后台,注意这个镜像地址要更换为你的
cactuslixf/ai-agent-station-admin-app:1.0 - ai-agent-station-study-app,是部署的服务端,这里要注意,SPRING_AI_OPENAI_BASE_URL、SPRING_AI_OPENAI_API_KEY 要更换为你的。
2.2 上传脚本

- 可以通过 https://termius.com/ 工具(免费)的 sftp 能力,把脚本上传到服务器上。
2.3 执行脚本
2.3.1 环境安装
docker compose -f docker-compose-environment.yml up -d
2.3.2 后端部署 + toc用户端 + 管理端
docker compose -f docker-compose-app.yml up -d
- 部署项目,包括;服务端(study)、toc用户端(front)、管理端(admin)
赞助