docker mysql is good
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"build": {
|
||||
"timestamp": "2025-09-06T10:59:29Z",
|
||||
"version": "main-ed86233-dirty",
|
||||
"platforms": "linux/amd64",
|
||||
"mode": "local",
|
||||
"push_to_registry": false
|
||||
},
|
||||
"git": {
|
||||
"commit": {
|
||||
"full": "ed862339f38c70f4182e984524a7ac99b7b5454f",
|
||||
"short": "ed86233",
|
||||
"message": "commit to github",
|
||||
"author": "BrunoGao",
|
||||
"date": "2025-09-06 15:29:18 +0800",
|
||||
"url": "https://github.com/BrunoGao/release/commit/ed862339f38c70f4182e984524a7ac99b7b5454f"
|
||||
},
|
||||
"branch": "main",
|
||||
"tag": "null",
|
||||
"describe": "ed86233-dirty",
|
||||
"dirty": "true"
|
||||
},
|
||||
"repository": {
|
||||
"github": "BrunoGao/release",
|
||||
"github_url": "https://github.com/BrunoGao/release"
|
||||
},
|
||||
"registry": {
|
||||
"url": "crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx",
|
||||
"images": []
|
||||
}
|
||||
}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
[2025-09-06 15:39:52] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 16:29:32] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 16:30:41] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 16:32:15] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:34:51] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:35:42] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:36:03] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:37:56] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:38:41] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:40:05] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:40:21] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:58:29] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:58:36] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
[2025-09-06 18:59:29] START: mysql -> crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:2.0.1 (commit: ed86233)
|
||||
+94
-104
@@ -1,17 +1,3 @@
|
||||
<<<<<<< HEAD
|
||||
# 系统文件
|
||||
.DS_Store
|
||||
.DS_Store?
|
||||
._*
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
Thumbs.db
|
||||
|
||||
# IDE文件
|
||||
.vscode/
|
||||
.idea/
|
||||
=======
|
||||
# ==============================================================================
|
||||
# 根目录 .gitignore - 精确忽略规则 (只忽略日志、venv、编译产物等)
|
||||
# ==============================================================================
|
||||
@@ -25,13 +11,44 @@ Thumbs.db
|
||||
# ==============================================================================
|
||||
|
||||
# ================================
|
||||
# 日志文件 - 确实需要忽略
|
||||
# 构建输出文件管理 - 新增区域
|
||||
# ================================
|
||||
# 构建信息和日志文件需要提交到版本库进行跟踪
|
||||
# 但排除临时构建文件
|
||||
|
||||
# 保留重要的构建记录文件
|
||||
!.build-info.json
|
||||
!.build.log
|
||||
!.sync.log
|
||||
!build-history/
|
||||
|
||||
# 排除临时构建文件
|
||||
*.build.tmp
|
||||
*.build.cache
|
||||
.buildx-cache/
|
||||
.docker-build-cache/
|
||||
|
||||
# ================================
|
||||
# 数据库文件管理 - 更新规则
|
||||
# ================================
|
||||
# 保留构建需要的数据文件,但排除临时数据
|
||||
!data.sql
|
||||
*.tmp.sql
|
||||
*.backup.sql
|
||||
|
||||
# ================================
|
||||
# 日志文件 - 精确控制
|
||||
# ================================
|
||||
*.log
|
||||
*.log.*
|
||||
**/logs/
|
||||
**/log/
|
||||
|
||||
# 但保留重要的构建和同步日志
|
||||
!.build.log
|
||||
!.sync.log
|
||||
!build-history/*.log
|
||||
|
||||
# ================================
|
||||
# Python虚拟环境 - 确实需要忽略
|
||||
# ================================
|
||||
@@ -66,50 +83,10 @@ yarn-error.log*
|
||||
# ================================
|
||||
.idea/
|
||||
.vscode/
|
||||
>>>>>>> gitea/main
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
|
||||
<<<<<<< HEAD
|
||||
# 日志文件
|
||||
*.log
|
||||
logs/
|
||||
|
||||
# 临时文件
|
||||
tmp/
|
||||
temp/
|
||||
*.tmp
|
||||
|
||||
# Docker数据目录
|
||||
data/
|
||||
backup/*/
|
||||
|
||||
# 敏感信息
|
||||
.env.local
|
||||
.env.*.local
|
||||
secrets/
|
||||
private_key*
|
||||
*.pem
|
||||
|
||||
# Docker Registry认证文件(如果包含真实密码)
|
||||
docker/registry/auth/htpasswd
|
||||
|
||||
# Jenkins生成的文件
|
||||
jenkins-workspace/
|
||||
.jenkins/
|
||||
|
||||
# 测试文件
|
||||
test-*.log
|
||||
debug-*.txt
|
||||
|
||||
# macOS相关
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# 网络文件
|
||||
.nfs*
|
||||
=======
|
||||
# ================================
|
||||
# 操作系统文件 - 确实需要忽略
|
||||
# ================================
|
||||
@@ -117,19 +94,69 @@ debug-*.txt
|
||||
.DS_Store?
|
||||
._*
|
||||
Thumbs.db
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
.Spotlight-V100
|
||||
.Trashes
|
||||
ehthumbs.db
|
||||
|
||||
# ================================
|
||||
# 大型数据文件 - 确实需要忽略
|
||||
# Docker相关临时文件
|
||||
# ================================
|
||||
# 保留Docker配置文件,但排除缓存和临时文件
|
||||
.dockerignore.tmp
|
||||
docker-compose.override.yml.tmp
|
||||
|
||||
# ================================
|
||||
# Jenkins和CI/CD临时文件
|
||||
# ================================
|
||||
jenkins-workspace/
|
||||
.jenkins/
|
||||
*.jenkins.tmp
|
||||
|
||||
# ================================
|
||||
# 临时文件和缓存 - 确实需要忽略
|
||||
# ================================
|
||||
**/tmp/
|
||||
**/temp/
|
||||
**/.cache/
|
||||
**/cache/*.log
|
||||
**/cache/*.tmp
|
||||
**/cache/*.json
|
||||
*.tmp
|
||||
*.temp
|
||||
|
||||
# ================================
|
||||
# 敏感信息 - 确实需要忽略
|
||||
# ================================
|
||||
.env.local
|
||||
.env.*.local
|
||||
secrets/
|
||||
private_key*
|
||||
*.pem
|
||||
*.key
|
||||
*.crt
|
||||
*.p12
|
||||
*.pfx
|
||||
|
||||
# 但保留配置模板
|
||||
!*.example.env
|
||||
!*.template.env
|
||||
|
||||
# ================================
|
||||
# 大型数据文件 - 有选择的保留
|
||||
# ================================
|
||||
*.xlsx
|
||||
*.xls
|
||||
*.csv
|
||||
# 保留配置相关的json文件
|
||||
|
||||
# 保留重要的JSON配置文件
|
||||
*.json
|
||||
!package.json
|
||||
!config.json
|
||||
!*config*.json
|
||||
!*Config*.json
|
||||
!.build-info.json
|
||||
|
||||
# ================================
|
||||
# 数据库文件 - 确实需要忽略
|
||||
@@ -140,55 +167,18 @@ Thumbs.db
|
||||
*.db3
|
||||
|
||||
# ================================
|
||||
# 大型SQL文件 - 但保留小的迁移文件
|
||||
# ================================
|
||||
*.sql
|
||||
!schema.sql
|
||||
!migration*.sql
|
||||
!*migration*.sql
|
||||
!create*.sql
|
||||
|
||||
# ================================
|
||||
# 临时和缓存文件 - 确实需要忽略
|
||||
# ================================
|
||||
**/tmp/
|
||||
**/temp/
|
||||
**/.cache/
|
||||
**/cache/*.log
|
||||
**/cache/*.tmp
|
||||
**/cache/*.json
|
||||
|
||||
# ================================
|
||||
# 上传和用户数据 - 确实需要忽略
|
||||
# ================================
|
||||
**/uploads/
|
||||
|
||||
# ================================
|
||||
# 证书和密钥 - 确实需要忽略
|
||||
# ================================
|
||||
*.pem
|
||||
*.key
|
||||
*.crt
|
||||
*.p12
|
||||
*.pfx
|
||||
|
||||
# ================================
|
||||
# 性能测试数据 - 确实需要忽略
|
||||
# 备份和性能测试文件
|
||||
# ================================
|
||||
*.backup
|
||||
*.bak
|
||||
*.orig
|
||||
performance_*.json
|
||||
performance_*.log
|
||||
*_report.json
|
||||
*_report.html
|
||||
|
||||
# ================================
|
||||
# 备份文件 - 确实需要忽略
|
||||
# ================================
|
||||
*.backup
|
||||
*.bak
|
||||
*.orig
|
||||
|
||||
# ================================
|
||||
# 媒体文件 - 确实需要忽略
|
||||
# 媒体和压缩文件 - 确实需要忽略
|
||||
# ================================
|
||||
*.mp4
|
||||
*.avi
|
||||
@@ -197,12 +187,12 @@ performance_*.log
|
||||
*.mp3
|
||||
*.wav
|
||||
*.flac
|
||||
|
||||
# ================================
|
||||
# 压缩包 - 确实需要忽略
|
||||
# ================================
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
*.7z
|
||||
>>>>>>> gitea/main
|
||||
|
||||
# ================================
|
||||
# 网络和其他文件
|
||||
# ================================
|
||||
.nfs*
|
||||
+110
-24
@@ -32,19 +32,32 @@ BUILDER_NAME="multiarch-builder"
|
||||
LOCAL_BUILD=${LOCAL_BUILD:-false} # 默认多架构构建
|
||||
PUSH_TO_REGISTRY=${PUSH_TO_REGISTRY:-true} # 默认推送到阿里云
|
||||
|
||||
# 环境变量优先级最高,覆盖配置文件设置
|
||||
if [ -n "$LOCAL_BUILD_OVERRIDE" ]; then
|
||||
LOCAL_BUILD="$LOCAL_BUILD_OVERRIDE"
|
||||
fi
|
||||
if [ -n "$PUSH_TO_REGISTRY_OVERRIDE" ]; then
|
||||
PUSH_TO_REGISTRY="$PUSH_TO_REGISTRY_OVERRIDE"
|
||||
fi
|
||||
if [ -n "$PLATFORMS_OVERRIDE" ]; then
|
||||
PLATFORMS="$PLATFORMS_OVERRIDE"
|
||||
fi
|
||||
|
||||
# 设置代理(网络优化)
|
||||
|
||||
# 设置阿里云Docker镜像加速
|
||||
setup_aliyun_mirror() {
|
||||
echo "🚀 配置Docker镜像加速(包含xuanyuan.run镜像源)..."
|
||||
|
||||
# 配置Docker daemon.json以使用阿里云镜像加速器
|
||||
local daemon_config='
|
||||
{
|
||||
"registry-mirrors": [
|
||||
"https://syxpn3chjq4bgj.xuanyuan.run",
|
||||
"https://mirror.baidubce.com",
|
||||
"https://dockerhub.azk8s.cn",
|
||||
"https://registry.cn-hangzhou.aliyuncs.com",
|
||||
"https://docker.mirrors.ustc.edu.cn"
|
||||
],
|
||||
"insecure-registries": [
|
||||
"crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com",
|
||||
"syxpn3chjq4bgj.xuanyuan.run"
|
||||
]
|
||||
}'
|
||||
|
||||
# 在Dockerfile中使用阿里云源镜像
|
||||
export DOCKER_BUILDKIT=1
|
||||
export BUILDKIT_PROGRESS=plain
|
||||
|
||||
echo "✅ Docker镜像加速配置完成,优先使用xuanyuan.run镜像源"
|
||||
}
|
||||
|
||||
# 生成数据库升级脚本 - 已移除,请使用专门的数据库升级脚本
|
||||
|
||||
@@ -61,8 +74,6 @@ login_aliyun() {
|
||||
echo "❌ 阿里云登录失败,请检查凭据"
|
||||
exit 1
|
||||
fi
|
||||
elif [ "$PUSH_TO_REGISTRY" = "false" ]; then
|
||||
echo "🚫 跳过镜像仓库登录(仅本地构建模式)"
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -87,6 +98,11 @@ if [ $# -eq 0 ]; then
|
||||
echo " $0 promtail # 构建定制化Promtail"
|
||||
echo " $0 alertmanager # 构建定制化AlertManager"
|
||||
echo ""
|
||||
echo "🚀 缓存管理:"
|
||||
echo " $0 cache-pull # 预拉取所有基础镜像到本地缓存"
|
||||
echo " $0 cache-clean # 清理构建缓存"
|
||||
echo " $0 cache-prune # 清理未使用的镜像和缓存"
|
||||
echo ""
|
||||
echo "🎯 构建模式:"
|
||||
echo " LOCAL_BUILD=false # 多架构构建(默认)"
|
||||
echo " PUSH_TO_REGISTRY=true # 推送到阿里云(默认)"
|
||||
@@ -182,25 +198,25 @@ build_app_image() {
|
||||
;;
|
||||
"boot")
|
||||
echo "🔨 使用多阶段容器构建 Spring Boot JAR 包..."
|
||||
echo "💡 在容器内构建确保跨平台兼容性"
|
||||
echo "💡 在容器内构建确保跨平台兼容性,使用阿里云Maven镜像加速"
|
||||
if [ "$LOCAL_BUILD" = "true" ] && [ "$PLATFORMS" = "linux/amd64" ]; then
|
||||
docker build -t $tag -t $latest_tag . -f ljwx-boot/ljwx-boot-admin/Dockerfile.prod
|
||||
docker build --build-arg MAVEN_OPTS="-XX:+UseG1GC -Xmx1g" -t $tag -t $latest_tag . -f ljwx-boot/ljwx-boot-admin/Dockerfile.prod
|
||||
else
|
||||
docker $build_args -t $tag -t $latest_tag . -f ljwx-boot/ljwx-boot-admin/Dockerfile.prod
|
||||
docker $build_args --build-arg MAVEN_OPTS="-XX:+UseG1GC -Xmx1g" -t $tag -t $latest_tag . -f ljwx-boot/ljwx-boot-admin/Dockerfile.prod
|
||||
fi
|
||||
;;
|
||||
"bigscreen")
|
||||
# 更新了使用Python 3.12
|
||||
echo "🔨 使用多阶段容器构建 Python FastAPI 应用..."
|
||||
echo "💡 在容器内构建确保跨平台兼容性,使用阿里云Python镜像和pip源加速"
|
||||
if [ "$LOCAL_BUILD" = "true" ] && [ "$PLATFORMS" = "linux/amd64" ]; then
|
||||
docker build -t $tag -t $latest_tag ljwx-bigscreen/bigscreen/ -f ljwx-bigscreen/bigscreen/Dockerfile.prod
|
||||
docker build --build-arg PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ -t $tag -t $latest_tag ljwx-bigscreen/bigscreen/ -f ljwx-bigscreen/bigscreen/Dockerfile.prod
|
||||
else
|
||||
docker $build_args -t $tag -t $latest_tag ljwx-bigscreen/bigscreen/ -f ljwx-bigscreen/bigscreen/Dockerfile.prod
|
||||
docker $build_args --build-arg PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ -t $tag -t $latest_tag ljwx-bigscreen/bigscreen/ -f ljwx-bigscreen/bigscreen/Dockerfile.prod
|
||||
fi
|
||||
;;
|
||||
"admin")
|
||||
# 使用容器内构建前端资源
|
||||
echo "🔨 使用多阶段容器构建前端应用..."
|
||||
echo "💡 在容器内构建确保跨平台兼容性和环境一致性"
|
||||
echo "🔨 使用多阶段容器构建前端静态资源镜像..."
|
||||
echo "💡 在容器内构建确保跨平台兼容性,使用阿里云npm镜像加速"
|
||||
if [ "$LOCAL_BUILD" = "true" ] && [ "$PLATFORMS" = "linux/amd64" ]; then
|
||||
docker build -t $tag -t $latest_tag ljwx-admin/ -f ljwx-admin/Dockerfile.prod
|
||||
else
|
||||
@@ -319,6 +335,61 @@ build_all() {
|
||||
build_all_monitoring
|
||||
}
|
||||
|
||||
# 缓存管理函数
|
||||
cache_pull() {
|
||||
echo "🚀 预拉取所有基础镜像到本地缓存..."
|
||||
|
||||
local base_images=(
|
||||
# Admin 前端镜像
|
||||
"node:18-alpine"
|
||||
"nginx:alpine"
|
||||
|
||||
# Boot 后端镜像
|
||||
"eclipse-temurin:21-jdk-alpine"
|
||||
"eclipse-temurin:21-jre-alpine"
|
||||
|
||||
# Bigscreen Python镜像
|
||||
"python:3.12-slim"
|
||||
|
||||
# 数据库和缓存镜像
|
||||
"mysql:8.0"
|
||||
"redis:7-alpine"
|
||||
|
||||
# 监控组件基础镜像
|
||||
"grafana/grafana:9.5.0"
|
||||
"prom/prometheus:v2.40.0"
|
||||
"grafana/loki:2.9.0"
|
||||
"grafana/promtail:2.9.0"
|
||||
"prom/alertmanager:latest"
|
||||
)
|
||||
|
||||
for image in "${base_images[@]}"; do
|
||||
echo "📥 拉取基础镜像: $image"
|
||||
if timeout 120 docker pull "$image"; then
|
||||
echo "✅ $image 拉取成功"
|
||||
else
|
||||
echo "⚠️ $image 拉取超时或失败,跳过"
|
||||
fi
|
||||
echo ""
|
||||
done
|
||||
|
||||
echo "✅ 基础镜像缓存完成!"
|
||||
}
|
||||
|
||||
cache_clean() {
|
||||
echo "🧹 清理构建缓存..."
|
||||
docker builder prune -f
|
||||
echo "✅ 构建缓存清理完成!"
|
||||
}
|
||||
|
||||
cache_prune() {
|
||||
echo "🗑️ 清理未使用的镜像和缓存..."
|
||||
docker system prune -f
|
||||
docker image prune -f
|
||||
docker builder prune -f
|
||||
echo "✅ 系统清理完成!"
|
||||
}
|
||||
|
||||
# 显示构建总结
|
||||
show_summary() {
|
||||
echo ""
|
||||
@@ -368,6 +439,9 @@ show_summary() {
|
||||
|
||||
# 主程序
|
||||
main() {
|
||||
# 设置阿里云镜像加速
|
||||
setup_aliyun_mirror
|
||||
|
||||
# 登录阿里云(如果需要推送)
|
||||
login_aliyun
|
||||
|
||||
@@ -384,6 +458,18 @@ main() {
|
||||
"monitoring")
|
||||
build_all_monitoring
|
||||
;;
|
||||
"cache-pull")
|
||||
cache_pull
|
||||
return 0
|
||||
;;
|
||||
"cache-clean")
|
||||
cache_clean
|
||||
return 0
|
||||
;;
|
||||
"cache-prune")
|
||||
cache_prune
|
||||
return 0
|
||||
;;
|
||||
"mysql"|"redis"|"boot"|"bigscreen"|"admin")
|
||||
for image in "$@"; do
|
||||
build_app_image "$image"
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
COMPOSE_VERSION=2.0.1
|
||||
|
||||
# Docker镜像版本配置
|
||||
MYSQL_IMAGE_VERSION=2.0.1
|
||||
REDIS_IMAGE_VERSION=2.0.1
|
||||
LJWX_BOOT_VERSION=2.0.1
|
||||
LJWX_BIGSCREEN_VERSION=2.0.1
|
||||
LJWX_ADMIN_VERSION=2.0.1
|
||||
@@ -1,11 +1,26 @@
|
||||
# 客户定制化配置文件
|
||||
# 复制此文件并根据客户需求修改相应配置
|
||||
|
||||
# ==================== 网络配置 ====================
|
||||
# ==================== Docker镜像版本配置 ====================
|
||||
# 镜像版本号 - 根据部署需求修改
|
||||
MYSQL_IMAGE_VERSION=2.0.1
|
||||
REDIS_IMAGE_VERSION=2.0.1
|
||||
LJWX_BOOT_VERSION=2.0.1
|
||||
LJWX_BIGSCREEN_VERSION=2.0.1
|
||||
LJWX_ADMIN_VERSION=2.0.1
|
||||
|
||||
# ==================== 网络端口配置 ====================
|
||||
# 服务器IP地址 - 根据实际部署环境修改
|
||||
SERVER_IP=192.168.1.6
|
||||
# 大屏服务端口 - 必须与docker-compose.yml中ljwx-bigscreen的端口一致
|
||||
BIGSCREEN_PORT=8001
|
||||
SERVER_IP=192.168.1.83
|
||||
# 各服务外部端口配置
|
||||
MYSQL_EXTERNAL_PORT=3306
|
||||
REDIS_EXTERNAL_PORT=6379
|
||||
LJWX_BOOT_EXTERNAL_PORT=9998
|
||||
LJWX_BIGSCREEN_EXTERNAL_PORT=8001
|
||||
LJWX_ADMIN_EXTERNAL_PORT=8088
|
||||
|
||||
# 大屏服务端口 - 向后兼容
|
||||
BIGSCREEN_PORT=${LJWX_BIGSCREEN_EXTERNAL_PORT}
|
||||
|
||||
# ==================== 大屏UI定制 ====================
|
||||
# 大屏标题
|
||||
@@ -27,12 +42,12 @@ VITE_APP_TITLE=穿戴健康管理平台
|
||||
# 管理端描述
|
||||
VITE_APP_DESC=穿戴健康管理平台
|
||||
# 大屏访问地址 - ljwx-admin中跳转大屏的URL(客户端浏览器可访问)
|
||||
VITE_BIGSCREEN_URL=http://192.168.1.6:8001
|
||||
VITE_BIGSCREEN_URL=http://${SERVER_IP}:${LJWX_BIGSCREEN_EXTERNAL_PORT}
|
||||
# 是否使用自定义Logo(true/false)
|
||||
VITE_CUSTOM_LOGO=true
|
||||
|
||||
# ==================== 数据库配置 ====================
|
||||
MYSQL_HOST=mysql
|
||||
MYSQL_HOST=ljwx-mysql
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_USER=root
|
||||
MYSQL_PASSWORD=123456
|
||||
@@ -50,4 +65,4 @@ APP_PORT=8001
|
||||
# 调试模式
|
||||
DEBUG=false
|
||||
# Docker环境标识
|
||||
IS_DOCKER=true
|
||||
IS_DOCKER=true
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
mysql:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:1.2.16
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:${MYSQL_IMAGE_VERSION:-1.2.16}
|
||||
container_name: ljwx-mysql
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
@@ -33,7 +33,7 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
redis:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-redis:1.2.16
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-redis:${REDIS_IMAGE_VERSION:-1.2.16}
|
||||
container_name: ljwx-redis
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
@@ -52,7 +52,7 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
ljwx-boot:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-boot:1.3.3
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-boot:${LJWX_BOOT_VERSION:-1.3.3}
|
||||
container_name: ljwx-boot
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
@@ -92,7 +92,7 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
ljwx-bigscreen:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-bigscreen:1.3.3
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-bigscreen:${LJWX_BIGSCREEN_VERSION:-1.3.3}
|
||||
container_name: ljwx-bigscreen
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
@@ -128,14 +128,14 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
ljwx-admin:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-admin:1.3.3
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-admin:${LJWX_ADMIN_VERSION:-1.3.3}
|
||||
container_name: ljwx-admin
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- custom-config.env
|
||||
environment:
|
||||
VITE_API_URL: http://ljwx-boot:9998
|
||||
VITE_BIGSCREEN_URL: http://192.168.1.6:8001
|
||||
VITE_BIGSCREEN_URL: http://192.168.1.83:8001
|
||||
VITE_APP_TITLE: 穿戴健康管理平台
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
version: '${COMPOSE_VERSION:-3.8}'
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:1.2.16
|
||||
ljwx-mysql:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-mysql:${MYSQL_IMAGE_VERSION:-1.2.16}
|
||||
container_name: ljwx-mysql
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
@@ -10,7 +12,7 @@ services:
|
||||
MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
- "3306:3306"
|
||||
- "${MYSQL_EXTERNAL_PORT:-3306}:3306"
|
||||
volumes:
|
||||
- mysql_data:/var/lib/mysql
|
||||
- ./logs/mysql:/var/log/mysql
|
||||
@@ -32,11 +34,11 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
redis:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-redis:1.2.16
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-redis:${REDIS_IMAGE_VERSION:-1.2.16}
|
||||
container_name: ljwx-redis
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "6379:6379"
|
||||
- "${REDIS_EXTERNAL_PORT:-6379}:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
- ./logs/redis:/var/log/redis
|
||||
@@ -51,7 +53,7 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
ljwx-boot:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-boot:1.3.3
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-boot:${LJWX_BOOT_VERSION:-1.3.3}
|
||||
container_name: ljwx-boot
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
@@ -77,7 +79,7 @@ services:
|
||||
SPRING_TASK_SCHEDULING_POOL_SIZE: 10
|
||||
SPRING_QUARTZ_PROPERTIES_ORG_QUARTZ_THREADPOOL_THREADCOUNT: 10
|
||||
ports:
|
||||
- "9998:9998"
|
||||
- "${LJWX_BOOT_EXTERNAL_PORT:-9998}:9998"
|
||||
volumes:
|
||||
- ./logs/ljwx-boot:/app/ljwx-boot-logs
|
||||
- ljwx_boot_data:/app/data
|
||||
@@ -93,7 +95,7 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
ljwx-bigscreen:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-bigscreen:1.3.3
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-bigscreen:${LJWX_BIGSCREEN_VERSION:-1.3.3}
|
||||
container_name: ljwx-bigscreen
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
@@ -111,7 +113,7 @@ services:
|
||||
APP_PORT: 8001
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
- "8001:8001"
|
||||
- "${LJWX_BIGSCREEN_EXTERNAL_PORT:-8001}:8001"
|
||||
volumes:
|
||||
- ./custom-config.py:/app/config.py:ro
|
||||
- ./custom-assets:/app/static/images:ro
|
||||
@@ -129,7 +131,7 @@ services:
|
||||
- ljwx-network
|
||||
|
||||
ljwx-admin:
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-admin:1.3.3
|
||||
image: crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx/ljwx-admin:${LJWX_ADMIN_VERSION:-1.3.3}
|
||||
container_name: ljwx-admin
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
@@ -140,7 +142,7 @@ services:
|
||||
VITE_APP_TITLE: ${VITE_APP_TITLE:-穿戴管理演示系统}
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
- "8088:80"
|
||||
- "${LJWX_ADMIN_EXTERNAL_PORT:-8088}:80"
|
||||
volumes:
|
||||
- ./logs/ljwx-admin:/var/log/nginx
|
||||
- ./custom-admin-config.js:/tmp/custom-admin-config.js:ro
|
||||
|
||||
+19
-13
@@ -1,22 +1,28 @@
|
||||
# LJWX 系统配置
|
||||
LJWX_VERSION=2.0.1
|
||||
# LJWX系统环境变量配置
|
||||
# 由generate-config.sh自动生成,请勿手动修改
|
||||
|
||||
# 镜像仓库和版本
|
||||
REGISTRY=crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx
|
||||
MYSQL_VERSION=2.0.1
|
||||
REDIS_VERSION=2.0.1
|
||||
BOOT_VERSION=2.0.1
|
||||
BIGSCREEN_VERSION=2.0.1
|
||||
ADMIN_VERSION=2.0.1
|
||||
|
||||
# 数据库配置
|
||||
MYSQL_ROOT_PASSWORD=123456
|
||||
MYSQL_HOST=ljwx-mysql
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_DATABASE=test
|
||||
MYSQL_USER=ljwx
|
||||
MYSQL_USERNAME=ljwx
|
||||
MYSQL_PASSWORD=123456
|
||||
|
||||
# 服务端口配置
|
||||
LJWX_BOOT_PORT=9998
|
||||
LJWX_BIGSCREEN_PORT=8001
|
||||
LJWX_ADMIN_PORT=8088
|
||||
MYSQL_PORT=3306
|
||||
REDIS_HOST=ljwx-redis
|
||||
REDIS_PORT=6379
|
||||
|
||||
# 时区配置
|
||||
TZ=Asia/Shanghai
|
||||
# 服务端口
|
||||
ADMIN_PORT=8080
|
||||
BIGSCREEN_PORT=8001
|
||||
BOOT_PORT=8082
|
||||
|
||||
# 日志配置
|
||||
LOG_LEVEL=INFO
|
||||
# 生成时间
|
||||
GENERATED_AT=2025-09-06T08:12:09Z
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# LJWX系统简单配置
|
||||
|
||||
## 📁 文件说明
|
||||
|
||||
- `ljwx.env` - 所有配置都在这里
|
||||
- `docker-compose.yml` - Docker服务编排
|
||||
- `start-ljwx.sh` - 一键启动脚本
|
||||
|
||||
## 🔧 修改配置
|
||||
|
||||
编辑 `ljwx.env` 文件:
|
||||
|
||||
```bash
|
||||
# 数据库配置
|
||||
MYSQL_HOST=ljwx-mysql
|
||||
MYSQL_PORT=3306
|
||||
MYSQL_DATABASE=test
|
||||
MYSQL_USERNAME=ljwx
|
||||
MYSQL_PASSWORD=123456
|
||||
|
||||
# 服务端口
|
||||
ADMIN_PORT=8080
|
||||
BIGSCREEN_PORT=8001
|
||||
BOOT_PORT=8082
|
||||
|
||||
# 镜像版本
|
||||
MYSQL_VERSION=2.0.1
|
||||
BIGSCREEN_VERSION=2.0.1
|
||||
BOOT_VERSION=2.0.1
|
||||
```
|
||||
|
||||
## 🚀 启动系统
|
||||
|
||||
```bash
|
||||
./start-ljwx.sh
|
||||
```
|
||||
|
||||
## 🛠️ 常用命令
|
||||
|
||||
```bash
|
||||
# 启动所有服务
|
||||
docker-compose --env-file ljwx.env up -d
|
||||
|
||||
# 停止所有服务
|
||||
docker-compose down
|
||||
|
||||
# 查看服务状态
|
||||
docker-compose ps
|
||||
|
||||
# 查看日志
|
||||
docker-compose logs -f ljwx-bigscreen
|
||||
|
||||
# 重启单个服务
|
||||
docker-compose restart ljwx-bigscreen
|
||||
```
|
||||
|
||||
## 📊 服务地址
|
||||
|
||||
- 管理后台: http://localhost:8080
|
||||
- 大屏系统: http://localhost:8001
|
||||
- 后端API: http://localhost:8082
|
||||
|
||||
就这么简单!所有配置都在 `ljwx.env` 文件里。
|
||||
@@ -0,0 +1,246 @@
|
||||
package com.ljwx.common.config;
|
||||
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
import javax.annotation.PostConstruct;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* LJWX系统配置加载器 - Java版本
|
||||
* 统一配置管理,支持YAML配置文件和环境变量覆盖
|
||||
*
|
||||
* @author LJWX Team
|
||||
* @version 2.0.1
|
||||
*/
|
||||
@Component
|
||||
@Configuration
|
||||
public class LJWXConfigLoader {
|
||||
|
||||
private Map<String, Object> config;
|
||||
|
||||
@Value("${ljwx.config.path:/app/config/ljwx-config.yaml}")
|
||||
private String configPath;
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
loadConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载配置文件
|
||||
*/
|
||||
private void loadConfig() {
|
||||
String[] possiblePaths = {
|
||||
"/app/config/ljwx-config.yaml", // 容器内路径
|
||||
"/client/config/ljwx-config.yaml", // 挂载路径
|
||||
"client/config/ljwx-config.yaml", // 相对路径
|
||||
"config/ljwx-config.yaml", // 简化路径
|
||||
configPath // 配置的路径
|
||||
};
|
||||
|
||||
for (String path : possiblePaths) {
|
||||
File file = new File(path);
|
||||
if (file.exists()) {
|
||||
try (InputStream input = new FileInputStream(file)) {
|
||||
Yaml yaml = new Yaml();
|
||||
config = yaml.load(input);
|
||||
|
||||
// 应用环境变量覆盖
|
||||
applyEnvOverrides();
|
||||
return;
|
||||
} catch (IOException e) {
|
||||
// 继续尝试下一个路径
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new RuntimeException("配置文件未找到,请确保ljwx-config.yaml存在");
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用环境变量覆盖
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void applyEnvOverrides() {
|
||||
// 数据库配置覆盖
|
||||
Map<String, Object> database = (Map<String, Object>) config.get("database");
|
||||
if (database != null) {
|
||||
Map<String, Object> mysql = (Map<String, Object>) database.get("mysql");
|
||||
if (mysql != null) {
|
||||
overrideFromEnv("MYSQL_HOST", mysql, "host");
|
||||
overrideFromEnv("MYSQL_PORT", mysql, "port", Integer.class);
|
||||
overrideFromEnv("MYSQL_DATABASE", mysql, "database");
|
||||
overrideFromEnv("MYSQL_USERNAME", mysql, "username");
|
||||
overrideFromEnv("MYSQL_PASSWORD", mysql, "password");
|
||||
}
|
||||
|
||||
Map<String, Object> redis = (Map<String, Object>) database.get("redis");
|
||||
if (redis != null) {
|
||||
overrideFromEnv("REDIS_HOST", redis, "host");
|
||||
overrideFromEnv("REDIS_PORT", redis, "port", Integer.class);
|
||||
overrideFromEnv("REDIS_PASSWORD", redis, "password");
|
||||
}
|
||||
}
|
||||
|
||||
// 服务端口覆盖
|
||||
String serverPort = System.getenv("SERVER_PORT");
|
||||
String serviceName = System.getenv("SERVICE_NAME");
|
||||
if (serverPort != null && serviceName != null) {
|
||||
Map<String, Object> services = (Map<String, Object>) config.get("services");
|
||||
if (services != null && services.containsKey(serviceName)) {
|
||||
Map<String, Object> service = (Map<String, Object>) services.get(serviceName);
|
||||
service.put("port", Integer.valueOf(serverPort));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从环境变量覆盖配置
|
||||
*/
|
||||
private void overrideFromEnv(String envKey, Map<String, Object> configMap, String configKey) {
|
||||
overrideFromEnv(envKey, configMap, configKey, String.class);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T> void overrideFromEnv(String envKey, Map<String, Object> configMap, String configKey, Class<T> type) {
|
||||
String envValue = System.getenv(envKey);
|
||||
if (envValue != null) {
|
||||
Object value = envValue;
|
||||
if (type == Integer.class) {
|
||||
value = Integer.valueOf(envValue);
|
||||
} else if (type == Boolean.class) {
|
||||
value = Boolean.valueOf(envValue);
|
||||
}
|
||||
configMap.put(configKey, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置值,支持点号分隔的嵌套键
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public Object get(String key, Object defaultValue) {
|
||||
String[] keys = key.split("\\.");
|
||||
Object value = config;
|
||||
|
||||
for (String k : keys) {
|
||||
if (value instanceof Map) {
|
||||
Map<String, Object> map = (Map<String, Object>) value;
|
||||
if (map.containsKey(k)) {
|
||||
value = map.get(k);
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置值
|
||||
*/
|
||||
public Object get(String key) {
|
||||
return get(key, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取字符串配置
|
||||
*/
|
||||
public String getString(String key, String defaultValue) {
|
||||
Object value = get(key, defaultValue);
|
||||
return value != null ? value.toString() : defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取整数配置
|
||||
*/
|
||||
public Integer getInt(String key, Integer defaultValue) {
|
||||
Object value = get(key, defaultValue);
|
||||
if (value instanceof Integer) {
|
||||
return (Integer) value;
|
||||
} else if (value instanceof String) {
|
||||
try {
|
||||
return Integer.valueOf((String) value);
|
||||
} catch (NumberFormatException e) {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库配置
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public Map<String, Object> getDatabaseConfig(String dbType) {
|
||||
return (Map<String, Object>) get("database." + dbType, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取服务配置
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public Map<String, Object> getServiceConfig(String serviceName) {
|
||||
return (Map<String, Object>) get("services." + serviceName, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取镜像配置
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public Map<String, Object> getImageConfig() {
|
||||
return (Map<String, Object>) get("images", null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库连接URL
|
||||
*/
|
||||
public String getDatabaseUrl(String dbType) {
|
||||
Map<String, Object> dbConfig = getDatabaseConfig(dbType);
|
||||
if (dbConfig == null) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if ("mysql".equals(dbType)) {
|
||||
String host = (String) dbConfig.get("host");
|
||||
Integer port = (Integer) dbConfig.get("port");
|
||||
String database = (String) dbConfig.get("database");
|
||||
String username = (String) dbConfig.get("username");
|
||||
String password = (String) dbConfig.get("password");
|
||||
String charset = (String) dbConfig.getOrDefault("charset", "utf8mb4");
|
||||
|
||||
return String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=%s&useSSL=false&serverTimezone=Asia/Shanghai",
|
||||
host, port, database, charset);
|
||||
} else if ("redis".equals(dbType)) {
|
||||
String host = (String) dbConfig.get("host");
|
||||
Integer port = (Integer) dbConfig.get("port");
|
||||
String password = (String) dbConfig.get("password");
|
||||
Integer db = (Integer) dbConfig.getOrDefault("db", 0);
|
||||
|
||||
if (password != null && !password.isEmpty()) {
|
||||
return String.format("redis://:%s@%s:%d/%d", password, host, port, db);
|
||||
} else {
|
||||
return String.format("redis://%s:%d/%d", host, port, db);
|
||||
}
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新加载配置
|
||||
*/
|
||||
public void reload() {
|
||||
loadConfig();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,194 @@
|
||||
# LJWX系统统一配置管理
|
||||
|
||||
本目录包含LJWX系统的统一配置管理工具,支持所有服务统一读取配置信息。
|
||||
|
||||
## 文件结构
|
||||
|
||||
```
|
||||
client/config/
|
||||
├── ljwx-config.yaml # 主配置文件(YAML格式)
|
||||
├── config_loader.py # Python配置加载器
|
||||
├── config-loader.js # JavaScript配置加载器
|
||||
├── LJWXConfigLoader.java # Java配置加载器
|
||||
├── package.json # JavaScript依赖配置
|
||||
└── README.md # 本文档
|
||||
```
|
||||
|
||||
## 主配置文件
|
||||
|
||||
`ljwx-config.yaml` 是系统的核心配置文件,包含:
|
||||
|
||||
- **系统信息**: 系统名称、版本、环境
|
||||
- **数据库配置**: MySQL、Redis连接信息
|
||||
- **服务端口**: 各服务的端口配置
|
||||
- **镜像版本**: Docker镜像版本信息
|
||||
- **网络配置**: Docker网络设置
|
||||
- **日志配置**: 日志级别和格式
|
||||
- **安全配置**: JWT密钥、CORS设置
|
||||
- **业务配置**: 业务相关的参数
|
||||
|
||||
## 各语言配置加载器
|
||||
|
||||
### Python (ljwx-bigscreen)
|
||||
|
||||
```python
|
||||
# 导入配置加载器
|
||||
from config_loader import get_config, get_database_config, get_service_config
|
||||
|
||||
# 获取配置
|
||||
config = get_config()
|
||||
mysql_config = get_database_config('mysql')
|
||||
service_config = get_service_config('ljwx-bigscreen')
|
||||
|
||||
# 获取具体配置值
|
||||
db_host = config.get('database.mysql.host')
|
||||
service_port = config.get('services.ljwx-bigscreen.port')
|
||||
```
|
||||
|
||||
### JavaScript (ljwx-admin)
|
||||
|
||||
```javascript
|
||||
// 导入配置加载器
|
||||
const { getConfig, getDatabaseConfig, getServiceConfig } = require('./config-loader');
|
||||
|
||||
// 获取配置
|
||||
const config = getConfig();
|
||||
const mysqlConfig = getDatabaseConfig('mysql');
|
||||
const serviceConfig = getServiceConfig('ljwx-admin');
|
||||
|
||||
// 获取具体配置值
|
||||
const dbHost = config.get('database.mysql.host');
|
||||
const servicePort = config.get('services.ljwx-admin.port');
|
||||
```
|
||||
|
||||
### Java (ljwx-boot)
|
||||
|
||||
```java
|
||||
// Spring Boot中使用
|
||||
@Autowired
|
||||
private LJWXConfigLoader configLoader;
|
||||
|
||||
// 获取配置
|
||||
Map<String, Object> mysqlConfig = configLoader.getDatabaseConfig("mysql");
|
||||
Map<String, Object> serviceConfig = configLoader.getServiceConfig("ljwx-boot");
|
||||
|
||||
// 获取具体配置值
|
||||
String dbHost = configLoader.getString("database.mysql.host", "localhost");
|
||||
Integer servicePort = configLoader.getInt("services.ljwx-boot.port", 8082);
|
||||
```
|
||||
|
||||
## 环境变量覆盖
|
||||
|
||||
配置支持环境变量覆盖,优先级:**环境变量 > 配置文件**
|
||||
|
||||
### 数据库配置覆盖
|
||||
|
||||
- `MYSQL_HOST` - MySQL主机地址
|
||||
- `MYSQL_PORT` - MySQL端口
|
||||
- `MYSQL_DATABASE` - 数据库名
|
||||
- `MYSQL_USERNAME` - 数据库用户名
|
||||
- `MYSQL_PASSWORD` - 数据库密码
|
||||
- `REDIS_HOST` - Redis主机地址
|
||||
- `REDIS_PORT` - Redis端口
|
||||
- `REDIS_PASSWORD` - Redis密码
|
||||
|
||||
### 服务端口覆盖
|
||||
|
||||
- `SERVER_PORT` + `SERVICE_NAME` - 特定服务的端口
|
||||
|
||||
## 配置文件路径查找顺序
|
||||
|
||||
各配置加载器会按以下顺序查找配置文件:
|
||||
|
||||
1. `/app/config/ljwx-config.yaml` (容器内路径)
|
||||
2. `/client/config/ljwx-config.yaml` (挂载路径)
|
||||
3. `client/config/ljwx-config.yaml` (相对路径)
|
||||
4. `config/ljwx-config.yaml` (简化路径)
|
||||
5. 指定的自定义路径
|
||||
|
||||
## 使用方法
|
||||
|
||||
### 1. 安装依赖
|
||||
|
||||
**Python依赖:**
|
||||
```bash
|
||||
pip install PyYAML
|
||||
```
|
||||
|
||||
**JavaScript依赖:**
|
||||
```bash
|
||||
cd client/config
|
||||
npm install
|
||||
```
|
||||
|
||||
**Java依赖:**
|
||||
在`pom.xml`或`build.gradle`中添加SnakeYAML依赖。
|
||||
|
||||
### 2. 配置文件挂载
|
||||
|
||||
在Docker容器中挂载配置文件:
|
||||
|
||||
```yaml
|
||||
# docker-compose.yml
|
||||
volumes:
|
||||
- ./client/config/ljwx-config.yaml:/app/config/ljwx-config.yaml:ro
|
||||
```
|
||||
|
||||
### 3. 在应用中使用
|
||||
|
||||
各服务在启动时自动加载配置,无需额外配置。
|
||||
|
||||
## 配置生成工具
|
||||
|
||||
使用 `generate-config.sh` 可以从统一配置生成各服务的运行时配置:
|
||||
|
||||
```bash
|
||||
cd client
|
||||
./generate-config.sh
|
||||
```
|
||||
|
||||
生成的文件:
|
||||
- `docker-compose.yml` - Docker Compose配置
|
||||
- `.env` - 环境变量文件
|
||||
- `config/bigscreen/config.py` - Bigscreen配置
|
||||
- `config/boot/application-prod.yml` - Boot配置
|
||||
|
||||
## 配置更新
|
||||
|
||||
1. 修改 `ljwx-config.yaml` 文件
|
||||
2. 重新生成配置: `./generate-config.sh`
|
||||
3. 重启相关服务: `docker-compose restart`
|
||||
|
||||
## 安全注意事项
|
||||
|
||||
- 配置文件包含敏感信息(数据库密码等),请妥善保管
|
||||
- 生产环境建议使用环境变量覆盖敏感配置
|
||||
- 配置文件应使用只读挂载到容器中
|
||||
|
||||
## 故障排除
|
||||
|
||||
### 配置文件未找到
|
||||
|
||||
确保配置文件路径正确,检查容器内挂载是否成功:
|
||||
|
||||
```bash
|
||||
docker exec -it ljwx-bigscreen ls -la /app/config/
|
||||
```
|
||||
|
||||
### 配置加载失败
|
||||
|
||||
检查YAML文件格式是否正确:
|
||||
|
||||
```bash
|
||||
python3 -c "import yaml; yaml.safe_load(open('client/config/ljwx-config.yaml'))"
|
||||
```
|
||||
|
||||
### 环境变量不生效
|
||||
|
||||
确认环境变量名称正确,并在容器启动时传入:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
- MYSQL_HOST=new-mysql-host
|
||||
- MYSQL_PORT=3307
|
||||
```
|
||||
@@ -0,0 +1,137 @@
|
||||
# LJWX系统统一配置管理 - 完成总结
|
||||
|
||||
## 🎉 已完成的工作
|
||||
|
||||
### ✅ 1. 核心配置文件
|
||||
- **ljwx-config.yaml** - 主配置文件(YAML格式)
|
||||
- **ljwx-config.json** - 兼容配置文件(JSON格式,无需外部依赖)
|
||||
|
||||
### ✅ 2. 多语言配置加载器
|
||||
- **config_loader.py** - Python版配置加载器(ljwx-bigscreen)
|
||||
- **config-loader.js** - JavaScript版配置加载器(ljwx-admin)
|
||||
- **LJWXConfigLoader.java** - Java版配置加载器(ljwx-boot)
|
||||
|
||||
### ✅ 3. 自动化工具
|
||||
- **generate-config.sh** - 配置生成脚本
|
||||
- **docker-compose.template.yml** - Docker Compose模板
|
||||
- **package.json** - JavaScript依赖管理
|
||||
|
||||
### ✅ 4. 生成的运行时配置
|
||||
- **docker-compose.yml** - 完整的Docker Compose配置
|
||||
- **.env** - 环境变量配置文件
|
||||
- **config/bigscreen/config.py** - Bigscreen专用配置
|
||||
- **config/boot/application-prod.yml** - Spring Boot生产配置
|
||||
|
||||
### ✅ 5. 文档和示例
|
||||
- **README.md** - 详细使用文档
|
||||
- **integration-examples.md** - 各服务集成示例
|
||||
- **SUMMARY.md** - 本总结文档
|
||||
|
||||
## 📋 配置涵盖内容
|
||||
|
||||
### 🗄️ 数据库配置
|
||||
```yaml
|
||||
database:
|
||||
mysql:
|
||||
host: "ljwx-mysql"
|
||||
port: 3306
|
||||
database: "test"
|
||||
username: "ljwx"
|
||||
password: "123456"
|
||||
redis:
|
||||
host: "ljwx-redis"
|
||||
port: 6379
|
||||
```
|
||||
|
||||
### 🚀 服务端口配置
|
||||
```yaml
|
||||
services:
|
||||
ljwx-admin: 8080
|
||||
ljwx-bigscreen: 8001
|
||||
ljwx-boot: 8082
|
||||
```
|
||||
|
||||
### 🐳 镜像版本配置
|
||||
```yaml
|
||||
images:
|
||||
registry: "crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx"
|
||||
ljwx-mysql: "2.0.1"
|
||||
ljwx-redis: "2.0.1"
|
||||
ljwx-admin: "2.0.1"
|
||||
ljwx-bigscreen: "2.0.1"
|
||||
ljwx-boot: "2.0.1"
|
||||
```
|
||||
|
||||
## 🔧 使用方法
|
||||
|
||||
### 1. 生成配置
|
||||
```bash
|
||||
cd client
|
||||
./generate-config.sh
|
||||
```
|
||||
|
||||
### 2. 启动服务
|
||||
```bash
|
||||
cd client
|
||||
docker-compose up -d
|
||||
```
|
||||
|
||||
### 3. 各服务自动读取统一配置
|
||||
- **ljwx-bigscreen**: 通过Python配置加载器
|
||||
- **ljwx-boot**: 通过Java配置加载器
|
||||
- **ljwx-admin**: 通过JavaScript配置加载器
|
||||
|
||||
## 🌟 核心特性
|
||||
|
||||
### ✨ 统一管理
|
||||
- 所有配置集中在一个文件中
|
||||
- 避免配置分散和不一致问题
|
||||
|
||||
### 🔄 环境变量覆盖
|
||||
- 支持通过环境变量覆盖配置
|
||||
- 便于不同环境部署
|
||||
|
||||
### 🎯 多语言支持
|
||||
- Python、JavaScript、Java三种语言的加载器
|
||||
- 统一的API接口设计
|
||||
|
||||
### 🚢 容器化友好
|
||||
- 配置文件可直接挂载到容器
|
||||
- 支持Docker Compose自动化部署
|
||||
|
||||
### 📝 自动生成
|
||||
- 一键生成所有运行时配置
|
||||
- 减少手动配置错误
|
||||
|
||||
## 🔍 配置验证
|
||||
|
||||
所有配置加载器都包含:
|
||||
- ✅ 配置文件存在性检查
|
||||
- ✅ 必要配置项完整性验证
|
||||
- ✅ 环境变量优先级处理
|
||||
- ✅ 默认值和备用配置
|
||||
|
||||
## 🚨 注意事项
|
||||
|
||||
1. **安全**: 配置文件包含敏感信息,请妥善保管
|
||||
2. **权限**: 配置文件应以只读方式挂载到容器
|
||||
3. **更新**: 修改配置后需重启相关服务生效
|
||||
4. **备份**: 重要配置文件应纳入版本控制和备份
|
||||
|
||||
## 🎯 下一步建议
|
||||
|
||||
1. **集成现有服务**: 根据integration-examples.md更新各服务代码
|
||||
2. **测试配置**: 在开发环境测试配置加载和服务启动
|
||||
3. **生产部署**: 在生产环境使用环境变量覆盖敏感配置
|
||||
4. **监控告警**: 添加配置相关的监控和告警
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如需帮助,请参考:
|
||||
- `README.md` - 详细使用指南
|
||||
- `integration-examples.md` - 集成示例
|
||||
- 测试各配置加载器:运行对应语言的测试代码
|
||||
|
||||
---
|
||||
|
||||
✅ **LJWX系统统一配置管理已完成,所有服务现在可以使用统一的配置文件!** 🚀
|
||||
@@ -0,0 +1,50 @@
|
||||
# ljwx-bigscreen配置文件
|
||||
# 由generate-config.sh自动生成
|
||||
|
||||
# 从统一配置加载
|
||||
import sys
|
||||
import os
|
||||
sys.path.append('/app/config')
|
||||
sys.path.append('/client/config')
|
||||
|
||||
try:
|
||||
from config_loader import get_database_config, get_service_config, get_config
|
||||
|
||||
# 数据库配置
|
||||
MYSQL_CONFIG = get_database_config('mysql')
|
||||
REDIS_CONFIG = get_database_config('redis')
|
||||
|
||||
# 服务配置
|
||||
SERVICE_CONFIG = get_service_config('ljwx-bigscreen')
|
||||
|
||||
# 应用配置
|
||||
APP_CONFIG = {
|
||||
'HOST': '0.0.0.0',
|
||||
'PORT': SERVICE_CONFIG.get('port', 8001),
|
||||
'DEBUG': False,
|
||||
'SECRET_KEY': get_config().get('security.jwt_secret', 'ljwx-secret'),
|
||||
}
|
||||
|
||||
except ImportError:
|
||||
# 备用静态配置
|
||||
MYSQL_CONFIG = {
|
||||
'host': 'ljwx-mysql',
|
||||
'port': 3306,
|
||||
'database': 'test',
|
||||
'username': 'ljwx',
|
||||
'password': '123456'
|
||||
}
|
||||
|
||||
REDIS_CONFIG = {
|
||||
'host': 'ljwx-redis',
|
||||
'port': 6379,
|
||||
'password': '',
|
||||
'db': 0
|
||||
}
|
||||
|
||||
APP_CONFIG = {
|
||||
'HOST': '0.0.0.0',
|
||||
'PORT': 8001,
|
||||
'DEBUG': False,
|
||||
'SECRET_KEY': 'ljwx-secret',
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
# ljwx-boot生产环境配置文件
|
||||
# 由generate-config.sh自动生成
|
||||
|
||||
server:
|
||||
port: 8082
|
||||
servlet:
|
||||
context-path: /api
|
||||
|
||||
spring:
|
||||
profiles:
|
||||
active: prod
|
||||
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://ljwx-mysql:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
|
||||
username: ljwx
|
||||
password: 123456
|
||||
|
||||
hikari:
|
||||
pool-name: ljwx-boot-pool
|
||||
minimum-idle: 5
|
||||
maximum-pool-size: 20
|
||||
connection-timeout: 30000
|
||||
idle-timeout: 600000
|
||||
max-lifetime: 1800000
|
||||
|
||||
redis:
|
||||
host: ljwx-redis
|
||||
port: 6379
|
||||
database: 0
|
||||
timeout: 5000
|
||||
jedis:
|
||||
pool:
|
||||
max-active: 50
|
||||
max-wait: 3000
|
||||
max-idle: 20
|
||||
min-idle: 2
|
||||
|
||||
jpa:
|
||||
hibernate:
|
||||
ddl-auto: none
|
||||
show-sql: false
|
||||
database-platform: org.hibernate.dialect.MySQL8Dialect
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level:
|
||||
root: INFO
|
||||
com.ljwx: INFO
|
||||
file:
|
||||
name: /app/logs/ljwx-boot.log
|
||||
pattern:
|
||||
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
|
||||
|
||||
# 管理端点
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: health,info,metrics
|
||||
endpoint:
|
||||
health:
|
||||
show-details: always
|
||||
@@ -0,0 +1,265 @@
|
||||
/**
|
||||
* LJWX系统配置加载器 - JavaScript版本
|
||||
* 统一配置管理,支持YAML配置文件和环境变量覆盖
|
||||
*
|
||||
* @author LJWX Team
|
||||
* @version 2.0.1
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const yaml = require('js-yaml');
|
||||
|
||||
class LJWXConfigLoader {
|
||||
constructor(configPath = null) {
|
||||
this.configPath = configPath;
|
||||
this.config = null;
|
||||
this.loadConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* 加载配置文件
|
||||
*/
|
||||
loadConfig() {
|
||||
const possiblePaths = [
|
||||
'/app/config/ljwx-config.yaml', // 容器内路径
|
||||
'/client/config/ljwx-config.yaml', // 挂载路径
|
||||
path.join(__dirname, 'ljwx-config.yaml'), // 同级目录
|
||||
'client/config/ljwx-config.yaml', // 相对路径
|
||||
'config/ljwx-config.yaml', // 简化路径
|
||||
this.configPath // 指定路径
|
||||
].filter(p => p);
|
||||
|
||||
for (const configPath of possiblePaths) {
|
||||
if (fs.existsSync(configPath)) {
|
||||
try {
|
||||
const fileContents = fs.readFileSync(configPath, 'utf8');
|
||||
this.config = yaml.load(fileContents);
|
||||
|
||||
// 应用环境变量覆盖
|
||||
this.applyEnvOverrides();
|
||||
return;
|
||||
} catch (error) {
|
||||
// 继续尝试下一个路径
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error('配置文件未找到,请确保ljwx-config.yaml存在');
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用环境变量覆盖
|
||||
*/
|
||||
applyEnvOverrides() {
|
||||
// 数据库配置覆盖
|
||||
if (process.env.MYSQL_HOST) {
|
||||
this.config.database.mysql.host = process.env.MYSQL_HOST;
|
||||
}
|
||||
if (process.env.MYSQL_PORT) {
|
||||
this.config.database.mysql.port = parseInt(process.env.MYSQL_PORT);
|
||||
}
|
||||
if (process.env.MYSQL_DATABASE) {
|
||||
this.config.database.mysql.database = process.env.MYSQL_DATABASE;
|
||||
}
|
||||
if (process.env.MYSQL_USERNAME) {
|
||||
this.config.database.mysql.username = process.env.MYSQL_USERNAME;
|
||||
}
|
||||
if (process.env.MYSQL_PASSWORD) {
|
||||
this.config.database.mysql.password = process.env.MYSQL_PASSWORD;
|
||||
}
|
||||
|
||||
if (process.env.REDIS_HOST) {
|
||||
this.config.database.redis.host = process.env.REDIS_HOST;
|
||||
}
|
||||
if (process.env.REDIS_PORT) {
|
||||
this.config.database.redis.port = parseInt(process.env.REDIS_PORT);
|
||||
}
|
||||
if (process.env.REDIS_PASSWORD) {
|
||||
this.config.database.redis.password = process.env.REDIS_PASSWORD;
|
||||
}
|
||||
|
||||
// 服务端口覆盖
|
||||
if (process.env.SERVER_PORT && process.env.SERVICE_NAME) {
|
||||
const serviceName = process.env.SERVICE_NAME;
|
||||
if (this.config.services[serviceName]) {
|
||||
this.config.services[serviceName].port = parseInt(process.env.SERVER_PORT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取配置值,支持点号分隔的嵌套键
|
||||
*
|
||||
* @param {string} key - 配置键,如 'database.mysql.host'
|
||||
* @param {any} defaultValue - 默认值
|
||||
* @returns {any} 配置值
|
||||
*/
|
||||
get(key, defaultValue = null) {
|
||||
const keys = key.split('.');
|
||||
let value = this.config;
|
||||
|
||||
for (const k of keys) {
|
||||
if (value && typeof value === 'object' && k in value) {
|
||||
value = value[k];
|
||||
} else {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库配置
|
||||
*
|
||||
* @param {string} dbType - 数据库类型,如 'mysql', 'redis'
|
||||
* @returns {object} 数据库配置对象
|
||||
*/
|
||||
getDatabaseConfig(dbType = 'mysql') {
|
||||
return this.get(`database.${dbType}`, {});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取服务配置
|
||||
*
|
||||
* @param {string} serviceName - 服务名称
|
||||
* @returns {object} 服务配置对象
|
||||
*/
|
||||
getServiceConfig(serviceName) {
|
||||
return this.get(`services.${serviceName}`, {});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取镜像配置
|
||||
*
|
||||
* @returns {object} 镜像配置对象
|
||||
*/
|
||||
getImageConfig() {
|
||||
return this.get('images', {});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库连接URL
|
||||
*
|
||||
* @param {string} dbType - 数据库类型
|
||||
* @returns {string} 数据库连接URL
|
||||
*/
|
||||
getDatabaseUrl(dbType = 'mysql') {
|
||||
const dbConfig = this.getDatabaseConfig(dbType);
|
||||
|
||||
if (dbType === 'mysql') {
|
||||
const { host, port, database, username, password, charset = 'utf8mb4' } = dbConfig;
|
||||
return `mysql://${username}:${password}@${host}:${port}/${database}?charset=${charset}`;
|
||||
} else if (dbType === 'redis') {
|
||||
const { host, port, password = '', db = 0 } = dbConfig;
|
||||
const passwordPart = password ? `:${password}@` : '';
|
||||
return `redis://${passwordPart}${host}:${port}/${db}`;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新加载配置
|
||||
*/
|
||||
reload() {
|
||||
this.loadConfig();
|
||||
}
|
||||
}
|
||||
|
||||
// 全局配置实例
|
||||
let _configLoader = null;
|
||||
|
||||
/**
|
||||
* 获取全局配置实例
|
||||
*
|
||||
* @returns {LJWXConfigLoader} 配置加载器实例
|
||||
*/
|
||||
function getConfig() {
|
||||
if (_configLoader === null) {
|
||||
_configLoader = new LJWXConfigLoader();
|
||||
}
|
||||
return _configLoader;
|
||||
}
|
||||
|
||||
/**
|
||||
* 重新加载全局配置
|
||||
*/
|
||||
function reloadConfig() {
|
||||
if (_configLoader !== null) {
|
||||
_configLoader.reload();
|
||||
}
|
||||
}
|
||||
|
||||
// 便捷函数
|
||||
/**
|
||||
* 获取数据库配置
|
||||
*/
|
||||
function getDatabaseConfig(dbType = 'mysql') {
|
||||
return getConfig().getDatabaseConfig(dbType);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取服务配置
|
||||
*/
|
||||
function getServiceConfig(serviceName) {
|
||||
return getConfig().getServiceConfig(serviceName);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库连接URL
|
||||
*/
|
||||
function getDatabaseUrl(dbType = 'mysql') {
|
||||
return getConfig().getDatabaseUrl(dbType);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
LJWXConfigLoader,
|
||||
getConfig,
|
||||
reloadConfig,
|
||||
getDatabaseConfig,
|
||||
getServiceConfig,
|
||||
getDatabaseUrl
|
||||
};
|
||||
|
||||
// 如果是直接运行此文件,进行测试
|
||||
if (require.main === module) {
|
||||
try {
|
||||
const config = getConfig();
|
||||
|
||||
console.log('=== LJWX配置测试 ===');
|
||||
console.log(`系统名称: ${config.get('system.name')}`);
|
||||
console.log(`系统版本: ${config.get('system.version')}`);
|
||||
console.log('');
|
||||
|
||||
console.log('=== 数据库配置 ===');
|
||||
const mysqlConfig = getDatabaseConfig('mysql');
|
||||
console.log(`MySQL:`, mysqlConfig);
|
||||
console.log(`MySQL URL: ${getDatabaseUrl('mysql')}`);
|
||||
console.log('');
|
||||
|
||||
const redisConfig = getDatabaseConfig('redis');
|
||||
console.log(`Redis:`, redisConfig);
|
||||
console.log(`Redis URL: ${getDatabaseUrl('redis')}`);
|
||||
console.log('');
|
||||
|
||||
console.log('=== 服务配置 ===');
|
||||
['ljwx-admin', 'ljwx-bigscreen', 'ljwx-boot'].forEach(service => {
|
||||
const serviceConfig = getServiceConfig(service);
|
||||
console.log(`${service}:`, serviceConfig);
|
||||
});
|
||||
console.log('');
|
||||
|
||||
console.log('=== 镜像配置 ===');
|
||||
const imageConfig = config.getImageConfig();
|
||||
console.log(`镜像仓库: ${imageConfig.registry}`);
|
||||
console.log(`Admin镜像: ${imageConfig['ljwx-admin']}`);
|
||||
console.log(`Bigscreen镜像: ${imageConfig['ljwx-bigscreen']}`);
|
||||
console.log(`Boot镜像: ${imageConfig['ljwx-boot']}`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('配置加载测试失败:', error.message);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,200 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
LJWX系统配置加载器
|
||||
统一配置管理,支持YAML配置文件和环境变量覆盖
|
||||
"""
|
||||
|
||||
import os
|
||||
import yaml
|
||||
from typing import Dict, Any, Optional
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class LJWXConfigLoader:
|
||||
"""LJWX配置加载器"""
|
||||
|
||||
def __init__(self, config_path: Optional[str] = None):
|
||||
"""
|
||||
初始化配置加载器
|
||||
|
||||
Args:
|
||||
config_path: 配置文件路径,默认为当前目录下的ljwx-config.yaml
|
||||
"""
|
||||
if config_path is None:
|
||||
# 尝试多个可能的配置文件位置
|
||||
possible_paths = [
|
||||
"/app/config/ljwx-config.yaml", # 容器内路径
|
||||
"/client/config/ljwx-config.yaml", # 挂载路径
|
||||
os.path.join(os.path.dirname(__file__), "ljwx-config.yaml"), # 同级目录
|
||||
"client/config/ljwx-config.yaml", # 相对路径
|
||||
"config/ljwx-config.yaml" # 简化路径
|
||||
]
|
||||
|
||||
config_path = None
|
||||
for path in possible_paths:
|
||||
if os.path.exists(path):
|
||||
config_path = path
|
||||
break
|
||||
|
||||
if config_path is None:
|
||||
raise FileNotFoundError("配置文件未找到,请确保ljwx-config.yaml存在")
|
||||
|
||||
self.config_path = config_path
|
||||
self.config = self._load_config()
|
||||
|
||||
def _load_config(self) -> Dict[str, Any]:
|
||||
"""加载配置文件"""
|
||||
try:
|
||||
with open(self.config_path, 'r', encoding='utf-8') as f:
|
||||
config = yaml.safe_load(f)
|
||||
|
||||
# 环境变量覆盖
|
||||
config = self._apply_env_overrides(config)
|
||||
|
||||
return config
|
||||
except Exception as e:
|
||||
raise Exception(f"加载配置文件失败: {e}")
|
||||
|
||||
def _apply_env_overrides(self, config: Dict[str, Any]) -> Dict[str, Any]:
|
||||
"""应用环境变量覆盖"""
|
||||
# 数据库配置覆盖
|
||||
if 'MYSQL_HOST' in os.environ:
|
||||
config['database']['mysql']['host'] = os.environ['MYSQL_HOST']
|
||||
if 'MYSQL_PORT' in os.environ:
|
||||
config['database']['mysql']['port'] = int(os.environ['MYSQL_PORT'])
|
||||
if 'MYSQL_DATABASE' in os.environ:
|
||||
config['database']['mysql']['database'] = os.environ['MYSQL_DATABASE']
|
||||
if 'MYSQL_USERNAME' in os.environ:
|
||||
config['database']['mysql']['username'] = os.environ['MYSQL_USERNAME']
|
||||
if 'MYSQL_PASSWORD' in os.environ:
|
||||
config['database']['mysql']['password'] = os.environ['MYSQL_PASSWORD']
|
||||
|
||||
if 'REDIS_HOST' in os.environ:
|
||||
config['database']['redis']['host'] = os.environ['REDIS_HOST']
|
||||
if 'REDIS_PORT' in os.environ:
|
||||
config['database']['redis']['port'] = int(os.environ['REDIS_PORT'])
|
||||
if 'REDIS_PASSWORD' in os.environ:
|
||||
config['database']['redis']['password'] = os.environ['REDIS_PASSWORD']
|
||||
|
||||
# 服务端口覆盖
|
||||
if 'SERVER_PORT' in os.environ:
|
||||
service_name = os.environ.get('SERVICE_NAME', 'ljwx-boot')
|
||||
if service_name in config['services']:
|
||||
config['services'][service_name]['port'] = int(os.environ['SERVER_PORT'])
|
||||
|
||||
return config
|
||||
|
||||
def get(self, key: str, default: Any = None) -> Any:
|
||||
"""
|
||||
获取配置值,支持点号分隔的嵌套键
|
||||
|
||||
Args:
|
||||
key: 配置键,如 'database.mysql.host'
|
||||
default: 默认值
|
||||
|
||||
Returns:
|
||||
配置值
|
||||
"""
|
||||
keys = key.split('.')
|
||||
value = self.config
|
||||
|
||||
for k in keys:
|
||||
if isinstance(value, dict) and k in value:
|
||||
value = value[k]
|
||||
else:
|
||||
return default
|
||||
|
||||
return value
|
||||
|
||||
def get_database_config(self, db_type: str = 'mysql') -> Dict[str, Any]:
|
||||
"""获取数据库配置"""
|
||||
return self.get(f'database.{db_type}', {})
|
||||
|
||||
def get_service_config(self, service_name: str) -> Dict[str, Any]:
|
||||
"""获取服务配置"""
|
||||
return self.get(f'services.{service_name}', {})
|
||||
|
||||
def get_image_config(self) -> Dict[str, str]:
|
||||
"""获取镜像配置"""
|
||||
return self.get('images', {})
|
||||
|
||||
def get_database_url(self, db_type: str = 'mysql') -> str:
|
||||
"""获取数据库连接URL"""
|
||||
db_config = self.get_database_config(db_type)
|
||||
|
||||
if db_type == 'mysql':
|
||||
return f"mysql+pymysql://{db_config['username']}:{db_config['password']}@{db_config['host']}:{db_config['port']}/{db_config['database']}?charset={db_config.get('charset', 'utf8mb4')}"
|
||||
elif db_type == 'redis':
|
||||
password_part = f":{db_config['password']}@" if db_config.get('password') else ""
|
||||
return f"redis://{password_part}{db_config['host']}:{db_config['port']}/{db_config.get('db', 0)}"
|
||||
|
||||
return ""
|
||||
|
||||
def reload(self):
|
||||
"""重新加载配置"""
|
||||
self.config = self._load_config()
|
||||
|
||||
|
||||
# 全局配置实例
|
||||
_config_loader = None
|
||||
|
||||
def get_config() -> LJWXConfigLoader:
|
||||
"""获取全局配置实例"""
|
||||
global _config_loader
|
||||
if _config_loader is None:
|
||||
_config_loader = LJWXConfigLoader()
|
||||
return _config_loader
|
||||
|
||||
def reload_config():
|
||||
"""重新加载全局配置"""
|
||||
global _config_loader
|
||||
if _config_loader is not None:
|
||||
_config_loader.reload()
|
||||
|
||||
# 便捷函数
|
||||
def get_database_config(db_type: str = 'mysql') -> Dict[str, Any]:
|
||||
"""获取数据库配置"""
|
||||
return get_config().get_database_config(db_type)
|
||||
|
||||
def get_service_config(service_name: str) -> Dict[str, Any]:
|
||||
"""获取服务配置"""
|
||||
return get_config().get_service_config(service_name)
|
||||
|
||||
def get_database_url(db_type: str = 'mysql') -> str:
|
||||
"""获取数据库连接URL"""
|
||||
return get_config().get_database_url(db_type)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# 测试配置加载
|
||||
config = get_config()
|
||||
|
||||
print("=== LJWX配置测试 ===")
|
||||
print(f"系统名称: {config.get('system.name')}")
|
||||
print(f"系统版本: {config.get('system.version')}")
|
||||
print()
|
||||
|
||||
print("=== 数据库配置 ===")
|
||||
mysql_config = get_database_config('mysql')
|
||||
print(f"MySQL: {mysql_config}")
|
||||
print(f"MySQL URL: {get_database_url('mysql')}")
|
||||
print()
|
||||
|
||||
redis_config = get_database_config('redis')
|
||||
print(f"Redis: {redis_config}")
|
||||
print(f"Redis URL: {get_database_url('redis')}")
|
||||
print()
|
||||
|
||||
print("=== 服务配置 ===")
|
||||
for service in ['ljwx-admin', 'ljwx-bigscreen', 'ljwx-boot']:
|
||||
service_config = get_service_config(service)
|
||||
print(f"{service}: {service_config}")
|
||||
print()
|
||||
|
||||
print("=== 镜像配置 ===")
|
||||
image_config = config.get_image_config()
|
||||
print(f"镜像仓库: {image_config.get('registry')}")
|
||||
print(f"Admin镜像: {image_config.get('ljwx-admin')}")
|
||||
print(f"Bigscreen镜像: {image_config.get('ljwx-bigscreen')}")
|
||||
print(f"Boot镜像: {image_config.get('ljwx-boot')}")
|
||||
@@ -0,0 +1,394 @@
|
||||
# LJWX系统统一配置集成示例
|
||||
|
||||
## ljwx-bigscreen (Python Flask) 集成示例
|
||||
|
||||
### 1. 修改主应用文件
|
||||
|
||||
在 `ljwx-bigscreen/bigscreen/app.py` 或 `run.py` 中:
|
||||
|
||||
```python
|
||||
# 原有代码
|
||||
import os
|
||||
from flask import Flask
|
||||
# ... 其他导入
|
||||
|
||||
# 新增:导入统一配置
|
||||
import sys
|
||||
sys.path.append('/client/config')
|
||||
sys.path.append('/app/config')
|
||||
|
||||
try:
|
||||
from config_loader import get_database_config, get_service_config, get_config
|
||||
|
||||
# 从统一配置加载
|
||||
mysql_config = get_database_config('mysql')
|
||||
redis_config = get_database_config('redis')
|
||||
service_config = get_service_config('ljwx-bigscreen')
|
||||
|
||||
# 数据库连接配置
|
||||
DATABASE_CONFIG = {
|
||||
'host': mysql_config['host'],
|
||||
'port': mysql_config['port'],
|
||||
'database': mysql_config['database'],
|
||||
'username': mysql_config['username'],
|
||||
'password': mysql_config['password'],
|
||||
'charset': mysql_config.get('charset', 'utf8mb4')
|
||||
}
|
||||
|
||||
# Redis配置
|
||||
REDIS_CONFIG = {
|
||||
'host': redis_config['host'],
|
||||
'port': redis_config['port'],
|
||||
'password': redis_config.get('password', ''),
|
||||
'db': redis_config.get('db', 0)
|
||||
}
|
||||
|
||||
# 应用配置
|
||||
APP_PORT = service_config['port']
|
||||
|
||||
except ImportError:
|
||||
# 备用配置(兼容现有部署)
|
||||
DATABASE_CONFIG = {
|
||||
'host': os.getenv('MYSQL_HOST', 'ljwx-mysql'),
|
||||
'port': int(os.getenv('MYSQL_PORT', 3306)),
|
||||
'database': os.getenv('MYSQL_DATABASE', 'test'),
|
||||
'username': os.getenv('MYSQL_USERNAME', 'ljwx'),
|
||||
'password': os.getenv('MYSQL_PASSWORD', '123456'),
|
||||
'charset': 'utf8mb4'
|
||||
}
|
||||
|
||||
REDIS_CONFIG = {
|
||||
'host': os.getenv('REDIS_HOST', 'ljwx-redis'),
|
||||
'port': int(os.getenv('REDIS_PORT', 6379)),
|
||||
'password': os.getenv('REDIS_PASSWORD', ''),
|
||||
'db': int(os.getenv('REDIS_DB', 0))
|
||||
}
|
||||
|
||||
APP_PORT = int(os.getenv('SERVER_PORT', 8001))
|
||||
|
||||
# Flask应用初始化
|
||||
app = Flask(__name__)
|
||||
|
||||
# 使用统一配置
|
||||
app.config.update({
|
||||
'MYSQL_HOST': DATABASE_CONFIG['host'],
|
||||
'MYSQL_PORT': DATABASE_CONFIG['port'],
|
||||
'MYSQL_DATABASE': DATABASE_CONFIG['database'],
|
||||
'MYSQL_USER': DATABASE_CONFIG['username'],
|
||||
'MYSQL_PASSWORD': DATABASE_CONFIG['password'],
|
||||
'REDIS_HOST': REDIS_CONFIG['host'],
|
||||
'REDIS_PORT': REDIS_CONFIG['port'],
|
||||
})
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host='0.0.0.0', port=APP_PORT, debug=False)
|
||||
```
|
||||
|
||||
### 2. 修改数据库连接模块
|
||||
|
||||
在数据库连接文件中:
|
||||
|
||||
```python
|
||||
# 原有代码中的数据库连接部分
|
||||
import pymysql
|
||||
from sqlalchemy import create_engine
|
||||
|
||||
# 使用统一配置
|
||||
from app import DATABASE_CONFIG
|
||||
|
||||
# SQLAlchemy连接
|
||||
def get_database_engine():
|
||||
connection_url = f"mysql+pymysql://{DATABASE_CONFIG['username']}:{DATABASE_CONFIG['password']}@{DATABASE_CONFIG['host']}:{DATABASE_CONFIG['port']}/{DATABASE_CONFIG['database']}?charset={DATABASE_CONFIG['charset']}"
|
||||
return create_engine(connection_url, pool_pre_ping=True, pool_recycle=3600)
|
||||
|
||||
# PyMySQL直接连接
|
||||
def get_mysql_connection():
|
||||
return pymysql.connect(
|
||||
host=DATABASE_CONFIG['host'],
|
||||
port=DATABASE_CONFIG['port'],
|
||||
user=DATABASE_CONFIG['username'],
|
||||
password=DATABASE_CONFIG['password'],
|
||||
database=DATABASE_CONFIG['database'],
|
||||
charset=DATABASE_CONFIG['charset'],
|
||||
cursorclass=pymysql.cursors.DictCursor
|
||||
)
|
||||
```
|
||||
|
||||
## ljwx-boot (Spring Boot) 集成示例
|
||||
|
||||
### 1. 添加配置类
|
||||
|
||||
创建 `src/main/java/com/ljwx/common/config/LJWXConfiguration.java`:
|
||||
|
||||
```java
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
public class LJWXConfiguration {
|
||||
|
||||
@Autowired
|
||||
private LJWXConfigLoader configLoader;
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties(prefix = "spring.datasource")
|
||||
public DataSourceProperties dataSourceProperties() {
|
||||
DataSourceProperties properties = new DataSourceProperties();
|
||||
|
||||
Map<String, Object> mysqlConfig = configLoader.getDatabaseConfig("mysql");
|
||||
if (mysqlConfig != null) {
|
||||
String host = (String) mysqlConfig.get("host");
|
||||
Integer port = (Integer) mysqlConfig.get("port");
|
||||
String database = (String) mysqlConfig.get("database");
|
||||
String username = (String) mysqlConfig.get("username");
|
||||
String password = (String) mysqlConfig.get("password");
|
||||
|
||||
String url = String.format("jdbc:mysql://%s:%d/%s?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai",
|
||||
host, port, database);
|
||||
|
||||
properties.setUrl(url);
|
||||
properties.setUsername(username);
|
||||
properties.setPassword(password);
|
||||
properties.setDriverClassName("com.mysql.cj.jdbc.Driver");
|
||||
}
|
||||
|
||||
return properties;
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties(prefix = "spring.redis")
|
||||
public LettuceConnectionFactory redisConnectionFactory() {
|
||||
Map<String, Object> redisConfig = configLoader.getDatabaseConfig("redis");
|
||||
if (redisConfig != null) {
|
||||
String host = (String) redisConfig.get("host");
|
||||
Integer port = (Integer) redisConfig.get("port");
|
||||
String password = (String) redisConfig.get("password");
|
||||
|
||||
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
|
||||
config.setHostName(host);
|
||||
config.setPort(port);
|
||||
if (password != null && !password.isEmpty()) {
|
||||
config.setPassword(password);
|
||||
}
|
||||
|
||||
return new LettuceConnectionFactory(config);
|
||||
}
|
||||
|
||||
return new LettuceConnectionFactory();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 修改应用启动类
|
||||
|
||||
在 `Application.java` 中:
|
||||
|
||||
```java
|
||||
@SpringBootApplication
|
||||
@ComponentScan(basePackages = {"com.ljwx"})
|
||||
public class LJWXBootApplication {
|
||||
|
||||
@Autowired
|
||||
private LJWXConfigLoader configLoader;
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(LJWXBootApplication.class, args);
|
||||
}
|
||||
|
||||
@PostConstruct
|
||||
public void init() {
|
||||
// 打印配置信息用于调试
|
||||
Map<String, Object> serviceConfig = configLoader.getServiceConfig("ljwx-boot");
|
||||
log.info("LJWX Boot服务配置: {}", serviceConfig);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## ljwx-admin (Vue.js + Node.js) 集成示例
|
||||
|
||||
### 1. 在构建配置中使用
|
||||
|
||||
在 `vite.config.js` 或 `webpack.config.js` 中:
|
||||
|
||||
```javascript
|
||||
const { getConfig, getDatabaseConfig } = require('../client/config/config-loader');
|
||||
|
||||
// 加载统一配置
|
||||
const config = getConfig();
|
||||
const serviceConfig = config.getServiceConfig('ljwx-admin');
|
||||
|
||||
export default defineConfig({
|
||||
server: {
|
||||
port: serviceConfig.port,
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: `http://ljwx-boot:${config.getServiceConfig('ljwx-boot').port}`,
|
||||
changeOrigin: true,
|
||||
}
|
||||
}
|
||||
},
|
||||
define: {
|
||||
// 将配置注入到环境变量
|
||||
__LJWX_CONFIG__: JSON.stringify({
|
||||
apiUrl: `/api`,
|
||||
version: config.get('system.version'),
|
||||
})
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### 2. 在前端代码中使用
|
||||
|
||||
创建 `src/config/index.js`:
|
||||
|
||||
```javascript
|
||||
// 前端配置
|
||||
export const config = {
|
||||
apiUrl: import.meta.env.VITE_API_URL || '/api',
|
||||
version: import.meta.env.VITE_VERSION || '2.0.1',
|
||||
|
||||
// 从后端获取的配置
|
||||
async loadRuntimeConfig() {
|
||||
try {
|
||||
const response = await fetch('/api/system/config');
|
||||
return await response.json();
|
||||
} catch (error) {
|
||||
console.warn('无法加载运行时配置:', error);
|
||||
return {};
|
||||
}
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
## Docker配置挂载示例
|
||||
|
||||
### 1. 在 Dockerfile 中添加配置支持
|
||||
|
||||
```dockerfile
|
||||
# ljwx-bigscreen Dockerfile
|
||||
FROM python:3.12-slim
|
||||
|
||||
# 创建配置目录
|
||||
RUN mkdir -p /app/config
|
||||
|
||||
# 复制应用代码
|
||||
COPY . /app
|
||||
WORKDIR /app
|
||||
|
||||
# 安装依赖
|
||||
RUN pip install -r requirements.txt
|
||||
|
||||
# 复制配置加载器
|
||||
COPY client/config/config_loader.py /app/config/
|
||||
|
||||
# 启动应用
|
||||
CMD ["python", "run.py"]
|
||||
```
|
||||
|
||||
### 2. 在 docker-compose.yml 中挂载配置
|
||||
|
||||
```yaml
|
||||
services:
|
||||
ljwx-bigscreen:
|
||||
image: ljwx-bigscreen:2.0.1
|
||||
volumes:
|
||||
- ./client/config/ljwx-config.json:/app/config/ljwx-config.json:ro
|
||||
- ./client/config/config_loader.py:/app/config/config_loader.py:ro
|
||||
environment:
|
||||
- SERVICE_NAME=ljwx-bigscreen
|
||||
- PYTHONPATH=/app:/app/config
|
||||
```
|
||||
|
||||
## 配置热更新支持
|
||||
|
||||
### 1. Python中的配置热更新
|
||||
|
||||
```python
|
||||
import threading
|
||||
import time
|
||||
from watchdog.observers import Observer
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
|
||||
class ConfigReloadHandler(FileSystemEventHandler):
|
||||
def __init__(self, config_loader):
|
||||
self.config_loader = config_loader
|
||||
|
||||
def on_modified(self, event):
|
||||
if event.src_path.endswith('ljwx-config.json'):
|
||||
print("配置文件已更新,重新加载...")
|
||||
self.config_loader.reload()
|
||||
|
||||
# 在应用启动时启用配置监控
|
||||
def start_config_watcher(config_loader):
|
||||
event_handler = ConfigReloadHandler(config_loader)
|
||||
observer = Observer()
|
||||
observer.schedule(event_handler, '/app/config', recursive=False)
|
||||
observer.start()
|
||||
return observer
|
||||
```
|
||||
|
||||
### 2. Java中的配置热更新
|
||||
|
||||
```java
|
||||
@Component
|
||||
public class ConfigReloadService {
|
||||
|
||||
@Autowired
|
||||
private LJWXConfigLoader configLoader;
|
||||
|
||||
@EventListener
|
||||
@Async
|
||||
public void handleConfigReload(ConfigReloadEvent event) {
|
||||
log.info("重新加载配置...");
|
||||
configLoader.reload();
|
||||
// 触发相关服务重新初始化
|
||||
}
|
||||
|
||||
// 定期检查配置文件修改时间
|
||||
@Scheduled(fixedDelay = 30000)
|
||||
public void checkConfigFile() {
|
||||
// 检查配置文件是否修改
|
||||
// 如果修改,发布ConfigReloadEvent
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 配置验证
|
||||
|
||||
### 1. Python配置验证
|
||||
|
||||
```python
|
||||
def validate_config(config):
|
||||
"""验证配置的完整性和正确性"""
|
||||
required_keys = [
|
||||
'database.mysql.host',
|
||||
'database.mysql.port',
|
||||
'database.mysql.username',
|
||||
'database.mysql.password',
|
||||
'services.ljwx-bigscreen.port'
|
||||
]
|
||||
|
||||
for key in required_keys:
|
||||
if config.get(key) is None:
|
||||
raise ValueError(f"配置项 {key} 不能为空")
|
||||
|
||||
# 端口范围验证
|
||||
port = config.get('services.ljwx-bigscreen.port')
|
||||
if not (1 <= port <= 65535):
|
||||
raise ValueError(f"端口 {port} 超出有效范围")
|
||||
|
||||
return True
|
||||
```
|
||||
|
||||
### 2. 启动时配置检查
|
||||
|
||||
```python
|
||||
# 在应用启动时验证配置
|
||||
try:
|
||||
config = get_config()
|
||||
validate_config(config)
|
||||
print("✅ 配置验证通过")
|
||||
except Exception as e:
|
||||
print(f"❌ 配置验证失败: {e}")
|
||||
sys.exit(1)
|
||||
```
|
||||
|
||||
通过以上集成示例,各服务可以无缝使用统一配置系统,同时保持向后兼容性。
|
||||
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"system": {
|
||||
"name": "ljwx-system",
|
||||
"version": "2.0.1",
|
||||
"environment": "production"
|
||||
},
|
||||
"database": {
|
||||
"mysql": {
|
||||
"host": "ljwx-mysql",
|
||||
"port": 3306,
|
||||
"database": "test",
|
||||
"username": "ljwx",
|
||||
"password": "123456",
|
||||
"charset": "utf8mb4",
|
||||
"pool_size": 10,
|
||||
"max_overflow": 20,
|
||||
"pool_timeout": 30,
|
||||
"pool_recycle": 3600
|
||||
},
|
||||
"redis": {
|
||||
"host": "ljwx-redis",
|
||||
"port": 6379,
|
||||
"password": "",
|
||||
"db": 0,
|
||||
"max_connections": 50
|
||||
}
|
||||
},
|
||||
"services": {
|
||||
"ljwx-admin": {
|
||||
"port": 8080,
|
||||
"api_prefix": "/api"
|
||||
},
|
||||
"ljwx-bigscreen": {
|
||||
"port": 8001,
|
||||
"api_prefix": "/api"
|
||||
},
|
||||
"ljwx-boot": {
|
||||
"port": 8082,
|
||||
"api_prefix": "/api"
|
||||
},
|
||||
"ljwx-mysql": {
|
||||
"port": 3306
|
||||
},
|
||||
"ljwx-redis": {
|
||||
"port": 6379
|
||||
}
|
||||
},
|
||||
"images": {
|
||||
"registry": "crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx",
|
||||
"ljwx-mysql": "2.0.1",
|
||||
"ljwx-redis": "2.0.1",
|
||||
"ljwx-admin": "2.0.1",
|
||||
"ljwx-bigscreen": "2.0.1",
|
||||
"ljwx-boot": "2.0.1",
|
||||
"grafana": "1.2.6",
|
||||
"prometheus": "1.2.6",
|
||||
"loki": "1.2.6",
|
||||
"promtail": "1.2.6",
|
||||
"alertmanager": "1.2.6"
|
||||
},
|
||||
"network": {
|
||||
"name": "client_ljwx-network",
|
||||
"driver": "bridge",
|
||||
"subnet": "172.20.0.0/16"
|
||||
},
|
||||
"logging": {
|
||||
"level": "INFO",
|
||||
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
||||
"max_file_size": "100MB",
|
||||
"backup_count": 10,
|
||||
"log_path": "/app/logs"
|
||||
},
|
||||
"security": {
|
||||
"jwt_secret": "ljwx-jwt-secret-key-2024",
|
||||
"jwt_expiration": 86400,
|
||||
"cors_origins": [
|
||||
"http://localhost:3000",
|
||||
"http://localhost:8080",
|
||||
"http://192.168.1.83:8080"
|
||||
]
|
||||
},
|
||||
"monitoring": {
|
||||
"enable_metrics": true,
|
||||
"metrics_port": 9090,
|
||||
"health_check_interval": 30
|
||||
},
|
||||
"alert": {
|
||||
"enabled": true,
|
||||
"webhook_url": "http://ljwx-bigscreen:8001/alert/webhook",
|
||||
"retry_count": 3,
|
||||
"retry_interval": 60
|
||||
},
|
||||
"business": {
|
||||
"health_data": {
|
||||
"batch_size": 1000,
|
||||
"process_interval": 300,
|
||||
"anomaly_threshold": 0.8
|
||||
},
|
||||
"device_message": {
|
||||
"queue_size": 10000,
|
||||
"process_workers": 4,
|
||||
"retention_days": 90
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
# LJWX 系统统一配置文件
|
||||
# 所有服务都从此文件读取配置信息
|
||||
|
||||
# 系统基础信息
|
||||
system:
|
||||
name: "ljwx-system"
|
||||
version: "2.0.1"
|
||||
environment: "production"
|
||||
|
||||
# 数据库配置
|
||||
database:
|
||||
mysql:
|
||||
host: "ljwx-mysql"
|
||||
port: 3306
|
||||
database: "test"
|
||||
username: "ljwx"
|
||||
password: "123456"
|
||||
charset: "utf8mb4"
|
||||
pool_size: 10
|
||||
max_overflow: 20
|
||||
pool_timeout: 30
|
||||
pool_recycle: 3600
|
||||
|
||||
redis:
|
||||
host: "ljwx-redis"
|
||||
port: 6379
|
||||
password: ""
|
||||
db: 0
|
||||
max_connections: 50
|
||||
|
||||
# 服务端口配置
|
||||
services:
|
||||
ljwx-admin:
|
||||
port: 8080
|
||||
api_prefix: "/api"
|
||||
|
||||
ljwx-bigscreen:
|
||||
port: 8001
|
||||
api_prefix: "/api"
|
||||
|
||||
ljwx-boot:
|
||||
port: 8082
|
||||
api_prefix: "/api"
|
||||
|
||||
ljwx-mysql:
|
||||
port: 3306
|
||||
|
||||
ljwx-redis:
|
||||
port: 6379
|
||||
|
||||
# Docker镜像版本配置
|
||||
images:
|
||||
registry: "crpi-yilnm6upy4pmbp67.cn-shenzhen.personal.cr.aliyuncs.com/ljwx"
|
||||
ljwx-mysql: "2.0.1"
|
||||
ljwx-redis: "2.0.1"
|
||||
ljwx-admin: "2.0.1"
|
||||
ljwx-bigscreen: "2.0.1"
|
||||
ljwx-boot: "2.0.1"
|
||||
grafana: "1.2.6"
|
||||
prometheus: "1.2.6"
|
||||
loki: "1.2.6"
|
||||
promtail: "1.2.6"
|
||||
alertmanager: "1.2.6"
|
||||
|
||||
# 网络配置
|
||||
network:
|
||||
name: "client_ljwx-network"
|
||||
driver: "bridge"
|
||||
subnet: "172.20.0.0/16"
|
||||
|
||||
# 日志配置
|
||||
logging:
|
||||
level: "INFO"
|
||||
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
||||
max_file_size: "100MB"
|
||||
backup_count: 10
|
||||
log_path: "/app/logs"
|
||||
|
||||
# 安全配置
|
||||
security:
|
||||
jwt_secret: "ljwx-jwt-secret-key-2024"
|
||||
jwt_expiration: 86400 # 24 hours
|
||||
cors_origins:
|
||||
- "http://localhost:3000"
|
||||
- "http://localhost:8080"
|
||||
- "http://192.168.1.83:8080"
|
||||
|
||||
# 监控配置
|
||||
monitoring:
|
||||
enable_metrics: true
|
||||
metrics_port: 9090
|
||||
health_check_interval: 30
|
||||
|
||||
# 告警配置
|
||||
alert:
|
||||
enabled: true
|
||||
webhook_url: "http://ljwx-bigscreen:8001/alert/webhook"
|
||||
retry_count: 3
|
||||
retry_interval: 60
|
||||
|
||||
# 业务配置
|
||||
business:
|
||||
# 健康数据处理配置
|
||||
health_data:
|
||||
batch_size: 1000
|
||||
process_interval: 300 # 5 minutes
|
||||
anomaly_threshold: 0.8
|
||||
|
||||
# 设备消息配置
|
||||
device_message:
|
||||
queue_size: 10000
|
||||
process_workers: 4
|
||||
retention_days: 90
|
||||
@@ -1,5 +1,5 @@
|
||||
[mysqld]
|
||||
default_authentication_plugin=mysql_native_password
|
||||
# MySQL 9 compatible - removed default_authentication_plugin
|
||||
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
|
||||
character-set-server=utf8mb4
|
||||
collation-server=utf8mb4_unicode_ci
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "ljwx-config",
|
||||
"version": "2.0.1",
|
||||
"description": "LJWX系统统一配置管理工具",
|
||||
"main": "config-loader.js",
|
||||
"scripts": {
|
||||
"test": "node config-loader.js"
|
||||
},
|
||||
"keywords": [
|
||||
"ljwx",
|
||||
"config",
|
||||
"yaml",
|
||||
"configuration"
|
||||
],
|
||||
"author": "LJWX Team",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"js-yaml": "^4.1.0"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"engines": {
|
||||
"node": ">=14.0.0"
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,2 @@
|
||||
[auto]
|
||||
server-uuid=7e7f87ae-8ae5-11f0-a9cb-0242ac140002
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,9 @@
|
||||
./binlog.000001
|
||||
./binlog.000002
|
||||
./binlog.000003
|
||||
./binlog.000004
|
||||
./binlog.000005
|
||||
./binlog.000006
|
||||
./binlog.000007
|
||||
./binlog.000008
|
||||
./binlog.000009
|
||||
@@ -0,0 +1,672 @@
|
||||
5,290
|
||||
5,289
|
||||
5,288
|
||||
5,287
|
||||
5,286
|
||||
5,285
|
||||
4294967279,423
|
||||
4294967279,422
|
||||
5,284
|
||||
5,283
|
||||
4294967279,421
|
||||
4294967279,420
|
||||
4294967279,419
|
||||
5,282
|
||||
5,281
|
||||
4294967279,418
|
||||
5,280
|
||||
5,279
|
||||
5,278
|
||||
5,277
|
||||
4294967294,471
|
||||
4294967278,357
|
||||
4294967293,131
|
||||
4294967293,130
|
||||
4294967293,129
|
||||
4294967293,128
|
||||
4294967293,127
|
||||
4294967293,126
|
||||
4294967293,125
|
||||
4294967293,124
|
||||
4294967293,123
|
||||
4294967293,122
|
||||
4294967293,121
|
||||
4294967293,120
|
||||
4294967293,119
|
||||
4294967293,118
|
||||
4294967293,117
|
||||
4294967293,116
|
||||
4294967293,115
|
||||
4294967293,114
|
||||
4294967293,113
|
||||
4294967293,112
|
||||
4294967293,111
|
||||
4294967293,110
|
||||
4294967293,109
|
||||
4294967293,108
|
||||
4294967293,107
|
||||
4294967293,106
|
||||
4294967293,105
|
||||
4294967293,104
|
||||
4294967293,103
|
||||
4294967293,102
|
||||
4294967293,101
|
||||
4294967293,100
|
||||
4294967293,99
|
||||
4294967293,98
|
||||
4294967293,97
|
||||
4294967293,96
|
||||
4294967293,95
|
||||
4294967293,94
|
||||
4294967293,93
|
||||
4294967293,92
|
||||
4294967293,91
|
||||
4294967293,90
|
||||
4294967293,89
|
||||
4294967293,88
|
||||
4294967293,87
|
||||
4294967293,86
|
||||
4294967293,85
|
||||
4294967293,84
|
||||
4294967293,83
|
||||
4294967293,82
|
||||
4294967293,81
|
||||
4294967293,80
|
||||
4294967293,79
|
||||
4294967293,78
|
||||
4294967293,77
|
||||
4294967293,76
|
||||
4294967293,75
|
||||
4294967293,74
|
||||
4294967293,73
|
||||
4294967293,72
|
||||
4294967293,71
|
||||
4294967293,70
|
||||
4294967293,69
|
||||
4294967293,68
|
||||
4294967293,67
|
||||
4294967293,66
|
||||
4294967293,65
|
||||
4294967293,64
|
||||
4294967293,63
|
||||
4294967293,62
|
||||
4294967293,61
|
||||
4294967293,60
|
||||
4294967293,59
|
||||
4294967293,58
|
||||
4294967293,57
|
||||
4294967293,56
|
||||
4294967293,55
|
||||
4294967293,54
|
||||
4294967293,53
|
||||
4294967293,52
|
||||
4294967293,51
|
||||
4294967293,50
|
||||
4294967293,49
|
||||
4294967293,48
|
||||
4294967293,47
|
||||
4294967293,46
|
||||
4294967293,45
|
||||
4294967293,44
|
||||
4294967293,43
|
||||
4294967293,42
|
||||
4294967293,41
|
||||
4294967293,40
|
||||
4294967293,39
|
||||
4294967293,38
|
||||
4294967293,37
|
||||
4294967293,36
|
||||
4294967293,35
|
||||
4294967293,34
|
||||
4294967293,33
|
||||
4294967293,32
|
||||
4294967293,31
|
||||
4294967293,30
|
||||
4294967293,29
|
||||
4294967293,28
|
||||
4294967293,27
|
||||
4294967293,26
|
||||
4294967293,25
|
||||
4294967293,24
|
||||
4294967293,23
|
||||
4294967293,22
|
||||
4294967293,21
|
||||
4294967293,20
|
||||
4294967293,19
|
||||
4294967293,18
|
||||
4294967293,17
|
||||
4294967293,16
|
||||
4294967293,15
|
||||
4294967293,14
|
||||
4294967293,13
|
||||
4294967293,12
|
||||
4294967293,11
|
||||
4294967293,10
|
||||
4294967293,9
|
||||
4294967293,8
|
||||
4294967293,7
|
||||
4294967293,6
|
||||
4294967293,5
|
||||
4294967293,4
|
||||
4294967293,3
|
||||
4294967293,2
|
||||
4243767290,0
|
||||
4243767289,0
|
||||
4243767288,0
|
||||
4243767287,0
|
||||
4243767286,0
|
||||
4243767285,0
|
||||
4243767284,0
|
||||
4243767283,0
|
||||
4243767282,0
|
||||
4243767281,0
|
||||
4294967293,0
|
||||
4294967279,185
|
||||
4294967279,184
|
||||
4294967279,402
|
||||
4294967279,70
|
||||
4294967279,71
|
||||
4294967279,187
|
||||
4294967279,186
|
||||
4294967279,188
|
||||
4294967279,72
|
||||
4294967279,73
|
||||
4294967279,74
|
||||
4294967279,296
|
||||
4294967279,189
|
||||
4294967279,386
|
||||
4294967279,75
|
||||
4294967279,190
|
||||
4294967279,76
|
||||
4294967279,387
|
||||
4294967279,191
|
||||
4294967279,193
|
||||
4294967279,192
|
||||
4294967279,77
|
||||
4294967279,78
|
||||
4294967279,79
|
||||
4294967279,194
|
||||
4294967279,298
|
||||
4294967279,297
|
||||
4294967279,195
|
||||
4294967279,196
|
||||
4294967279,80
|
||||
4294967279,81
|
||||
4294967279,82
|
||||
4294967279,388
|
||||
4294967279,198
|
||||
4294967279,390
|
||||
4294967279,197
|
||||
4294967279,83
|
||||
4294967279,84
|
||||
4294967279,199
|
||||
4294967279,299
|
||||
4294967279,403
|
||||
4294967279,200
|
||||
4294967279,85
|
||||
4294967279,201
|
||||
4294967279,86
|
||||
4294967279,87
|
||||
4294967279,202
|
||||
4294967279,203
|
||||
4294967279,300
|
||||
4294967279,89
|
||||
4294967279,204
|
||||
4294967279,389
|
||||
4294967279,90
|
||||
4294967279,91
|
||||
4294967279,205
|
||||
4294967279,92
|
||||
4294967279,206
|
||||
4294967279,301
|
||||
4294967279,93
|
||||
4294967279,207
|
||||
4294967279,208
|
||||
4294967279,94
|
||||
4294967279,302
|
||||
4294967279,209
|
||||
4294967279,210
|
||||
4294967279,95
|
||||
4294967279,96
|
||||
4294967279,97
|
||||
4294967279,211
|
||||
4294967279,413
|
||||
4294967278,281
|
||||
4294967279,212
|
||||
4294967278,265
|
||||
4294967279,98
|
||||
4294967279,99
|
||||
4294967279,100
|
||||
4294967279,280
|
||||
4294967279,214
|
||||
4294967279,216
|
||||
4294967279,101
|
||||
4294967279,102
|
||||
4294967279,103
|
||||
4294967279,219
|
||||
4294967279,221
|
||||
4294967279,218
|
||||
4294967279,231
|
||||
4294967279,220
|
||||
4294967279,104
|
||||
4294967279,105
|
||||
4294967279,223
|
||||
4294967279,225
|
||||
4294967279,222
|
||||
4294967279,224
|
||||
4294967279,106
|
||||
4294967279,107
|
||||
4294967279,229
|
||||
4294967279,227
|
||||
4294967279,230
|
||||
4294967279,228
|
||||
4294967279,226
|
||||
4294967279,108
|
||||
4294967279,109
|
||||
4294967279,110
|
||||
4294967279,235
|
||||
4294967279,233
|
||||
4294967279,304
|
||||
4294967279,234
|
||||
4294967279,232
|
||||
4294967279,111
|
||||
4294967279,112
|
||||
4294967279,236
|
||||
4294967279,239
|
||||
4294967279,405
|
||||
4294967279,237
|
||||
4294967279,113
|
||||
4294967279,238
|
||||
4294967279,114
|
||||
4294967279,115
|
||||
4294967279,241
|
||||
4294967279,245
|
||||
4294967279,243
|
||||
4294967279,240
|
||||
4294967279,244
|
||||
4294967279,242
|
||||
4294967279,116
|
||||
4294967279,117
|
||||
4294967279,391
|
||||
4294967279,118
|
||||
4294967279,247
|
||||
4294967279,246
|
||||
4294967279,248
|
||||
4294967279,249
|
||||
4294967279,119
|
||||
4294967279,120
|
||||
4294967279,251
|
||||
4294967279,253
|
||||
4294967279,121
|
||||
4294967279,250
|
||||
4294967279,252
|
||||
4294967279,122
|
||||
4294967279,123
|
||||
4294967279,254
|
||||
4294967279,255
|
||||
4294967279,414
|
||||
4294967279,124
|
||||
4294967279,305
|
||||
4294967279,125
|
||||
4294967279,307
|
||||
4294967279,415
|
||||
4294967279,256
|
||||
4294967279,126
|
||||
4294967279,306
|
||||
4294967279,127
|
||||
4294967279,416
|
||||
4294967279,128
|
||||
4294967279,308
|
||||
4294967279,309
|
||||
4294967279,129
|
||||
4294967279,130
|
||||
4294967279,392
|
||||
4294967278,356
|
||||
4294967279,393
|
||||
4294967279,257
|
||||
4294967279,310
|
||||
4294967279,131
|
||||
4294967279,132
|
||||
4294967278,309
|
||||
4294967278,4
|
||||
4294967278,310
|
||||
4294967278,257
|
||||
4294967278,258
|
||||
4294967278,259
|
||||
4294967278,5
|
||||
4294967278,6
|
||||
4294967278,7
|
||||
4294967278,279
|
||||
4294967278,341
|
||||
4294967278,278
|
||||
4294967278,262
|
||||
4294967278,261
|
||||
4294967278,263
|
||||
4294967278,8
|
||||
4294967278,9
|
||||
4294967278,10
|
||||
4294967278,342
|
||||
4294967278,288
|
||||
4294967278,264
|
||||
4294967278,149
|
||||
4294967278,280
|
||||
4294967278,11
|
||||
4294967278,12
|
||||
4294967278,13
|
||||
4294967278,311
|
||||
4294967278,282
|
||||
4294967278,283
|
||||
4294967278,266
|
||||
4294967278,267
|
||||
4294967278,14
|
||||
4294967278,268
|
||||
4294967278,15
|
||||
4294967278,269
|
||||
4294967278,270
|
||||
4294967278,16
|
||||
4294967278,17
|
||||
4294967278,18
|
||||
4294967278,274
|
||||
4294967278,284
|
||||
4294967278,273
|
||||
4294967278,133
|
||||
4294967278,271
|
||||
4294967278,272
|
||||
4294967278,19
|
||||
4294967278,20
|
||||
4294967278,21
|
||||
4294967278,134
|
||||
4294967278,275
|
||||
4294967278,22
|
||||
4294967278,276
|
||||
4294967278,135
|
||||
4294967278,136
|
||||
4294967278,23
|
||||
4294967278,24
|
||||
4294967278,137
|
||||
4294967278,138
|
||||
4294967278,285
|
||||
4294967278,25
|
||||
4294967278,26
|
||||
4294967278,139
|
||||
4294967278,140
|
||||
4294967278,27
|
||||
4294967278,141
|
||||
4294967278,28
|
||||
4294967278,29
|
||||
4294967278,325
|
||||
4294967278,286
|
||||
4294967278,142
|
||||
4294967278,344
|
||||
4294967278,345
|
||||
4294967278,30
|
||||
4294967278,31
|
||||
4294967278,32
|
||||
4294967278,346
|
||||
4294967278,33
|
||||
4294967278,347
|
||||
4294967278,287
|
||||
4294967278,146
|
||||
4294967278,34
|
||||
4294967278,147
|
||||
4294967278,148
|
||||
4294967278,35
|
||||
4294967278,316
|
||||
4294967278,36
|
||||
4294967278,312
|
||||
4294967278,165
|
||||
4294967278,37
|
||||
4294967278,150
|
||||
4294967278,151
|
||||
4294967278,38
|
||||
4294967278,348
|
||||
4294967278,39
|
||||
4294967278,289
|
||||
4294967278,152
|
||||
4294967278,40
|
||||
4294967278,153
|
||||
4294967278,154
|
||||
4294967278,290
|
||||
4294967278,41
|
||||
4294967278,42
|
||||
4294967278,155
|
||||
4294967278,43
|
||||
4294967278,313
|
||||
4294967278,349
|
||||
4294967278,326
|
||||
4294967278,156
|
||||
4294967278,157
|
||||
4294967278,44
|
||||
4294967278,158
|
||||
4294967278,45
|
||||
4294967278,46
|
||||
4294967278,291
|
||||
4294967278,315
|
||||
4294967278,314
|
||||
4294967278,159
|
||||
4294967278,160
|
||||
4294967278,47
|
||||
4294967278,161
|
||||
4294967278,48
|
||||
4294967278,350
|
||||
4294967278,49
|
||||
4294967278,292
|
||||
4294967278,162
|
||||
4294967278,50
|
||||
4294967278,163
|
||||
4294967278,327
|
||||
4294967278,51
|
||||
4294967278,317
|
||||
4294967278,52
|
||||
4294967278,53
|
||||
4294967278,166
|
||||
4294967278,351
|
||||
4294967278,54
|
||||
4294967278,167
|
||||
4294967278,55
|
||||
4294967278,168
|
||||
4294967279,68
|
||||
4294967279,182
|
||||
4294967279,67
|
||||
4294967279,66
|
||||
4294967279,180
|
||||
4294967279,181
|
||||
4294967279,65
|
||||
4294967279,179
|
||||
4294967279,63
|
||||
4294967279,177
|
||||
4294967279,62
|
||||
4294967279,61
|
||||
4294967279,175
|
||||
4294967279,173
|
||||
4294967279,294
|
||||
4294967279,59
|
||||
4294967279,172
|
||||
4294967279,171
|
||||
4294967279,401
|
||||
4294967279,170
|
||||
4294967279,56
|
||||
4294967279,168
|
||||
4294967279,169
|
||||
4294967279,53
|
||||
4294967279,166
|
||||
4294967279,293
|
||||
4294967279,292
|
||||
4294967279,52
|
||||
4294967279,165
|
||||
4294967279,160
|
||||
4294967279,50
|
||||
4294967279,49
|
||||
4294967279,162
|
||||
4294967279,163
|
||||
4294967279,161
|
||||
4294967279,46
|
||||
4294967279,47
|
||||
4294967279,157
|
||||
4294967279,318
|
||||
4294967279,158
|
||||
4294967279,44
|
||||
4294967279,43
|
||||
4294967279,156
|
||||
4294967279,317
|
||||
4294967279,42
|
||||
4294967279,154
|
||||
4294967279,40
|
||||
4294967279,153
|
||||
4294967279,39
|
||||
4294967279,152
|
||||
4294967279,38
|
||||
4294967279,37
|
||||
4294967279,36
|
||||
4294967279,316
|
||||
4294967279,149
|
||||
4294967279,410
|
||||
4294967279,275
|
||||
4294967279,34
|
||||
4294967279,398
|
||||
4294967279,32
|
||||
4294967279,409
|
||||
4294967279,408
|
||||
4294967279,30
|
||||
4294967279,407
|
||||
4294967279,397
|
||||
4294967279,141
|
||||
4294967279,28
|
||||
4294967279,140
|
||||
4294967279,26
|
||||
4294967279,138
|
||||
4294967279,314
|
||||
4294967279,279
|
||||
4294967279,137
|
||||
4294967279,24
|
||||
4294967279,136
|
||||
4294967279,278
|
||||
4294967279,277
|
||||
4294967279,133
|
||||
4294967279,64
|
||||
4294967279,134
|
||||
4294967279,276
|
||||
4294967279,19
|
||||
4294967279,18
|
||||
4294967279,274
|
||||
4294967279,17
|
||||
4294967279,273
|
||||
4294967279,16
|
||||
4294967279,395
|
||||
4294967279,271
|
||||
4294967279,14
|
||||
4294967279,13
|
||||
4294967279,268
|
||||
4294967279,270
|
||||
4294967279,287
|
||||
4294967279,12
|
||||
4294967279,11
|
||||
4294967279,266
|
||||
4294967279,10
|
||||
4294967279,286
|
||||
4294967294,1460
|
||||
4294967294,396
|
||||
4294967294,1448
|
||||
4294967294,36
|
||||
4294967294,37
|
||||
4294967294,39
|
||||
4294967294,40
|
||||
4294967294,42
|
||||
4294967294,114
|
||||
4294967294,120
|
||||
4294967294,1421
|
||||
4294967294,44
|
||||
4294967294,1435
|
||||
4294967294,1450
|
||||
4294967294,45
|
||||
4294967294,439
|
||||
4294967294,392
|
||||
4294967294,47
|
||||
4294967294,48
|
||||
4294967294,51
|
||||
4294967294,417
|
||||
4294967294,387
|
||||
4294967294,1451
|
||||
4294967294,53
|
||||
4294967294,74
|
||||
4294967294,76
|
||||
4294967294,77
|
||||
4294967294,79
|
||||
4294967294,80
|
||||
4294967294,170
|
||||
4294967294,1167
|
||||
4294967294,190
|
||||
4294967294,1152
|
||||
4294967294,1077
|
||||
4294967294,83
|
||||
4294967294,1249
|
||||
4294967294,85
|
||||
4294967294,87
|
||||
4294967294,88
|
||||
4294967294,91
|
||||
4294967294,92
|
||||
4294967294,98
|
||||
4294967294,100
|
||||
4294967294,101
|
||||
4294967294,103
|
||||
4294967294,104
|
||||
4294967294,106
|
||||
4294967294,107
|
||||
4294967294,161
|
||||
4294967294,109
|
||||
4294967294,162
|
||||
4294967294,110
|
||||
4294967294,111
|
||||
4294967294,112
|
||||
4294967294,168
|
||||
4294967294,388
|
||||
4294967294,117
|
||||
4294967294,118
|
||||
4294967294,394
|
||||
4294967294,459
|
||||
4294967294,164
|
||||
4294967294,465
|
||||
4294967294,191
|
||||
4294967294,384
|
||||
4294967294,425
|
||||
4294967294,1430
|
||||
4294967294,1083
|
||||
4294967294,1087
|
||||
4294967294,385
|
||||
4294967294,178
|
||||
4294967294,413
|
||||
4294967294,1086
|
||||
4294967294,395
|
||||
4294967294,426
|
||||
4294967294,1445
|
||||
4294967294,1449
|
||||
4294967294,1462
|
||||
4294967294,1434
|
||||
4294967294,1442
|
||||
4294967294,1423
|
||||
4294967294,1436
|
||||
4294967294,393
|
||||
4294967294,1432
|
||||
4294967294,1076
|
||||
4294967294,1079
|
||||
4294967294,1163
|
||||
4294967294,1156
|
||||
4294967294,1075
|
||||
4294967294,5
|
||||
4294967294,126
|
||||
4294967294,20
|
||||
4294967294,127
|
||||
4294967278,353
|
||||
4294967294,13
|
||||
4294967294,422
|
||||
4294967294,599
|
||||
4294967294,435
|
||||
4294967294,456
|
||||
4294967294,583
|
||||
4294967294,601
|
||||
4294967294,1161
|
||||
4294967294,189
|
||||
4294967294,163
|
||||
4294967294,169
|
||||
4294967294,467
|
||||
4294967294,468
|
||||
Binary file not shown.
Binary file not shown.
Symlink
+1
@@ -0,0 +1 @@
|
||||
/var/run/mysqld/mysqld.sock
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
{"mysqld_version_id":80043,"dd_version":80023,"sdi_version":80019,"dd_object_type":"Table","dd_object":{"name":"cond_instances","mysql_version_id":80043,"created":20250906045455,"last_altered":20250906045455,"hidden":1,"options":"avg_row_length=0;key_block_size=0;keys_disabled=0;pack_record=1;server_p_s_table=1;stats_auto_recalc=0;stats_sample_pages=0;","columns":[{"name":"NAME","type":16,"is_nullable":false,"is_zerofill":false,"is_unsigned":false,"is_auto_increment":false,"is_virtual":false,"hidden":1,"ordinal_position":1,"char_length":512,"numeric_precision":0,"numeric_scale":0,"numeric_scale_null":true,"datetime_precision":0,"datetime_precision_null":1,"has_no_default":true,"default_value_null":false,"srs_id_null":true,"srs_id":0,"default_value":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\nAA==","default_value_utf8_null":true,"default_value_utf8":"","default_option":"","update_option":"","comment":"","generation_expression":"","generation_expression_utf8":"","options":"interval_count=0;","se_private_data":"","engine_attribute":"","secondary_engine_attribute":"","column_key":4,"column_type_utf8":"varchar(128)","elements":[],"collation_id":255,"is_explicit_collation":false},{"name":"OBJECT_INSTANCE_BEGIN","type":9,"is_nullable":false,"is_zerofill":false,"is_unsigned":true,"is_auto_increment":false,"is_virtual":false,"hidden":1,"ordinal_position":2,"char_length":20,"numeric_precision":20,"numeric_scale":0,"numeric_scale_null":false,"datetime_precision":0,"datetime_precision_null":1,"has_no_default":true,"default_value_null":false,"srs_id_null":true,"srs_id":0,"default_value":"AAAAAAAAAAA=","default_value_utf8_null":true,"default_value_utf8":"","default_option":"","update_option":"","comment":"","generation_expression":"","generation_expression_utf8":"","options":"interval_count=0;","se_private_data":"","engine_attribute":"","secondary_engine_attribute":"","column_key":2,"column_type_utf8":"bigint unsigned","elements":[],"collation_id":255,"is_explicit_collation":false}],"schema_ref":"performance_schema","se_private_id":18446744073709551615,"engine":"PERFORMANCE_SCHEMA","last_checked_for_upgrade_version_id":0,"comment":"","se_private_data":"","engine_attribute":"","secondary_engine_attribute":"","row_format":2,"partition_type":0,"partition_expression":"","partition_expression_utf8":"","default_partitioning":0,"subpartition_type":0,"subpartition_expression":"","subpartition_expression_utf8":"","default_subpartitioning":0,"indexes":[{"name":"PRIMARY","hidden":false,"is_generated":false,"ordinal_position":1,"comment":"","options":"flags=0;","se_private_data":"","type":1,"algorithm":4,"is_algorithm_explicit":false,"is_visible":true,"engine":"PERFORMANCE_SCHEMA","engine_attribute":"","secondary_engine_attribute":"","elements":[{"ordinal_position":1,"length":8,"order":1,"hidden":false,"column_opx":1}]},{"name":"NAME","hidden":false,"is_generated":false,"ordinal_position":2,"comment":"","options":"flags=0;","se_private_data":"","type":3,"algorithm":4,"is_algorithm_explicit":false,"is_visible":true,"engine":"PERFORMANCE_SCHEMA","engine_attribute":"","secondary_engine_attribute":"","elements":[{"ordinal_position":1,"length":512,"order":1,"hidden":false,"column_opx":0}]}],"foreign_keys":[],"check_constraints":[],"partitions":[],"collation_id":255}}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user