feat(llmx): 添加 OpenAI接口支持 #48
219
.gitea/workflows/deploy.master.yml
Normal file
219
.gitea/workflows/deploy.master.yml
Normal file
@ -0,0 +1,219 @@
|
|||||||
|
name: CI/CD Pipeline
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master # 触发构建的分支
|
||||||
|
|
||||||
|
env:
|
||||||
|
# ========== 环境变量配置 ==========
|
||||||
|
DOCKER_REGISTRY_URL: ${{vars.DOCKER_REGISTRY_URL}} # 私有Docker镜像仓库地址
|
||||||
|
INTERNAL_DOCKER_REGISTRY_URL: ${{vars.INTERNAL_DOCKER_REGISTRY_URL}}
|
||||||
|
PROJECT_NAME: llmx # 项目名称
|
||||||
|
MAIN_COMPOSE_FILE: docker/docker-compose.master.main.yml
|
||||||
|
AGENT_COMPOSE_FILE: docker/docker-compose.master.agent.yml
|
||||||
|
SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }} # 仓库密码
|
||||||
|
JCNC_GITEA_URL: ${{vars.SERVER_GITEA_URL}} # Gitea地址
|
||||||
|
RUNNER_TOOL_CACHE: /opt/tools-cache # 工具缓存目录
|
||||||
|
GRADLE_CACHE_KEY: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
SPRING_PROFILES_ACTIVE: master
|
||||||
|
INTERNAL_SERVER_HOST: ${{ vars.INTERNAL_SERVER_HOST }}
|
||||||
|
INTERNAL_SERVER_PROT: ${{ vars.INTERNAL_SERVER_PROT }}
|
||||||
|
SINGAPORE_SERVER_HOST: ${{ vars.SINGAPORE_SERVER_HOST }}
|
||||||
|
SSH_PROT: ${{ vars.SSH_PROT }}
|
||||||
|
jobs:
|
||||||
|
build-and-deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: jcnc/act-runner:latest # 使用自定义Runner镜像
|
||||||
|
options: --user root # 以root用户运行(需要docker权限)
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# ========== 1. 代码检出 ==========
|
||||||
|
- name: 🛒 Checkout source code
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # 获取完整git历史(某些插件需要)
|
||||||
|
|
||||||
|
# ========== 2. Docker环境准备 ==========
|
||||||
|
- name: 🐳 Install Docker Environment
|
||||||
|
run: |
|
||||||
|
echo "=== 检查Docker安装状态 ==="
|
||||||
|
if ! command -v docker >/dev/null; then
|
||||||
|
echo "❌ Docker未安装,开始安装..."
|
||||||
|
curl -fsSL https://get.docker.com | sh | tee docker-install.log
|
||||||
|
echo "✅ Docker安装完成"
|
||||||
|
echo "✅ Docker Compose安装完成"
|
||||||
|
else
|
||||||
|
echo "ℹ️ Docker已安装,版本: $(docker -v)"
|
||||||
|
echo "ℹ️ Docker Compose已安装,版本: $(docker compose version)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ========== 3. Gradle环境准备 ==========
|
||||||
|
- name: 🔧 Prepare Gradle Environment
|
||||||
|
run: |
|
||||||
|
echo "赋予gradlew执行权限..."
|
||||||
|
chmod +x gradlew
|
||||||
|
echo "当前目录结构:"
|
||||||
|
ls -al
|
||||||
|
# ========== 4. 恢复缓存 ==========
|
||||||
|
- name: 📦 Use Cache
|
||||||
|
id: cache
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/actions/cache/restore@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
~/.cache
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
env:
|
||||||
|
ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出
|
||||||
|
|
||||||
|
- name: ⚙️ Setup Gradle
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/gradle/actions/setup-gradle@v4
|
||||||
|
with:
|
||||||
|
gradle-version: wrapper # 使用项目自带的gradle-wrapper
|
||||||
|
- name: 📦 Copy Compose File to Internal Server
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/appleboy/scp-action@v1
|
||||||
|
with:
|
||||||
|
host: ${{ env.INTERNAL_SERVER_HOST }}
|
||||||
|
port: $INTERNAL_SERVER_PROT
|
||||||
|
username: root
|
||||||
|
password: ${{ secrets.INTERNAL_SERVER_PASSWORD }}
|
||||||
|
source: $MAIN_COMPOSE_FILE
|
||||||
|
target: "/home/luke/deploy/llmx/docker-compose.master.yml"
|
||||||
|
- name: 📦 Copy Compose File to Singapore Server
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/appleboy/scp-action@v1
|
||||||
|
with:
|
||||||
|
host: $SINGAPORE_SERVER_HOST
|
||||||
|
port: $SSH_PROT
|
||||||
|
username: root
|
||||||
|
password: ${{ secrets.SINGAPORE_SERVER_PASSWORD }}
|
||||||
|
source: $AGENT_COMPOSE_FILE
|
||||||
|
target: "/home/deploy/llmx/docker-compose.master.yml"
|
||||||
|
# ========== 5. 构建阶段 ==========
|
||||||
|
- name: 🏗️ Build with Jib
|
||||||
|
run: |
|
||||||
|
echo "开始构建Docker镜像..."
|
||||||
|
./gradlew jib --stacktrace --build-cache --info -Dorg.gradle.caching=true -Dorg.gradle.jvmargs="-Xmx2g -Xms2g -XX:MaxMetaspaceSize=1g" | tee build.log
|
||||||
|
|
||||||
|
echo "=== 镜像构建结果 ==="
|
||||||
|
docker images | grep ${{ env.PROJECT_NAME }} || true
|
||||||
|
- name: 🛑 Stop Gradle Daemon
|
||||||
|
run: |
|
||||||
|
echo "停止Gradle守护进程..."
|
||||||
|
./gradlew --stop
|
||||||
|
echo "剩余Java进程:"
|
||||||
|
ps aux | grep java || true
|
||||||
|
- name: 🛰️ Tag & Push to Internal Registry
|
||||||
|
run: |
|
||||||
|
echo "标记并推送镜像到内部服务器..."
|
||||||
|
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-core-service:latest ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
|
||||||
|
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
|
||||||
|
|
||||||
|
echo "${{ secrets.INTERNAL_DOCKER_REGISTRY_PASSWORD }}" | docker login ${{env.INTERNAL_DOCKER_REGISTRY_URL}} -u root --password-stdin
|
||||||
|
docker push ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
|
||||||
|
docker push ${{env.INTERNAL_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
|
||||||
|
docker logout ${{env.INTERNAL_DOCKER_REGISTRY_URL}}
|
||||||
|
- name: 🛰️ Tag & Push to Singapore Registry
|
||||||
|
run: |
|
||||||
|
echo "标记并推送镜像到内部服务器..."
|
||||||
|
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-core-service:latest ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
|
||||||
|
docker tag ${{env.DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
|
||||||
|
|
||||||
|
echo "${{ secrets.INTERNAL_DOCKER_REGISTRY_PASSWORD }}" | docker login ${{env.SINGAPORE_DOCKER_REGISTRY_URL}} -u root --password-stdin
|
||||||
|
docker push ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-core-service:latest
|
||||||
|
docker push ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}/llmx-impl-bailian:latest
|
||||||
|
docker logout ${{env.SINGAPORE_DOCKER_REGISTRY_URL}}
|
||||||
|
# ========== 6. 保存缓存 ==========
|
||||||
|
- name: 📦 Save Cache
|
||||||
|
id: cache
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/actions/cache/save@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
~/.cache
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||||
|
env:
|
||||||
|
ACTIONS_RUNNER_DEBUG: true # 启用缓存调试输出
|
||||||
|
- name: 🧼 Cleanup Dangling Images
|
||||||
|
run: |
|
||||||
|
echo "开始清理无标签镜像..."
|
||||||
|
docker image prune -f
|
||||||
|
remote-internal-deploy:
|
||||||
|
needs: build-and-deploy
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: jcnc/act-runner:latest # 使用自定义Runner镜像
|
||||||
|
options: --user root # 以root用户运行(需要docker权限)
|
||||||
|
steps:
|
||||||
|
- name: ✈️ Deploy on Internal Server
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/appleboy/ssh-action@v1
|
||||||
|
with:
|
||||||
|
host: $INTERNAL_SERVER_HOST
|
||||||
|
port: $INTERNAL_SERVER_PROT
|
||||||
|
username: root
|
||||||
|
password: ${{ secrets.INTERNAL_SERVER_PASSWORD }}
|
||||||
|
script: |
|
||||||
|
cd /home/luke/deploy/llmx
|
||||||
|
echo "准备部署环境..."
|
||||||
|
chmod +x docker-compose.master.yml
|
||||||
|
echo "当前Docker状态:"
|
||||||
|
docker ps -a
|
||||||
|
echo "清理旧容器..."
|
||||||
|
docker compose -f docker-compose.master.yml down --remove-orphans
|
||||||
|
echo "清理后Docker状态:"
|
||||||
|
docker ps -a
|
||||||
|
echo "拉取最新镜像..."
|
||||||
|
docker compose -f docker-compose.master.yml pull
|
||||||
|
echo "启动新服务..."
|
||||||
|
docker compose -f docker-compose.master.yml up -d
|
||||||
|
docker compose ps
|
||||||
|
echo "=== 服务状态检查 ==="
|
||||||
|
docker compose -f docker-compose.master.yml ps
|
||||||
|
echo "开始清理无标签镜像..."
|
||||||
|
docker image prune -f
|
||||||
|
echo "清理docker-compose.master.yml"
|
||||||
|
rm -rf docker-compose.master.yml
|
||||||
|
remote-singapore-deploy:
|
||||||
|
needs: build-and-deploy
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: jcnc/act-runner:latest # 使用自定义Runner镜像
|
||||||
|
options: --user root # 以root用户运行(需要docker权限)
|
||||||
|
steps:
|
||||||
|
- name: ✈️ Deploy on Internal Server
|
||||||
|
uses: ${{env.JCNC_GITEA_URL}}/appleboy/ssh-action@v1
|
||||||
|
with:
|
||||||
|
host: $SINGAPORE_SERVER_HOST
|
||||||
|
port: $SSH_PROT
|
||||||
|
username: root
|
||||||
|
password: ${{ secrets.SINGAPORE_SERVER_PASSWORD }}
|
||||||
|
script: |
|
||||||
|
cd /home/deploy/llmx
|
||||||
|
echo "准备部署环境..."
|
||||||
|
chmod +x docker-compose.master.yml
|
||||||
|
echo "当前Docker状态:"
|
||||||
|
docker ps -a
|
||||||
|
echo "清理旧容器..."
|
||||||
|
docker compose -f docker-compose.master.yml down --remove-orphans
|
||||||
|
echo "清理后Docker状态:"
|
||||||
|
docker ps -a
|
||||||
|
echo "拉取最新镜像..."
|
||||||
|
docker compose -f docker-compose.master.yml pull
|
||||||
|
echo "启动新服务..."
|
||||||
|
docker compose -f docker-compose.master.yml up -d
|
||||||
|
docker compose ps
|
||||||
|
echo "=== 服务状态检查 ==="
|
||||||
|
docker compose -f docker-compose.master.yml ps
|
||||||
|
echo "开始清理无标签镜像..."
|
||||||
|
docker image prune -f
|
||||||
|
echo "清理docker-compose.master.yml"
|
||||||
|
rm -rf docker-compose.master.yml
|
||||||
32
docker/docker-compose.master.agent.yml
Normal file
32
docker/docker-compose.master.agent.yml
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
services:
|
||||||
|
llmx-core-service-banana:
|
||||||
|
image: ${DOCKER_REGISTRY_URL}/llmx-core-service
|
||||||
|
container_name: llmx-core-service
|
||||||
|
ports:
|
||||||
|
- "9002:9002"
|
||||||
|
networks:
|
||||||
|
- llmx-net-master
|
||||||
|
environment:
|
||||||
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
|
||||||
|
volumes:
|
||||||
|
- llmx-core-service-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
llmx-impl-bailian-banana:
|
||||||
|
image: ${DOCKER_REGISTRY_URL}/llmx-impl-bailian
|
||||||
|
container_name: llmx-impl-bailian
|
||||||
|
ports:
|
||||||
|
- "9003:9003"
|
||||||
|
networks:
|
||||||
|
- llmx-net-master
|
||||||
|
environment:
|
||||||
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
|
||||||
|
volumes:
|
||||||
|
- llmx-impl-bailian-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
networks:
|
||||||
|
llmx-net-master:
|
||||||
|
driver: bridge
|
||||||
|
volumes:
|
||||||
|
llmx-core-service-volume:
|
||||||
|
llmx-impl-bailian-volume:
|
||||||
48
docker/docker-compose.master.main.yml
Normal file
48
docker/docker-compose.master.main.yml
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
services:
|
||||||
|
llmx-core-service-apple:
|
||||||
|
image: ${DOCKER_REGISTRY_URL}/llmx-core-service
|
||||||
|
container_name: llmx-core-service
|
||||||
|
ports:
|
||||||
|
- "9002:9002"
|
||||||
|
networks:
|
||||||
|
- llmx-net-master
|
||||||
|
environment:
|
||||||
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
|
||||||
|
volumes:
|
||||||
|
- llmx-core-service-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
llmx-database:
|
||||||
|
image: postgres:16-alpine # 长期支持版本推荐用 16
|
||||||
|
container_name: llmx-database
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "9052:5432"
|
||||||
|
networks:
|
||||||
|
- llmx-net-master
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: llmx_db
|
||||||
|
POSTGRES_USER: llmx
|
||||||
|
POSTGRES_PASSWORD: L4s6f9y3,
|
||||||
|
volumes:
|
||||||
|
- llmx-db-volume
|
||||||
|
llmx-impl-bailian-apple:
|
||||||
|
image: ${DOCKER_REGISTRY_URL}/llmx-impl-bailian
|
||||||
|
container_name: llmx-impl-bailian
|
||||||
|
ports:
|
||||||
|
- "9003:9003"
|
||||||
|
networks:
|
||||||
|
- llmx-net-master
|
||||||
|
environment:
|
||||||
|
SPRING_PROFILES_ACTIVE: ${SPRING_PROFILES_ACTIVE}
|
||||||
|
volumes:
|
||||||
|
- llmx-impl-bailian-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
networks:
|
||||||
|
llmx-net-master:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
llmx-core-service-volume:
|
||||||
|
llmx-impl-bailian-volume:
|
||||||
|
llmx-db-volume:
|
||||||
@ -1,7 +1,2 @@
|
|||||||
server:
|
server:
|
||||||
port: 9002
|
port: 9002
|
||||||
spring:
|
|
||||||
cloud:
|
|
||||||
nacos:
|
|
||||||
discovery:
|
|
||||||
server-addr: 49.235.96.75:9001
|
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
spring:
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
username: nacos
|
||||||
|
password: L4s6f9y3,
|
||||||
|
server-addr: 49.235.96.75:8848
|
||||||
|
discovery:
|
||||||
|
server-addr: ${spring.cloud.nacos.server-addr}
|
||||||
|
username: ${spring.cloud.nacos.username}
|
||||||
|
password: ${spring.cloud.nacos.password}
|
||||||
|
group: llmx-${spring.profiles.active}
|
||||||
|
namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b
|
||||||
|
config:
|
||||||
|
file-extension: yaml
|
||||||
|
namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b
|
||||||
|
refresh-enabled: true
|
||||||
|
extension-configs:
|
||||||
|
- data-id: ${spring.application.name}-${spring.profiles.active}.yaml
|
||||||
|
refresh: true
|
||||||
|
group: ${spring.application.name}
|
||||||
|
- data-id: common-db.yaml
|
||||||
|
refresh: true
|
||||||
|
group: infra
|
||||||
@ -1,22 +1,2 @@
|
|||||||
server:
|
server:
|
||||||
port: 9003
|
port: 9003
|
||||||
spring:
|
|
||||||
application:
|
|
||||||
name: llmx-impl-bailian
|
|
||||||
cloud:
|
|
||||||
nacos:
|
|
||||||
discovery:
|
|
||||||
server-addr: 49.235.96.75:9001 # Nacos 服务地址
|
|
||||||
# 阿里云配置
|
|
||||||
aliyun:
|
|
||||||
# DashScope服务配置
|
|
||||||
dash:
|
|
||||||
# 访问凭证配置
|
|
||||||
scope:
|
|
||||||
access-key-id: LTAI5tHiA2Ry3XTAfoSEJW6z # 阿里云访问密钥ID
|
|
||||||
access-key-secret: K5sf4FxZZuUgLEFnyfepBfMqFGmDcD # 阿里云访问密钥密钥
|
|
||||||
endpoint: bailian.cn-beijing.aliyuncs.com # 阿里云服务端点
|
|
||||||
workspace-id: llm-axfkuqft05uzbjpi # 工作区ID
|
|
||||||
api-key: sk-78af4dd964a94f4cb373851064dbdc12 # API密钥
|
|
||||||
app-id: 3fae0bbab2e54a90a37aa02cd12dd62c # 应用ID
|
|
||||||
base-url: https://dashscope.aliyuncs.com/api/v1/apps/ # 基础API URL
|
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
spring:
|
||||||
|
cloud:
|
||||||
|
nacos:
|
||||||
|
username: nacos
|
||||||
|
password: L4s6f9y3,
|
||||||
|
server-addr: 49.235.96.75:8848
|
||||||
|
discovery:
|
||||||
|
username: ${spring.cloud.nacos.username}
|
||||||
|
password: ${spring.cloud.nacos.password}
|
||||||
|
server-addr: ${spring.cloud.nacos.server-addr}
|
||||||
|
group: llmx-${spring.profiles.active}
|
||||||
|
namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b
|
||||||
|
config:
|
||||||
|
file-extension: yaml
|
||||||
|
namespace: ab34d859-6f1a-4f28-ac6b-27a7410ab27b
|
||||||
|
refresh-enabled: true
|
||||||
|
extension-configs:
|
||||||
|
- data-id: ${spring.application.name}-${spring.profiles.active}.yaml
|
||||||
|
refresh: true
|
||||||
|
group: ${spring.application.name}
|
||||||
Loading…
x
Reference in New Issue
Block a user