-
Notifications
You must be signed in to change notification settings - Fork 8.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2317 from 6vision/master
feat: add install.sh and run.sh
- Loading branch information
Showing
2 changed files
with
201 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,192 @@ | ||
#!/usr/bin/env bash | ||
set -e | ||
|
||
# 颜色定义 | ||
RED='\033[0;31m' # 红色 | ||
GREEN='\033[0;32m' # 绿色 | ||
YELLOW='\033[0;33m' # 黄色 | ||
BLUE='\033[0;34m' # 蓝色 | ||
NC='\033[0m' # 无颜色 | ||
|
||
# 获取当前脚本的目录 | ||
export BASE_DIR=$(cd "$(dirname "$0")"; pwd) | ||
echo -e "${GREEN}📁 BASE_DIR: ${BASE_DIR}${NC}" | ||
|
||
# 检查 config.json 文件是否存在 | ||
check_config_file() { | ||
if [ ! -f "${BASE_DIR}/config.json" ]; then | ||
echo -e "${RED}❌ 错误:未找到 config.json 文件。请确保 config.json 存在于当前目录。${NC}" | ||
exit 1 | ||
fi | ||
} | ||
|
||
# 检查 Python 版本是否大于等于 3.7,并检查 pip 是否可用 | ||
check_python_version() { | ||
if ! command -v python3 &> /dev/null; then | ||
echo -e "${RED}❌ 错误:未找到 Python3。请安装 Python 3.7 或以上版本。${NC}" | ||
exit 1 | ||
fi | ||
|
||
PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")') | ||
PYTHON_MAJOR=$(echo "$PYTHON_VERSION" | cut -d'.' -f1) | ||
PYTHON_MINOR=$(echo "$PYTHON_VERSION" | cut -d'.' -f2) | ||
|
||
if (( PYTHON_MAJOR < 3 || (PYTHON_MAJOR == 3 && PYTHON_MINOR < 7) )); then | ||
echo -e "${RED}❌ 错误:Python 版本为 ${PYTHON_VERSION}。请安装 Python 3.7 或以上版本。${NC}" | ||
exit 1 | ||
fi | ||
|
||
if ! python3 -m pip --version &> /dev/null; then | ||
echo -e "${RED}❌ 错误:未找到 pip。请安装 pip。${NC}" | ||
exit 1 | ||
fi | ||
} | ||
|
||
# 检查并安装缺失的依赖 | ||
install_dependencies() { | ||
echo -e "${YELLOW}⏳ 正在安装依赖...${NC}" | ||
|
||
if [ ! -f "${BASE_DIR}/requirements.txt" ]; then | ||
echo -e "${RED}❌ 错误:未找到 requirements.txt 文件。${NC}" | ||
exit 1 | ||
fi | ||
|
||
# 安装 requirements.txt 中的依赖,使用清华大学的 PyPI 镜像 | ||
pip3 install -r "${BASE_DIR}/requirements.txt" -i https://pypi.tuna.tsinghua.edu.cn/simple | ||
|
||
# 处理 requirements-optional.txt(如果存在) | ||
if [ -f "${BASE_DIR}/requirements-optional.txt" ]; then | ||
echo -e "${YELLOW}⏳ 正在安装可选的依赖...${NC}" | ||
pip3 install -r "${BASE_DIR}/requirements-optional.txt" -i https://pypi.tuna.tsinghua.edu.cn/simple | ||
fi | ||
} | ||
|
||
# 启动项目 | ||
run_project() { | ||
echo -e "${GREEN}🚀 准备启动项目...${NC}" | ||
cd "${BASE_DIR}" | ||
sleep 2 | ||
|
||
|
||
# 判断操作系统类型 | ||
OS_TYPE=$(uname) | ||
|
||
if [[ "$OS_TYPE" == "Linux" ]]; then | ||
# 在 Linux 上使用 setsid | ||
setsid python3 "${BASE_DIR}/app.py" > "${BASE_DIR}/nohup.out" 2>&1 & | ||
echo -e "${GREEN}🚀 正在启动 ChatGPT-on-WeChat (Linux)...${NC}" | ||
elif [[ "$OS_TYPE" == "Darwin" ]]; then | ||
# 在 macOS 上直接运行 | ||
python3 "${BASE_DIR}/app.py" > "${BASE_DIR}/nohup.out" 2>&1 & | ||
echo -e "${GREEN}🚀 正在启动 ChatGPT-on-WeChat (macOS)...${NC}" | ||
else | ||
echo -e "${RED}❌ 错误:不支持的操作系统 ${OS_TYPE}。${NC}" | ||
exit 1 | ||
fi | ||
|
||
sleep 2 | ||
# 显示日志输出,供用户扫码 | ||
tail -n 30 -f "${BASE_DIR}/nohup.out" | ||
|
||
} | ||
# 更新项目 | ||
update_project() { | ||
echo -e "${GREEN}🔄 准备更新项目,现在停止项目...${NC}" | ||
cd "${BASE_DIR}" | ||
|
||
# 停止项目 | ||
stop_project | ||
echo -e "${GREEN}🔄 开始更新项目...${NC}" | ||
# 更新代码,从 git 仓库拉取最新代码 | ||
if [ -d .git ]; then | ||
GIT_PULL_OUTPUT=$(git pull) | ||
if [ $? -eq 0 ]; then | ||
if [[ "$GIT_PULL_OUTPUT" == *"Already up to date."* ]]; then | ||
echo -e "${GREEN}✅ 代码已经是最新的。${NC}" | ||
else | ||
echo -e "${GREEN}✅ 代码更新完成。${NC}" | ||
fi | ||
else | ||
echo -e "${YELLOW}⚠️ 从 GitHub 更新失败,尝试切换到 Gitee 仓库...${NC}" | ||
# 更改远程仓库为 Gitee | ||
git remote set-url origin https://gitee.com/zhayujie/chatgpt-on-wechat.git | ||
GIT_PULL_OUTPUT=$(git pull) | ||
if [ $? -eq 0 ]; then | ||
if [[ "$GIT_PULL_OUTPUT" == *"Already up to date."* ]]; then | ||
echo -e "${GREEN}✅ 代码已经是最新的。${NC}" | ||
else | ||
echo -e "${GREEN}✅ 从 Gitee 更新成功。${NC}" | ||
fi | ||
else | ||
echo -e "${RED}❌ 错误:从 Gitee 更新仍然失败,请检查网络连接。${NC}" | ||
exit 1 | ||
fi | ||
fi | ||
else | ||
echo -e "${RED}❌ 错误:当前目录不是 git 仓库,无法更新代码。${NC}" | ||
exit 1 | ||
fi | ||
|
||
# 安装依赖 | ||
install_dependencies | ||
|
||
# 启动项目 | ||
run_project | ||
} | ||
|
||
# 停止项目 | ||
stop_project() { | ||
echo -e "${GREEN}🛑 正在停止项目...${NC}" | ||
cd "${BASE_DIR}" | ||
pid=$(ps ax | grep -i app.py | grep "${BASE_DIR}" | grep python3 | grep -v grep | awk '{print $1}') | ||
if [ -z "$pid" ] ; then | ||
echo -e "${YELLOW}⚠️ 未找到正在运行的 ChatGPT-on-WeChat。${NC}" | ||
return | ||
fi | ||
|
||
echo -e "${GREEN}🛑 正在运行的 ChatGPT-on-WeChat (PID: ${pid})${NC}" | ||
|
||
kill ${pid} | ||
sleep 3 | ||
|
||
if ps -p $pid > /dev/null; then | ||
echo -e "${YELLOW}⚠️ 进程未停止,尝试强制终止...${NC}" | ||
kill -9 ${pid} | ||
fi | ||
|
||
echo -e "${GREEN}✅ 已停止 ChatGPT-on-WeChat (PID: ${pid})${NC}" | ||
} | ||
|
||
# 主函数,根据用户参数执行操作 | ||
case "$1" in | ||
start) | ||
check_config_file | ||
check_python_version | ||
run_project | ||
;; | ||
stop) | ||
stop_project | ||
;; | ||
restart) | ||
stop_project | ||
check_config_file | ||
check_python_version | ||
run_project | ||
;; | ||
update) | ||
check_config_file | ||
check_python_version | ||
update_project | ||
;; | ||
*) | ||
echo -e "${YELLOW}=========================================${NC}" | ||
echo -e "${YELLOW}用法:${GREEN}$0 ${BLUE}{start|stop|restart|update}${NC}" | ||
echo -e "${YELLOW}示例:${NC}" | ||
echo -e " ${GREEN}$0 ${BLUE}start${NC}" | ||
echo -e " ${GREEN}$0 ${BLUE}stop${NC}" | ||
echo -e " ${GREEN}$0 ${BLUE}restart${NC}" | ||
echo -e " ${GREEN}$0 ${BLUE}update${NC}" | ||
echo -e "${YELLOW}=========================================${NC}" | ||
exit 1 | ||
;; | ||
esac |