15 KiB
15 KiB
宝塔面板部署指南
阿美巴传统官网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 宝塔面板安装
# 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 安装依赖
# 前端
npm install
# CMS后端
cd cms/server
npm install
# 管理后台
cd cms/admin
npm install
3.2 构建前端
# 在项目根目录执行
npm run build
构建完成后会生成 dist/ 文件夹。
3.3 构建管理后台
cd cms/admin
npm run build
构建完成后会在 cms/admin/ 生成 dist/ 文件夹。
3.4 初始化数据库(可选)
如果想在本地初始化测试数据:
cd cms/server
npm run seed
四、上传文件到服务器
4.1 使用宝塔文件管理器
- 登录宝塔面板
- 点击 文件 进入文件管理
- 导航到
/www/wwwroot/ - 创建目录
aiameiba.com
4.2 上传文件
| 本地路径 | 服务器路径 | 说明 |
|---|---|---|
dist/* |
/www/wwwroot/aiameiba.com/frontend/ |
前端所有文件 |
cms/server/* |
/www/wwwroot/aiameiba.com/cms-server/ |
整个server目录 |
注意:
node_modules不需要上传,服务器上重新安装- 不要把开发机数据库直接放进版本库;生产数据应通过备份恢复或在服务器初始化
4.3 使用 SCP 命令上传(可选)
# 上传前端
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
- 在宝塔面板打开 Node.js版本管理器
- 安装 Node.js 20.x(不要用24.x)
- 设置为默认版本
5.2 安装依赖
通过宝塔 终端 或 SSH 连接服务器:
cd /www/wwwroot/aiameiba.com/cms-server
# 安装生产依赖
npm install --production
# 如果 better-sqlite3 安装失败,尝试:
npm rebuild better-sqlite3
5.3 初始化数据库
cd /www/wwwroot/aiameiba.com/cms-server
npm run seed
执行后会:
- 创建数据库表
- 使用
CMS_ADMIN_PASSWORD创建管理员;未设置时生成一次性随机密码并打印 - 插入示例数据
5.4 设置目录权限
chmod -R 755 /www/wwwroot/aiameiba.com/cms-server
chmod -R 777 /www/wwwroot/aiameiba.com/cms-server/uploads
六、使用 PM2 启动服务
6.1 通过宝塔 PM2 管理器(推荐)
- 打开 软件商店 → PM2管理器
- 点击 添加项目
- 填写配置:
| 配置项 | 值 |
|---|---|
| 项目目录 | /www/wwwroot/aiameiba.com/cms-server |
| 启动文件 | src/index.js |
| 项目名称 | ameba-cms |
| Node版本 | 选择已安装的20.x |
| 运行用户 | www |
- 点击 提交
6.2 通过命令行
cd /www/wwwroot/aiameiba.com/cms-server
# 启动服务
pm2 start src/index.js --name ameba-cms
# 保存进程列表
pm2 save
# 设置开机自启
pm2 startup
6.3 常用 PM2 命令
# 查看所有进程
pm2 list
# 查看日志
pm2 logs ameba-cms
# 重启服务
pm2 restart ameba-cms
# 停止服务
pm2 stop ameba-cms
# 删除服务
pm2 delete ameba-cms
七、配置 Nginx
7.1 创建网站
- 打开宝塔 网站 → 添加站点
- 填写信息:
- 域名:
aiameiba.com - 根目录:
/www/wwwroot/aiameiba.com/frontend - PHP版本:纯静态
- 域名:
7.2 配置反向代理
- 点击网站列表中的 设置
- 选择 配置文件
- 替换为以下内容:
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;
}
- 点击 保存
7.3 重启 Nginx
nginx -t # 检查配置
nginx -s reload # 重载配置
或在宝塔面板点击 重启 Nginx。
八、配置 SSL 证书(推荐)
8.1 申请免费证书
- 在宝塔 网站 → 点击站点 设置
- 选择 SSL 选项卡
- 点击 Let's Encrypt
- 选择域名,点击 申请
- 开启 强制HTTPS
8.2 证书申请成功后
Nginx配置会自动更新,包含443端口监听:
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 文件
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 密钥:
# 生成随机密钥
openssl rand -hex 32
# 将生成的密钥填入 .env 的 JWT_SECRET
十、验证部署
10.1 检查服务状态
# 检查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 登录后台
- 访问
https://aiameiba.com/admin - 输入账号密码:
- 用户名:
admin - 密码:使用
CMS_ADMIN_PASSWORD或npm run seed输出的一次性密码
- 用户名:
- 首次登录后请立即修改密码
十一、常见问题
11.1 PM2 启动失败
# 查看详细日志
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 前端显示空白
# 检查Nginx配置
nginx -t
# 检查文件是否存在
ls -la /www/wwwroot/aiameiba.com/frontend/
# 检查Nginx错误日志
tail -f /www/wwwroot/aiameiba.com/frontend/error.log
11.3 API 请求失败
# 检查CMS服务是否运行
pm2 list
# 检查反向代理配置
curl -I http://localhost:13001/api/cms/public
# 检查防火墙
iptables -L -n | grep 13001
11.4 上传图片失败
# 检查目录权限
ls -la /www/wwwroot/aiameiba.com/cms-server/uploads/
# 修复权限
chmod -R 777 /www/wwwroot/aiameiba.com/cms-server/uploads/
11.5 数据库损坏
# 备份当前数据库
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 定期备份脚本
创建备份脚本:
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 恢复数据
# 恢复数据库
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 文件修改端口:
CMS_PORT=18888 # 改为其他端口
同步修改 Nginx 配置中的代理端口。
13.3 限制后台访问IP
在 Nginx 配置中添加 IP 白名单:
location /admin/ {
allow 123.456.789.0; # 你的IP
deny all;
proxy_pass http://127.0.0.1:13001;
# ... 其他代理配置
}
13.4 开启防火墙
# 只开放必要端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
十四、更新部署
14.1 更新前端
# 本地构建
npm run build
# 上传 dist 到服务器
scp -r dist/* root@server:/www/wwwroot/aiameiba.com/frontend/
14.2 更新后端
# 上传新的 cms-server 代码
# ...
# 在服务器上
cd /www/wwwroot/aiameiba.com/cms-server
npm install --production
pm2 restart ameba-cms
14.3 更新管理后台
# 本地构建
cd cms/admin
npm run build
# 上传 admin/dist 到服务器
scp -r cms/admin/dist/* root@server:/www/wwwroot/aiameiba.com/cms-server/admin/dist/
附录:完整部署命令汇总
# ========== 服务器端执行 ==========
# 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