309 lines
8.1 KiB
Bash
309 lines
8.1 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
# 脚本功能:不依赖docker-compose,使用docker命令管理nacos服务
|
|||
|
|
|
|||
|
|
# 定义变量
|
|||
|
|
IMAGE="docker.tanuki.vip/nacos-server-kingbase"
|
|||
|
|
IMAGE_VERSION="2.3.0"
|
|||
|
|
FULL_IMAGE="${IMAGE}:${IMAGE_VERSION}" # 合并镜像地址和版本
|
|||
|
|
CONTAINER_NAME="nacos-server"
|
|||
|
|
CONFIG_DIR="/docker-data/nacos/conf" # 配置文件目录
|
|||
|
|
HOST_PORT="8848"
|
|||
|
|
CONTAINER_PORT="8848"
|
|||
|
|
|
|||
|
|
# 环境变量(处理特殊字符,使用单引号包裹)
|
|||
|
|
ENV_VARS=(
|
|||
|
|
'MODE=standalone'
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# 显示使用帮助
|
|||
|
|
usage() {
|
|||
|
|
echo "用法: $0 [命令]"
|
|||
|
|
echo "命令列表:"
|
|||
|
|
echo " deploy - 部署并启动服务(如果镜像不存在会拉取)"
|
|||
|
|
echo " start - 启动服务(容器必须已存在)"
|
|||
|
|
echo " stop - 停止服务"
|
|||
|
|
echo " restart - 重启服务"
|
|||
|
|
echo " status - 查看服务状态"
|
|||
|
|
echo " logs - 查看服务日志"
|
|||
|
|
echo " remove - 删除容器(停止状态下)"
|
|||
|
|
echo " pull - 拉取最新镜像"
|
|||
|
|
echo " help - 显示帮助信息"
|
|||
|
|
exit 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 检查docker是否安装
|
|||
|
|
check_docker() {
|
|||
|
|
if ! command -v docker &> /dev/null; then
|
|||
|
|
echo "错误: 未安装docker,请先安装"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 检查容器是否存在
|
|||
|
|
container_exists() {
|
|||
|
|
docker inspect "$CONTAINER_NAME" &> /dev/null
|
|||
|
|
return $?
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 检查容器是否运行
|
|||
|
|
container_running() {
|
|||
|
|
docker inspect -f '{{.State.Running}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "true"
|
|||
|
|
return $?
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 拉取镜像
|
|||
|
|
pull_image() {
|
|||
|
|
check_docker
|
|||
|
|
echo "拉取镜像 $FULL_IMAGE ..."
|
|||
|
|
if docker pull "$FULL_IMAGE"; then
|
|||
|
|
echo "镜像拉取成功"
|
|||
|
|
else
|
|||
|
|
echo "错误: 镜像拉取失败"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 部署并启动服务(如果容器不存在则创建,已存在则启动)
|
|||
|
|
deploy_service() {
|
|||
|
|
check_docker
|
|||
|
|
|
|||
|
|
# 检查数据目录和配置目录是否存在,不存在则创建
|
|||
|
|
|
|||
|
|
if [ ! -d "$CONFIG_DIR" ]; then
|
|||
|
|
echo "创建配置目录: $CONFIG_DIR"
|
|||
|
|
mkdir -p "$CONFIG_DIR"
|
|||
|
|
chmod 777 "$CONFIG_DIR"
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 生成单机模式配置文件(若不存在)
|
|||
|
|
if [ ! -f "$CONFIG_DIR/application.properties" ]; then
|
|||
|
|
echo "生成配置文件: $CONFIG_DIR/application.properties"
|
|||
|
|
cat > "$CONFIG_DIR/application.properties" << EOF
|
|||
|
|
#server.port=8848
|
|||
|
|
spring.datasource.platform=kingbase8
|
|||
|
|
db.type=kingbase8
|
|||
|
|
db.driverClassName=com.kingbase8.Driver
|
|||
|
|
db.pool.config.driverClassName=com.kingbase8.Driver
|
|||
|
|
|
|||
|
|
db.num=1
|
|||
|
|
db.url.0=jdbc:kingbase8://10.10.2.102:54321/itc?currentSchema=nacos_sit&socketTimeout=600000&queryTimeout=600
|
|||
|
|
db.user=itc_dne
|
|||
|
|
db.password=itc_dne
|
|||
|
|
|
|||
|
|
# 已配置的驱动(保留)
|
|||
|
|
spring.datasource.hikari.auto-commit=false
|
|||
|
|
# 增加事务超时(全局设置)
|
|||
|
|
spring.transaction.default-timeout=6000
|
|||
|
|
# 连接池最大连接数
|
|||
|
|
spring.datasource.hikari.maximum-pool-size=20
|
|||
|
|
# 连接池最小空闲连接数
|
|||
|
|
spring.datasource.hikari.minimum-idle=10
|
|||
|
|
# 连接最大存活时间
|
|||
|
|
spring.datasource.hikari.max-lifetime=1800000
|
|||
|
|
# 验证连接是否有效
|
|||
|
|
spring.datasource.hikari.connection-test-query=SELECT 1
|
|||
|
|
# 等待连接池分配连接的最大时长
|
|||
|
|
spring.datasource.hikari.connection-timeout=60000
|
|||
|
|
# 设置事务隔离级别为READ_COMMITTED
|
|||
|
|
spring.datasource.hikari.transaction-isolation=TRANSACTION_READ_COMMITTED
|
|||
|
|
# 传递 JDBC 驱动属性(设置 queryTimeout)
|
|||
|
|
spring.datasource.hikari.connection-properties=queryTimeout=6000;socketTimeout=600000
|
|||
|
|
# 验证连接的查询超时(单独设置,单位:秒)
|
|||
|
|
spring.datasource.hikari.validation-query-timeout=3000
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 开启认证功能
|
|||
|
|
nacos.core.auth.enabled=true
|
|||
|
|
nacos.core.auth.username=nacos
|
|||
|
|
nacos.core.auth.password=Lng@123
|
|||
|
|
|
|||
|
|
# 配置 JWT 密钥(必须自定义,长度至少32位)
|
|||
|
|
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
|
|||
|
|
# 关闭用户代理白名单(增强安全性)
|
|||
|
|
nacos.core.auth.enable.userAgentAuthWhite=false
|
|||
|
|
# 配置服务端身份识别(可选,用于集群环境)
|
|||
|
|
nacos.core.auth.server.identity.key=serverIdentity
|
|||
|
|
nacos.core.auth.server.identity.value=security
|
|||
|
|
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
|
|||
|
|
### worked when nacos.core.auth.system.type=nacos
|
|||
|
|
### The token expiration in seconds:
|
|||
|
|
nacos.core.auth.plugin.nacos.token.cache.enable=false
|
|||
|
|
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
|
|||
|
|
nacos.config.push.maxRetryTime=50
|
|||
|
|
nacos.cmdb.dumpTaskInterval=3600
|
|||
|
|
nacos.cmdb.eventTaskInterval=10
|
|||
|
|
EOF
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
|
|||
|
|
if container_exists; then
|
|||
|
|
echo "容器 $CONTAINER_NAME 已存在,尝试启动..."
|
|||
|
|
start_service
|
|||
|
|
return
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# 检查镜像是否存在,不存在则拉取
|
|||
|
|
if ! docker images --format "{{.Repository}}:{{.Tag}}" | grep -q "$FULL_IMAGE"; then
|
|||
|
|
echo "本地不存在镜像 $FULL_IMAGE,开始拉取..."
|
|||
|
|
pull_image || exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "开始部署 $CONTAINER_NAME 服务..."
|
|||
|
|
|
|||
|
|
docker run -d --restart always --name nacos-server \
|
|||
|
|
-p 8848:8848 -p 9848:9848 -p 9849:9849 \
|
|||
|
|
-e MODE=standalone \
|
|||
|
|
-v $CONFIG_DIR/application.properties:/home/nacos/conf/application.properties \
|
|||
|
|
$FULL_IMAGE
|
|||
|
|
|
|||
|
|
if [ $? -eq 0 ]; then
|
|||
|
|
echo "nacos容器部署成功!"
|
|||
|
|
echo "容器名称: $CONTAINER_NAME"
|
|||
|
|
echo "映射端口: 8848 9848 9849"
|
|||
|
|
docker network connect --ip 172.20.0.5 scm-net $CONTAINER_NAME
|
|||
|
|
else
|
|||
|
|
echo "Redis容器部署失败!"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 启动服务
|
|||
|
|
start_service() {
|
|||
|
|
check_docker
|
|||
|
|
|
|||
|
|
if ! container_exists; then
|
|||
|
|
echo "错误: 容器 $CONTAINER_NAME 不存在,请先执行 deploy 命令"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if container_running; then
|
|||
|
|
echo "服务 $CONTAINER_NAME 已在运行中"
|
|||
|
|
status_service
|
|||
|
|
return
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "启动 $CONTAINER_NAME 服务..."
|
|||
|
|
docker start "$CONTAINER_NAME"
|
|||
|
|
status_service
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 停止服务
|
|||
|
|
stop_service() {
|
|||
|
|
check_docker
|
|||
|
|
|
|||
|
|
if ! container_exists; then
|
|||
|
|
echo "错误: 容器 $CONTAINER_NAME 不存在"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if ! container_running; then
|
|||
|
|
echo "服务 $CONTAINER_NAME 已停止"
|
|||
|
|
status_service
|
|||
|
|
return
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "停止 $CONTAINER_NAME 服务..."
|
|||
|
|
docker stop "$CONTAINER_NAME"
|
|||
|
|
status_service
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 重启服务
|
|||
|
|
restart_service() {
|
|||
|
|
check_docker
|
|||
|
|
|
|||
|
|
if ! container_exists; then
|
|||
|
|
echo "错误: 容器 $CONTAINER_NAME 不存在,请先执行 deploy 命令"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "重启 $CONTAINER_NAME 服务..."
|
|||
|
|
docker restart "$CONTAINER_NAME"
|
|||
|
|
status_service
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 查看服务状态
|
|||
|
|
status_service() {
|
|||
|
|
check_docker
|
|||
|
|
|
|||
|
|
if ! container_exists; then
|
|||
|
|
echo "容器 $CONTAINER_NAME 不存在"
|
|||
|
|
return
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "$CONTAINER_NAME 服务状态:"
|
|||
|
|
docker ps -f "name=$CONTAINER_NAME" --format "ID: {{.ID}}\n名称: {{.Names}}\n镜像: {{.Image}}\n状态: {{.Status}}\n端口: {{.Ports}}"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 查看服务日志
|
|||
|
|
logs_service() {
|
|||
|
|
check_docker
|
|||
|
|
|
|||
|
|
if ! container_exists; then
|
|||
|
|
echo "错误: 容器 $CONTAINER_NAME 不存在"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "查看 $CONTAINER_NAME 服务日志 (按Ctrl+C退出)..."
|
|||
|
|
docker logs -f --tail 100 "$CONTAINER_NAME"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 删除容器(需先停止)
|
|||
|
|
remove_service() {
|
|||
|
|
check_docker
|
|||
|
|
|
|||
|
|
if ! container_exists; then
|
|||
|
|
echo "错误: 容器 $CONTAINER_NAME 不存在"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
if container_running; then
|
|||
|
|
echo "错误: 容器 $CONTAINER_NAME 正在运行,请先停止"
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
echo "删除 $CONTAINER_NAME 容器..."
|
|||
|
|
docker rm "$CONTAINER_NAME"
|
|||
|
|
if [ $? -eq 0 ]; then
|
|||
|
|
echo "容器 $CONTAINER_NAME 已删除"
|
|||
|
|
else
|
|||
|
|
echo "删除容器失败"
|
|||
|
|
fi
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 主逻辑
|
|||
|
|
if [ $# -eq 0 ]; then
|
|||
|
|
usage
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
case "$1" in
|
|||
|
|
deploy)
|
|||
|
|
deploy_service
|
|||
|
|
;;
|
|||
|
|
start)
|
|||
|
|
start_service
|
|||
|
|
;;
|
|||
|
|
stop)
|
|||
|
|
stop_service
|
|||
|
|
;;
|
|||
|
|
restart)
|
|||
|
|
restart_service
|
|||
|
|
;;
|
|||
|
|
status)
|
|||
|
|
status_service
|
|||
|
|
;;
|
|||
|
|
logs)
|
|||
|
|
logs_service
|
|||
|
|
;;
|
|||
|
|
remove)
|
|||
|
|
remove_service
|
|||
|
|
;;
|
|||
|
|
pull)
|
|||
|
|
pull_image
|
|||
|
|
;;
|
|||
|
|
help)
|
|||
|
|
usage
|
|||
|
|
;;
|
|||
|
|
*)
|
|||
|
|
echo "错误: 未知命令 '$1'"
|
|||
|
|
usage
|
|||
|
|
;;
|
|||
|
|
esac
|