You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
4.8 KiB
207 lines
4.8 KiB
#!/bin/bash
|
|
|
|
# 设置错误时退出
|
|
set -e
|
|
|
|
# 颜色定义
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# 日志函数
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# 默认配置
|
|
IMAGE_NAME="x1-webui"
|
|
CONTAINER_NAME="x1-webui-container"
|
|
PORT="9905"
|
|
REMOVE_MODE=false
|
|
|
|
# 解析命令行参数
|
|
parse_arguments() {
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
-p|--port)
|
|
PORT="$2"
|
|
shift 2
|
|
;;
|
|
-i|--image)
|
|
IMAGE_NAME="$2"
|
|
shift 2
|
|
;;
|
|
-c|--container)
|
|
CONTAINER_NAME="$2"
|
|
shift 2
|
|
;;
|
|
-r|--remove)
|
|
REMOVE_MODE=true
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
echo "用法: $0 [选项]"
|
|
echo "选项:"
|
|
echo " -p, --port PORT 指定端口 (默认: 9905)"
|
|
echo " -i, --image NAME 指定镜像名称 (默认: x1-webui)"
|
|
echo " -c, --container NAME 指定容器名称 (默认: x1-webui-container)"
|
|
echo " -r, --remove 删除旧容器和镜像"
|
|
echo " -h, --help 显示帮助信息"
|
|
exit 0
|
|
;;
|
|
*)
|
|
log_error "未知选项: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# 检查Docker
|
|
check_docker() {
|
|
log_info "检查Docker安装状态..."
|
|
if ! command -v docker &> /dev/null; then
|
|
log_error "Docker未安装,请先安装Docker"
|
|
exit 1
|
|
fi
|
|
|
|
if ! docker info &> /dev/null; then
|
|
log_error "Docker服务未运行,请启动Docker服务"
|
|
exit 1
|
|
fi
|
|
|
|
log_success "Docker检查通过"
|
|
}
|
|
|
|
# 检查必要文件
|
|
check_files() {
|
|
log_info "检查必要文件..."
|
|
|
|
local required_files=("Dockerfile" "nginx.conf" "index.html")
|
|
for file in "${required_files[@]}"; do
|
|
if [ ! -f "$file" ]; then
|
|
log_error "缺少必要文件: $file"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
log_success "文件检查通过"
|
|
}
|
|
|
|
# 停止并删除旧容器
|
|
stop_old_container() {
|
|
log_info "停止旧容器..."
|
|
if docker ps -a --format "table {{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
|
|
docker stop "$CONTAINER_NAME" || true
|
|
docker rm "$CONTAINER_NAME" || true
|
|
log_success "旧容器已停止并删除"
|
|
else
|
|
log_info "没有找到旧容器"
|
|
fi
|
|
}
|
|
|
|
# 删除旧镜像
|
|
remove_old_image() {
|
|
if [ "$REMOVE_MODE" = true ]; then
|
|
log_info "删除旧镜像..."
|
|
if docker images --format "table {{.Repository}}" | grep -q "^${IMAGE_NAME}$"; then
|
|
docker rmi "$IMAGE_NAME" || true
|
|
log_success "旧镜像已删除"
|
|
else
|
|
log_info "没有找到旧镜像"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# 构建Docker镜像
|
|
build_image() {
|
|
log_info "构建Docker镜像: $IMAGE_NAME"
|
|
docker build -t "$IMAGE_NAME" .
|
|
log_success "镜像构建完成"
|
|
}
|
|
|
|
# 运行容器
|
|
run_container() {
|
|
log_info "启动容器: $CONTAINER_NAME"
|
|
docker run -d \
|
|
--name "$CONTAINER_NAME" \
|
|
-p "$PORT:80" \
|
|
--restart unless-stopped \
|
|
"$IMAGE_NAME"
|
|
|
|
log_success "容器启动完成"
|
|
}
|
|
|
|
# 健康检查
|
|
health_check() {
|
|
log_info "等待应用启动..."
|
|
local max_attempts=30
|
|
local attempt=1
|
|
|
|
while [ $attempt -le $max_attempts ]; do
|
|
if curl -f -s "http://localhost:$PORT/health" > /dev/null 2>&1; then
|
|
log_success "应用启动成功!"
|
|
return 0
|
|
fi
|
|
|
|
log_info "等待应用启动... ($attempt/$max_attempts)"
|
|
sleep 2
|
|
((attempt++))
|
|
done
|
|
|
|
log_warning "应用启动超时,但容器可能仍在运行"
|
|
return 1
|
|
}
|
|
|
|
# 显示部署信息
|
|
show_deployment_info() {
|
|
log_success "部署完成!"
|
|
echo ""
|
|
echo "部署信息:"
|
|
echo " 镜像名称: $IMAGE_NAME"
|
|
echo " 容器名称: $CONTAINER_NAME"
|
|
echo " 访问端口: $PORT"
|
|
echo " 访问地址: http://localhost:$PORT"
|
|
echo ""
|
|
|
|
log_info "容器状态:"
|
|
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
|
|
|
|
echo ""
|
|
log_info "容器日志:"
|
|
docker logs --tail 10 "$CONTAINER_NAME"
|
|
}
|
|
|
|
# 主函数
|
|
main() {
|
|
log_info "开始部署X1.WebUI..."
|
|
|
|
parse_arguments "$@"
|
|
check_docker
|
|
check_files
|
|
stop_old_container
|
|
remove_old_image
|
|
build_image
|
|
run_container
|
|
health_check
|
|
show_deployment_info
|
|
|
|
log_success "部署完成!"
|
|
}
|
|
|
|
# 执行主函数
|
|
main "$@"
|
|
|