697 lines
15 KiB
Markdown
697 lines
15 KiB
Markdown
# 宝塔面板部署指南
|
||
|
||
> 阿美巴传统官网1.0 - 完整部署教程
|
||
|
||
---
|
||
|
||
## 一、环境要求
|
||
|
||
### 1.1 服务器配置
|
||
|
||
| 项目 | 最低要求 | 推荐配置 |
|
||
|------|---------|---------|
|
||
| 操作系统 | CentOS 7+ / Ubuntu 20+ | CentOS 8 / Ubuntu 22 |
|
||
| 内存 | 1GB | 2GB+ |
|
||
| 硬盘 | 20GB | 50GB+ |
|
||
| Node.js | 18.x | 20.x(better-sqlite3 需要可用的原生构建环境) |
|
||
|
||
### 1.2 宝塔面板安装
|
||
|
||
```bash
|
||
# CentOS
|
||
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh
|
||
|
||
# Ubuntu
|
||
wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
|
||
```
|
||
|
||
### 1.3 宝塔软件安装
|
||
|
||
登录宝塔面板后,在 **软件商店** 中安装:
|
||
|
||
| 软件 | 版本 | 用途 |
|
||
|------|------|------|
|
||
| **Nginx** | 1.24+ | Web服务器 |
|
||
| **PM2管理器** | 5.x | Node.js进程管理 |
|
||
| **Node.js版本管理器** | - | 安装Node.js 20 |
|
||
|
||
---
|
||
|
||
## 二、项目结构
|
||
|
||
### 2.1 本地项目结构
|
||
|
||
```
|
||
传统官网升级版/
|
||
├── dist/ ← 前端构建产物
|
||
├── cms/
|
||
│ ├── server/ ← CMS后端
|
||
│ │ ├── src/
|
||
│ │ ├── admin/dist/ ← 管理后台构建产物
|
||
│ │ ├── cms.db ← 数据库(运行后生成)
|
||
│ │ └── uploads/ ← 上传文件目录
|
||
│ └── admin/ ← 管理后台源码(不需要上传)
|
||
├── package.json
|
||
└── README.md
|
||
```
|
||
|
||
### 2.2 服务器目录结构
|
||
|
||
```
|
||
/www/wwwroot/aiameiba.com/
|
||
├── frontend/ ← 前端静态文件
|
||
│ ├── index.html
|
||
│ └── assets/
|
||
├── cms-server/ ← CMS后端
|
||
│ ├── src/
|
||
│ ├── admin/dist/ ← 管理后台
|
||
│ ├── node_modules/
|
||
│ ├── cms.db ← 数据库
|
||
│ └── uploads/ ← 上传文件
|
||
└── .env ← 环境变量(可选)
|
||
```
|
||
|
||
---
|
||
|
||
## 三、本地构建
|
||
|
||
### 3.1 安装依赖
|
||
|
||
```bash
|
||
# 前端
|
||
npm install
|
||
|
||
# CMS后端
|
||
cd cms/server
|
||
npm install
|
||
|
||
# 管理后台
|
||
cd cms/admin
|
||
npm install
|
||
```
|
||
|
||
### 3.2 构建前端
|
||
|
||
```bash
|
||
# 在项目根目录执行
|
||
npm run build
|
||
```
|
||
|
||
构建完成后会生成 `dist/` 文件夹。
|
||
|
||
### 3.3 构建管理后台
|
||
|
||
```bash
|
||
cd cms/admin
|
||
npm run build
|
||
```
|
||
|
||
构建完成后会在 `cms/admin/` 生成 `dist/` 文件夹。
|
||
|
||
### 3.4 初始化数据库(可选)
|
||
|
||
如果想在本地初始化测试数据:
|
||
|
||
```bash
|
||
cd cms/server
|
||
npm run seed
|
||
```
|
||
|
||
---
|
||
|
||
## 四、上传文件到服务器
|
||
|
||
### 4.1 使用宝塔文件管理器
|
||
|
||
1. 登录宝塔面板
|
||
2. 点击 **文件** 进入文件管理
|
||
3. 导航到 `/www/wwwroot/`
|
||
4. 创建目录 `aiameiba.com`
|
||
|
||
### 4.2 上传文件
|
||
|
||
| 本地路径 | 服务器路径 | 说明 |
|
||
|---------|-----------|------|
|
||
| `dist/*` | `/www/wwwroot/aiameiba.com/frontend/` | 前端所有文件 |
|
||
| `cms/server/*` | `/www/wwwroot/aiameiba.com/cms-server/` | 整个server目录 |
|
||
|
||
**注意**:
|
||
- `node_modules` 不需要上传,服务器上重新安装
|
||
- 不要把开发机数据库直接放进版本库;生产数据应通过备份恢复或在服务器初始化
|
||
|
||
### 4.3 使用 SCP 命令上传(可选)
|
||
|
||
```bash
|
||
# 上传前端
|
||
scp -r dist/* root@your-server-ip:/www/wwwroot/aiameiba.com/frontend/
|
||
|
||
# 上传CMS后端
|
||
scp -r cms/server root@your-server-ip:/www/wwwroot/aiameiba.com/cms-server/
|
||
```
|
||
|
||
---
|
||
|
||
## 五、服务器配置
|
||
|
||
### 5.1 安装 Node.js
|
||
|
||
1. 在宝塔面板打开 **Node.js版本管理器**
|
||
2. 安装 **Node.js 20.x**(不要用24.x)
|
||
3. 设置为默认版本
|
||
|
||
### 5.2 安装依赖
|
||
|
||
通过宝塔 **终端** 或 SSH 连接服务器:
|
||
|
||
```bash
|
||
cd /www/wwwroot/aiameiba.com/cms-server
|
||
|
||
# 安装生产依赖
|
||
npm install --production
|
||
|
||
# 如果 better-sqlite3 安装失败,尝试:
|
||
npm rebuild better-sqlite3
|
||
```
|
||
|
||
### 5.3 初始化数据库
|
||
|
||
```bash
|
||
cd /www/wwwroot/aiameiba.com/cms-server
|
||
npm run seed
|
||
```
|
||
|
||
执行后会:
|
||
- 创建数据库表
|
||
- 使用 `CMS_ADMIN_PASSWORD` 创建管理员;未设置时生成一次性随机密码并打印
|
||
- 插入示例数据
|
||
|
||
### 5.4 设置目录权限
|
||
|
||
```bash
|
||
chmod -R 755 /www/wwwroot/aiameiba.com/cms-server
|
||
chmod -R 777 /www/wwwroot/aiameiba.com/cms-server/uploads
|
||
```
|
||
|
||
---
|
||
|
||
## 六、使用 PM2 启动服务
|
||
|
||
### 6.1 通过宝塔 PM2 管理器(推荐)
|
||
|
||
1. 打开 **软件商店** → **PM2管理器**
|
||
2. 点击 **添加项目**
|
||
3. 填写配置:
|
||
|
||
| 配置项 | 值 |
|
||
|-------|-----|
|
||
| 项目目录 | `/www/wwwroot/aiameiba.com/cms-server` |
|
||
| 启动文件 | `src/index.js` |
|
||
| 项目名称 | `ameba-cms` |
|
||
| Node版本 | 选择已安装的20.x |
|
||
| 运行用户 | `www` |
|
||
|
||
4. 点击 **提交**
|
||
|
||
### 6.2 通过命令行
|
||
|
||
```bash
|
||
cd /www/wwwroot/aiameiba.com/cms-server
|
||
|
||
# 启动服务
|
||
pm2 start src/index.js --name ameba-cms
|
||
|
||
# 保存进程列表
|
||
pm2 save
|
||
|
||
# 设置开机自启
|
||
pm2 startup
|
||
```
|
||
|
||
### 6.3 常用 PM2 命令
|
||
|
||
```bash
|
||
# 查看所有进程
|
||
pm2 list
|
||
|
||
# 查看日志
|
||
pm2 logs ameba-cms
|
||
|
||
# 重启服务
|
||
pm2 restart ameba-cms
|
||
|
||
# 停止服务
|
||
pm2 stop ameba-cms
|
||
|
||
# 删除服务
|
||
pm2 delete ameba-cms
|
||
```
|
||
|
||
---
|
||
|
||
## 七、配置 Nginx
|
||
|
||
### 7.1 创建网站
|
||
|
||
1. 打开宝塔 **网站** → **添加站点**
|
||
2. 填写信息:
|
||
- 域名:`aiameiba.com`
|
||
- 根目录:`/www/wwwroot/aiameiba.com/frontend`
|
||
- PHP版本:**纯静态**
|
||
|
||
### 7.2 配置反向代理
|
||
|
||
1. 点击网站列表中的 **设置**
|
||
2. 选择 **配置文件**
|
||
3. 替换为以下内容:
|
||
|
||
```nginx
|
||
server {
|
||
listen 80;
|
||
server_name aiameiba.com www.aiameiba.com;
|
||
|
||
# 禁止访问隐藏文件
|
||
location ~ /\. {
|
||
deny all;
|
||
}
|
||
|
||
# 前端静态文件
|
||
root /www/wwwroot/aiameiba.com/frontend;
|
||
index index.html;
|
||
|
||
# 前端路由 - SPA支持
|
||
location / {
|
||
try_files $uri $uri/ /index.html;
|
||
}
|
||
|
||
# CMS后端API反向代理
|
||
location /api/ {
|
||
proxy_pass http://127.0.0.1:13001;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
|
||
# CMS管理后台
|
||
location /admin/ {
|
||
proxy_pass http://127.0.0.1:13001;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||
proxy_set_header X-Forwarded-Proto $scheme;
|
||
}
|
||
|
||
# 上传文件访问
|
||
location /uploads/ {
|
||
proxy_pass http://127.0.0.1:13001;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
}
|
||
|
||
# 静态资源缓存
|
||
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||
expires 30d;
|
||
add_header Cache-Control "public, immutable";
|
||
}
|
||
|
||
# Gzip压缩
|
||
gzip on;
|
||
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
|
||
gzip_min_length 1000;
|
||
gzip_comp_level 6;
|
||
}
|
||
```
|
||
|
||
4. 点击 **保存**
|
||
|
||
### 7.3 重启 Nginx
|
||
|
||
```bash
|
||
nginx -t # 检查配置
|
||
nginx -s reload # 重载配置
|
||
```
|
||
|
||
或在宝塔面板点击 **重启** Nginx。
|
||
|
||
---
|
||
|
||
## 八、配置 SSL 证书(推荐)
|
||
|
||
### 8.1 申请免费证书
|
||
|
||
1. 在宝塔 **网站** → 点击站点 **设置**
|
||
2. 选择 **SSL** 选项卡
|
||
3. 点击 **Let's Encrypt**
|
||
4. 选择域名,点击 **申请**
|
||
5. 开启 **强制HTTPS**
|
||
|
||
### 8.2 证书申请成功后
|
||
|
||
Nginx配置会自动更新,包含443端口监听:
|
||
|
||
```nginx
|
||
server {
|
||
listen 80;
|
||
listen 443 ssl;
|
||
server_name aiameiba.com www.aiameiba.com;
|
||
|
||
ssl_certificate /www/server/panel/vhost/cert/aiameiba.com/fullchain.pem;
|
||
ssl_certificate_key /www/server/panel/vhost/cert/aiameiba.com/privkey.pem;
|
||
|
||
# 强制HTTPS
|
||
if ($scheme = http) {
|
||
return 301 https://$host$request_uri;
|
||
}
|
||
|
||
# ... 其他配置同上
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 九、配置环境变量(可选)
|
||
|
||
### 9.1 创建 .env 文件
|
||
|
||
```bash
|
||
cat > /www/wwwroot/aiameiba.com/cms-server/.env << 'EOF'
|
||
# CMS服务器端口
|
||
CMS_PORT=13001
|
||
|
||
# JWT密钥(建议修改)
|
||
JWT_SECRET=your-random-secret-key-here
|
||
|
||
# 首次初始化管理员密码(仅 seed 时使用)
|
||
CMS_ADMIN_PASSWORD=replace-with-a-strong-password
|
||
|
||
# 数据库路径(可选,默认当前目录)
|
||
# CMS_DB_PATH=/www/wwwroot/aiameiba.com/cms-server/cms.db
|
||
|
||
# 上传目录(可选)
|
||
# UPLOAD_DIR=/www/wwwroot/aiameiba.com/uploads
|
||
EOF
|
||
```
|
||
|
||
### 9.2 修改 JWT 密钥(重要)
|
||
|
||
在生产环境中,务必修改 JWT 密钥:
|
||
|
||
```bash
|
||
# 生成随机密钥
|
||
openssl rand -hex 32
|
||
|
||
# 将生成的密钥填入 .env 的 JWT_SECRET
|
||
```
|
||
|
||
---
|
||
|
||
## 十、验证部署
|
||
|
||
### 10.1 检查服务状态
|
||
|
||
```bash
|
||
# 检查PM2进程
|
||
pm2 list
|
||
|
||
# 应该看到:
|
||
# ┌─────┬──────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┐
|
||
# │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │
|
||
# ├─────┼──────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┤
|
||
# │ 0 │ ameba-cms │ default │ 1.0.0 │ fork │ 12345 │ 5m │ 0 │ online │ 0% │
|
||
# └─────┴──────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┘
|
||
|
||
# 检查端口监听
|
||
netstat -tlnp | grep 13001
|
||
|
||
# 检查CMS健康状态
|
||
curl http://localhost:13001/health
|
||
```
|
||
|
||
### 10.2 访问测试
|
||
|
||
| 项目 | 访问地址 | 说明 |
|
||
|------|---------|------|
|
||
| 官网首页 | https://aiameiba.com | 应显示网站首页 |
|
||
| CMS后台 | https://aiameiba.com/admin | 应显示登录页 |
|
||
| 健康检查 | https://aiameiba.com/health | 返回 `{"status":"ok"}` |
|
||
|
||
### 10.3 登录后台
|
||
|
||
1. 访问 `https://aiameiba.com/admin`
|
||
2. 输入账号密码:
|
||
- 用户名:`admin`
|
||
- 密码:使用 `CMS_ADMIN_PASSWORD` 或 `npm run seed` 输出的一次性密码
|
||
3. **首次登录后请立即修改密码**
|
||
|
||
---
|
||
|
||
## 十一、常见问题
|
||
|
||
### 11.1 PM2 启动失败
|
||
|
||
```bash
|
||
# 查看详细日志
|
||
pm2 logs ameba-cms --lines 100
|
||
|
||
# 常见原因:
|
||
# 1. better-sqlite3 未编译
|
||
npm rebuild better-sqlite3
|
||
|
||
# 2. 端口被占用
|
||
lsof -i :13001
|
||
kill -9 <PID>
|
||
|
||
# 3. 权限问题
|
||
chmod -R 755 /www/wwwroot/aiameiba.com/cms-server
|
||
```
|
||
|
||
### 11.2 前端显示空白
|
||
|
||
```bash
|
||
# 检查Nginx配置
|
||
nginx -t
|
||
|
||
# 检查文件是否存在
|
||
ls -la /www/wwwroot/aiameiba.com/frontend/
|
||
|
||
# 检查Nginx错误日志
|
||
tail -f /www/wwwroot/aiameiba.com/frontend/error.log
|
||
```
|
||
|
||
### 11.3 API 请求失败
|
||
|
||
```bash
|
||
# 检查CMS服务是否运行
|
||
pm2 list
|
||
|
||
# 检查反向代理配置
|
||
curl -I http://localhost:13001/api/cms/public
|
||
|
||
# 检查防火墙
|
||
iptables -L -n | grep 13001
|
||
```
|
||
|
||
### 11.4 上传图片失败
|
||
|
||
```bash
|
||
# 检查目录权限
|
||
ls -la /www/wwwroot/aiameiba.com/cms-server/uploads/
|
||
|
||
# 修复权限
|
||
chmod -R 777 /www/wwwroot/aiameiba.com/cms-server/uploads/
|
||
```
|
||
|
||
### 11.5 数据库损坏
|
||
|
||
```bash
|
||
# 备份当前数据库
|
||
cp /www/wwwroot/aiameiba.com/cms-server/cms.db /tmp/cms.db.backup
|
||
|
||
# 检查数据库完整性
|
||
sqlite3 /www/wwwroot/aiameiba.com/cms-server/cms.db "PRAGMA integrity_check;"
|
||
|
||
# 如果损坏,重新初始化
|
||
cd /www/wwwroot/aiameiba.com/cms-server
|
||
rm cms.db
|
||
npm run seed
|
||
```
|
||
|
||
---
|
||
|
||
## 十二、备份与恢复
|
||
|
||
### 12.1 定期备份脚本
|
||
|
||
创建备份脚本:
|
||
|
||
```bash
|
||
cat > /www/backup/ameba-backup.sh << 'EOF'
|
||
#!/bin/bash
|
||
BACKUP_DIR="/www/backup/ameba"
|
||
DATE=$(date +%Y%m%d_%H%M%S)
|
||
|
||
mkdir -p $BACKUP_DIR
|
||
|
||
# 备份数据库
|
||
cp /www/wwwroot/aiameiba.com/cms-server/cms.db $BACKUP_DIR/cms_$DATE.db
|
||
|
||
# 备份上传文件
|
||
tar -czf $BACKUP_DIR/uploads_$DATE.tar.gz -C /www/wwwroot/aiameiba.com/cms-server uploads/
|
||
|
||
# 备份前端
|
||
tar -czf $BACKUP_DIR/frontend_$DATE.tar.gz -C /www/wwwroot/aiameiba.com frontend/
|
||
|
||
# 删除7天前的备份
|
||
find $BACKUP_DIR -name "*.db" -mtime +7 -delete
|
||
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
|
||
|
||
echo "Backup completed: $DATE"
|
||
EOF
|
||
|
||
chmod +x /www/backup/ameba-backup.sh
|
||
```
|
||
|
||
### 12.2 设置定时备份
|
||
|
||
在宝塔 **计划任务** 中添加:
|
||
|
||
| 类型 | Shell脚本 |
|
||
|------|----------|
|
||
| 执行周期 | 每天 03:00 |
|
||
| 脚本内容 | `/www/backup/ameba-backup.sh` |
|
||
|
||
### 12.3 恢复数据
|
||
|
||
```bash
|
||
# 恢复数据库
|
||
cp /www/backup/ameba/cms_20260908_120000.db /www/wwwroot/aiameiba.com/cms-server/cms.db
|
||
|
||
# 恢复上传文件
|
||
tar -xzf /www/backup/ameba/uploads_20260908_120000.tar.gz -C /www/wwwroot/aiameiba.com/cms-server/
|
||
|
||
# 重启服务
|
||
pm2 restart ameba-cms
|
||
```
|
||
|
||
---
|
||
|
||
## 十三、安全建议
|
||
|
||
### 13.1 修改默认密码
|
||
|
||
首次部署后立即修改管理员密码:
|
||
- 后台修改:登录后台 → ⚙ 修改密码
|
||
- 命令修改:`cd cms-server && npm run passwd`
|
||
|
||
### 13.2 修改默认端口
|
||
|
||
编辑 `.env` 文件修改端口:
|
||
|
||
```env
|
||
CMS_PORT=18888 # 改为其他端口
|
||
```
|
||
|
||
同步修改 Nginx 配置中的代理端口。
|
||
|
||
### 13.3 限制后台访问IP
|
||
|
||
在 Nginx 配置中添加 IP 白名单:
|
||
|
||
```nginx
|
||
location /admin/ {
|
||
allow 123.456.789.0; # 你的IP
|
||
deny all;
|
||
|
||
proxy_pass http://127.0.0.1:13001;
|
||
# ... 其他代理配置
|
||
}
|
||
```
|
||
|
||
### 13.4 开启防火墙
|
||
|
||
```bash
|
||
# 只开放必要端口
|
||
firewall-cmd --permanent --add-port=80/tcp
|
||
firewall-cmd --permanent --add-port=443/tcp
|
||
firewall-cmd --reload
|
||
```
|
||
|
||
---
|
||
|
||
## 十四、更新部署
|
||
|
||
### 14.1 更新前端
|
||
|
||
```bash
|
||
# 本地构建
|
||
npm run build
|
||
|
||
# 上传 dist 到服务器
|
||
scp -r dist/* root@server:/www/wwwroot/aiameiba.com/frontend/
|
||
```
|
||
|
||
### 14.2 更新后端
|
||
|
||
```bash
|
||
# 上传新的 cms-server 代码
|
||
# ...
|
||
|
||
# 在服务器上
|
||
cd /www/wwwroot/aiameiba.com/cms-server
|
||
npm install --production
|
||
pm2 restart ameba-cms
|
||
```
|
||
|
||
### 14.3 更新管理后台
|
||
|
||
```bash
|
||
# 本地构建
|
||
cd cms/admin
|
||
npm run build
|
||
|
||
# 上传 admin/dist 到服务器
|
||
scp -r cms/admin/dist/* root@server:/www/wwwroot/aiameiba.com/cms-server/admin/dist/
|
||
```
|
||
|
||
---
|
||
|
||
## 附录:完整部署命令汇总
|
||
|
||
```bash
|
||
# ========== 服务器端执行 ==========
|
||
|
||
# 1. 创建目录
|
||
mkdir -p /www/wwwroot/aiameiba.com/{frontend,cms-server}
|
||
|
||
# 2. 安装Node.js(通过宝塔面板)
|
||
|
||
# 3. 安装依赖
|
||
cd /www/wwwroot/aiameiba.com/cms-server
|
||
npm install --production
|
||
|
||
# 4. 初始化数据库
|
||
npm run seed
|
||
|
||
# 5. 设置权限
|
||
chmod -R 755 /www/wwwroot/aiameiba.com/cms-server
|
||
chmod -R 777 /www/wwwroot/aiameiba.com/cms-server/uploads
|
||
|
||
# 6. 启动PM2
|
||
pm2 start src/index.js --name ameba-cms
|
||
pm2 save
|
||
pm2 startup
|
||
|
||
# 7. 配置Nginx(通过宝塔面板)
|
||
|
||
# 8. 申请SSL证书(通过宝塔面板)
|
||
|
||
# 9. 验证
|
||
curl http://localhost:13001/health
|
||
```
|
||
|
||
---
|
||
|
||
**部署完成!** 🎉
|
||
|
||
如有问题,请查看 PM2 日志:`pm2 logs ameba-cms`
|