-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdeploy.sh
More file actions
executable file
·224 lines (192 loc) · 7.47 KB
/
deploy.sh
File metadata and controls
executable file
·224 lines (192 loc) · 7.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#!/bin/bash
# 快速部署脚本 - 用于服务器部署
# 使用方法:bash deploy.sh
echo "🚀 开始部署 Email Forward 系统..."
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 检查 Node.js
if ! command -v node &> /dev/null; then
echo -e "${RED}❌ 未检测到 Node.js${NC}"
echo -e "${YELLOW}是否需要自动安装 Node.js 20 LTS?(y/n)${NC}"
read -r INSTALL_NODE
if [[ "$INSTALL_NODE" =~ ^[Yy]$ ]]; then
echo -e "${GREEN}📦 开始安装 Node.js 20 LTS...${NC}"
# 检测操作系统
if [ -f /etc/debian_version ]; then
# Debian/Ubuntu
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
elif [ -f /etc/redhat-release ]; then
# CentOS/RHEL
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs
else
echo -e "${RED}❌ 未识别的操作系统,请手动安装 Node.js 18+${NC}"
echo -e "${YELLOW}访问: https://nodejs.org/${NC}"
exit 1
fi
# 验证安装
if ! command -v node &> /dev/null; then
echo -e "${RED}❌ Node.js 安装失败${NC}"
exit 1
fi
echo -e "${GREEN}✅ Node.js 安装成功: $(node -v)${NC}"
else
echo -e "${YELLOW}请手动安装 Node.js 18+ 后重新运行此脚本${NC}"
echo -e "${YELLOW}访问: https://nodejs.org/${NC}"
exit 1
fi
fi
NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
if [ "$NODE_VERSION" -lt 18 ]; then
echo -e "${RED}❌ Node.js 版本过低 (当前: $(node -v)),需要 18+${NC}"
echo -e "${YELLOW}是否需要升级到 Node.js 20 LTS?(y/n)${NC}"
read -r UPGRADE_NODE
if [[ "$UPGRADE_NODE" =~ ^[Yy]$ ]]; then
echo -e "${GREEN}📦 开始升级 Node.js...${NC}"
# 检测操作系统
if [ -f /etc/debian_version ]; then
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
elif [ -f /etc/redhat-release ]; then
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo yum install -y nodejs
else
echo -e "${RED}❌ 未识别的操作系统,请手动升级 Node.js${NC}"
exit 1
fi
echo -e "${GREEN}✅ Node.js 升级成功: $(node -v)${NC}"
else
echo -e "${YELLOW}请手动升级 Node.js 到 18+ 后重新运行此脚本${NC}"
exit 1
fi
fi
echo -e "${GREEN}✅ Node.js 版本检查通过: $(node -v)${NC}"
# 检查 .env.local 文件
if [ ! -f ".env.local" ]; then
echo -e "${YELLOW}⚠️ 未找到 .env.local 文件,正在创建...${NC}"
cat > .env.local << 'EOF'
# 管理员密码(明文,系统会自动加密)
ADMIN_PASSWORD=admin123
# Webhook API 密钥(与 Cloudflare Worker 保持一致)
WEBHOOK_API_KEY=Gk1NGvD8QhuxOQ//5yNdrmrkg8+2UFweMGY5BYLjGkU=
# 服务器端口
PORT=3303
# Web 应用访问 URL(用于 Cloudflare Worker 配置)
WEB_APP_URL=http://your-server-ip:3303
# 数据库路径
DATABASE_PATH=./emails.db
# 调试模式
DEBUG=false
EOF
echo -e "${GREEN}✅ .env.local 文件已创建${NC}"
echo -e "${YELLOW}⚠️ 默认密码: admin123,请在 .env.local 中修改 ADMIN_PASSWORD${NC}"
else
echo -e "${GREEN}✅ .env.local 文件已存在${NC}"
fi
# 从 .env.local 加载环境变量到当前 shell
if [ -f ".env.local" ]; then
export $(grep -v '^#' .env.local | xargs)
echo -e "${GREEN}✅ 环境变量已加载 (PORT=${PORT:-3000})${NC}"
fi
# 更新 Cloudflare Worker 配置中的 URL 和 API Key
if [ -f "cloudflare-worker.js" ]; then
echo -e "${YELLOW}🔧 正在更新 Cloudflare Worker 配置...${NC}"
# 备份原文件
cp cloudflare-worker.js cloudflare-worker.js.bak 2>/dev/null
# 替换默认 URL
if [ -n "${WEB_APP_URL}" ]; then
sed -i.tmp "s|http://your-server-ip:3303|${WEB_APP_URL}|g" cloudflare-worker.js && rm cloudflare-worker.js.tmp 2>/dev/null || true
echo -e "${GREEN}✅ Worker URL 已更新为: ${WEB_APP_URL}${NC}"
fi
# 替换默认 API Key
if [ -n "${WEBHOOK_API_KEY}" ]; then
sed -i.tmp "s|your-webhook-api-key-here|${WEBHOOK_API_KEY}|g" cloudflare-worker.js && rm cloudflare-worker.js.tmp 2>/dev/null || true
echo -e "${GREEN}✅ Worker API Key 已更新${NC}"
fi
fi
# 安装依赖
echo -e "${YELLOW}📦 正在安装依赖...${NC}"
if npm install; then
echo -e "${GREEN}✅ 依赖安装成功${NC}"
else
echo -e "${RED}❌ 依赖安装失败${NC}"
exit 1
fi
# 初始化数据库
if [ ! -f "emails.db" ]; then
echo -e "${YELLOW}🗄️ 正在初始化数据库...${NC}"
if node scripts/addRule.js; then
echo -e "${GREEN}✅ 数据库初始化成功${NC}"
else
echo -e "${RED}❌ 数据库初始化失败${NC}"
exit 1
fi
else
echo -e "${GREEN}✅ 数据库已存在${NC}"
fi
# 构建项目
echo -e "${YELLOW}🔨 正在构建项目...${NC}"
if npm run build; then
echo -e "${GREEN}✅ 项目构建成功${NC}"
else
echo -e "${RED}❌ 项目构建失败${NC}"
exit 1
fi
# 检查 PM2
if command -v pm2 &> /dev/null; then
echo -e "${GREEN}✅ 检测到 PM2${NC}"
# 停止旧进程
pm2 stop email-forward 2>/dev/null
pm2 delete email-forward 2>/dev/null
# 启动新进程
echo -e "${YELLOW}🚀 正在启动服务 (PM2) 端口: ${PORT:-3000}...${NC}"
if PORT=${PORT:-3303} pm2 start npm --name "email-forward" --update-env -- start; then
pm2 save
echo -e "${GREEN}✅ 服务启动成功!${NC}"
echo ""
echo -e "${GREEN}📊 查看状态: pm2 status${NC}"
echo -e "${GREEN}📝 查看日志: pm2 logs email-forward${NC}"
echo -e "${GREEN}🔄 重启服务: pm2 restart email-forward${NC}"
echo ""
pm2 status
else
echo -e "${RED}❌ 服务启动失败${NC}"
exit 1
fi
else
echo -e "${YELLOW}⚠️ 未检测到 PM2,使用 npm start 启动...${NC}"
echo -e "${YELLOW}💡 建议安装 PM2 以便更好地管理进程: npm install -g pm2${NC}"
echo ""
echo -e "${GREEN}🚀 启动服务 (端口: ${PORT:-3000})...${NC}"
echo -e "${YELLOW}提示: 按 Ctrl+C 停止服务${NC}"
PORT=${PORT:-3303} npm start
fi
echo ""
echo -e "${GREEN}🎉 部署完成!${NC}"
echo ""
echo -e "${GREEN}📍 访问地址:${NC}"
echo -e " 本地: http://localhost:${PORT:-3303}"
# 获取外网 IP
EXTERNAL_IP=$(curl -s ifconfig.me 2>/dev/null || curl -s icanhazip.com 2>/dev/null || echo "无法获取")
if [ "$EXTERNAL_IP" != "无法获取" ]; then
echo -e " 外网: http://${EXTERNAL_IP}:${PORT:-3303}"
fi
# 如果配置了自定义域名
if [ -n "${WEB_APP_URL}" ] && [ "${WEB_APP_URL}" != "http://your-server-ip:3303" ]; then
echo -e " 自定义: ${WEB_APP_URL}"
fi
echo ""
echo -e "${GREEN}🔑 登录密码: ${ADMIN_PASSWORD:-admin123}${NC}"
echo -e "${GREEN}🔐 API 密钥: ${WEBHOOK_API_KEY}${NC}"
echo ""
echo -e "${YELLOW}📝 配置 Cloudflare Worker:${NC}"
echo -e " 1. 复制 cloudflare-worker.js 内容到 Cloudflare Worker"
echo -e " 2. 设置环境变量:"
echo -e " - WEB_APP_URL: ${WEB_APP_URL:-http://${EXTERNAL_IP}:${PORT:-3303}}"
echo -e " - WEBHOOK_API_KEY: ${WEBHOOK_API_KEY}"
echo ""
echo -e "${YELLOW}💡 提示: cloudflare-worker.js 中的默认 URL 已更新为你的配置${NC}"