build(ci): add stage deployment pipeline and configs

This commit is contained in:
lzh
2026-03-30 22:53:46 +08:00
parent 19cb25b0ea
commit 90fa54dc11
8 changed files with 978 additions and 10 deletions

50
Jenkinsfile vendored
View File

@@ -30,6 +30,11 @@ pipeline {
// 部署配置Prod 服务器内网地址)
DEPLOY_HOST = '172.17.16.14'
DEPLOY_PATH = '/opt/aiot-platform-cloud'
PROD_DEPLOY_HOST = '172.17.16.14'
PROD_DEPLOY_PATH = '/opt/aiot-platform-cloud'
STAGE_BRANCH = 'stage/multi-tenant-isolation'
STAGE_DEPLOY_HOST = '172.17.16.7'
STAGE_DEPLOY_PATH = '/opt/aiot-platform-cloud-stage'
SSH_KEY = '/var/jenkins_home/.ssh/id_rsa'
// 性能配置 - 将动态调整
@@ -61,6 +66,23 @@ pipeline {
echo "Build: #${env.BUILD_NUMBER}"
echo "Workspace: ${env.WORKSPACE}"
echo "Start Time: ${new Date()}"
if (env.BRANCH_NAME == 'master') {
env.DEPLOY_ENV = 'prod'
env.DEPLOY_HOST = env.PROD_DEPLOY_HOST
env.DEPLOY_PATH = env.PROD_DEPLOY_PATH
env.DEPLOY_COMPOSE_ARGS = '-f docker-compose.core.yml'
} else if (env.BRANCH_NAME == env.STAGE_BRANCH) {
env.DEPLOY_ENV = 'stage'
env.DEPLOY_HOST = env.STAGE_DEPLOY_HOST
env.DEPLOY_PATH = env.STAGE_DEPLOY_PATH
env.DEPLOY_COMPOSE_ARGS = '-f docker-compose.core.yml -f docker-compose.stage.override.yml'
} else {
env.DEPLOY_ENV = 'build-only'
env.DEPLOY_COMPOSE_ARGS = '-f docker-compose.core.yml'
}
echo "Deploy Env: ${env.DEPLOY_ENV}"
echo "Deploy Host: ${env.DEPLOY_HOST ?: 'N/A'}"
echo "Deploy Path: ${env.DEPLOY_PATH ?: 'N/A'}"
echo "=========================================="
// 【优化2】动态检测系统资源
@@ -261,7 +283,7 @@ pipeline {
when {
allOf {
expression { env.SERVICES_TO_BUILD != '' }
branch 'master'
expression { env.BRANCH_NAME == 'master' || env.BRANCH_NAME == env.STAGE_BRANCH }
}
}
steps {
@@ -281,9 +303,12 @@ pipeline {
backupCurrentDeployment(sortedServices)
}
// 【新增】同步最新的 docker-compose.core.yml 到部署服务器
echo "📂 Syncing docker-compose.core.yml to deploy host..."
// 【新增】同步最新的 compose 文件到部署服务器
echo "📂 Syncing compose files to deploy host..."
sh "scp -o StrictHostKeyChecking=no -i ${env.SSH_KEY} docker-compose.core.yml root@${env.DEPLOY_HOST}:${env.DEPLOY_PATH}/"
if (env.DEPLOY_ENV == 'stage') {
sh "scp -o StrictHostKeyChecking=no -i ${env.SSH_KEY} docker-compose.stage.override.yml root@${env.DEPLOY_HOST}:${env.DEPLOY_PATH}/"
}
try {
// 串行部署(保证依赖关系)
@@ -312,7 +337,7 @@ pipeline {
when {
allOf {
expression { env.SERVICES_TO_BUILD != '' }
branch 'master'
expression { env.BRANCH_NAME == 'master' || env.BRANCH_NAME == env.STAGE_BRANCH }
}
}
steps {
@@ -652,7 +677,7 @@ def getPreviousImageTag() {
script: """
ssh ${sshOpts} root@${env.DEPLOY_HOST} '
cd ${env.DEPLOY_PATH}
docker compose -f docker-compose.core.yml images --format json | \
docker compose ${env.DEPLOY_COMPOSE_ARGS} images --format json | \
jq -r ".[0].Tag" | head -1
' 2>/dev/null || echo "latest"
""",
@@ -676,12 +701,16 @@ def backupCurrentDeployment(def services) {
sh """
ssh ${sshOpts} root@${env.DEPLOY_HOST} '
cd ${env.DEPLOY_PATH}
export IMAGE_TAG=${env.IMAGE_TAG}
# 保存当前 docker-compose 配置
cp docker-compose.core.yml docker-compose.core.yml.backup-${env.BUILD_NUMBER}
if [ -f docker-compose.stage.override.yml ]; then
cp docker-compose.stage.override.yml docker-compose.stage.override.yml.backup-${env.BUILD_NUMBER}
fi
# 记录当前运行的镜像
docker compose -f docker-compose.core.yml images > deployment-state-${env.BUILD_NUMBER}.txt
docker compose ${env.DEPLOY_COMPOSE_ARGS} images > deployment-state-${env.BUILD_NUMBER}.txt
echo "✅ Backup completed: deployment-state-${env.BUILD_NUMBER}.txt"
'
@@ -718,10 +747,10 @@ def rollbackDeployment(def services) {
export IMAGE_TAG=${env.PREVIOUS_IMAGE_TAG}
# 拉取旧版本镜像
docker compose -f docker-compose.core.yml pull ${service}
docker compose ${env.DEPLOY_COMPOSE_ARGS} pull ${service}
# 重启服务
docker compose -f docker-compose.core.yml up -d ${service}
docker compose ${env.DEPLOY_COMPOSE_ARGS} up -d ${service}
echo "✅ ${service} rolled back to ${env.PREVIOUS_IMAGE_TAG}"
'
@@ -851,11 +880,12 @@ def deployService(String service) {
set -e
cd ${env.DEPLOY_PATH}
export IMAGE_TAG=${env.IMAGE_TAG}
echo "📥 Pulling ${service}..."
docker compose -f docker-compose.core.yml pull ${service}
docker compose ${env.DEPLOY_COMPOSE_ARGS} pull ${service}
echo "🔄 Restarting ${service}..."
docker compose -f docker-compose.core.yml up -d ${service}
docker compose ${env.DEPLOY_COMPOSE_ARGS} up -d ${service}
echo "⏳ Waiting for container to start..."
sleep 5

View File

@@ -0,0 +1,46 @@
version: '3.8'
services:
viewsh-gateway:
environment:
SPRING_PROFILES_ACTIVE: stage
viewsh-module-system-server:
environment:
SPRING_PROFILES_ACTIVE: stage
MYSQL_HOST: 172.17.16.7
MYSQL_PORT: 3306
MYSQL_DATABASE: aiot-platform
MYSQL_USER: root
MYSQL_PASSWORD: "65p^VTPi9Qd+"
viewsh-module-infra-server:
environment:
SPRING_PROFILES_ACTIVE: stage
MYSQL_HOST: 172.17.16.7
MYSQL_PORT: 3306
MYSQL_DATABASE: aiot-platform
MYSQL_USER: root
MYSQL_PASSWORD: "65p^VTPi9Qd+"
viewsh-module-iot-server:
environment:
SPRING_PROFILES_ACTIVE: stage
MYSQL_HOST: 172.17.16.7
MYSQL_PORT: 3306
MYSQL_DATABASE: aiot-platform
MYSQL_USER: root
MYSQL_PASSWORD: "65p^VTPi9Qd+"
viewsh-module-iot-gateway:
environment:
SPRING_PROFILES_ACTIVE: stage
viewsh-module-ops-server:
environment:
SPRING_PROFILES_ACTIVE: stage
MYSQL_HOST: 172.17.16.7
MYSQL_PORT: 3306
MYSQL_DATABASE: aiot-platform
MYSQL_USER: root
MYSQL_PASSWORD: "65p^VTPi9Qd+"

View File

@@ -0,0 +1,75 @@
--- #################### 娉ㄥ唽涓績 + 閰嶇疆涓績鐩稿叧閰嶇疆 ####################
spring:
cloud:
nacos:
server-addr: ${NACOS_ADDR:172.17.16.7:8848}
username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos}
discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:stage}
group: DEFAULT_GROUP
metadata:
version: 1.0.0
config:
namespace: ${NACOS_CONFIG_NAMESPACE:stage}
group: DEFAULT_GROUP
file-extension: yaml
refresh-enabled: true
--- #################### Redis 閰嶇疆 ####################
spring:
data:
redis:
host: 172.17.16.7
port: 6379
database: 0
password: ""
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
--- #################### 鏈嶅姟淇濋殰鐩稿叧閰嶇疆 ####################
lock4j:
acquire-timeout: 3000
expire: 30000
--- #################### 鐩戞帶鐩稿叧閰嶇疆 ####################
management:
endpoints:
web:
base-path: /actuator
exposure:
include: '*'
spring:
boot:
admin:
client:
instance:
service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
logging:
level:
root: INFO
com.viewsh: ${LOG_LEVEL:INFO}
org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR
file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 鑺嬮亾鐩稿叧閰嶇疆 ####################
viewsh:
demo: false
env:
tag: ${HOSTNAME:stage}
security:
mock-enable: false

View File

@@ -0,0 +1,170 @@
--- #################### 娉ㄥ唽涓績 + 閰嶇疆涓績鐩稿叧閰嶇疆 ####################
spring:
cloud:
nacos:
server-addr: ${NACOS_ADDR:172.17.16.7:8848}
username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos}
discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:stage}
group: DEFAULT_GROUP
metadata:
version: 1.0.0
config:
namespace: ${NACOS_CONFIG_NAMESPACE:stage}
group: DEFAULT_GROUP
file-extension: yaml
refresh-enabled: true
lifecycle:
timeout-per-shutdown-phase: 30s # 澧炲姞浼橀泤鍏抽棴瓒呮椂鏃堕棿
--- #################### 鏁版嵁搴撶浉鍏抽厤缃?####################
spring:
datasource:
druid:
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: ${DRUID_USERNAME:admin}
login-password: ${DRUID_PASSWORD:admin}
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 100
merge-sql: true
wall:
config:
multi-statement-allow: true
dynamic:
druid:
initial-size: 5
min-idle: 10
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 600000
max-evictable-idle-time-millis: 1800000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
primary: master
datasource:
master:
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}
password: ${MYSQL_PASSWORD:}
slave:
lazy: 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}}
password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}}
data:
redis:
host: ${REDIS_HOST:172.17.16.7}
port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:}
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
--- #################### MQ 娑堟伅闃熷垪鐩稿叧閰嶇疆 ####################
rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:124.222.218.198:9876}
spring:
rabbitmq:
host: ${RABBITMQ_HOST:127.0.0.1}
port: ${RABBITMQ_PORT:5672}
username: ${RABBITMQ_USERNAME:guest}
password: ${RABBITMQ_PASSWORD:guest}
kafka:
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092}
--- #################### 瀹氭椂浠诲姟鐩稿叧閰嶇疆 ####################
xxl:
job:
enabled: false
admin:
addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.7:19090/xxl-job-admin}
executor:
ip: ${XXL_JOB_EXECUTOR_IP:}
port: ${XXL_JOB_EXECUTOR_PORT:9999}
--- #################### 鏈嶅姟淇濋殰鐩稿叧閰嶇疆 ####################
lock4j:
acquire-timeout: 3000
expire: 30000
--- #################### 鐩戞帶鐩稿叧閰嶇疆 ####################
management:
endpoints:
web:
base-path: /actuator
exposure:
include: '*'
spring:
boot:
admin:
client:
instance:
service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
context-path: /admin # 閰嶇疆 Spring
logging:
level:
root: INFO
com.viewsh: ${LOG_LEVEL:INFO}
com.viewsh.module.infra.dal.mysql: debug
com.viewsh.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO
com.viewsh.module.infra.dal.mysql.file.FileConfigMapper: INFO
org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR
file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 鑺嬮亾鐩稿叧閰嶇疆 ####################
viewsh:
demo: false
env:
tag: ${HOSTNAME:stage}
captcha:
enable: true
security:
mock-enable: false
--- #################### Quartz 浼橀泤鍏抽棴閰嶇疆 ####################
spring:
quartz:
properties:
org:
quartz:
scheduler:
makeSchedulerThreadDaemon: true
shutdownHook: clean_shutdown
threadPool:
threadNamePrefix: QuartzSchedulerThread
threadsInheritContextClassLoaderOfInitializingThread: true
plugin:
shutdownhook:
class: org.quartz.plugins.management.ShutdownHookPlugin
cleanShutdown: true

View File

@@ -0,0 +1,128 @@
--- #################### 搴旂敤閰嶇疆 ####################
spring:
application:
name: iot-gateway-server
profiles:
active: stage
# Redis 閰嶇疆
data:
redis:
host: ${REDIS_HOST:172.17.16.7}
port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:}
timeout: ${REDIS_TIMEOUT:30000ms}
--- #################### 娑堟伅闃熷垪鐩稿叧 ####################
# rocketmq 閰嶇疆椤癸紝瀵瑰簲 RocketMQProperties 閰嶇疆绫?rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:124.222.218.198:9876}
producer:
group: ${spring.application.name}_PRODUCER
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
consumer:
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
--- #################### IoT 缃戝叧鐩稿叧閰嶇疆 ####################
viewsh:
iot:
# 娑堟伅鎬荤嚎閰嶇疆
message-bus:
type: ${IOT_MESSAGE_BUS_TYPE:redis}
# 缃戝叧閰嶇疆
gateway:
# 璁惧 RPC 閰嶇疆
rpc:
url: ${VIEWSH_IOT_GATEWAY_RPC_URL:http://aiot-iot-server:48091}
connect-timeout: ${VIEWSH_RPC_CONNECT_TIMEOUT:30s}
read-timeout: ${VIEWSH_RPC_READ_TIMEOUT:30s}
# 璁惧 Token 閰嶇疆
token:
secret: ${VIEWSH_IOT_TOKEN_SECRET:viewshIotGatewayTokenSecret123456789}
expiration: ${VIEWSH_IOT_TOKEN_EXPIRATION:7d}
# 鍗忚閰嶇疆
protocol:
# ====================================
# 閽堝寮曞叆鐨?HTTP 缁勪欢鐨勯厤缃? # ====================================
http:
enabled: ${IOT_HTTP_ENABLED:true}
server-port: ${IOT_HTTP_PORT:8092}
# ====================================
# 閽堝寮曞叆鐨?EMQX 缁勪欢鐨勯厤缃? # ====================================
emqx:
enabled: ${IOT_EMQX_ENABLED:false}
http-port: ${IOT_EMQX_HTTP_PORT:8090}
mqtt-host: ${IOT_EMQX_MQTT_HOST:127.0.0.1}
mqtt-port: ${IOT_EMQX_MQTT_PORT:1883}
mqtt-username: ${IOT_EMQX_MQTT_USERNAME:admin}
mqtt-password: ${IOT_EMQX_MQTT_PASSWORD:public}
mqtt-client-id: ${IOT_EMQX_MQTT_CLIENT_ID:iot-gateway-mqtt}
mqtt-ssl: ${IOT_EMQX_MQTT_SSL:false}
mqtt-topics:
- "/sys/#"
clean-session: true
keep-alive-interval-seconds: 60
max-inflight-queue: 10000
connect-timeout-seconds: 10
# 鏄惁淇′换鎵€鏈?SSL 璇佷功 (榛樿: false)銆傝鍛婏細鐢熶骇鐜蹇呴』涓?false锛? # 浠呭湪寮€鍙戠幆澧冩垨鍐呯綉娴嬭瘯鏃讹紝濡傛灉浣跨敤浜嗚嚜绛惧悕璇佷功锛屽彲浠ヤ复鏃惰缃负 true
trust-all: ${IOT_EMQX_TRUST_ALL:false}
# 閬楀槺娑堟伅閰嶇疆 (鐢ㄤ簬缃戝叧寮傚父涓嬬嚎鏃堕€氱煡鍏朵粬绯荤粺)
will:
enabled: ${IOT_EMQX_WILL_ENABLED:true}
topic: "gateway/status/${viewsh.iot.gateway.emqx.mqtt-client-id}"
payload: "offline"
qos: 1
retain: true
# 楂樼骇 SSL/TLS 閰嶇疆 (褰?trust-all: false 涓?mqtt-ssl: true 鏃剁敓鏁?
ssl-options:
key-store-path: ${IOT_EMQX_SSL_KEYSTORE_PATH:classpath:certs/client.jks}
key-store-password: ${IOT_EMQX_SSL_KEYSTORE_PASSWORD:your-keystore-password}
trust-store-path: ${IOT_EMQX_SSL_TRUSTSTORE_PATH:classpath:certs/trust.jks}
trust-store-password: ${IOT_EMQX_SSL_TRUSTSTORE_PASSWORD:your-truststore-password}
# ====================================
# 閽堝寮曞叆鐨?TCP 缁勪欢鐨勯厤缃? # ====================================
tcp:
enabled: ${IOT_TCP_ENABLED:false}
port: ${IOT_TCP_PORT:8091}
keep-alive-timeout-ms: ${IOT_TCP_KEEPALIVE_TIMEOUT:30000}
max-connections: ${IOT_TCP_MAX_CONNECTIONS:1000}
ssl-enabled: ${IOT_TCP_SSL_ENABLED:false}
ssl-cert-path: ${IOT_TCP_SSL_CERT_PATH:classpath:certs/client.jks}
ssl-key-path: ${IOT_TCP_SSL_KEY_PATH:classpath:certs/client.jks}
# ====================================
# 閽堝寮曞叆鐨?MQTT 缁勪欢鐨勯厤缃? # ====================================
mqtt:
enabled: ${IOT_MQTT_ENABLED:true}
port: ${IOT_MQTT_PORT:1883}
max-message-size: ${IOT_MQTT_MAX_MESSAGE_SIZE:8192}
connect-timeout-seconds: ${IOT_MQTT_CONNECT_TIMEOUT:60}
ssl-enabled: ${IOT_MQTT_SSL_ENABLED:false}
--- #################### 鏃ュ織鐩稿叧閰嶇疆 ####################
# 鍩虹鏃ュ織閰嶇疆
logging:
file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
level:
# 搴旂敤鍩虹鏃ュ織绾у埆
com.viewsh.module.iot.gateway: ${LOG_LEVEL_IOT_GATEWAY:INFO}
org.springframework.boot: INFO
# RocketMQ 鏃ュ織
org.apache.rocketmq: WARN
# MQTT 瀹㈡埛绔棩蹇? # io.vertx.mqtt: DEBUG
# 鐢熶骇鐜鏃ュ織
com.viewsh.module.iot.gateway.protocol.emqx: ${LOG_LEVEL_EMQX:INFO}
com.viewsh.module.iot.gateway.protocol.http: ${LOG_LEVEL_HTTP:INFO}
com.viewsh.module.iot.gateway.protocol.mqtt: ${LOG_LEVEL_MQTT:INFO}
# 鏍规棩蹇楃骇鍒? root: INFO
debug: false

View File

@@ -0,0 +1,167 @@
--- #################### 娉ㄥ唽涓績 + 閰嶇疆涓績鐩稿叧閰嶇疆 ####################
spring:
cloud:
nacos:
server-addr: ${NACOS_ADDR:172.17.16.7:8848}
username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos}
discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:stage}
group: DEFAULT_GROUP
metadata:
version: 1.0.0
config:
namespace: ${NACOS_CONFIG_NAMESPACE:stage}
group: DEFAULT_GROUP
file-extension: yaml
refresh-enabled: true
--- #################### 鏁版嵁搴撶浉鍏抽厤缃?####################
spring:
datasource:
druid:
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: ${DRUID_USERNAME:admin}
login-password: ${DRUID_PASSWORD:admin}
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 100
merge-sql: true
wall:
config:
multi-statement-allow: true
dynamic:
druid:
initial-size: 5
min-idle: 10
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 600000
max-evictable-idle-time-millis: 1800000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
primary: master
datasource:
master:
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}
password: ${MYSQL_PASSWORD:}
slave:
lazy: 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}}
password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}}
tdengine:
url: jdbc:TAOS-RS://${TDENGINE_HOST:172.17.16.7}:${TDENGINE_PORT:6041}/aiot_platform
driver-class-name: com.taosdata.jdbc.rs.RestfulDriver
username: ${TDENGINE_USERNAME:root}
password: ${TDENGINE_PASSWORD:taosdata}
druid:
validation-query: SELECT SERVER_STATUS()
data:
redis:
host: ${REDIS_HOST:172.17.16.7}
port: ${REDIS_PORT:6379}
database: ${REDIS_DATABASE:0}
password: ${REDIS_PASSWORD:}
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
--- #################### MQ 娑堟伅闃熷垪鐩稿叧閰嶇疆 ####################
rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:124.222.218.198:9876}
producer:
group: ${spring.application.name}_PRODUCER
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
consumer:
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
spring:
# 绂佺敤 RabbitMQ 鑷姩閰嶇疆锛堝鏋滀笉闇€瑕?RabbitMQ锛岄伩鍏嶅惎鍔ㄦ椂杩炴帴澶辫触锛?
autoconfigure:
exclude:
- org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration
# RabbitMQ 閰嶇疆锛堝凡绂佺敤鑷姩閰嶇疆锛屼粎淇濈暀閰嶇疆椤逛緵涓氬姟浠g爜浣跨敤锛?
# rabbitmq:
# host: ${RABBITMQ_HOST:127.0.0.1}
# port: ${RABBITMQ_PORT:5672}
# username: ${RABBITMQ_USERNAME:guest}
# password: ${RABBITMQ_PASSWORD:guest}
kafka:
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092}
--- #################### 瀹氭椂浠诲姟鐩稿叧閰嶇疆 ####################
xxl:
job:
enabled: false
admin:
addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.7:19090/xxl-job-admin}
executor:
ip: ${XXL_JOB_EXECUTOR_IP:}
port: ${XXL_JOB_EXECUTOR_PORT:9999}
--- #################### 鏈嶅姟淇濋殰鐩稿叧閰嶇疆 ####################
lock4j:
acquire-timeout: 3000
expire: 30000
--- #################### 鐩戞帶鐩稿叧閰嶇疆 ####################
management:
endpoints:
web:
base-path: /actuator
exposure:
include: '*'
spring:
boot:
admin:
client:
instance:
service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
logging:
level:
root: INFO
com.viewsh: ${LOG_LEVEL:INFO}
com.viewsh.module.iot.dal.mysql: debug
com.viewsh.module.iot.dal.mysql.sms.SmsChannelMapper: INFO
org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR
file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 鑺嬮亾鐩稿叧閰嶇疆 ####################
viewsh:
demo: false
env:
tag: ${HOSTNAME:stage}
captcha:
enable: true
security:
mock-enable: false

View File

@@ -0,0 +1,135 @@
--- #################### 娉ㄥ唽涓績 + 閰嶇疆涓績鐩稿叧閰嶇疆 ####################
spring:
cloud:
nacos:
server-addr: ${NACOS_ADDR:172.17.16.7:8848}
username: ${NACOS_USERNAME:nacos} # Nacos 璐﹀彿
password: ${NACOS_PASSWORD:nacos} # Nacos 瀵嗙爜
discovery: # 銆愰厤缃腑蹇冦€戦厤缃」
namespace: ${NACOS_DISCOVERY_NAMESPACE:stage} # 鍛藉悕绌洪棿
group: DEFAULT_GROUP # 浣跨敤鐨?Nacos 閰嶇疆鍒嗙粍锛岄粯璁や负 DEFAULT_GROUP
metadata:
version: 1.0.0 # 鏈嶅姟瀹炰緥鐨勭増鏈彿锛屽彲鐢ㄤ簬鐏板害鍙戝竷
config: # 銆愭敞鍐屼腑蹇冦€戦厤缃」
namespace: ${NACOS_CONFIG_NAMESPACE:stage} # 鍛藉悕绌洪棿
group: DEFAULT_GROUP # 浣跨敤鐨?Nacos 閰嶇疆鍒嗙粍锛岄粯璁や负 DEFAULT_GROUP
--- #################### 鏁版嵁搴撶浉鍏抽厤缃?####################
spring:
# 鏁版嵁婧愰厤缃」
autoconfigure:
# noinspection SpringBootApplicationYaml
exclude:
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 鎺掗櫎 Druid 鐨勮嚜鍔ㄩ厤缃紝浣跨敤 dynamic-datasource-spring-boot-starter 閰嶇疆澶氭暟鎹簮
datasource:
druid: # Druid 銆愮洃鎺с€戠浉鍏崇殑鍏ㄥ眬閰嶇疆
web-stat-filter:
enabled: false
stat-view-servlet:
enabled: false
allow: # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂? url-pattern: /druid/*
login-username: # 鎺у埗鍙扮鐞嗙敤鎴峰悕鍜屽瘑鐮? login-password:
filter:
stat:
enabled: false
log-slow-sql: true # 鎱?SQL 璁板綍
slow-sql-millis: 100
merge-sql: true
wall:
config:
multi-statement-allow: true
dynamic: # 澶氭暟鎹簮閰嶇疆
druid: # Druid 銆愯繛鎺ユ睜銆戠浉鍏崇殑鍏ㄥ眬閰嶇疆
initial-size: 5 # 鍒濆杩炴帴鏁? min-idle: 10 # 鏈€灏忚繛鎺ユ睜鏁伴噺
max-active: 20 # 鏈€澶ц繛鎺ユ睜鏁伴噺
max-wait: 60000 # 閰嶇疆鑾峰彇杩炴帴绛夊緟瓒呮椂鐨勬椂闂达紝鍗曚綅锛氭绉掞紙1 鍒嗛挓锛? time-between-eviction-runs-millis: 60000 # 閰嶇疆闂撮殧澶氫箙鎵嶈繘琛屼竴娆℃娴嬶紝妫€娴嬮渶瑕佸叧闂殑绌洪棽杩炴帴锛屽崟浣嶏細姣锛? 鍒嗛挓锛? min-evictable-idle-time-millis: 600000 # 閰嶇疆涓€涓繛鎺ュ湪姹犱腑鏈€灏忕敓瀛樼殑鏃堕棿锛屽崟浣嶏細姣锛?0 鍒嗛挓锛? max-evictable-idle-time-millis: 1800000 # 閰嶇疆涓€涓繛鎺ュ湪姹犱腑鏈€澶х敓瀛樼殑鏃堕棿锛屽崟浣嶏細姣锛?0 鍒嗛挓锛? validation-query: SELECT 1 FROM DUAL # 閰嶇疆妫€娴嬭繛鎺ユ槸鍚︽湁鏁? test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true # 鏄惁寮€鍚?PreparedStatement 缂撳瓨
max-pool-prepared-statement-per-connection-size: 20 # 姣忎釜杩炴帴缂撳瓨鐨?PreparedStatement 鏁伴噺
primary: master
datasource:
master:
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}
password: ${MYSQL_PASSWORD:}
slave: # 妯℃嫙浠庡簱锛屽彲鏍规嵁鑷繁闇€瑕佷慨鏀? lazy: 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}}
password: ${MYSQL_SLAVE_PASSWORD:${MYSQL_PASSWORD:}}
# Redis 閰嶇疆銆俁edisson 榛樿鐨勯厤缃冻澶熶娇鐢紝涓€鑸笉闇€瑕佽繘琛岃皟浼? data:
redis:
host: ${REDIS_HOST:172.17.16.7} # 鍦板潃
port: ${REDIS_PORT:6379} # 绔彛
database: ${REDIS_DATABASE:0} # 鏁版嵁搴撶储寮? password: ${REDIS_PASSWORD:} # 瀵嗙爜
--- #################### MQ 娑堟伅闃熷垪鐩稿叧閰嶇疆 ####################
# rocketmq 閰嶇疆椤癸紝瀵瑰簲 RocketMQProperties 閰嶇疆绫?rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:124.222.218.198:9876} # RocketMQ Namesrv
producer:
group: ${spring.application.name}_PRODUCER
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
consumer:
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
spring:
# RabbitMQ 閰嶇疆椤癸紝瀵瑰簲 RabbitProperties 閰嶇疆绫? rabbitmq:
host: ${SPRING_RABBITMQ_HOST:127.0.0.1} # RabbitMQ 鏈嶅姟鐨勫湴鍧€
port: ${SPRING_RABBITMQ_PORT:5672} # RabbitMQ 鏈嶅姟鐨勭鍙? username: ${SPRING_RABBITMQ_USERNAME:guest} # RabbitMQ 鏈嶅姟鐨勮处鍙? password: ${SPRING_RABBITMQ_PASSWORD:guest} # RabbitMQ 鏈嶅姟鐨勫瘑鐮? # Kafka 閰嶇疆椤癸紝瀵瑰簲 KafkaProperties 閰嶇疆绫? kafka:
bootstrap-servers: ${SPRING_KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092} # 鎸囧畾 Kafka Broker 鍦板潃锛屽彲浠ヨ缃涓紝浠ラ€楀彿鍒嗛殧
--- #################### 瀹氭椂浠诲姟鐩稿叧閰嶇疆 ####################
xxl:
job:
enabled: false
admin:
addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.7:19090/xxl-job-admin}
executor:
ip: ${XXL_JOB_EXECUTOR_IP:}
port: ${XXL_JOB_EXECUTOR_PORT:9999}
--- #################### 鏈嶅姟淇濋殰鐩稿叧閰嶇疆 ####################
# Lock4j 閰嶇疆椤?lock4j:
acquire-timeout: 3000 # 鑾峰彇鍒嗗竷寮忛攣瓒呮椂鏃堕棿锛岄粯璁や负 3000 姣
expire: 30000 # 鍒嗗竷寮忛攣鐨勮秴鏃舵椂闂达紝榛樿涓?30 姣
--- #################### 鐩戞帶鐩稿叧閰嶇疆 ####################
# Actuator 鐩戞帶绔偣鐨勯厤缃」
management:
endpoints:
web:
base-path: /actuator # Actuator 鎻愪緵鐨?API 鎺ュ彛鐨勬牴鐩綍銆傞粯璁や负 /actuator
exposure:
include: '*' # 闇€瑕佸紑鏀剧殑绔偣銆傞粯璁ゅ€煎彧鎵撳紑 health 鍜?info 涓や釜绔偣銆傞€氳繃璁剧疆 * 锛屽彲浠ュ紑鏀炬墍鏈夌鐐广€?
# Spring Boot Admin 閰嶇疆椤?spring:
boot:
admin:
# Spring Boot Admin Client 瀹㈡埛绔殑鐩稿叧閰嶇疆
client:
instance:
service-host-type: IP # 娉ㄥ唽瀹炰緥鏃讹紝浼樺厛浣跨敤 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
username: ${SPRING_BOOT_ADMIN_CLIENT_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_CLIENT_PASSWORD:admin}
# 鏃ュ織鏂囦欢閰嶇疆
logging:
level:
# 閰嶇疆鑷繁鍐欑殑 MyBatis Mapper 鎵撳嵃鏃ュ織
com.viewsh.module.ops.dal.mysql: info # 鐢熶骇鐜寤鸿 info
org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 鑺嬭壙锛氬厛绂佺敤锛孲pring Boot 3.X 瀛樺湪閮ㄥ垎閿欒鐨?WARN 鎻愮ず
--- #################### 鑺嬮亾鐩稿叧閰嶇疆 ####################
# 鑺嬮亾閰嶇疆椤癸紝璁剧疆褰撳墠椤圭洰鎵€鏈夎嚜瀹氫箟鐨勯厤缃?viewsh:
env: # 澶氱幆澧冪殑閰嶇疆椤? tag: ${HOSTNAME}
security:
mock-enable: false # 鐢熶骇鐜绂佺敤 mock
access-log: # 璁块棶鏃ュ織鐨勯厤缃」
enable: true # 鐢熶骇鐜寮€鍚闂棩蹇?

View File

@@ -0,0 +1,217 @@
--- #################### 娉ㄥ唽涓績 + 閰嶇疆涓績鐩稿叧閰嶇疆 ####################
spring:
cloud:
nacos:
server-addr: ${NACOS_ADDR:172.17.16.7:8848}
username: ${NACOS_USERNAME:nacos}
password: ${NACOS_PASSWORD:nacos}
discovery:
namespace: ${NACOS_DISCOVERY_NAMESPACE:stage}
group: DEFAULT_GROUP
metadata:
version: 1.0.0
config:
namespace: ${NACOS_CONFIG_NAMESPACE:stage}
group: DEFAULT_GROUP
file-extension: yaml
refresh-enabled: true
--- #################### 鏁版嵁搴撶浉鍏抽厤缃?####################
spring:
datasource:
druid: # Druid 銆愮洃鎺с€戠浉鍏崇殑鍏ㄥ眬閰嶇疆
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
allow: # 璁剧疆鐧藉悕鍗曪紝涓嶅~鍒欏厑璁告墍鏈夎闂?
url-pattern: /druid/*
login-username: ${DRUID_USERNAME:admin}
login-password: ${DRUID_PASSWORD:admin}
filter:
stat:
enabled: true
log-slow-sql: true # 鎱?SQL 璁板綍
slow-sql-millis: 100
merge-sql: true
wall:
config:
multi-statement-allow: true
dynamic: # 澶氭暟鎹簮閰嶇疆
druid: # Druid 銆愯繛鎺ユ睜銆戠浉鍏崇殑鍏ㄥ眬閰嶇疆
initial-size: 5
min-idle: 10
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 600000
max-evictable-idle-time-millis: 1800000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
primary: master
datasource:
master:
url: jdbc:mysql://172.17.16.8:3306/aiot-platform-test?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root
password: root
slave: # 浠庡簱閰嶇疆锛堝彲閫夛級
lazy: 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
password: root
# Redis 閰嶇疆
data:
redis:
host: 172.17.16.7
port: 6379
database: 0
password: ""
timeout: 5000ms
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
--- #################### MQ 娑堟伅闃熷垪鐩稿叧閰嶇疆 ####################
# rocketmq 閰嶇疆椤?
rocketmq:
name-server: ${ROCKETMQ_NAMESRV_ADDR:124.222.218.198:9876}
producer:
group: ${spring.application.name}_PRODUCER
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
consumer:
access-key: ${ROCKETMQ_ACCESS_KEY:}
secret-key: ${ROCKETMQ_SECRET_KEY:}
spring:
# RabbitMQ 閰嶇疆椤癸紙鍙€夛級
rabbitmq:
host: ${RABBITMQ_HOST:127.0.0.1}
port: ${RABBITMQ_PORT:5672}
username: ${RABBITMQ_USERNAME:guest}
password: ${RABBITMQ_PASSWORD:guest}
# Kafka 閰嶇疆椤癸紙鍙€夛級
kafka:
bootstrap-servers: ${KAFKA_BOOTSTRAP_SERVERS:127.0.0.1:9092}
--- #################### 瀹氭椂浠诲姟鐩稿叧閰嶇疆 ####################
xxl:
job:
enabled: false
admin:
addresses: ${XXL_JOB_ADMIN_ADDRESSES:http://172.17.16.7:19090/xxl-job-admin}
executor:
ip: ${XXL_JOB_EXECUTOR_IP:}
port: ${XXL_JOB_EXECUTOR_PORT:9999}
--- #################### 鏈嶅姟淇濋殰鐩稿叧閰嶇疆 ####################
# Lock4j 閰嶇疆椤?
lock4j:
acquire-timeout: 3000
expire: 30000
--- #################### 鐩戞帶鐩稿叧閰嶇疆 ####################
# Actuator 鐩戞帶绔偣鐨勯厤缃」
management:
endpoints:
web:
base-path: /actuator
exposure:
include: '*'
# Spring Boot Admin 閰嶇疆椤?
spring:
boot:
admin:
client:
instance:
service-host-type: IP
username: ${SPRING_BOOT_ADMIN_USERNAME:admin}
password: ${SPRING_BOOT_ADMIN_PASSWORD:admin}
# 鏃ュ織鏂囦欢閰嶇疆
logging:
level:
root: INFO
com.viewsh: ${LOG_LEVEL:INFO}
file:
name: ${LOG_FILE_PATH:/app/logs}/${spring.application.name}.log
--- #################### 寰俊鍏紬鍙枫€佸皬绋嬪簭鐩稿叧閰嶇疆 ####################
wx:
mp: # 鍏紬鍙烽厤缃紙蹇呭~锛?
app-id: ${WX_MP_APP_ID:wx5b23ba7a5589ecbb} # 浼樺厛鐜鍙橀噺锛屽厹搴曢粯璁ゅ€?
secret: ${WX_MP_SECRET:2a7b3b20c537e52e74afd395eb85f61f}
config-storage:
type: RedisTemplate
key-prefix: wx
http-client-type: HttpClient
miniapp: # 灏忕▼搴忛厤缃紙蹇呭~锛?
appid: ${WX_MINIAPP_APPID:wxc4598c446f8a9cb3}
secret: ${WX_MINIAPP_SECRET:4a1a04e07f6a4a0751b39c3064a92c8b}
config-storage:
type: RedisTemplate
key-prefix: wa
http-client-type: HttpClient
--- #################### 鑺嬮亾鐩稿叧閰嶇疆 ####################
viewsh:
demo: false # 鐢熶骇鐜鍏抽棴婕旂ず妯″紡
env:
tag: ${HOSTNAME:stage}
captcha:
enable: true # 鐢熶骇鐜寮€鍚獙璇佺爜
security:
mock-enable: false # 鐢熶骇鐜鍏抽棴 mock
access-log:
enable: true
wxa-code:
env-version: release
wxa-subscribe-message:
miniprogram-state: formal
justauth:
enabled: false
type:
DINGTALK: # 閽夐拤
client-id: dingvrnreaje3yqvzhxg
client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
ignore-check-redirect-uri: true
WECHAT_ENTERPRISE: # 浼佷笟寰俊
client-id: wwd411c69a39ad2e54
client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
agent-id: 1000004
ignore-check-redirect-uri: true
# noinspection SpringBootApplicationYaml
WECHAT_MINI_PROGRAM: # 寰俊灏忕▼搴?
client-id: ${wx.miniapp.appid}
client-secret: ${wx.miniapp.secret}
ignore-check-redirect-uri: true
ignore-check-state: true # 寰俊灏忕▼搴忥紝涓嶄細浣跨敤鍒?state锛屾墍浠ヤ笉杩涜鏍¢獙
WECHAT_MP: # 寰俊鍏紬鍙?
client-id: ${wx.mp.app-id}
client-secret: ${wx.mp.secret}
ignore-check-redirect-uri: true
ALIPAY: # 鏀粯瀹濆皬绋嬪簭
client-id: xx
client-secret: xx
alipay-public-key: xx
ignore-check-redirect-uri: true
ignore-check-state: true
cache:
type: REDIS
prefix: 'social_auth_state:' # 缂撳瓨鍓嶇紑锛岀洰鍓嶅彧瀵?Redis 缂撳瓨鐢熸晥锛岄粯璁?JUSTAUTH::STATE::
timeout: 24h # 瓒呮椂鏃堕暱锛岀洰鍓嶅彧瀵?Redis 缂撳瓨鐢熸晥锛岄粯璁?3 鍒嗛挓