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

#!/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 "$@"