1+ #! /usr/bin/env bash
2+ set -e
3+
4+ # 颜色定义
5+ RED=' \033[0;31m' # 红色
6+ GREEN=' \033[0;32m' # 绿色
7+ YELLOW=' \033[0;33m' # 黄色
8+ BLUE=' \033[0;34m' # 蓝色
9+ NC=' \033[0m' # 无颜色
10+
11+ # 获取当前脚本的目录
12+ export BASE_DIR=$( cd " $( dirname " $0 " ) " ; pwd)
13+ echo -e " ${GREEN} 📁 BASE_DIR: ${BASE_DIR}${NC} "
14+
15+ # 检查 config.json 文件是否存在
16+ check_config_file () {
17+ if [ ! -f " ${BASE_DIR} /config.json" ]; then
18+ echo -e " ${RED} ❌ 错误:未找到 config.json 文件。请确保 config.json 存在于当前目录。${NC} "
19+ exit 1
20+ fi
21+ }
22+
23+ # 检查 Python 版本是否大于等于 3.7,并检查 pip 是否可用
24+ check_python_version () {
25+ if ! command -v python3 & > /dev/null; then
26+ echo -e " ${RED} ❌ 错误:未找到 Python3。请安装 Python 3.7 或以上版本。${NC} "
27+ exit 1
28+ fi
29+
30+ PYTHON_VERSION=$( python3 -c ' import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")' )
31+ PYTHON_MAJOR=$( echo " $PYTHON_VERSION " | cut -d' .' -f1)
32+ PYTHON_MINOR=$( echo " $PYTHON_VERSION " | cut -d' .' -f2)
33+
34+ if (( PYTHON_MAJOR < 3 || (PYTHON_MAJOR == 3 && PYTHON_MINOR < 7 ) )) ; then
35+ echo -e " ${RED} ❌ 错误:Python 版本为 ${PYTHON_VERSION} 。请安装 Python 3.7 或以上版本。${NC} "
36+ exit 1
37+ fi
38+
39+ if ! python3 -m pip --version & > /dev/null; then
40+ echo -e " ${RED} ❌ 错误:未找到 pip。请安装 pip。${NC} "
41+ exit 1
42+ fi
43+ }
44+
45+ # 检查并安装缺失的依赖
46+ install_dependencies () {
47+ echo -e " ${YELLOW} ⏳ 正在安装依赖...${NC} "
48+
49+ if [ ! -f " ${BASE_DIR} /requirements.txt" ]; then
50+ echo -e " ${RED} ❌ 错误:未找到 requirements.txt 文件。${NC} "
51+ exit 1
52+ fi
53+
54+ # 安装 requirements.txt 中的依赖,使用清华大学的 PyPI 镜像
55+ pip3 install -r " ${BASE_DIR} /requirements.txt" -i https://pypi.tuna.tsinghua.edu.cn/simple
56+
57+ # 处理 requirements-optional.txt(如果存在)
58+ if [ -f " ${BASE_DIR} /requirements-optional.txt" ]; then
59+ echo -e " ${YELLOW} ⏳ 正在安装可选的依赖...${NC} "
60+ pip3 install -r " ${BASE_DIR} /requirements-optional.txt" -i https://pypi.tuna.tsinghua.edu.cn/simple
61+ fi
62+ }
63+
64+ # 启动项目
65+ run_project () {
66+ echo -e " ${GREEN} 🚀 准备启动项目...${NC} "
67+ cd " ${BASE_DIR} "
68+ sleep 2
69+
70+
71+ # 判断操作系统类型
72+ OS_TYPE=$( uname)
73+
74+ if [[ " $OS_TYPE " == " Linux" ]]; then
75+ # 在 Linux 上使用 setsid
76+ setsid python3 " ${BASE_DIR} /app.py" > " ${BASE_DIR} /nohup.out" 2>&1 &
77+ echo -e " ${GREEN} 🚀 正在启动 ChatGPT-on-WeChat (Linux)...${NC} "
78+ elif [[ " $OS_TYPE " == " Darwin" ]]; then
79+ # 在 macOS 上直接运行
80+ python3 " ${BASE_DIR} /app.py" > " ${BASE_DIR} /nohup.out" 2>&1 &
81+ echo -e " ${GREEN} 🚀 正在启动 ChatGPT-on-WeChat (macOS)...${NC} "
82+ else
83+ echo -e " ${RED} ❌ 错误:不支持的操作系统 ${OS_TYPE} 。${NC} "
84+ exit 1
85+ fi
86+
87+ sleep 2
88+ # 显示日志输出,供用户扫码
89+ tail -n 30 -f " ${BASE_DIR} /nohup.out"
90+
91+ }
92+ # 更新项目
93+ update_project () {
94+ echo -e " ${GREEN} 🔄 准备更新项目,现在停止项目...${NC} "
95+ cd " ${BASE_DIR} "
96+
97+ # 停止项目
98+ stop_project
99+ echo -e " ${GREEN} 🔄 开始更新项目...${NC} "
100+ # 更新代码,从 git 仓库拉取最新代码
101+ if [ -d .git ]; then
102+ GIT_PULL_OUTPUT=$( git pull)
103+ if [ $? -eq 0 ]; then
104+ if [[ " $GIT_PULL_OUTPUT " == * " Already up to date." * ]]; then
105+ echo -e " ${GREEN} ✅ 代码已经是最新的。${NC} "
106+ else
107+ echo -e " ${GREEN} ✅ 代码更新完成。${NC} "
108+ fi
109+ else
110+ echo -e " ${YELLOW} ⚠️ 从 GitHub 更新失败,尝试切换到 Gitee 仓库...${NC} "
111+ # 更改远程仓库为 Gitee
112+ git remote set-url origin https://gitee.com/zhayujie/chatgpt-on-wechat.git
113+ GIT_PULL_OUTPUT=$( git pull)
114+ if [ $? -eq 0 ]; then
115+ if [[ " $GIT_PULL_OUTPUT " == * " Already up to date." * ]]; then
116+ echo -e " ${GREEN} ✅ 代码已经是最新的。${NC} "
117+ else
118+ echo -e " ${GREEN} ✅ 从 Gitee 更新成功。${NC} "
119+ fi
120+ else
121+ echo -e " ${RED} ❌ 错误:从 Gitee 更新仍然失败,请检查网络连接。${NC} "
122+ exit 1
123+ fi
124+ fi
125+ else
126+ echo -e " ${RED} ❌ 错误:当前目录不是 git 仓库,无法更新代码。${NC} "
127+ exit 1
128+ fi
129+
130+ # 安装依赖
131+ install_dependencies
132+
133+ # 启动项目
134+ run_project
135+ }
136+
137+ # 停止项目
138+ stop_project () {
139+ echo -e " ${GREEN} 🛑 正在停止项目...${NC} "
140+ cd " ${BASE_DIR} "
141+ pid=$( ps ax | grep -i app.py | grep " ${BASE_DIR} " | grep python3 | grep -v grep | awk ' {print $1}' )
142+ if [ -z " $pid " ] ; then
143+ echo -e " ${YELLOW} ⚠️ 未找到正在运行的 ChatGPT-on-WeChat。${NC} "
144+ return
145+ fi
146+
147+ echo -e " ${GREEN} 🛑 正在运行的 ChatGPT-on-WeChat (PID: ${pid} )${NC} "
148+
149+ kill ${pid}
150+ sleep 3
151+
152+ if ps -p $pid > /dev/null; then
153+ echo -e " ${YELLOW} ⚠️ 进程未停止,尝试强制终止...${NC} "
154+ kill -9 ${pid}
155+ fi
156+
157+ echo -e " ${GREEN} ✅ 已停止 ChatGPT-on-WeChat (PID: ${pid} )${NC} "
158+ }
159+
160+ # 主函数,根据用户参数执行操作
161+ case " $1 " in
162+ start)
163+ check_config_file
164+ check_python_version
165+ run_project
166+ ;;
167+ stop)
168+ stop_project
169+ ;;
170+ restart)
171+ stop_project
172+ check_config_file
173+ check_python_version
174+ run_project
175+ ;;
176+ update)
177+ check_config_file
178+ check_python_version
179+ update_project
180+ ;;
181+ * )
182+ echo -e " ${YELLOW} =========================================${NC} "
183+ echo -e " ${YELLOW} 用法:${GREEN} $0 ${BLUE} {start|stop|restart|update}${NC} "
184+ echo -e " ${YELLOW} 示例:${NC} "
185+ echo -e " ${GREEN} $0 ${BLUE} start${NC} "
186+ echo -e " ${GREEN} $0 ${BLUE} stop${NC} "
187+ echo -e " ${GREEN} $0 ${BLUE} restart${NC} "
188+ echo -e " ${GREEN} $0 ${BLUE} update${NC} "
189+ echo -e " ${YELLOW} =========================================${NC} "
190+ exit 1
191+ ;;
192+ esac
0 commit comments