refactor(deploy): 迁移CI/CD至双服务器架构
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled

- Jenkinsfile: Registry改为Infra内网172.17.16.7:5000,部署目标改为Prod内网172.17.16.14
- docker-compose: 镜像源改为172.17.16.7:5000,MySQL改为172.17.16.8,Redis改为172.17.16.13,RocketMQ改为腾讯云TDMQ
- 所有模块application-prod.yaml: 统一更新MySQL/Redis/RocketMQ默认连接地址
- deploy.sh: Registry地址同步更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
lzh
2026-02-13 10:41:54 +08:00
parent c9195f78e9
commit 547da7cfd2
9 changed files with 879 additions and 879 deletions

8
Jenkinsfile vendored
View File

@@ -17,15 +17,15 @@ pipeline {
} }
environment { environment {
// 镜像仓库配置 // 镜像仓库配置Infra 服务器内网地址Prod 服务器可通过内网拉取)
REGISTRY = 'localhost:5000' REGISTRY = '172.17.16.7:5000'
DEPS_IMAGE = "${REGISTRY}/aiot-deps:latest" DEPS_IMAGE = "${REGISTRY}/aiot-deps:latest"
// 服务配置 // 服务配置
CORE_SERVICES = 'viewsh-gateway,viewsh-module-system-server,viewsh-module-infra-server,viewsh-module-iot-server,viewsh-module-iot-gateway,viewsh-module-ops-server' CORE_SERVICES = 'viewsh-gateway,viewsh-module-system-server,viewsh-module-infra-server,viewsh-module-iot-server,viewsh-module-iot-gateway,viewsh-module-ops-server'
// 部署配置 // 部署配置Prod 服务器内网地址)
DEPLOY_HOST = '172.19.0.1' DEPLOY_HOST = '172.17.16.14'
DEPLOY_PATH = '/opt/aiot-platform-cloud' DEPLOY_PATH = '/opt/aiot-platform-cloud'
SSH_KEY = '/var/jenkins_home/.ssh/id_rsa' SSH_KEY = '/var/jenkins_home/.ssh/id_rsa'

View File

@@ -10,7 +10,7 @@ volumes:
services: services:
viewsh-gateway: viewsh-gateway:
image: ${REGISTRY_HOST:-localhost:5000}/viewsh-gateway:${IMAGE_TAG:-latest} image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-gateway:${IMAGE_TAG:-latest}
container_name: aiot-gateway container_name: aiot-gateway
restart: on-failure:5 restart: on-failure:5
ports: ports:
@@ -31,9 +31,9 @@ services:
NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
# ===== Redis 配置 ===== # ===== Redis 配置 =====
SPRING_DATA_REDIS_HOST: 172.17.16.14 SPRING_DATA_REDIS_HOST: 172.17.16.13
SPRING_DATA_REDIS_PORT: 6379 SPRING_DATA_REDIS_PORT: 6379
SPRING_DATA_REDIS_PASSWORD: "9kHXcZ1ojFsD" SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1"
volumes: volumes:
- app-logs:/app/logs - app-logs:/app/logs
@@ -50,7 +50,7 @@ services:
start_period: 120s start_period: 120s
viewsh-module-system-server: viewsh-module-system-server:
image: ${REGISTRY_HOST:-localhost:5000}/viewsh-module-system-server:${IMAGE_TAG:-latest} image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-system-server:${IMAGE_TAG:-latest}
container_name: aiot-system-server container_name: aiot-system-server
restart: on-failure:5 restart: on-failure:5
ports: ports:
@@ -68,13 +68,13 @@ services:
NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
# 数据库 # 数据库
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.14:3306/aiot-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root # TODO: 填入数据库用户名 SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root # TODO: 填入数据库用户名
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "65p^VTPi9Qd+" # TODO: 填入数据库密码 SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@" # TODO: 填入数据库密码
# Redis # Redis
SPRING_DATA_REDIS_HOST: 172.17.16.14 SPRING_DATA_REDIS_HOST: 172.17.16.13
SPRING_DATA_REDIS_PASSWORD: "9kHXcZ1ojFsD" # TODO: 填入 Redis 密码 SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1" # TODO: 填入 Redis 密码
# 微信配置 (解决 appid 不能为 null) # 微信配置 (解决 appid 不能为 null)
WX_MP_APP_ID: "wx5b23ba7a5589ecbb" WX_MP_APP_ID: "wx5b23ba7a5589ecbb"
@@ -103,7 +103,7 @@ services:
condition: service_healthy condition: service_healthy
viewsh-module-infra-server: viewsh-module-infra-server:
image: ${REGISTRY_HOST:-localhost:5000}/viewsh-module-infra-server:${IMAGE_TAG:-latest} image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-infra-server:${IMAGE_TAG:-latest}
container_name: aiot-infra-server container_name: aiot-infra-server
restart: on-failure:5 restart: on-failure:5
ports: ports:
@@ -119,12 +119,12 @@ services:
NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.14:3306/aiot-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "65p^VTPi9Qd+" SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@"
SPRING_DATA_REDIS_HOST: 172.17.16.14 SPRING_DATA_REDIS_HOST: 172.17.16.13
SPRING_DATA_REDIS_PASSWORD: "9kHXcZ1ojFsD" SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1"
# XXL-Job 调度中心地址 # XXL-Job 调度中心地址
XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.14:19090/xxl-job-admin XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.14:19090/xxl-job-admin
@@ -142,7 +142,7 @@ services:
condition: service_healthy condition: service_healthy
viewsh-module-iot-server: viewsh-module-iot-server:
image: ${REGISTRY_HOST:-localhost:5000}/viewsh-module-iot-server:${IMAGE_TAG:-latest} image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-iot-server:${IMAGE_TAG:-latest}
container_name: aiot-iot-server container_name: aiot-iot-server
restart: on-failure:5 restart: on-failure:5
ports: ports:
@@ -158,14 +158,14 @@ services:
NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.14:3306/aiot-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "65p^VTPi9Qd+" SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@"
SPRING_DATA_REDIS_HOST: 172.17.16.14 SPRING_DATA_REDIS_HOST: 172.17.16.13
SPRING_DATA_REDIS_PASSWORD: "9kHXcZ1ojFsD" SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1"
ROCKETMQ_NAME_SERVER: 172.17.16.14:9876 ROCKETMQ_NAME_SERVER: rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080
# TDengine # TDengine
TDENGINE_HOST: 172.17.16.14 TDENGINE_HOST: 172.17.16.14
@@ -194,7 +194,7 @@ services:
condition: service_healthy condition: service_healthy
viewsh-module-iot-gateway: viewsh-module-iot-gateway:
image: ${REGISTRY_HOST:-localhost:5000}/viewsh-module-iot-gateway:${IMAGE_TAG:-latest} image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-iot-gateway:${IMAGE_TAG:-latest}
container_name: aiot-iot-gateway container_name: aiot-iot-gateway
restart: on-failure:5 restart: on-failure:5
ports: ports:
@@ -207,10 +207,10 @@ services:
SPRING_PROFILES_ACTIVE: prod SPRING_PROFILES_ACTIVE: prod
JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs" JAVA_OPTS: "-Xms1024m -Xmx2048m -XX:+UseContainerSupport -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/app/logs"
SPRING_DATA_REDIS_HOST: 172.17.16.14 SPRING_DATA_REDIS_HOST: 172.17.16.13
SPRING_DATA_REDIS_PASSWORD: "9kHXcZ1ojFsD" SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1"
ROCKETMQ_NAME_SERVER: 172.17.16.14:9876 ROCKETMQ_NAME_SERVER: rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080
# 添加这一行 # 添加这一行
VIEWSH_IOT_GATEWAY_RPC_URL: "http://aiot-iot-server:48091" VIEWSH_IOT_GATEWAY_RPC_URL: "http://aiot-iot-server:48091"
volumes: volumes:
@@ -224,7 +224,7 @@ services:
- viewsh-module-iot-server - viewsh-module-iot-server
viewsh-module-ops-server: viewsh-module-ops-server:
image: ${REGISTRY_HOST:-localhost:5000}/viewsh-module-ops-server:${IMAGE_TAG:-latest} image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-ops-server:${IMAGE_TAG:-latest}
container_name: aiot-ops-server container_name: aiot-ops-server
restart: on-failure:5 restart: on-failure:5
ports: ports:
@@ -240,14 +240,14 @@ services:
NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_DISCOVERY_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395" NACOS_CONFIG_NAMESPACE: "8efd6d96-de7f-4664-b28e-c2788ffa1395"
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.14:3306/aiot-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL: jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME: root
SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "65p^VTPi9Qd+" SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD: "tKi8rfUJjVrf@"
SPRING_DATA_REDIS_HOST: 172.17.16.14 SPRING_DATA_REDIS_HOST: 172.17.16.13
SPRING_DATA_REDIS_PASSWORD: "9kHXcZ1ojFsD" SPRING_DATA_REDIS_PASSWORD: "HkVZkVnn1"
ROCKETMQ_NAME_SERVER: 172.17.16.14:9876 ROCKETMQ_NAME_SERVER: rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080
# XXL-Job 调度中心地址 # XXL-Job 调度中心地址
XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.14:19090/xxl-job-admin XXL_JOB_ADMIN_ADDRESSES: http://172.17.16.14:19090/xxl-job-admin

View File

@@ -1,230 +1,230 @@
#!/bin/bash #!/bin/bash
# ============================================ # ============================================
# AIOT Platform - 部署脚本 # AIOT Platform - 部署脚本
# 滚动更新部署,支持健康检查和自动回滚 # 滚动更新部署,支持健康检查和自动回滚
# ============================================ # ============================================
set -e set -e
# 颜色输出 # 颜色输出
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# 配置 # 配置
COMPOSE_FILE="docker-compose.core.yml" COMPOSE_FILE="docker-compose.core.yml"
REGISTRY="localhost:5000" REGISTRY="172.17.16.7:5000"
HEALTH_CHECK_TIMEOUT=120 HEALTH_CHECK_TIMEOUT=120
HEALTH_CHECK_INTERVAL=5 HEALTH_CHECK_INTERVAL=5
# 日志函数 # 日志函数
log_info() { log_info() {
echo -e "${GREEN}[INFO]${NC} $1" echo -e "${GREEN}[INFO]${NC} $1"
} }
log_warn() { log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1" echo -e "${YELLOW}[WARN]${NC} $1"
} }
log_error() { log_error() {
echo -e "${RED}[ERROR]${NC} $1" echo -e "${RED}[ERROR]${NC} $1"
} }
# 检查服务健康状态 # 检查服务健康状态
check_health() { check_health() {
local service=$1 local service=$1
local container_name="aiot-${service}" local container_name="aiot-${service}"
local elapsed=0 local elapsed=0
log_info "等待 ${service} 健康检查..." log_info "等待 ${service} 健康检查..."
while [ $elapsed -lt $HEALTH_CHECK_TIMEOUT ]; do while [ $elapsed -lt $HEALTH_CHECK_TIMEOUT ]; do
if docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null | grep -q "healthy"; then if docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null | grep -q "healthy"; then
log_info "${service} 健康检查通过 ✓" log_info "${service} 健康检查通过 ✓"
return 0 return 0
fi fi
sleep $HEALTH_CHECK_INTERVAL sleep $HEALTH_CHECK_INTERVAL
elapsed=$((elapsed + HEALTH_CHECK_INTERVAL)) elapsed=$((elapsed + HEALTH_CHECK_INTERVAL))
echo -n "." echo -n "."
done done
echo "" echo ""
log_error "${service} 健康检查超时 ✗" log_error "${service} 健康检查超时 ✗"
return 1 return 1
} }
# 备份当前运行的镜像标签 # 备份当前运行的镜像标签
backup_current_tags() { backup_current_tags() {
log_info "备份当前镜像标签..." log_info "备份当前镜像标签..."
docker-compose -f "$COMPOSE_FILE" config --services | while read service; do docker-compose -f "$COMPOSE_FILE" config --services | while read service; do
local current_image=$(docker inspect "aiot-${service}" --format='{{.Config.Image}}' 2>/dev/null || echo "") local current_image=$(docker inspect "aiot-${service}" --format='{{.Config.Image}}' 2>/dev/null || echo "")
if [ -n "$current_image" ]; then if [ -n "$current_image" ]; then
echo "${service}=${current_image}" >> .deploy_backup echo "${service}=${current_image}" >> .deploy_backup
fi fi
done done
log_info "备份完成: .deploy_backup" log_info "备份完成: .deploy_backup"
} }
# 部署单个服务 # 部署单个服务
deploy_service() { deploy_service() {
local service=$1 local service=$1
log_info "=========================================" log_info "========================================="
log_info "部署服务: ${service}" log_info "部署服务: ${service}"
log_info "=========================================" log_info "========================================="
# 拉取最新镜像 # 拉取最新镜像
log_info "拉取最新镜像..." log_info "拉取最新镜像..."
if ! docker-compose -f "$COMPOSE_FILE" pull "$service"; then if ! docker-compose -f "$COMPOSE_FILE" pull "$service"; then
log_error "拉取镜像失败" log_error "拉取镜像失败"
return 1 return 1
fi fi
# 启动新容器 # 启动新容器
log_info "启动新容器..." log_info "启动新容器..."
if ! docker-compose -f "$COMPOSE_FILE" up -d "$service"; then if ! docker-compose -f "$COMPOSE_FILE" up -d "$service"; then
log_error "启动容器失败" log_error "启动容器失败"
return 1 return 1
fi fi
# 健康检查 # 健康检查
if ! check_health "$service"; then if ! check_health "$service"; then
log_error "${service} 部署失败,准备回滚..." log_error "${service} 部署失败,准备回滚..."
return 1 return 1
fi fi
log_info "${service} 部署成功 ✓" log_info "${service} 部署成功 ✓"
return 0 return 0
} }
# 回滚服务 # 回滚服务
rollback_service() { rollback_service() {
local service=$1 local service=$1
log_warn "回滚服务: ${service}" log_warn "回滚服务: ${service}"
# 从备份文件读取之前的镜像 # 从备份文件读取之前的镜像
if [ -f .deploy_backup ]; then if [ -f .deploy_backup ]; then
local backup_image=$(grep "^${service}=" .deploy_backup | cut -d'=' -f2) local backup_image=$(grep "^${service}=" .deploy_backup | cut -d'=' -f2)
if [ -n "$backup_image" ]; then if [ -n "$backup_image" ]; then
log_info "回滚到镜像: ${backup_image}" log_info "回滚到镜像: ${backup_image}"
docker-compose -f "$COMPOSE_FILE" stop "$service" docker-compose -f "$COMPOSE_FILE" stop "$service"
docker tag "$backup_image" "${REGISTRY}/${service}:latest" docker tag "$backup_image" "${REGISTRY}/${service}:latest"
docker-compose -f "$COMPOSE_FILE" up -d "$service" docker-compose -f "$COMPOSE_FILE" up -d "$service"
if check_health "$service"; then if check_health "$service"; then
log_info "${service} 回滚成功 ✓" log_info "${service} 回滚成功 ✓"
return 0 return 0
fi fi
fi fi
fi fi
log_error "${service} 回滚失败 ✗" log_error "${service} 回滚失败 ✗"
return 1 return 1
} }
# 主部署流程 # 主部署流程
main() { main() {
log_info "=========================================" log_info "========================================="
log_info "AIOT Platform 部署开始" log_info "AIOT Platform 部署开始"
log_info "=========================================" log_info "========================================="
# 检查 .env 文件 # 检查 .env 文件
if [ ! -f .env ]; then if [ ! -f .env ]; then
log_error ".env 文件不存在,请先复制 .env.example 并配置" log_error ".env 文件不存在,请先复制 .env.example 并配置"
exit 1 exit 1
fi fi
# 加载环境变量 # 加载环境变量
source .env source .env
# 备份当前状态 # 备份当前状态
rm -f .deploy_backup rm -f .deploy_backup
backup_current_tags backup_current_tags
# 获取要部署的服务列表 # 获取要部署的服务列表
local services_to_deploy="" local services_to_deploy=""
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
# 部署所有核心服务 # 部署所有核心服务
services_to_deploy=$(docker-compose -f "$COMPOSE_FILE" config --services | grep -v -E "mysql|redis|nacos|rocketmq") services_to_deploy=$(docker-compose -f "$COMPOSE_FILE" config --services | grep -v -E "mysql|redis|nacos|rocketmq")
else else
# 部署指定服务 # 部署指定服务
services_to_deploy="$@" services_to_deploy="$@"
fi fi
log_info "待部署服务: ${services_to_deploy}" log_info "待部署服务: ${services_to_deploy}"
# 部署服务 # 部署服务
local failed_services="" local failed_services=""
for service in $services_to_deploy; do for service in $services_to_deploy; do
if ! deploy_service "$service"; then if ! deploy_service "$service"; then
failed_services="${failed_services} ${service}" failed_services="${failed_services} ${service}"
# 尝试回滚 # 尝试回滚
rollback_service "$service" rollback_service "$service"
fi fi
done done
# 清理旧镜像 # 清理旧镜像
log_info "清理悬空镜像..." log_info "清理悬空镜像..."
docker image prune -f docker image prune -f
# 部署结果 # 部署结果
echo "" echo ""
log_info "=========================================" log_info "========================================="
if [ -z "$failed_services" ]; then if [ -z "$failed_services" ]; then
log_info "所有服务部署成功 ✓" log_info "所有服务部署成功 ✓"
log_info "=========================================" log_info "========================================="
rm -f .deploy_backup rm -f .deploy_backup
exit 0 exit 0
else else
log_error "以下服务部署失败: ${failed_services}" log_error "以下服务部署失败: ${failed_services}"
log_error "=========================================" log_error "========================================="
exit 1 exit 1
fi fi
} }
# 显示帮助 # 显示帮助
show_help() { show_help() {
cat << EOF cat << EOF
用法: $0 [服务名...] 用法: $0 [服务名...]
部署 AIOT Platform 服务到生产环境 部署 AIOT Platform 服务到生产环境
参数: 参数:
无参数 部署所有应用服务 无参数 部署所有应用服务
服务名... 部署指定的服务 服务名... 部署指定的服务
示例: 示例:
$0 # 部署所有服务 $0 # 部署所有服务
$0 viewsh-gateway # 仅部署 gateway $0 viewsh-gateway # 仅部署 gateway
$0 viewsh-module-iot-server viewsh-module-iot-gateway # 部署多个服务 $0 viewsh-module-iot-server viewsh-module-iot-gateway # 部署多个服务
服务列表: 服务列表:
- viewsh-gateway - viewsh-gateway
- viewsh-module-system-server - viewsh-module-system-server
- viewsh-module-infra-server - viewsh-module-infra-server
- viewsh-module-iot-server - viewsh-module-iot-server
- viewsh-module-iot-gateway - viewsh-module-iot-gateway
- viewsh-module-ops-server - viewsh-module-ops-server
EOF EOF
} }
# 参数处理 # 参数处理
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
show_help show_help
exit 0 exit 0
fi fi
# 执行主流程 # 执行主流程
main "$@" main "$@"

View File

@@ -1,75 +1,75 @@
--- #################### 注册中心 + 配置中心相关配置 #################### --- #################### 注册中心 + 配置中心相关配置 ####################
spring: spring:
cloud: cloud:
nacos: nacos:
server-addr: ${NACOS_ADDR:127.0.0.1:8848} server-addr: ${NACOS_ADDR:127.0.0.1:8848}
username: ${NACOS_USERNAME:nacos} username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos} password: ${NACOS_PASSWORD:nacos}
discovery: discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:prod} namespace: ${NACOS_DISCOVERY_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
metadata: metadata:
version: 1.0.0 version: 1.0.0
config: config:
namespace: ${NACOS_CONFIG_NAMESPACE:prod} namespace: ${NACOS_CONFIG_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
file-extension: yaml file-extension: yaml
refresh-enabled: true refresh-enabled: true
--- #################### Redis 配置 #################### --- #################### Redis 配置 ####################
spring: spring:
data: data:
redis: redis:
host: 127.0.0.1 host: 172.17.16.13
port: 6379 port: 6379
database: 0 database: 0
password: "" password: ""
timeout: 5000ms timeout: 5000ms
lettuce: lettuce:
pool: pool:
max-active: 8 max-active: 8
max-wait: -1ms max-wait: -1ms
max-idle: 8 max-idle: 8
min-idle: 0 min-idle: 0
--- #################### 服务保障相关配置 #################### --- #################### 服务保障相关配置 ####################
lock4j: lock4j:
acquire-timeout: 3000 acquire-timeout: 3000
expire: 30000 expire: 30000
--- #################### 监控相关配置 #################### --- #################### 监控相关配置 ####################
management: management:
endpoints: endpoints:
web: web:
base-path: /actuator base-path: /actuator
exposure: exposure:
include: '*' include: '*'
spring: spring:
boot: boot:
admin: admin:
client: client:
instance: instance:
service-host-type: IP service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin} username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin} password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
logging: logging:
level: level:
root: INFO root: INFO
com.viewsh: ${LOG_LEVEL:INFO} com.viewsh: ${LOG_LEVEL:INFO}
org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR
file: file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################
viewsh: viewsh:
demo: false demo: false
env: env:
tag: ${HOSTNAME:prod} tag: ${HOSTNAME:prod}
security: security:
mock-enable: false mock-enable: false

