#!/bin/bash # Momentry Studio - 通用安装脚本 # 适用于任何用户环境 # 使用: ./install.sh set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' 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" } # 获取脚本所在目录 SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" USER_HOME="${HOME:-$(pwd)}" echo "================================================================================" echo " Momentry Studio - 安装向导" echo "================================================================================" echo "" echo "检测到的环境:" echo " 用户主目录: ${USER_HOME}" echo " Studio 根目录: ${SCRIPT_DIR}" echo " 用户名: $(whoami)" echo "" # 步骤 1: 检查依赖 log_step "步骤 1/6: 检查依赖..." check_command() { local cmd=$1 local name=$2 if command -v $cmd &> /dev/null; then log_info "✅ $name: $(command -v $cmd)" else log_error "❌ $name 未安装" return 1 fi } check_command "node" "Node.js" || exit 1 check_command "npm" "npm" || exit 1 check_command "rustc" "Rust" || exit 1 check_command "cargo" "Cargo" || exit 1 echo "" # 步骤 2: 创建环境变量文件 log_step "步骤 2/6: 创建环境变量文件..." if [ -f "${SCRIPT_DIR}/.env" ]; then log_warn ".env 文件已存在,跳过创建" else cp "${SCRIPT_DIR}/.env.template" "${SCRIPT_DIR}/.env" log_info "✅ 已创建 .env 文件" log_warn "请编辑 .env 文件,填入实际的 API Keys" fi echo "" # 步骤 3: 生成配置文件 log_step "步骤 3/6: 生成配置文件..." chmod +x "${SCRIPT_DIR}/generate_config.sh" "${SCRIPT_DIR}/generate_config.sh" echo "" # 步骤 4: 创建数据目录 log_step "步骤 4/6: 创建数据目录..." mkdir -p "${USER_HOME}/momentry/output" mkdir -p "${USER_HOME}/momentry/backup" mkdir -p "${USER_HOME}/momentry/var/sftpgo/data" mkdir -p "${SCRIPT_DIR}/data/users" log_info "✅ 已创建数据目录:" log_info " - Output: ${USER_HOME}/momentry/output" log_info " - Backup: ${USER_HOME}/momentry/backup" log_info " - Storage: ${USER_HOME}/momentry/var/sftpgo/data" log_info " - Database: ${SCRIPT_DIR}/data/users" echo "" # 步骤 5: 安装依赖并构建 log_step "步骤 5/6: 安装依赖并构建..." cd "${SCRIPT_DIR}" log_info "安装 Node.js 依赖..." npm install log_info "构建前端..." npm run build log_info "构建 Rust 代理..." cd src-tauri cargo build --release cd .. log_info "✅ 构建完成" echo "" # 步骤 5.5: 初始化默认用户 log_step "步骤 5.5/6: 初始化默认用户..." # Generate a secure random password DEFAULT_PASSWORD="demo_$(openssl rand -hex 4)" # Set environment variable for password export MOMENTRY_DEFAULT_PASSWORD="${DEFAULT_PASSWORD}" log_info "默认用户密码: ${DEFAULT_PASSWORD}" log_warn "请妥善保存此密码!" # Save to .env file if [ -f "${SCRIPT_DIR}/.env" ]; then echo "" >> "${SCRIPT_DIR}/.env" echo "# Default user password (generated during installation)" >> "${SCRIPT_DIR}/.env" echo "MOMENTRY_DEFAULT_PASSWORD=${DEFAULT_PASSWORD}" >> "${SCRIPT_DIR}/.env" log_info "✅ 密码已保存到 .env 文件" fi # Initialize database cd "${SCRIPT_DIR}/src-tauri" "${SCRIPT_DIR}/src-tauri/target/release/user_tool" init-demo 2>/dev/null || { log_warn "用户工具未编译,将在首次启动时初始化" } cd "${SCRIPT_DIR}" echo "" # 步骤 6: 创建启动脚本 log_step "步骤 6/6: 创建启动脚本..." cat > "${SCRIPT_DIR}/start.sh" << STARTSCRIPT #!/bin/bash # Momentry Studio 启动脚本 # 加载环境变量 if [ -f "${SCRIPT_DIR}/.env" ]; then source "${SCRIPT_DIR}/.env" fi # 设置必要的环境变量 export MOMENTRY_API_KEY=\${MOMENTRY_API_KEY:-your_api_key_here} export MOMENTRY_DATA_DIR=\${MOMENTRY_DATA_DIR:-${SCRIPT_DIR}/data/users} # 启动代理 cd "${SCRIPT_DIR}" ./src-tauri/target/release/momentry-proxy STARTSCRIPT chmod +x "${SCRIPT_DIR}/start.sh" log_info "✅ 已创建启动脚本: start.sh" echo "" # 总结 echo "================================================================================" echo " ✅ 安装完成" echo "================================================================================" echo "" echo "安装位置:" echo " Studio 根目录: ${SCRIPT_DIR}" echo " 配置文件: ${SCRIPT_DIR}/config/admin_config.json" echo " 环境变量: ${SCRIPT_DIR}/.env" echo " 数据目录: ${SCRIPT_DIR}/data/users" echo "" echo "下一步:" echo " 1. 编辑环境变量: vim ${SCRIPT_DIR}/.env" echo " 2. 加载环境变量: source ${SCRIPT_DIR}/.env" echo " 3. 启动服务: ${SCRIPT_DIR}/start.sh" echo " 4. 访问: http://localhost:8888" echo "" echo "或者使用 npm 命令:" echo " npm run proxy # 启动代理服务" echo "" echo "================================================================================"