#!/bin/bash # Sanguo VeighNa Synology NAS 快速部署脚本 # 用于在 Synology NAS 上快速部署和配置 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 "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } log_step() { echo -e "${BLUE}[STEP]${NC} $1" } # ============================================ # 打印 Banner # ============================================ print_banner() { cat << "EOF" ╔════════════════════════════════════════════════════════════╗ ║ ║ ║ _____ ____ ____ _ _____ _ ___ _ ║ ║ | __ \ / __ \ / __ \ | ||_ _|__ _| | |_ _|___| | ║ ║ | |__) | | | | | | |_| | |/ _` | |_____|| | _ \ | ║ ║ | ___/| | | | | | |_ | | (_| | |_____| | || ||| ║ ║ |_| | |__| | \___/\__| |\_____|_| |___||_||_| ║ ║ \____/ ║ ║ ║ ║ Synology NAS 部署脚本 v1.0.0 ║ ║ ║ ╚════════════════════════════════════════════════════════════╝ EOF } # ============================================ # 检查权限 # ============================================ check_permission() { log_step "检查执行权限..." if [ "$EUID" -ne 0 ]; then log_error "请使用 sudo 运行此脚本" echo "用法: sudo bash deploy-synology.sh" exit 1 fi log_info "权限检查通过" } # ============================================ # 加载配置 # ============================================ load_config() { log_step "加载配置..." # 获取脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # 设置默认值 DATA_DIR=${DATA_DIR:-/volume1/docker/stock/sanguo_vnpy} HTTP_PORT=${HTTP_PORT:-8000} WS_PORT=${WS_PORT:-8080} TZ=${TZ:-Asia/Shanghai} # 尝试加载 .env 文件 if [ -f "$SCRIPT_DIR/.env" ]; then log_info "从 .env 文件加载配置..." source "$SCRIPT_DIR/.env" else log_warn ".env 文件不存在,使用默认配置" if [ -f "$SCRIPT_DIR/.env.example" ]; then log_info "从 .env.example 创建 .env 文件..." cp "$SCRIPT_DIR/.env.example" "$SCRIPT_DIR/.env" log_warn "请编辑 .env 文件配置您的环境" log_info "配置完成后重新运行此脚本" exit 0 fi fi log_info "配置加载完成" log_info "数据目录: $DATA_DIR" log_info "HTTP 端口: $HTTP_PORT" log_info "WebSocket 端口: $WS_PORT" log_info "时区: $TZ" } # ============================================ # 检查 Docker # ============================================ check_docker() { log_step "检查 Docker 环境..." if ! command -v docker &> /dev/null; then log_error "Docker 未安装" log_info "请在 DSM 中安装 Container Manager 套件" exit 1 fi if ! command -v docker-compose &> /dev/null; then log_error "Docker Compose 未安装" exit 1 fi log_info "Docker 环境检查通过" } # ============================================ # 创建数据目录 # ============================================ create_directories() { log_step "创建数据目录..." # 主目录 mkdir -p "$DATA_DIR" # 子目录 mkdir -p "$DATA_DIR/data" mkdir -p "$DATA_DIR/logs" mkdir -p "$DATA_DIR/config" mkdir -p "$DATA_DIR/temp" mkdir -p "$DATA_DIR/redis" mkdir -p "$DATA_DIR/nginx" mkdir -p "$DATA_DIR/nginx/ssl" # 设置权限 chmod -R 755 "$DATA_DIR" log_info "数据目录创建完成: $DATA_DIR" } # ============================================ # 备份现有数据 # ============================================ backup_data() { log_step "检查是否需要备份..." if [ -d "$DATA_DIR/data" ] && [ "$(ls -A $DATA_DIR/data 2>/dev/null)" ]; then BACKUP_DIR="/volume1/Backup" mkdir -p "$BACKUP_DIR" BACKUP_FILE="$BACKUP_DIR/vnpy_backup_$(date +%Y%m%d_%H%M%S).tar.gz" log_warn "检测到现有数据,创建备份..." tar czf "$BACKUP_FILE" -C "$DATA_DIR" . log_info "备份已创建: $BACKUP_FILE" log_info "备份大小: $(du -h $BACKUP_FILE | cut -f1)" else log_info "未检测到现有数据,跳过备份" fi } # ============================================ # 构建 Docker 镜像 # ============================================ build_image() { log_step "构建 Docker 镜像..." cd "$SCRIPT_DIR" log_info "开始构建(这可能需要几分钟)..." docker-compose build log_info "Docker 镜像构建完成" } # ============================================ # 启动服务 # ============================================ start_services() { log_step "启动服务..." cd "$SCRIPT_DIR" # 停止现有服务(如果有) if docker-compose ps | grep -q "Up"; then log_warn "检测到运行中的服务,先停止..." docker-compose down fi # 启动服务 log_info "启动服务..." docker-compose up -d log_info "服务启动完成" } # ============================================ # 检查服务状态 # ============================================ check_status() { log_step "检查服务状态..." cd "$SCRIPT_DIR" # 等待服务启动 sleep 5 # 检查容器状态 docker-compose ps echo "" log_info "检查服务日志(最后 20 行):" docker-compose logs --tail=20 vnpy } # ============================================ # 显示访问信息 # ============================================ show_access_info() { log_step "部署完成!" echo "" echo "==========================================" log_info "访问地址:" echo "" echo " HTTP: http://$(hostname -I | awk '{print $1}'):$HTTP_PORT" echo " WebSocket: ws://$(hostname -I | awk '{print $1}'):$WS_PORT" echo "" log_info "默认登录凭据:" echo "" echo " 用户名: admin" echo " 密码: admin123" echo "" log_warn "重要提示:" echo " 1. 请立即修改默认密码" echo " 2. 数据目录: $DATA_DIR" echo " 3. 查看日志: docker-compose logs -f" echo " 4. 停止服务: docker-compose down" echo "==========================================" echo "" } # ============================================ # 主函数 # ============================================ main() { print_banner echo "" check_permission load_config check_docker create_directories backup_data build_image start_services check_status show_access_info log_info "部署脚本执行完成!" } # ============================================ # 信号处理 # ============================================ trap 'log_error "脚本被中断"; exit 1' SIGINT SIGTERM # ============================================ # 执行主函数 # ============================================ main "$@"