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