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 |