#!/bin/bash # RWADurian Admin Web 一键部署脚本 # 使用方法: ./deploy.sh [命令] # 命令: # build - 仅构建镜像 # start - 构建并启动服务 # stop - 停止服务 # restart - 重启服务 # logs - 查看日志 # clean - 清理容器和镜像 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 项目信息 PROJECT_NAME="rwadurian-admin-web" IMAGE_NAME="rwadurian-admin-web" CONTAINER_NAME="rwadurian-admin-web" DEFAULT_PORT=3000 # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查 Docker 是否安装 check_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 检查通过" } # 检查 Docker Compose 是否安装 check_docker_compose() { if docker compose version &> /dev/null; then COMPOSE_CMD="docker compose" elif command -v docker-compose &> /dev/null; then COMPOSE_CMD="docker-compose" else log_error "Docker Compose 未安装" exit 1 fi log_success "Docker Compose 检查通过 ($COMPOSE_CMD)" } # 构建镜像 build() { log_info "开始构建 Docker 镜像..." $COMPOSE_CMD build --no-cache log_success "镜像构建完成" } # 启动服务 start() { log_info "开始部署服务..." # 检查端口是否被占用 PORT=${PORT:-$DEFAULT_PORT} if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then log_warn "端口 $PORT 已被占用,尝试停止旧服务..." stop fi # 构建并启动 $COMPOSE_CMD up -d --build # 等待服务启动 log_info "等待服务启动..." sleep 5 # 检查服务状态 if docker ps | grep -q $CONTAINER_NAME; then log_success "服务部署成功!" log_info "访问地址: http://localhost:$PORT" else log_error "服务启动失败,请查看日志: ./deploy.sh logs" exit 1 fi } # 停止服务 stop() { log_info "停止服务..." $COMPOSE_CMD down log_success "服务已停止" } # 重启服务 restart() { log_info "重启服务..." stop start } # 查看日志 logs() { $COMPOSE_CMD logs -f } # 清理 clean() { log_info "清理容器和镜像..." # 停止并删除容器 $COMPOSE_CMD down --rmi local --volumes --remove-orphans # 删除悬空镜像 docker image prune -f log_success "清理完成" } # 显示状态 status() { log_info "服务状态:" docker ps -a --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" } # 显示帮助 show_help() { echo "" echo "RWADurian Admin Web 部署脚本" echo "" echo "使用方法: ./deploy.sh [命令]" echo "" echo "命令:" echo " build 仅构建 Docker 镜像" echo " start 构建并启动服务 (默认)" echo " stop 停止服务" echo " restart 重启服务" echo " logs 查看服务日志" echo " status 查看服务状态" echo " clean 清理容器和镜像" echo " help 显示此帮助信息" echo "" echo "环境变量:" echo " PORT 服务端口 (默认: 3000)" echo "" echo "示例:" echo " ./deploy.sh start # 默认端口 3000 启动" echo " PORT=8080 ./deploy.sh start # 指定端口 8080 启动" echo "" } # 主函数 main() { # 切换到脚本所在目录 cd "$(dirname "$0")" # 检查环境 check_docker check_docker_compose # 执行命令 case "${1:-start}" in build) build ;; start) start ;; stop) stop ;; restart) restart ;; logs) logs ;; status) status ;; clean) clean ;; help|--help|-h) show_help ;; *) log_error "未知命令: $1" show_help exit 1 ;; esac } main "$@"