+154
-102
@@ -1,26 +1,56 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# =============================================================================
|
||||||
# MuMuAINovel Termux 一键安装脚本
|
# MuMuAINovel Termux 一键安装脚本
|
||||||
# 用法: curl -fsSL <url> | bash
|
# =============================================================================
|
||||||
# 或者: bash install-termux.sh
|
#
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
INSTALL_DIR="$HOME/MuMuAINovel"
|
# ── 路径配置 ──────────────────────────────────────────────────────────────────
|
||||||
DATA_DIR="$HOME/mumuainovel/data"
|
INSTALL_DIR="$HOME/MuMuAINovel" # 项目安装目录
|
||||||
LOG_DIR="$HOME/mumuainovel/logs"
|
DATA_DIR="$HOME/mumuainovel/data" # 数据库目录
|
||||||
REPO="https://github.com/xiamuceer-j/MuMuAINovel.git"
|
LOG_DIR="$HOME/mumuainovel/logs" # 日志目录
|
||||||
|
REPO="https://ghfast.top/https://github.com/xiamuceer-j/MuMuAINovel.git" # GitHub 镜像
|
||||||
# 颜色
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
RED='\033[0;31m'
|
|
||||||
CYAN='\033[0;36m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
|
# ── 输出函数 ──────────────────────────────────────────────────────────────────
|
||||||
|
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
|
||||||
info() { echo -e "${GREEN}[✓]${NC} $1"; }
|
info() { echo -e "${GREEN}[✓]${NC} $1"; }
|
||||||
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
|
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
|
||||||
err() { echo -e "${RED}[✗]${NC} $1"; }
|
err() { echo -e "${RED}[✗]${NC} $1"; }
|
||||||
step() { echo -e "\n${CYAN}[$1/$2]${NC} $3"; }
|
step() { echo -e "\n${CYAN}[$1/$2]${NC} $3"; }
|
||||||
|
|
||||||
|
# ── 转圈动画函数 ──────────────────────────────────────────────────────────────
|
||||||
|
# 用法: SPIN <后台进程PID> <提示文字> <日志文件路径>
|
||||||
|
# 原理: 检测进程是否存活,存活就显示旋转动画,结束后显示 ✅ 或 ❌
|
||||||
|
SPIN() {
|
||||||
|
local PID=$1 MSG=$2 LOGF=$3
|
||||||
|
echo -n " $MSG"
|
||||||
|
while kill -0 $PID 2>/dev/null; do
|
||||||
|
for s in ⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏; do
|
||||||
|
echo -ne "\r $s $MSG"
|
||||||
|
sleep 0.3
|
||||||
|
kill -0 $PID 2>/dev/null || break 2
|
||||||
|
done
|
||||||
|
done
|
||||||
|
wait $PID
|
||||||
|
local RET=$?
|
||||||
|
if [ $RET -eq 0 ]; then
|
||||||
|
echo -e "\r ✅ $MSG 完成 "
|
||||||
|
else
|
||||||
|
echo -e "\r ❌ $MSG 失败 "
|
||||||
|
if [ -n "$LOGF" ] && [ -f "$LOGF" ]; then
|
||||||
|
echo -e "${RED}--- 错误日志 (最后20行) ---${NC}"
|
||||||
|
tail -20 "$LOGF"
|
||||||
|
echo -e "${RED}--- 日志结束 ---${NC}"
|
||||||
|
fi
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── pip 镜像源(国内加速)──────────────────────────────────────────────────────
|
||||||
|
MIRROR="-i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com"
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${CYAN}╔══════════════════════════════════════════╗${NC}"
|
echo -e "${CYAN}╔══════════════════════════════════════════╗${NC}"
|
||||||
echo -e "${CYAN}║ 📚 MuMuAINovel Termux 一键安装 ║${NC}"
|
echo -e "${CYAN}║ 📚 MuMuAINovel Termux 一键安装 ║${NC}"
|
||||||
@@ -29,50 +59,72 @@ echo ""
|
|||||||
|
|
||||||
TOTAL=9
|
TOTAL=9
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 步骤 1: 检查 Termux 环境
|
||||||
|
# =============================================================================
|
||||||
step 1 $TOTAL "检查环境"
|
step 1 $TOTAL "检查环境"
|
||||||
# ──────────────────────────────────────────
|
|
||||||
if [ ! -d "/data/data/com.termux" ]; then
|
if [ ! -d "/data/data/com.termux" ]; then
|
||||||
err "未检测到 Termux 环境,请在 Termux 中运行"
|
err "未检测到 Termux 环境,请在 Termux 中运行"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
info "Termux 环境检测通过"
|
info "Termux 环境检测通过"
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 步骤 2: 安装系统依赖 (python/nodejs/git)
|
||||||
|
# 说明: pkg install 自动跳过已安装的包,重复运行不会重新下载
|
||||||
|
# =============================================================================
|
||||||
step 2 $TOTAL "安装系统依赖"
|
step 2 $TOTAL "安装系统依赖"
|
||||||
# ──────────────────────────────────────────
|
LOG="$TMPDIR/pkg-install.log"
|
||||||
pkg install -y python nodejs git > /dev/null 2>&1
|
pkg install -y python nodejs git > "$LOG" 2>&1 &
|
||||||
info "python/nodejs/git 已安装"
|
SPIN $! "安装中" "$LOG"
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
step 3 $TOTAL "克隆项目"
|
# 步骤 3: 拉取/更新项目源码
|
||||||
# ──────────────────────────────────────────
|
# 说明: 已有 .git 目录 → git pull 增量更新 (保留 venv/.env/data)
|
||||||
if [ -d "$INSTALL_DIR" ]; then
|
# 没有 → git clone 全量下载
|
||||||
warn "检测到旧安装,清理中..."
|
# =============================================================================
|
||||||
rm -rf "$INSTALL_DIR"
|
step 3 $TOTAL "拉取/更新项目源码"
|
||||||
|
if [ -d "$INSTALL_DIR/.git" ]; then
|
||||||
|
LOG="$TMPDIR/git-pull.log"
|
||||||
|
(
|
||||||
|
cd "$INSTALL_DIR"
|
||||||
|
git fetch origin
|
||||||
|
git reset --hard origin/main 2>/dev/null || git reset --hard origin/master
|
||||||
|
) > "$LOG" 2>&1 &
|
||||||
|
SPIN $! "拉取中" "$LOG"
|
||||||
|
else
|
||||||
|
# 目录存在但不是 git 仓库,清理后重新克隆
|
||||||
|
if [ -d "$INSTALL_DIR" ]; then
|
||||||
|
rm -rf "$INSTALL_DIR"
|
||||||
|
fi
|
||||||
|
LOG="$TMPDIR/git-clone.log"
|
||||||
|
git clone "$REPO" "$INSTALL_DIR" > "$LOG" 2>&1 &
|
||||||
|
SPIN $! "克隆中" "$LOG"
|
||||||
fi
|
fi
|
||||||
git clone "$REPO" "$INSTALL_DIR"
|
|
||||||
info "项目已就位: $INSTALL_DIR"
|
|
||||||
|
|
||||||
BACKEND="$INSTALL_DIR/backend"
|
BACKEND="$INSTALL_DIR/backend"
|
||||||
FRONTEND="$INSTALL_DIR/frontend"
|
FRONTEND="$INSTALL_DIR/frontend"
|
||||||
PYTHON="$BACKEND/venv/bin/python"
|
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 步骤 4: 应用 Termux 兼容补丁
|
||||||
|
# 说明: Termux 不支持 chromadb/sentence-transformers,需要修补代码避免崩溃
|
||||||
|
# 4a. memory_service.py — import 改为 try/except,缺失时优雅降级
|
||||||
|
# 4b. API 文件 — memory_service 导入改为 try/except
|
||||||
|
# 4c. .env — 已有则跳过,新建则写入默认配置
|
||||||
|
# =============================================================================
|
||||||
step 4 $TOTAL "应用 Termux 补丁"
|
step 4 $TOTAL "应用 Termux 补丁"
|
||||||
# ──────────────────────────────────────────
|
LOG="$TMPDIR/patch.log"
|
||||||
|
(
|
||||||
# 4a. Patch memory_service.py - 让 chromadb/sentence_transformers 缺失不崩溃
|
# ── 4a. 修补 memory_service.py ──────────────────────────────────────────────
|
||||||
MEM_FILE="$BACKEND/app/services/memory_service.py"
|
python3 << 'PYEOF'
|
||||||
python3 << PYEOF
|
|
||||||
import os
|
import os
|
||||||
f = os.path.expanduser("~/MuMuAINovel/backend/app/services/memory_service.py")
|
f = os.path.expanduser("~/MuMuAINovel/backend/app/services/memory_service.py")
|
||||||
with open(f) as fh:
|
with open(f) as fh:
|
||||||
c = fh.read()
|
c = fh.read()
|
||||||
|
|
||||||
# 替换顶层 import
|
# 顶层 import 改为 try/except
|
||||||
c = c.replace(
|
c = c.replace(
|
||||||
"import chromadb\nfrom sentence_transformers import SentenceTransformer",
|
"import chromadb\\nfrom sentence_transformers import SentenceTransformer",
|
||||||
"""try:
|
"""try:
|
||||||
import chromadb
|
import chromadb
|
||||||
from sentence_transformers import SentenceTransformer
|
from sentence_transformers import SentenceTransformer
|
||||||
@@ -83,36 +135,17 @@ except ImportError:
|
|||||||
SentenceTransformer = None"""
|
SentenceTransformer = None"""
|
||||||
)
|
)
|
||||||
|
|
||||||
# 在 __init__ 的 _initialized 检查后加 MEMORY_AVAILABLE 保护
|
# __init__ 中加 MEMORY_AVAILABLE 检查,缺失时直接 return 不初始化
|
||||||
old_init = """ def __init__(self):
|
old_init = ' def __init__(self):\n \\\"\\\"\\\"初始化ChromaDB和Embedding模型\\\"\\\"\\\"\n if self._initialized:\n return\n \n try:'
|
||||||
\"\"\"初始化ChromaDB和Embedding模型\"\"\"
|
new_init = ' def __init__(self):\n \\\"\\\"\\\"初始化ChromaDB和Embedding模型\\\"\\\"\\\"\n if self._initialized:\n return\n\n if not MEMORY_AVAILABLE:\n self.client = None\n self.model = None\n self.collection = None\n self._initialized = True\n logger.warning("⚠️ 向量记忆功能不可用(缺少 chromadb/sentence-transformers)")\n return\n\n try:'
|
||||||
if self._initialized:
|
|
||||||
return
|
|
||||||
|
|
||||||
try:"""
|
|
||||||
new_init = """ def __init__(self):
|
|
||||||
\"\"\"初始化ChromaDB和Embedding模型\"\"\"
|
|
||||||
if self._initialized:
|
|
||||||
return
|
|
||||||
|
|
||||||
if not MEMORY_AVAILABLE:
|
|
||||||
self.client = None
|
|
||||||
self.model = None
|
|
||||||
self.collection = None
|
|
||||||
self._initialized = True
|
|
||||||
logger.warning("⚠️ 向量记忆功能不可用(缺少 chromadb/sentence-transformers)")
|
|
||||||
return
|
|
||||||
|
|
||||||
try:"""
|
|
||||||
c = c.replace(old_init, new_init, 1)
|
c = c.replace(old_init, new_init, 1)
|
||||||
|
|
||||||
with open(f, "w") as fh:
|
with open(f, "w") as fh:
|
||||||
fh.write(c)
|
fh.write(c)
|
||||||
print(" ✅ memory_service.py 已修补")
|
print(" ✅ memory_service.py 已修补")
|
||||||
PYEOF
|
PYEOF
|
||||||
info "memory_service.py 已修补"
|
|
||||||
|
|
||||||
# 4b. Patch API files - memory_service 导入改为 try/except
|
# ── 4b. 修补 API 文件的 memory_service 导入 ──────────────────────────────────
|
||||||
python3 << 'PYEOF'
|
python3 << 'PYEOF'
|
||||||
import os
|
import os
|
||||||
home = os.path.expanduser("~")
|
home = os.path.expanduser("~")
|
||||||
@@ -135,10 +168,10 @@ for f in files:
|
|||||||
count += 1
|
count += 1
|
||||||
print(f" ✅ API 文件已修补({count} 个)")
|
print(f" ✅ API 文件已修补({count} 个)")
|
||||||
PYEOF
|
PYEOF
|
||||||
info "API 文件已修补"
|
|
||||||
|
|
||||||
# 4c. 创建 .env
|
# ── 4c. 创建 .env 配置文件 (已有则跳过) ─────────────────────────────────────
|
||||||
mkdir -p "$DATA_DIR" "$LOG_DIR"
|
mkdir -p "$DATA_DIR" "$LOG_DIR"
|
||||||
|
if [ ! -f "$BACKEND/.env" ]; then
|
||||||
cat > "$BACKEND/.env" << 'ENVEOF'
|
cat > "$BACKEND/.env" << 'ENVEOF'
|
||||||
# MuMuAINovel Termux 配置
|
# MuMuAINovel Termux 配置
|
||||||
APP_NAME=MuMuAINovel
|
APP_NAME=MuMuAINovel
|
||||||
@@ -161,7 +194,7 @@ LOG_BACKUP_COUNT=5
|
|||||||
CORS_ORIGINS=["http://localhost:8000","http://127.0.0.1:8000"]
|
CORS_ORIGINS=["http://localhost:8000","http://127.0.0.1:8000"]
|
||||||
|
|
||||||
# ⚠️ 请填入你的 API Key
|
# ⚠️ 请填入你的 API Key
|
||||||
OPENAI_API_KEY=sk-your-key-here
|
OPENAI_API_KEY=***
|
||||||
OPENAI_BASE_URL=https://api.openai.com/v1
|
OPENAI_BASE_URL=https://api.openai.com/v1
|
||||||
|
|
||||||
DEFAULT_AI_PROVIDER=openai
|
DEFAULT_AI_PROVIDER=openai
|
||||||
@@ -170,27 +203,33 @@ DEFAULT_TEMPERATURE=0.7
|
|||||||
DEFAULT_MAX_TOKENS=4096
|
DEFAULT_MAX_TOKENS=4096
|
||||||
|
|
||||||
# 本地登录账号
|
# 本地登录账号
|
||||||
|
LOCAL_AUTH_ENABLED=True
|
||||||
LOCAL_AUTH_USERNAME=admin
|
LOCAL_AUTH_USERNAME=admin
|
||||||
LOCAL_AUTH_PASSWORD=admin123
|
LOCAL_AUTH_PASSWORD=admin123
|
||||||
LOCAL_AUTH_DISPLAY_NAME=管理员
|
LOCAL_AUTH_DISPLAY_NAME=Admin
|
||||||
ENVEOF
|
ENVEOF
|
||||||
|
# 替换占位符路径为实际 $HOME 路径
|
||||||
# 修正 DATABASE_URL 路径(替换占位符为实际路径)
|
|
||||||
sed -i "s|/data/data/com.termux/files/home|$HOME|g" "$BACKEND/.env"
|
sed -i "s|/data/data/com.termux/files/home|$HOME|g" "$BACKEND/.env"
|
||||||
sed -i "s|LOG_FILE_PATH=.*|LOG_FILE_PATH=$LOG_DIR/app.log|" "$BACKEND/.env"
|
sed -i "s|LOG_FILE_PATH=.*|LOG_FILE_PATH=$LOG_DIR/app.log|" "$BACKEND/.env"
|
||||||
info ".env 已创建(SQLite + admin/admin123)"
|
echo " ✅ .env 已创建"
|
||||||
|
else
|
||||||
|
echo " ✅ .env 已存在,跳过"
|
||||||
|
fi
|
||||||
|
) > "$LOG" 2>&1 &
|
||||||
|
SPIN $! "修补中" "$LOG"
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
|
||||||
|
# =============================================================================
|
||||||
|
# 步骤 5: 安装 Python 依赖
|
||||||
|
# 说明: venv 不存在则创建;pip 自动跳过已安装的包,只安装新增的
|
||||||
|
# =============================================================================
|
||||||
step 5 $TOTAL "安装 Python 依赖"
|
step 5 $TOTAL "安装 Python 依赖"
|
||||||
# ──────────────────────────────────────────
|
|
||||||
if [ ! -d "$BACKEND/venv" ]; then
|
if [ ! -d "$BACKEND/venv" ]; then
|
||||||
python -m venv "$BACKEND/venv"
|
python -m venv "$BACKEND/venv"
|
||||||
fi
|
fi
|
||||||
PIP="$BACKEND/venv/bin/pip"
|
PIP="$BACKEND/venv/bin/pip"
|
||||||
|
|
||||||
$PIP install --upgrade pip setuptools wheel -q
|
# 写入精简依赖列表 (不含 Termux 不兼容的 psutil/chromadb/sentence-transformers)
|
||||||
|
|
||||||
# 精简依赖(跳过 Termux 不兼容的包)
|
|
||||||
cat > "$BACKEND/requirements-lite.txt" << 'REQEOF'
|
cat > "$BACKEND/requirements-lite.txt" << 'REQEOF'
|
||||||
fastapi==0.121.0
|
fastapi==0.121.0
|
||||||
uvicorn==0.38.0
|
uvicorn==0.38.0
|
||||||
@@ -209,45 +248,56 @@ mcp==1.22.0
|
|||||||
greenlet>=3.0
|
greenlet>=3.0
|
||||||
REQEOF
|
REQEOF
|
||||||
|
|
||||||
$PIP install -r "$BACKEND/requirements-lite.txt" -q
|
LOG="$TMPDIR/pip-install.log"
|
||||||
info "Python 依赖已安装"
|
(
|
||||||
|
$PIP install --upgrade pip setuptools wheel -q $MIRROR
|
||||||
|
$PIP install -r "$BACKEND/requirements-lite.txt" $MIRROR
|
||||||
|
) > "$LOG" 2>&1 &
|
||||||
|
SPIN $! "安装中" "$LOG"
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 步骤 6: 数据库迁移
|
||||||
|
# 说明: 首次安装创建所有表;重复运行自动跳过已执行的迁移
|
||||||
|
# =============================================================================
|
||||||
step 6 $TOTAL "数据库迁移"
|
step 6 $TOTAL "数据库迁移"
|
||||||
# ──────────────────────────────────────────
|
|
||||||
export DATABASE_URL="sqlite+aiosqlite:///$DATA_DIR/ai_story.db"
|
export DATABASE_URL="sqlite+aiosqlite:///$DATA_DIR/ai_story.db"
|
||||||
cd "$BACKEND"
|
LOG="$TMPDIR/alembic.log"
|
||||||
"$BACKEND/venv/bin/python" -m alembic -c alembic-sqlite.ini upgrade head || {
|
(
|
||||||
warn "alembic 迁移失败,尝试修复后重试..."
|
cd "$BACKEND"
|
||||||
"$BACKEND/venv/bin/pip" install --force-reinstall alembic==1.14.0 -q
|
"$BACKEND/venv/bin/python" -m alembic -c alembic-sqlite.ini upgrade head
|
||||||
"$BACKEND/venv/bin/python" -m alembic -c alembic-sqlite.ini upgrade head || {
|
) > "$LOG" 2>&1 &
|
||||||
err "数据库迁移失败,请手动运行: cd $BACKEND && python -m alembic -c alembic-sqlite.ini upgrade head"
|
SPIN $! "迁移中" "$LOG"
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
info "SQLite 数据库已初始化"
|
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 步骤 7: 安装前端依赖
|
||||||
|
# 说明: node_modules 已存在则跳过;首次运行 npm install
|
||||||
|
# =============================================================================
|
||||||
step 7 $TOTAL "安装前端依赖"
|
step 7 $TOTAL "安装前端依赖"
|
||||||
# ──────────────────────────────────────────
|
|
||||||
cd "$FRONTEND"
|
cd "$FRONTEND"
|
||||||
npm install --include=dev
|
if [ -d "node_modules" ] && [ -f "node_modules/.package-lock.json" ]; then
|
||||||
info "前端依赖已安装"
|
info "前端依赖已安装,跳过"
|
||||||
|
else
|
||||||
|
LOG="$TMPDIR/npm-install.log"
|
||||||
|
npm install --include=dev --loglevel=silent > "$LOG" 2>&1 &
|
||||||
|
SPIN $! "安装中" "$LOG"
|
||||||
|
fi
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 步骤 8: 构建前端
|
||||||
|
# 说明: 每次都重新构建,确保最新代码生效
|
||||||
|
# =============================================================================
|
||||||
step 8 $TOTAL "构建前端"
|
step 8 $TOTAL "构建前端"
|
||||||
# ──────────────────────────────────────────
|
node "$FRONTEND/node_modules/typescript/bin/tsc" -b 2>/dev/null || true
|
||||||
# Termux 下 npm 的符号链接可能失效,用 node 直接调用
|
LOG="$TMPDIR/vite-build.log"
|
||||||
node "$FRONTEND/node_modules/typescript/bin/tsc" -b 2>/dev/null || warn "TypeScript 有类型警告(已跳过)"
|
node "$FRONTEND/node_modules/vite/bin/vite.js" build > "$LOG" 2>&1 &
|
||||||
node "$FRONTEND/node_modules/vite/bin/vite.js" build || {
|
SPIN $! "构建中" "$LOG"
|
||||||
err "前端构建失败"
|
grep -E "built in" "$LOG" | sed 's/^/ /'
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
info "前端已构建 → $BACKEND/static/"
|
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 步骤 9: 创建启动脚本
|
||||||
|
# 说明: 生成 ~/mumuainovel-start.sh,支持前台/后台运行
|
||||||
|
# =============================================================================
|
||||||
step 9 $TOTAL "创建启动脚本"
|
step 9 $TOTAL "创建启动脚本"
|
||||||
# ──────────────────────────────────────────
|
|
||||||
cat > "$HOME/mumuainovel-start.sh" << STARTEOF
|
cat > "$HOME/mumuainovel-start.sh" << STARTEOF
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# MuMuAINovel Termux 启动脚本
|
# MuMuAINovel Termux 启动脚本
|
||||||
@@ -282,7 +332,9 @@ STARTEOF
|
|||||||
chmod +x "$HOME/mumuainovel-start.sh"
|
chmod +x "$HOME/mumuainovel-start.sh"
|
||||||
info "启动脚本已创建: ~/mumuainovel-start.sh"
|
info "启动脚本已创建: ~/mumuainovel-start.sh"
|
||||||
|
|
||||||
# ──────────────────────────────────────────
|
# =============================================================================
|
||||||
|
# 安装完成
|
||||||
|
# =============================================================================
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${GREEN}╔══════════════════════════════════════════════╗${NC}"
|
echo -e "${GREEN}╔══════════════════════════════════════════════╗${NC}"
|
||||||
echo -e "${GREEN}║ 🎉 MuMuAINovel 安装完成! ║${NC}"
|
echo -e "${GREEN}║ 🎉 MuMuAINovel 安装完成! ║${NC}"
|
||||||
@@ -295,7 +347,7 @@ echo -e "${GREEN}║ 后台运行: ║${NC}"
|
|||||||
echo -e "${GREEN}║ bash ~/mumuainovel-start.sh --bg ║${NC}"
|
echo -e "${GREEN}║ bash ~/mumuainovel-start.sh --bg ║${NC}"
|
||||||
echo -e "${GREEN}║ ║${NC}"
|
echo -e "${GREEN}║ ║${NC}"
|
||||||
echo -e "${GREEN}║ 停止后台: ║${NC}"
|
echo -e "${GREEN}║ 停止后台: ║${NC}"
|
||||||
echo -e "${GREEN}║ kill \\\$(cat ~/mumuainovel.pid) ║${NC}"
|
echo -e "${GREEN}║ kill \$(cat ~/mumuainovel.pid) ║${NC}"
|
||||||
echo -e "${GREEN}║ ║${NC}"
|
echo -e "${GREEN}║ ║${NC}"
|
||||||
echo -e "${GREEN}║ 查看日志: ║${NC}"
|
echo -e "${GREEN}║ 查看日志: ║${NC}"
|
||||||
echo -e "${GREEN}║ tail -f ~/mumuainovel/logs/app.log ║${NC}"
|
echo -e "${GREEN}║ tail -f ~/mumuainovel/logs/app.log ║${NC}"
|
||||||
|
|||||||
Reference in New Issue
Block a user