View File

@@ -1,166 +1,166 @@
--- #################### 注册中心 + 配置中心相关配置 #################### --- #################### 注册中心 + 配置中心相关配置 ####################
spring: spring:
cloud: cloud:
nacos: nacos:
server-addr: ${NACOS_ADDR:127.0.0.1:8848} server-addr: ${NACOS_ADDR:127.0.0.1:8848}
username: ${NACOS_USERNAME:nacos} username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos} password: ${NACOS_PASSWORD:nacos}
discovery: discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:prod} namespace: ${NACOS_DISCOVERY_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
metadata: metadata:
version: 1.0.0 version: 1.0.0
config: config:
namespace: ${NACOS_CONFIG_NAMESPACE:prod} namespace: ${NACOS_CONFIG_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
file-extension: yaml file-extension: yaml
refresh-enabled: true refresh-enabled: true
lifecycle: lifecycle:
timeout-per-shutdown-phase: 30s # 增加优雅关闭超时时间 timeout-per-shutdown-phase: 30s # 增加优雅关闭超时时间
--- #################### 数据库相关配置 #################### --- #################### 数据库相关配置 ####################
spring: spring:
datasource: datasource:
druid: druid:
web-stat-filter: web-stat-filter:
enabled: true enabled: true
stat-view-servlet: stat-view-servlet:
enabled: true enabled: true
url-pattern: /druid/* url-pattern: /druid/*
login-username: ${DRUID_USERNAME:admin} login-username: ${DRUID_USERNAME:admin}
login-password: ${DRUID_PASSWORD:admin} login-password: ${DRUID_PASSWORD:admin}
filter: filter:
stat: stat:
enabled: true enabled: true
log-slow-sql: true log-slow-sql: true
slow-sql-millis: 100 slow-sql-millis: 100
merge-sql: true merge-sql: true
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
dynamic: dynamic:
druid: druid:
initial-size: 5 initial-size: 5
min-idle: 10 min-idle: 10
max-active: 20 max-active: 20
max-wait: 60000 max-wait: 60000
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 600000 min-evictable-idle-time-millis: 600000
max-evictable-idle-time-millis: 1800000 max-evictable-idle-time-millis: 1800000
validation-query: SELECT 1 FROM DUAL validation-query: SELECT 1 FROM DUAL
test-while-idle: true test-while-idle: true
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
pool-prepared-statements: true pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20 max-pool-prepared-statement-per-connection-size: 20
primary: master primary: master
datasource: datasource:
master: master:
url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:aiot_platform}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true url: jdbc:mysql://${MYSQL_HOST:172.17.16.8}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:aiot-platform-test}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: ${MYSQL_USER:root} username: ${MYSQL_USER:root}
password: ${MYSQL_PASSWORD:} password: ${MYSQL_PASSWORD:}
slave: slave:
lazy: true lazy: true
url: jdbc:mysql://${MYSQL_SLAVE_HOST:${MYSQL_HOST:127.0.0.1}}:${MYSQL_SLAVE_PORT:${MYSQL_PORT:3306}}/${MYSQL_DATABASE:aiot_platform}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true url: jdbc:mysql://${MYSQL_SLAVE_HOST:${MYSQL_HOST:172.17.16.8}}:${MYSQL_SLAVE_PORT:${MYSQL_PORT:3306}}/${MYSQL_DATABASE:aiot-platform-test}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: ${MYSQL_SLAVE_USER:${MYSQL_USER:root}} username: ${MYSQL_SLAVE_USER:${MYSQL_USER:root}}
password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}} password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}}
data: data:
redis: redis:
host: ${REDIS_HOST:127.0.0.1} host: ${REDIS_HOST:172.17.16.13}
port: ${REDIS_PORT:6379} port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0} database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:} password: ${REDIS_PASSWORD:}
timeout: 5000ms timeout: 5000ms
lettuce: lettuce:
pool: pool:
max-active: 8 max-active: 8
max-wait: -1ms max-wait: -1ms
max-idle: 8 max-idle: 8
min-idle: 0 min-idle: 0
--- #################### MQ 消息队列相关配置 #################### --- #################### MQ 消息队列相关配置 ####################
rocketmq: rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:127.0.0.1:9876} name-server: ${ROCKETMQ_NAMESRV_ADDR:rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080}
spring: spring:
rabbitmq: rabbitmq:
host: ${RABBITMQ_HOST:127.0.0.1} host: ${RABBITMQ_HOST:127.0.0.1}
port: ${RABBITMQ_PORT:5672} port: ${RABBITMQ_PORT:5672}
username: ${RABBITMQ_USERNAME:guest} username: ${RABBITMQ_USERNAME:guest}
password: ${RABBITMQ_PASSWORD:guest} password: ${RABBITMQ_PASSWORD:guest}
kafka: kafka:
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092} bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092}
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################
xxl: xxl:
job: job:
admin: admin:
addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.14:19090/xxl-job-admin} addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.14:19090/xxl-job-admin}
--- #################### 服务保障相关配置 #################### --- #################### 服务保障相关配置 ####################
lock4j: lock4j:
acquire-timeout: 3000 acquire-timeout: 3000
expire: 30000 expire: 30000
--- #################### 监控相关配置 #################### --- #################### 监控相关配置 ####################
management: management:
endpoints: endpoints:
web: web:
base-path: /actuator base-path: /actuator
exposure: exposure:
include: '*' include: '*'
spring: spring:
boot: boot:
admin: admin:
client: client:
instance: instance:
service-host-type: IP service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin} username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin} password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
context-path: /admin # 配置 Spring context-path: /admin # 配置 Spring
logging: logging:
level: level:
root: INFO root: INFO
com.viewsh: ${LOG_LEVEL:INFO} com.viewsh: ${LOG_LEVEL:INFO}
com.viewsh.module.infra.dal.mysql: debug com.viewsh.module.infra.dal.mysql: debug
com.viewsh.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO com.viewsh.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO
com.viewsh.module.infra.dal.mysql.file.FileConfigMapper: INFO com.viewsh.module.infra.dal.mysql.file.FileConfigMapper: INFO
org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR
file: file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################
viewsh: viewsh:
demo: false demo: false
env: env:
tag: ${HOSTNAME:prod} tag: ${HOSTNAME:prod}
captcha: captcha:
enable: true enable: true
security: security:
mock-enable: false mock-enable: false
--- #################### Quartz 优雅关闭配置 #################### --- #################### Quartz 优雅关闭配置 ####################
spring: spring:
quartz: quartz:
properties: properties:
org: org:
quartz: quartz:
scheduler: scheduler:
makeSchedulerThreadDaemon: true makeSchedulerThreadDaemon: true
shutdownHook: clean_shutdown shutdownHook: clean_shutdown
threadPool: threadPool:
threadNamePrefix: QuartzSchedulerThread threadNamePrefix: QuartzSchedulerThread
threadsInheritContextClassLoaderOfInitializingThread: true threadsInheritContextClassLoaderOfInitializingThread: true
plugin: plugin:
shutdownhook: shutdownhook:
class: org.quartz.plugins.management.ShutdownHookPlugin class: org.quartz.plugins.management.ShutdownHookPlugin
cleanShutdown: true cleanShutdown: true

View File

@@ -9,7 +9,7 @@ spring:
# Redis 配置 # Redis 配置
data: data:
redis: redis:
host: ${REDIS_HOST:127.0.0.1} host: ${REDIS_HOST:172.17.16.13}
port: ${REDIS_PORT:6379} port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0} database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:} password: ${REDIS_PASSWORD:}
@@ -19,7 +19,7 @@ spring:
# rocketmq 配置项,对应 RocketMQProperties 配置类 # rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq: rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:127.0.0.1:9876} name-server: ${ROCKETMQ_NAMESRV_ADDR:rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080}
# Producer 配置项 # Producer 配置项
producer: producer:
group: ${spring.application.name}_PRODUCER group: ${spring.application.name}_PRODUCER

View File

@@ -1,156 +1,156 @@
--- #################### 注册中心 + 配置中心相关配置 #################### --- #################### 注册中心 + 配置中心相关配置 ####################
spring: spring:
cloud: cloud:
nacos: nacos:
server-addr: ${NACOS_ADDR:127.0.0.1:8848} server-addr: ${NACOS_ADDR:127.0.0.1:8848}
username: ${NACOS_USERNAME:nacos} username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos} password: ${NACOS_PASSWORD:nacos}
discovery: discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:prod} namespace: ${NACOS_DISCOVERY_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
metadata: metadata:
version: 1.0.0 version: 1.0.0
config: config:
namespace: ${NACOS_CONFIG_NAMESPACE:prod} namespace: ${NACOS_CONFIG_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
file-extension: yaml file-extension: yaml
refresh-enabled: true refresh-enabled: true
--- #################### 数据库相关配置 #################### --- #################### 数据库相关配置 ####################
spring: spring:
datasource: datasource:
druid: druid:
web-stat-filter: web-stat-filter:
enabled: true enabled: true
stat-view-servlet: stat-view-servlet:
enabled: true enabled: true
url-pattern: /druid/* url-pattern: /druid/*
login-username: ${DRUID_USERNAME:admin} login-username: ${DRUID_USERNAME:admin}
login-password: ${DRUID_PASSWORD:admin} login-password: ${DRUID_PASSWORD:admin}
filter: filter:
stat: stat:
enabled: true enabled: true
log-slow-sql: true log-slow-sql: true
slow-sql-millis: 100 slow-sql-millis: 100
merge-sql: true merge-sql: true
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
dynamic: dynamic:
druid: druid:
initial-size: 5 initial-size: 5
min-idle: 10 min-idle: 10
max-active: 20 max-active: 20
max-wait: 60000 max-wait: 60000
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 600000 min-evictable-idle-time-millis: 600000
max-evictable-idle-time-millis: 1800000 max-evictable-idle-time-millis: 1800000
validation-query: SELECT 1 FROM DUAL validation-query: SELECT 1 FROM DUAL
test-while-idle: true test-while-idle: true
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
pool-prepared-statements: true pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20 max-pool-prepared-statement-per-connection-size: 20
primary: master primary: master
datasource: datasource:
master: master:
url: jdbc:mysql://${MYSQL_HOST:127.0.0.1}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:aiot_platform}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true url: jdbc:mysql://${MYSQL_HOST:172.17.16.8}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:aiot-platform-test}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: ${MYSQL_USER:root} username: ${MYSQL_USER:root}
password: ${MYSQL_PASSWORD:} password: ${MYSQL_PASSWORD:}
slave: slave:
lazy: true lazy: true
url: jdbc:mysql://${MYSQL_SLAVE_HOST:${MYSQL_HOST:127.0.0.1}}:${MYSQL_SLAVE_PORT:${MYSQL_PORT:3306}}/${MYSQL_DATABASE:aiot_platform}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true url: jdbc:mysql://${MYSQL_SLAVE_HOST:${MYSQL_HOST:172.17.16.8}}:${MYSQL_SLAVE_PORT:${MYSQL_PORT:3306}}/${MYSQL_DATABASE:aiot-platform-test}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: ${MYSQL_SLAVE_USER:${MYSQL_USER:root}} username: ${MYSQL_SLAVE_USER:${MYSQL_USER:root}}
password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}} password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}}
tdengine: tdengine:
url: jdbc:TAOS-RS://${TDENGINE_HOST:172.17.16.14}:${TDENGINE_PORT:6041}/aiot_platform url: jdbc:TAOS-RS://${TDENGINE_HOST:172.17.16.14}:${TDENGINE_PORT:6041}/aiot_platform
driver-class-name: com.taosdata.jdbc.rs.RestfulDriver driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
username: ${TDENGINE_USERNAME:root} username: ${TDENGINE_USERNAME:root}
password: ${TDENGINE_PASSWORD:taosdata} password: ${TDENGINE_PASSWORD:taosdata}
druid: druid:
validation-query: SELECT SERVER_STATUS() validation-query: SELECT SERVER_STATUS()
data: data:
redis: redis:
host: ${REDIS_HOST:127.0.0.1} host: ${REDIS_HOST:172.17.16.13}
port: ${REDIS_PORT:6379} port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0} database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:} password: ${REDIS_PASSWORD:}
timeout: 5000ms timeout: 5000ms
lettuce: lettuce:
pool: pool:
max-active: 8 max-active: 8
max-wait: -1ms max-wait: -1ms
max-idle: 8 max-idle: 8
min-idle: 0 min-idle: 0
--- #################### MQ 消息队列相关配置 #################### --- #################### MQ 消息队列相关配置 ####################
rocketmq: rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:127.0.0.1:9876} name-server: ${ROCKETMQ_NAMESRV_ADDR:rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080}
spring: spring:
# 禁用 RabbitMQ 自动配置(如果不需要 RabbitMQ避免启动时连接失败 # 禁用 RabbitMQ 自动配置(如果不需要 RabbitMQ避免启动时连接失败
autoconfigure: autoconfigure:
exclude: exclude:
- org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration - org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
# RabbitMQ 配置(已禁用自动配置,仅保留配置项供业务代码使用) # RabbitMQ 配置(已禁用自动配置,仅保留配置项供业务代码使用)
# rabbitmq: # rabbitmq:
# host: ${RABBITMQ_HOST:127.0.0.1} # host: ${RABBITMQ_HOST:127.0.0.1}
# port: ${RABBITMQ_PORT:5672} # port: ${RABBITMQ_PORT:5672}
# username: ${RABBITMQ_USERNAME:guest} # username: ${RABBITMQ_USERNAME:guest}
# password: ${RABBITMQ_PASSWORD:guest} # password: ${RABBITMQ_PASSWORD:guest}
kafka: kafka:
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092} bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092}
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################
xxl: xxl:
job: job:
admin: admin:
addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.14:19090/xxl-job-admin} addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.14:19090/xxl-job-admin}
--- #################### 服务保障相关配置 #################### --- #################### 服务保障相关配置 ####################
lock4j: lock4j:
acquire-timeout: 3000 acquire-timeout: 3000
expire: 30000 expire: 30000
--- #################### 监控相关配置 #################### --- #################### 监控相关配置 ####################
management: management:
endpoints: endpoints:
web: web:
base-path: /actuator base-path: /actuator
exposure: exposure:
include: '*' include: '*'
spring: spring:
boot: boot:
admin: admin:
client: client:
instance: instance:
service-host-type: IP service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin} username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin} password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
logging: logging:
level: level:
root: INFO root: INFO
com.viewsh: ${LOG_LEVEL:INFO} com.viewsh: ${LOG_LEVEL:INFO}
com.viewsh.module.iot.dal.mysql: debug com.viewsh.module.iot.dal.mysql: debug
com.viewsh.module.iot.dal.mysql.sms.SmsChannelMapper: INFO com.viewsh.module.iot.dal.mysql.sms.SmsChannelMapper: INFO
org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR
file: file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################
viewsh: viewsh:
demo: false demo: false
env: env:
tag: ${HOSTNAME:prod} tag: ${HOSTNAME:prod}
captcha: captcha:
enable: true enable: true
security: security:
mock-enable: false mock-enable: false

View File

@@ -59,27 +59,27 @@ spring:
primary: master primary: master
datasource: datasource:
master: master:
url: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL} url: jdbc:mysql://${MYSQL_HOST:172.17.16.8}:${MYSQL_PORT:3306}/${MYSQL_DATABASE:aiot-platform-test}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME} username: ${MYSQL_USER:root}
password: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD} password: ${MYSQL_PASSWORD:}
slave: # 模拟从库,可根据自己需要修改 slave: # 模拟从库,可根据自己需要修改
lazy: true # 开启懒加载,保证启动速度 lazy: true # 开启懒加载,保证启动速度
url: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_URL:${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_URL}} url: jdbc:mysql://${MYSQL_SLAVE_HOST:${MYSQL_HOST:172.17.16.8}}:${MYSQL_SLAVE_PORT:${MYSQL_PORT:3306}}/${MYSQL_DATABASE:aiot-platform-test}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_USERNAME:${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_USERNAME}} username: ${MYSQL_SLAVE_USER:${MYSQL_USER:root}}
password: ${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_SLAVE_PASSWORD:${SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_PASSWORD}} password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}}
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data: data:
redis: redis:
host: ${SPRING_DATA_REDIS_HOST:127.0.0.1} # 地址 host: ${REDIS_HOST:172.17.16.13} # 地址
port: ${SPRING_DATA_REDIS_PORT:6379} # 端口 port: ${REDIS_PORT:6379} # 端口
database: ${SPRING_DATA_REDIS_DATABASE:0} # 数据库索引 database: ${REDIS_DATABASE:0} # 数据库索引
password: ${SPRING_DATA_REDIS_PASSWORD} # 密码 password: ${REDIS_PASSWORD:} # 密码
--- #################### MQ 消息队列相关配置 #################### --- #################### MQ 消息队列相关配置 ####################
# rocketmq 配置项,对应 RocketMQProperties 配置类 # rocketmq 配置项,对应 RocketMQProperties 配置类
rocketmq: rocketmq:
name-server: ${ROCKETMQ_NAME_SERVER:127.0.0.1:9876} # RocketMQ Namesrv name-server: ${ROCKETMQ_NAME_SERVER:rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080} # RocketMQ Namesrv
spring: spring:
# RabbitMQ 配置项,对应 RabbitProperties 配置类 # RabbitMQ 配置项,对应 RabbitProperties 配置类

View File

@@ -1,206 +1,206 @@
--- #################### 注册中心 + 配置中心相关配置 #################### --- #################### 注册中心 + 配置中心相关配置 ####################
spring: spring:
cloud: cloud:
nacos: nacos:
server-addr: ${NACOS_ADDR:127.0.0.1:8848} server-addr: ${NACOS_ADDR:127.0.0.1:8848}
username: ${NACOS_USERNAME:nacos} username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos} password: ${NACOS_PASSWORD:nacos}
discovery: discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:prod} namespace: ${NACOS_DISCOVERY_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
metadata: metadata:
version: 1.0.0 version: 1.0.0
config: config:
namespace: ${NACOS_CONFIG_NAMESPACE:prod} namespace: ${NACOS_CONFIG_NAMESPACE:prod}
group: DEFAULT_GROUP group: DEFAULT_GROUP
file-extension: yaml file-extension: yaml
refresh-enabled: true refresh-enabled: true
--- #################### 数据库相关配置 #################### --- #################### 数据库相关配置 ####################
spring: spring:
datasource: datasource:
druid: # Druid 【监控】相关的全局配置 druid: # Druid 【监控】相关的全局配置
web-stat-filter: web-stat-filter:
enabled: true enabled: true
stat-view-servlet: stat-view-servlet:
enabled: true enabled: true
allow: # 设置白名单,不填则允许所有访问 allow: # 设置白名单,不填则允许所有访问
url-pattern: /druid/* url-pattern: /druid/*
login-username: ${DRUID_USERNAME:admin} login-username: ${DRUID_USERNAME:admin}
login-password: ${DRUID_PASSWORD:admin} login-password: ${DRUID_PASSWORD:admin}
filter: filter:
stat: stat:
enabled: true enabled: true
log-slow-sql: true # 慢 SQL 记录 log-slow-sql: true # 慢 SQL 记录
slow-sql-millis: 100 slow-sql-millis: 100
merge-sql: true merge-sql: true
wall: wall:
config: config:
multi-statement-allow: true multi-statement-allow: true
dynamic: # 多数据源配置 dynamic: # 多数据源配置
druid: # Druid 【连接池】相关的全局配置 druid: # Druid 【连接池】相关的全局配置
initial-size: 5 initial-size: 5
min-idle: 10 min-idle: 10
max-active: 20 max-active: 20
max-wait: 60000 max-wait: 60000
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 600000 min-evictable-idle-time-millis: 600000
max-evictable-idle-time-millis: 1800000 max-evictable-idle-time-millis: 1800000
validation-query: SELECT 1 FROM DUAL validation-query: SELECT 1 FROM DUAL
test-while-idle: true test-while-idle: true
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
pool-prepared-statements: true pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20 max-pool-prepared-statement-per-connection-size: 20
primary: master primary: master
datasource: datasource:
master: master:
url: jdbc:mysql://127.0.0.1:3306/aiot_platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true url: jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root username: root
password: root password: root
slave: # 从库配置(可选) slave: # 从库配置(可选)
lazy: true lazy: true
url: jdbc:mysql://127.0.0.1:3306/aiot_platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true url: jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root username: root
password: root password: root
# Redis 配置 # Redis 配置
data: data:
redis: redis:
host: 127.0.0.1 host: 172.17.16.13
port: 6379 port: 6379
database: 0 database: 0
password: "" password: ""
timeout: 5000ms timeout: 5000ms
lettuce: lettuce:
pool: pool:
max-active: 8 max-active: 8
max-wait: -1ms max-wait: -1ms
max-idle: 8 max-idle: 8
min-idle: 0 min-idle: 0
--- #################### MQ 消息队列相关配置 #################### --- #################### MQ 消息队列相关配置 ####################
# rocketmq 配置项 # rocketmq 配置项
rocketmq: rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:127.0.0.1:9876} name-server: ${ROCKETMQ_NAMESRV_ADDR:rmq-4wd73bxpv.rocketmq.sh.qcloud.tencenttdmq.com:8080}
spring: spring:
# RabbitMQ 配置项(可选) # RabbitMQ 配置项(可选)
rabbitmq: rabbitmq:
host: ${RABBITMQ_HOST:127.0.0.1} host: ${RABBITMQ_HOST:127.0.0.1}
port: ${RABBITMQ_PORT:5672} port: ${RABBITMQ_PORT:5672}
username: ${RABBITMQ_USERNAME:guest} username: ${RABBITMQ_USERNAME:guest}
password: ${RABBITMQ_PASSWORD:guest} password: ${RABBITMQ_PASSWORD:guest}
# Kafka 配置项(可选) # Kafka 配置项(可选)
kafka: kafka:
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092} bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092}
--- #################### 定时任务相关配置 #################### --- #################### 定时任务相关配置 ####################
xxl: xxl:
job: job:
admin: admin:
addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.14:19090/xxl-job-admin} addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.14:19090/xxl-job-admin}
--- #################### 服务保障相关配置 #################### --- #################### 服务保障相关配置 ####################
# Lock4j 配置项 # Lock4j 配置项
lock4j: lock4j:
acquire-timeout: 3000 acquire-timeout: 3000
expire: 30000 expire: 30000
--- #################### 监控相关配置 #################### --- #################### 监控相关配置 ####################
# Actuator 监控端点的配置项 # Actuator 监控端点的配置项
management: management:
endpoints: endpoints:
web: web:
base-path: /actuator base-path: /actuator
exposure: exposure:
include: '*' include: '*'
# Spring Boot Admin 配置项 # Spring Boot Admin 配置项
spring: spring:
boot: boot:
admin: admin:
client: client:
instance: instance:
service-host-type: IP service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin} username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin} password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
# 日志文件配置 # 日志文件配置
logging: logging:
level: level:
root: INFO root: INFO
com.viewsh: ${LOG_LEVEL:INFO} com.viewsh: ${LOG_LEVEL:INFO}
file: file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 微信公众号、小程序相关配置 #################### --- #################### 微信公众号、小程序相关配置 ####################
wx: wx:
mp: # 公众号配置(必填) mp: # 公众号配置(必填)
app-id: ${WX_MP_APP_ID:wx5b23ba7a5589ecbb} # 优先环境变量,兜底默认值 app-id: ${WX_MP_APP_ID:wx5b23ba7a5589ecbb} # 优先环境变量,兜底默认值
secret: ${WX_MP_SECRET:2a7b3b20c537e52e74afd395eb85f61f} secret: ${WX_MP_SECRET:2a7b3b20c537e52e74afd395eb85f61f}
config-storage: config-storage:
type: RedisTemplate type: RedisTemplate
key-prefix: wx key-prefix: wx
http-client-type: HttpClient http-client-type: HttpClient
miniapp: # 小程序配置(必填) miniapp: # 小程序配置(必填)
appid: ${WX_MINIAPP_APPID:wxc4598c446f8a9cb3} appid: ${WX_MINIAPP_APPID:wxc4598c446f8a9cb3}
secret: ${WX_MINIAPP_SECRET:4a1a04e07f6a4a0751b39c3064a92c8b} secret: ${WX_MINIAPP_SECRET:4a1a04e07f6a4a0751b39c3064a92c8b}
config-storage: config-storage:
type: RedisTemplate type: RedisTemplate
key-prefix: wa key-prefix: wa
http-client-type: HttpClient http-client-type: HttpClient
--- #################### 芋道相关配置 #################### --- #################### 芋道相关配置 ####################
viewsh: viewsh:
demo: false # 生产环境关闭演示模式 demo: false # 生产环境关闭演示模式
env: env:
tag: ${HOSTNAME:prod} tag: ${HOSTNAME:prod}
captcha: captcha:
enable: true # 生产环境开启验证码 enable: true # 生产环境开启验证码
security: security:
mock-enable: false # 生产环境关闭 mock mock-enable: false # 生产环境关闭 mock
access-log: access-log:
enable: true enable: true
wxa-code: wxa-code:
env-version: release env-version: release
wxa-subscribe-message: wxa-subscribe-message:
miniprogram-state: formal miniprogram-state: formal
justauth: justauth:
enabled: true enabled: true
type: type:
DINGTALK: # 钉钉 DINGTALK: # 钉钉
client-id: dingvrnreaje3yqvzhxg client-id: dingvrnreaje3yqvzhxg
client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
ignore-check-redirect-uri: true ignore-check-redirect-uri: true
WECHAT_ENTERPRISE: # 企业微信 WECHAT_ENTERPRISE: # 企业微信
client-id: wwd411c69a39ad2e54 client-id: wwd411c69a39ad2e54
client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
agent-id: 1000004 agent-id: 1000004
ignore-check-redirect-uri: true ignore-check-redirect-uri: true
# noinspection SpringBootApplicationYaml # noinspection SpringBootApplicationYaml
WECHAT_MINI_PROGRAM: # 微信小程序 WECHAT_MINI_PROGRAM: # 微信小程序
client-id: ${wx.miniapp.appid} client-id: ${wx.miniapp.appid}
client-secret: ${wx.miniapp.secret} client-secret: ${wx.miniapp.secret}
ignore-check-redirect-uri: true ignore-check-redirect-uri: true
ignore-check-state: true # 微信小程序,不会使用到 state所以不进行校验 ignore-check-state: true # 微信小程序,不会使用到 state所以不进行校验
WECHAT_MP: # 微信公众号 WECHAT_MP: # 微信公众号
client-id: ${wx.mp.app-id} client-id: ${wx.mp.app-id}
client-secret: ${wx.mp.secret} client-secret: ${wx.mp.secret}
ignore-check-redirect-uri: true ignore-check-redirect-uri: true
ALIPAY: # 支付宝小程序 ALIPAY: # 支付宝小程序
client-id: xx client-id: xx
client-secret: xx client-secret: xx
alipay-public-key: xx alipay-public-key: xx
ignore-check-redirect-uri: true ignore-check-redirect-uri: true
ignore-check-state: true ignore-check-state: true
cache: cache:
type: REDIS type: REDIS
prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE:: prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟 timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