#!/bin/bash # 一键部署脚本 - Laravel知识库系统 # 整合镜像导出、压缩、传输和部署功能 set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" } log_success() { echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] ✓${NC} $1" } log_error() { echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ✗${NC} $1" } show_help() { cat << EOF 一键部署脚本 - Laravel知识库系统 用法: $0 [模式] [选项] 模式: export 导出Docker镜像 deploy 部署到OpenEuler服务器 full 完整流程 (导出+部署) 选项: -h, --help 显示帮助信息 -c, --compress 启用压缩 -v, --verify 验证完整性 --server HOST 目标服务器地址 --user USER SSH用户名 --deploy-dir DIR 部署目录 示例: $0 export -c -v # 导出并压缩镜像 $0 deploy --server 192.168.1.100 # 部署到服务器 $0 full -c --server 192.168.1.100 # 完整流程 EOF } # 默认配置 MODE="" COMPRESS=false VERIFY=false SERVER="" USER="deploy" DEPLOY_DIR="/opt/knowledge-base" # 解析参数 while [[ $# -gt 0 ]]; do case $1 in export|deploy|full) MODE="$1" shift ;; -h|--help) show_help exit 0 ;; -c|--compress) COMPRESS=true shift ;; -v|--verify) VERIFY=true shift ;; --server) SERVER="$2" shift 2 ;; --user) USER="$2" shift 2 ;; --deploy-dir) DEPLOY_DIR="$2" shift 2 ;; *) log_error "未知参数: $1" show_help exit 1 ;; esac done if [[ -z "$MODE" ]]; then log_error "请指定模式: export, deploy, 或 full" show_help exit 1 fi # 导出镜像 export_images() { log "开始导出Docker镜像..." local export_args="" if [[ "$COMPRESS" == true ]]; then export_args="$export_args -c" fi if [[ "$VERIFY" == true ]]; then export_args="$export_args -v" fi if "$SCRIPT_DIR/export-images.sh" $export_args; then log_success "镜像导出完成" else log_error "镜像导出失败" exit 1 fi } # 部署到服务器 deploy_to_server() { if [[ -z "$SERVER" ]]; then log_error "请指定服务器地址 --server" exit 1 fi log "开始部署到服务器: $SERVER" # 传输文件 log "传输部署文件..." scp -r "${PROJECT_ROOT}/docker-images" "${USER}@${SERVER}:/tmp/" scp "${SCRIPT_DIR}/deploy-to-openeuler.sh" "${USER}@${SERVER}:/tmp/" # 远程部署 log "执行远程部署..." ssh "${USER}@${SERVER}" "sudo /tmp/deploy-to-openeuler.sh -d $DEPLOY_DIR /tmp/docker-images" log_success "部署完成" } # 主流程 case "$MODE" in export) export_images ;; deploy) deploy_to_server ;; full) export_images deploy_to_server ;; esac log_success "操作完成!"