feat(core): 重构项目并添加 Docker 支持
- 重命名应用名称和包名,统一使用 llmx 前缀- 添加生产环境和测试环境的 Docker 配置文件 - 新增环境变量配置,用于 Docker部署 - 更新构建脚本,支持多模块构建 - 优化应用配置,适配 Docker 环境
This commit is contained in:
parent
0515b8d5e4
commit
8b17f6cb84
1
.gitignore
vendored
1
.gitignore
vendored
@ -27,6 +27,7 @@ out/
|
|||||||
!**/src/main/**/out/
|
!**/src/main/**/out/
|
||||||
!**/src/test/**/out/
|
!**/src/test/**/out/
|
||||||
gradle.properties
|
gradle.properties
|
||||||
|
docker/.env.dev
|
||||||
### NetBeans ###
|
### NetBeans ###
|
||||||
/nbproject/private/
|
/nbproject/private/
|
||||||
/nbbuild/
|
/nbbuild/
|
||||||
|
|||||||
@ -99,7 +99,6 @@ subprojects {
|
|||||||
plugin(libs.plugins.kotlin.jvm.get().pluginId)
|
plugin(libs.plugins.kotlin.jvm.get().pluginId)
|
||||||
plugin(libs.plugins.jibLocalPlugin.get().pluginId)
|
plugin(libs.plugins.jibLocalPlugin.get().pluginId)
|
||||||
}
|
}
|
||||||
println(project.name + ":" + project.getPropertyByBoolean(ProjectFlags.USE_SPRING_BOOT))
|
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
compilerOptions {
|
compilerOptions {
|
||||||
@ -107,10 +106,20 @@ subprojects {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
jibConfig {
|
jibConfig {
|
||||||
|
val env=System.getenv("SPRING_PROFILES_ACTIVE")
|
||||||
project {
|
project {
|
||||||
projectName = "llmx-core-service"
|
projectName = "llmx-core-service"
|
||||||
ports = listOf("9002")
|
ports = listOf("9002")
|
||||||
environment = mapOf("SPRING_PROFILES_ACTIVE" to "prod")
|
environment = mapOf("SPRING_PROFILES_ACTIVE" to env)
|
||||||
|
imageName = "llmx-core-service"
|
||||||
|
// paths = listOf(File(rootProject.projectDir, "scripts").absolutePath)
|
||||||
|
}
|
||||||
|
project{
|
||||||
|
projectName="llmx-impl-bailian"
|
||||||
|
ports=listOf("9003")
|
||||||
|
environment=mapOf("SPRING_PROFILES_ACTIVE" to env)
|
||||||
|
imageName="llmx-impl-bailian"
|
||||||
|
// paths = listOf(File(rootProject.projectDir, "scripts").absolutePath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,8 +12,8 @@ dependencies {
|
|||||||
gradlePlugin {
|
gradlePlugin {
|
||||||
plugins {
|
plugins {
|
||||||
register("jib-plugin") {
|
register("jib-plugin") {
|
||||||
id = "org.jcnc.llmhub.plugin.jib"
|
id = "org.jcnc.llmx.plugin.jib"
|
||||||
implementationClass = "org.jcnc.llmhub.plugin.jib.JibPlugin"
|
implementationClass = "org.jcnc.llmx.plugin.jib.JibPlugin"
|
||||||
description =
|
description =
|
||||||
"提供简单的配置构建镜像"
|
"提供简单的配置构建镜像"
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,12 +52,13 @@ class JibPlugin : Plugin<Project> {
|
|||||||
}
|
}
|
||||||
to {
|
to {
|
||||||
image =
|
image =
|
||||||
"${System.getenv("LUKE_SERVER_DOCKER_REGISTRY_URL")}/${jibProject.imageName}:${jibProject.version}"
|
"${System.getenv("DOCKER_REGISTRY_URL")}/${jibProject.imageName}:${jibProject.version}"
|
||||||
auth {
|
auth {
|
||||||
username = "root"
|
username = "root"
|
||||||
password = System.getenv("LUKE_SERVER_DOCKER_REGISTRY_PASSWORD")
|
password = System.getenv("SERVER_PASSWORD")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
setAllowInsecureRegistries(true)
|
||||||
// 动态配置容器参数
|
// 动态配置容器参数
|
||||||
container {
|
container {
|
||||||
ports = jibProject.ports
|
ports = jibProject.ports
|
||||||
@ -69,7 +70,9 @@ class JibPlugin : Plugin<Project> {
|
|||||||
|
|
||||||
// 动态配置额外目录
|
// 动态配置额外目录
|
||||||
extraDirectories {
|
extraDirectories {
|
||||||
|
if(jibProject.paths.isNotEmpty()){
|
||||||
setPaths(jibProject.paths)
|
setPaths(jibProject.paths)
|
||||||
|
}
|
||||||
permissions.putAll(jibProject.permissions)
|
permissions.putAll(jibProject.permissions)
|
||||||
}
|
}
|
||||||
// 将动态部分移到任务配置中
|
// 将动态部分移到任务配置中
|
||||||
|
|||||||
@ -19,14 +19,14 @@ data class JibProject(
|
|||||||
var ports: List<String> = listOf("8080"),
|
var ports: List<String> = listOf("8080"),
|
||||||
var environment: Map<String, String> = mapOf("SPRING_PROFILES_ACTIVE" to "prod"),
|
var environment: Map<String, String> = mapOf("SPRING_PROFILES_ACTIVE" to "prod"),
|
||||||
var entrypoint: List<String> = emptyList(),
|
var entrypoint: List<String> = emptyList(),
|
||||||
var paths: List<String> = listOf("llmhub-base/scripts/entrypoint.sh"),
|
var paths: List<String> = listOf(),
|
||||||
var imageName: String = "",
|
var imageName: String = "",
|
||||||
var version: String = "latest",
|
var version: String = "latest",
|
||||||
var permissions: Map<String, String> = mapOf("/scripts/entrypoint.sh" to "755"),
|
var permissions: Map<String, String> = mapOf("/scripts/entrypoint.sh" to "755"),
|
||||||
var baseImage: String = "docker://bellsoft/liberica-openjdk-debian:21"
|
var baseImage: String = "docker://bellsoft/liberica-openjdk-debian:21"
|
||||||
) {
|
) {
|
||||||
init {
|
init {
|
||||||
if (imageName.isEmpty()) {
|
if (imageName.isBlank()) {
|
||||||
imageName = projectName
|
imageName = projectName
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
docker/.env.prod
Normal file
3
docker/.env.prod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Docker_REGISTRY_URL=49.235.96.75:5000
|
||||||
|
SERVER_PASSWORD=L4s6f9y3
|
||||||
|
SPRING_PROFILES_ACTIVE=prod
|
||||||
3
docker/.env.test
Normal file
3
docker/.env.test
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Docker_REGISTRY_URL=49.235.96.75:5000
|
||||||
|
SERVER_PASSWORD=L4s6f9y3
|
||||||
|
SPRING_PROFILES_ACTIVE=test
|
||||||
42
docker/docker-compose.dev.yml
Normal file
42
docker/docker-compose.dev.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
services:
|
||||||
|
llmx-core-database:
|
||||||
|
image: postgres:16-alpine # 长期支持版本推荐用 16
|
||||||
|
container_name: llmx-core-database
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "5432:9052"
|
||||||
|
networks:
|
||||||
|
- llmx-net
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: llmx_core
|
||||||
|
POSTGRES_USER: llmx
|
||||||
|
POSTGRES_PASSWORD: L4s6f9y3,
|
||||||
|
volumes:
|
||||||
|
- llmx-core-db-volume:/var/lib/postgresql/data
|
||||||
|
llmx-core-service:
|
||||||
|
image: ${Docker_REGISTRY_URL}/llmx-core-service
|
||||||
|
container_name: llmx-core-service
|
||||||
|
ports:
|
||||||
|
- "9002:9002"
|
||||||
|
networks:
|
||||||
|
- llmx-net
|
||||||
|
volumes:
|
||||||
|
- llmx-core-service-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
llmx-impl-baiLian:
|
||||||
|
image: ${Docker_REGISTRY_URL}/llmx-impl-bailian
|
||||||
|
container_name: llmx-impl-bailian
|
||||||
|
ports:
|
||||||
|
- "9003:9003"
|
||||||
|
networks:
|
||||||
|
- llmx-net
|
||||||
|
volumes:
|
||||||
|
- llmx-impl-baiLian-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
llmx-net:
|
||||||
|
driver: bridge
|
||||||
|
volumes:
|
||||||
|
llmx-core-service-volume:
|
||||||
|
llmx-impl-baiLian-volume:
|
||||||
|
llmx-core-db-volume:
|
||||||
42
docker/docker-compose.test.yml
Normal file
42
docker/docker-compose.test.yml
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
services:
|
||||||
|
llmx-core-database:
|
||||||
|
image: postgres:16-alpine # 长期支持版本推荐用 16
|
||||||
|
container_name: llmx-core-database
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "5432:9052"
|
||||||
|
networks:
|
||||||
|
- llmx-net
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: llmx_core
|
||||||
|
POSTGRES_USER: llmx
|
||||||
|
POSTGRES_PASSWORD: L4s6f9y3,
|
||||||
|
volumes:
|
||||||
|
- llmx-core-db-volume:/var/lib/postgresql/data
|
||||||
|
llmx-core-service:
|
||||||
|
image: ${Docker_REGISTRY_URL}/llmx-core-service
|
||||||
|
container_name: llmx-core-service
|
||||||
|
ports:
|
||||||
|
- "9002:9002"
|
||||||
|
networks:
|
||||||
|
- llmx-net
|
||||||
|
volumes:
|
||||||
|
- llmx-core-service-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
llmx-impl-baiLian:
|
||||||
|
image: ${Docker_REGISTRY_URL}/llmx-impl-baiLian
|
||||||
|
container_name: llmx-impl-baiLian
|
||||||
|
ports:
|
||||||
|
- "9003:9003"
|
||||||
|
networks:
|
||||||
|
- llmx-net
|
||||||
|
volumes:
|
||||||
|
- llmx-impl-baiLian-volume:/app/volume
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
llmx-net-dev:
|
||||||
|
driver: bridge
|
||||||
|
volumes:
|
||||||
|
llmx-core-service-volume:
|
||||||
|
llmx-impl-baiLian-volume:
|
||||||
|
llmx-core-db-volume:
|
||||||
@ -26,7 +26,7 @@ spring-dependency-management = { id = "io.spring.dependency-management", version
|
|||||||
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot-version" }
|
spring-boot = { id = "org.springframework.boot", version.ref = "spring-boot-version" }
|
||||||
|
|
||||||
jib = { id = "com.google.cloud.tools.jib", version.ref = "jib-version" }
|
jib = { id = "com.google.cloud.tools.jib", version.ref = "jib-version" }
|
||||||
jibLocalPlugin = { id = "org.jcnc.llmhub.plugin.jib" }
|
jibLocalPlugin = { id = "org.jcnc.llmx.plugin.jib" }
|
||||||
[libraries]
|
[libraries]
|
||||||
jib-gradlePlugin = { module = "com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin", version.ref = "jib-version" }
|
jib-gradlePlugin = { module = "com.google.cloud.tools.jib:com.google.cloud.tools.jib.gradle.plugin", version.ref = "jib-version" }
|
||||||
# bom
|
# bom
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import org.springframework.cloud.context.config.annotation.RefreshScope
|
|||||||
* @since 2025-04-26 18:01:48
|
* @since 2025-04-26 18:01:48
|
||||||
* @author gewuyou
|
* @author gewuyou
|
||||||
*/
|
*/
|
||||||
@ConfigurationProperties(prefix = "llmhub.model-route")
|
@ConfigurationProperties(prefix = "llmx.model-route")
|
||||||
@RefreshScope
|
@RefreshScope
|
||||||
open class ModelProperties {
|
open class ModelProperties {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -3,11 +3,11 @@ server:
|
|||||||
spring:
|
spring:
|
||||||
config:
|
config:
|
||||||
import: classpath:bootstrap-dev.yml
|
import: classpath:bootstrap-dev.yml
|
||||||
llmhub:
|
llmx:
|
||||||
model-route:
|
model-route:
|
||||||
modelServiceMap:
|
modelServiceMap:
|
||||||
qwen-turbo: llmhub-impl-baiLian
|
qwen-turbo: llmx-impl-baiLian
|
||||||
qwen-max: llmhub-impl-baiLian
|
qwen-max: llmx-impl-baiLian
|
||||||
qwen-plus: llmhub-impl-baiLian
|
qwen-plus: llmx-impl-baiLian
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: llmhub-core-service
|
name: llmx-core-service
|
||||||
profiles:
|
profiles:
|
||||||
active: dev
|
active: dev
|
||||||
|
|||||||
@ -4,7 +4,7 @@ spring:
|
|||||||
config:
|
config:
|
||||||
import: classpath:bootstrap-dev.yml
|
import: classpath:bootstrap-dev.yml
|
||||||
application:
|
application:
|
||||||
name: llmhub-impl-baiLian
|
name: llmx-impl-baiLian
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
@ -2,7 +2,7 @@ server:
|
|||||||
port: 9003
|
port: 9003
|
||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: llmhub-impl-baiLian
|
name: llmx-impl-baiLian
|
||||||
cloud:
|
cloud:
|
||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
@ -1,6 +1,6 @@
|
|||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: llmhub-impl-baiLian
|
name: llmx-impl-baiLian
|
||||||
profiles:
|
profiles:
|
||||||
active: dev
|
active: dev
|
||||||
# 阿里云配置
|
# 阿里云配置
|
||||||
99
scripts/entrypoint.sh
Normal file
99
scripts/entrypoint.sh
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#set -x # 调试模式,可以启用以打印每行脚本的执行情况
|
||||||
|
|
||||||
|
# 设置默认的等待时间间隔,默认值为2秒
|
||||||
|
: "${SLEEP_SECOND:=2}"
|
||||||
|
# 设置默认的超时时间,默认值为60秒
|
||||||
|
: "${TIMEOUT:=60}"
|
||||||
|
|
||||||
|
# 带时间戳+emoji的小型日志函数
|
||||||
|
log() {
|
||||||
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
||||||
|
}
|
||||||
|
|
||||||
|
# 等待服务函数
|
||||||
|
wait_for() {
|
||||||
|
local host="$1"
|
||||||
|
local port="$2"
|
||||||
|
local timeout="$TIMEOUT"
|
||||||
|
local start_time
|
||||||
|
local current_time
|
||||||
|
local elapsed_time
|
||||||
|
local attempt=0
|
||||||
|
|
||||||
|
start_time=$(date +%s)
|
||||||
|
log "🔄 开始等待依赖服务 $host:$port 可用 (超时时间: ${timeout}s, 间隔: ${SLEEP_SECOND}s)"
|
||||||
|
|
||||||
|
while ! nc -z "$host" "$port" 2>/dev/null; do
|
||||||
|
current_time=$(date +%s)
|
||||||
|
elapsed_time=$((current_time - start_time))
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
|
||||||
|
if [ "$elapsed_time" -ge "$timeout" ]; then
|
||||||
|
log "🛑 [ERROR] 等待超时!依赖服务 $host:$port 在 ${timeout}s 内未启动"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "🔄 第 ${attempt} 次检测:$host:$port 未就绪,已等待 ${elapsed_time}s..."
|
||||||
|
sleep "$SLEEP_SECOND"
|
||||||
|
done
|
||||||
|
|
||||||
|
total_time=$(( $(date +%s) - start_time ))
|
||||||
|
log "✅ [SUCCESS] 依赖服务 $host:$port 已启动,耗时 ${total_time}s"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
# 声明变量
|
||||||
|
declare DEPENDS
|
||||||
|
declare CMD
|
||||||
|
|
||||||
|
# 解析参数
|
||||||
|
while getopts "d:c:" arg; do
|
||||||
|
case "$arg" in
|
||||||
|
d)
|
||||||
|
DEPENDS="$OPTARG"
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
CMD="$OPTARG"
|
||||||
|
;;
|
||||||
|
?)
|
||||||
|
log "🛑 [ERROR] 未知参数"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# 检查依赖
|
||||||
|
if [ -n "$DEPENDS" ]; then
|
||||||
|
log "📦 检测到依赖服务列表: $DEPENDS"
|
||||||
|
for var in ${DEPENDS//,/ }; do
|
||||||
|
host=${var%:*}
|
||||||
|
port=${var#*:}
|
||||||
|
if [ -z "$host" ] || [ -z "$port" ]; then
|
||||||
|
log "🛑 [ERROR] 依赖项格式错误: $var,应为 host:port"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! wait_for "$host" "$port"; then
|
||||||
|
log "❌ [ERROR] 依赖服务 $host:$port 启动失败,终止执行"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
else
|
||||||
|
log "⚡️ 未配置依赖服务,跳过依赖检测"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 执行命令
|
||||||
|
if [ -n "$CMD" ]; then
|
||||||
|
log "🚀 准备执行命令: $CMD"
|
||||||
|
eval "$CMD"
|
||||||
|
cmd_exit_code=$?
|
||||||
|
if [ $cmd_exit_code -eq 0 ]; then
|
||||||
|
log "✅ [SUCCESS] 命令执行完成,退出码: $cmd_exit_code"
|
||||||
|
else
|
||||||
|
log "❌ [ERROR] 命令执行失败,退出码: $cmd_exit_code"
|
||||||
|
exit $cmd_exit_code
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "⚠️ [WARNING] 未指定要执行的命令,脚本结束"
|
||||||
|
fi
|
||||||
@ -13,8 +13,8 @@ project(":llmx-core:llmx-core-spi").name = "llmx-core-spi"
|
|||||||
|
|
||||||
include(
|
include(
|
||||||
"llmx-impl",
|
"llmx-impl",
|
||||||
"llmx-impl:llmx-impl-baiLian",
|
"llmx-impl:llmx-impl-bailian",
|
||||||
// "llmx-impl:llmx-impl-openAi",
|
// "llmx-impl:llmx-impl-openAi",
|
||||||
)
|
)
|
||||||
project(":llmx-impl:llmx-impl-baiLian").name = "llmx-impl-baiLian"
|
project(":llmx-impl:llmx-impl-bailian").name = "llmx-impl-bailian"
|
||||||
//project(":llmx-impl:llmx-impl-openAi").name = "llmx-impl-openAi"
|
//project(":llmx-impl:llmx-impl-openAi").name = "llmx-impl-openAi"
|
||||||
Loading…
x
Reference in New Issue
Block a user