宝塔面板部署
🚀 宝塔面板部署教程
宝塔面板部署是最简单的服务器部署方式,提供可视化界面管理服务器,无需手动敲命令。适合绝大多数用户。
📋 服务器最低配置
| 配置项 | 要求 |
|---|---|
| CPU | 2核及以上 |
| 内存 | 2GB 及以上(推荐 4GB) |
| 硬盘 | 40GB 及以上 SSD |
| 系统 | Ubuntu 22.04 / CentOS 7.9+ |
| 带宽 | 3Mbps 及以上 |
⚡ 完整部署步骤
第一步:购买云服务器(已有可跳过)
推荐云服务商:
| 服务商 | 购买链接 | 特点 |
|---|---|---|
| 阿里云 | ECS 云服务器 → | 国内最大,新用户有折扣 |
| 腾讯云 | 轻量应用服务器 → | 性价比高,新用户优惠大 |
| 华为云 | 弹性云服务器 → | 大品牌可选 |
购买步骤:
打开上方链接,注册并完成实名认证
选择 云服务器 ECS 或 轻量应用服务器
地域选择离用户最近的(如华南、华东等)
配置选择:2核 2G 起步(推荐 2核 4G)
操作系统选择:Ubuntu 22.04 LTS(推荐)或 CentOS 7.9
系统盘:40GB SSD 起步
带宽:3Mbps 起步(按量付费更划算)
购买完成后,进入云控制台:
- 找到服务器的 公网 IP 地址 — 记下来
- 设置 root 登录密码(如果还没设置)
⚠️ 重要:开放安全组端口
在云控制台找到「安全组」或「防火墙」,添加以下规则:
| 端口 | 用途 | 协议 |
|---|---|---|
| 22 | SSH 远程连接 | TCP |
| 80 | HTTP 网站访问 | TCP |
| 443 | HTTPS 安全访问 | TCP |
| 8888 | 宝塔面板访问 | TCP |
| 3000 | CRM后端服务(可选) | TCP |
第二步:SSH 连接服务器
需要一个 SSH 工具来远程连接服务器,就像远程操作服务器的"遥控器"。
| 工具 | 下载地址 | 适用系统 |
|---|---|---|
| FinalShell | 点击下载 → | Windows(推荐新手) |
| Xshell | 家庭版免费 → | Windows |
| 终端 | 系统自带 | macOS |
使用 FinalShell 连接(以 Windows 为例):
- 安装并打开 FinalShell
- 点击左上角「+」→ 选择「SSH连接」
- 填写:
- 名称:
我的CRM服务器 - 主机:
你的服务器公网IP - 端口:
22 - 用户名:
root - 密码:
你设置的root密码
- 名称:
- 点击「确定」→ 双击连接
macOS 用户:
ssh root@你的服务器IP
# 输入服务器密码(输入时不会显示字符,属于正常现象)
✅ 看到类似
root@ubuntu:~#的提示符,说明连接成功!
第三步:安装宝塔面板
SSH 连接成功后,复制以下命令粘贴到终端,回车执行:
Ubuntu / Debian 系统:
wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec
CentOS 系统:
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec
安装过程约 2-5 分钟,中途提示 Do you want to install Bt-Panel to the /www directory now?(y/n) 输入 y 回车。
⚠️ 超级重要:安装完成后终端会显示面板地址、用户名和密码,请立即截图或复制保存! 格式类似:
================================================ 面板地址: http://你的IP:8888/xxxxxx 用户名: xxxxxxxx 密码: xxxxxxxx ================================================如果不小心关了,可以用命令重新查看:
bt default
第四步:登录宝塔面板并安装软件
- 在浏览器中打开上一步显示的面板地址(如
http://你的IP:8888/xxxxxx) - 输入用户名和密码登录
- 首次登录需要绑定宝塔账号(免费注册一个即可)
- 进入面板后,弹出推荐安装套件,点击「取消」,我们手动选择
- 进入左侧菜单「软件商店」,搜索并安装以下软件:
| 软件 | 版本 | 安装方式 |
|---|---|---|
| Nginx | 1.22 或 1.24 | 极速安装 |
| MySQL | 8.0 | 极速安装 |
| PM2管理器 | 最新版 | 极速安装 |
- 安装 PM2 管理器后,进入 PM2 管理器 → 「Node版本」→ 选择 v20.x → 点击「安装」
⏱ Nginx + MySQL 安装约 5-15 分钟,Node.js 安装约 3-5 分钟。
💡 也可以通过命令行安装 Node.js(在宝塔面板左侧「终端」中执行):
# 方式一:通过 nvm 安装(推荐) curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install 20 nvm alias default 20 # 方式二:国内镜像安装 nvm curl -o- https://gitee.com/mirrors/nvm/raw/master/install.sh | bash source ~/.bashrc nvm install 20 nvm alias default 20
第五步:创建数据库
- 在宝塔面板左侧菜单点击「数据库」
- 点击右上角「添加数据库」
- 填写信息:
| 项目 | 填写内容 |
|---|---|
| 数据库名 | crm_db |
| 用户名 | crm_user |
| 密码 | 点击「随机」自动生成 |
| 访问权限 | 选择「本地服务器」 |
- 点击「提交」
⚠️ 请立即复制保存数据库用户名和密码! 后续配置
.env文件需要使用。
- 导入数据库结构:
- 在数据库列表中找到
crm_db - 点击右侧「导入」
- 点击「从本地上传」→ 选择项目中的
database/schema.sql文件 - 点击「导入」
- 在数据库列表中找到
💡 如果项目还没上传,可以先跳过导入步骤,在第七步上传代码后再回来导入。
第六步:添加站点
- 点击左侧「网站」→「添加站点」
- 填写信息:
| 项目 | 填写内容 |
|---|---|
| 域名 | 填写你的域名(如 crm.yourdomain.com);如果没有域名,填服务器 公网 IP |
| 根目录 | /www/wwwroot/CRM/dist |
| FTP | 不创建 |
| 数据库 | 不创建(已在上一步创建) |
| PHP版本 | 选「纯静态」 |
- 点击「提交」
第七步:上传项目代码
方式一(推荐):Git 克隆
在宝塔面板左侧「终端」中执行:
cd /www/wwwroot
git clone https://github.com/shushuhao01/crm-system.git CRM
cd CRM
方式二:手动上传
在宝塔面板「文件」中:
- 导航到
/www/wwwroot - 点击「上传」→ 选择项目压缩包(.zip 或 .tar.gz)
- 上传完成后,右键压缩包 →「解压」
- 确保解压后目录为
/www/wwwroot/CRM
第八步:配置后端环境变量
在宝塔面板「文件」中导航到 /www/wwwroot/CRM/backend:
- 找到
.env.example,右键「复制」→ 粘贴后重命名为.env - 双击
.env文件编辑,填写以下内容:
# 数据库配置 - 填写第五步创建的数据库信息
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=crm_user
DB_PASSWORD=第五步生成的数据库密码
DB_DATABASE=crm_db
DB_CHARSET=utf8mb4
# JWT 密钥 - 用终端命令 openssl rand -hex 32 生成
JWT_SECRET=用下面的命令生成一个随机字符串粘贴到这里
JWT_EXPIRES_IN=7d
# 服务端口
PORT=3000
💡 生成 JWT_SECRET 的方法:在宝塔终端执行
openssl rand -hex 32,复制输出的随机字符串粘贴到 JWT_SECRET 后面。
第九步:安装依赖 + 构建 + 启动(一键脚本)⚡
方式一:一键部署脚本(推荐)
在宝塔终端中执行:
cd /www/wwwroot/CRM
chmod +x deploy.sh
./deploy.sh
脚本将自动完成:
- ✅ 环境检查(Node.js版本、内存、磁盘空间)
- ✅ 配置 npm 国内镜像加速
- ✅ 安装前端和后端依赖
- ✅ 构建前端项目
- ✅ 使用 PM2 启动后端服务
- ✅ 配置开机自启动
⏱ 预计总耗时 20-30 分钟,请耐心等待。
方式二:手动逐步执行
如果一键脚本出问题,按以下步骤手动操作:
# 进入项目目录
cd /www/wwwroot/CRM
# 1. 配置 npm 国内镜像
npm config set registry https://registry.npmmirror.com
# 2. 安装前端依赖(约5-8分钟)
npm install
# 3. 构建前端(约5-10分钟)
npm run build
# 4. 安装后端依赖(约3-5分钟)
cd backend
npm install
# 5. 构建后端
npm run build
# 6. 安装 PM2(进程管理器,保持服务不掉线)
npm install -g pm2
# 7. 用 PM2 启动后端
pm2 start dist/server.js --name crm-backend
# 8. 保存 PM2 进程列表 + 开机自启
pm2 save
pm2 startup
# ⚠️ pm2 startup 会输出一条命令,复制那条命令再执行一次!
💡 常用 PM2 命令:
pm2 list— 查看所有进程pm2 logs crm-backend— 查看日志pm2 restart crm-backend— 重启服务pm2 stop crm-backend— 停止服务
第十步:配置 Nginx(⭐ 关键步骤)
- 在宝塔面板左侧点击「网站」
- 找到第六步添加的站点,点击右侧「设置」
- 点击左侧「配置文件」
- 全选删除原有内容,将以下完整配置复制粘贴进去
- 把配置中的
your-domain.com替换为你的实际域名(如果用 IP 访问就改为_) - 点击「保存」
📋 完整 Nginx 配置文件(直接复制):
# ============================================
# 云客CRM Nginx 完整配置
# ============================================
# 使用说明:
# 1. 将 your-domain.com 替换为你的实际域名
# 2. 如果使用IP访问,将 server_name 改为 _
# 3. 将此配置粘贴到宝塔网站配置中保存即可
# ============================================
# 上游后端服务(连接池优化)
upstream crm_backend {
server 127.0.0.1:3000;
keepalive 64;
}
server {
listen 80;
listen [::]:80;
# ========== ⚠️ 修改这里:替换为你的域名 ==========
server_name your-domain.com www.your-domain.com;
# 如果没有域名,使用IP访问,改为:server_name _;
# ========== ⚠️ 修改这里:确认项目路径正确 ==========
root /www/wwwroot/CRM/dist;
index index.html;
# 访问日志和错误日志
access_log /www/wwwlogs/crm.access.log;
error_log /www/wwwlogs/crm.error.log;
# ==========================================
# 前端静态文件(Vue/React 单页应用路由支持)
# ==========================================
location / {
try_files $uri $uri/ /index.html;
}
# ==========================================
# 后端 API 反向代理
# ==========================================
location /api/ {
proxy_pass http://crm_backend;
proxy_http_version 1.1;
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;
proxy_set_header Connection "";
# 超时设置(防止大文件上传或长请求超时)
proxy_connect_timeout 60s;
proxy_send_timeout 120s;
proxy_read_timeout 120s;
# 缓冲设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 16k;
}
# ==========================================
# WebSocket 实时通讯支持(消息推送、在线状态等)
# ==========================================
location /socket.io/ {
proxy_pass http://crm_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket 长连接超时(24小时)
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
# ==========================================
# 文件上传/下载目录
# ==========================================
location /uploads/ {
alias /www/wwwroot/CRM/uploads/;
expires 30d;
add_header Cache-Control "public";
# 防止执行上传的文件
location ~* \.(php|jsp|asp|sh|cgi)$ {
deny all;
}
}
# ==========================================
# 静态资源缓存(提升加载速度)
# ==========================================
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|mp4|webp|avif)$ {
expires 7d;
add_header Cache-Control "public, immutable";
access_log off;
}
# ==========================================
# Gzip 压缩(减小传输体积,加快加载)
# ==========================================
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
application/xml+rss
application/atom+xml
image/svg+xml;
# ==========================================
# 安全配置
# ==========================================
# 禁止访问隐藏文件(.env、.git 等敏感文件)
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 禁止访问备份文件
location ~* \.(bak|sql|log|old|orig|swp)$ {
deny all;
}
# 上传文件大小限制(支持上传最大 50MB 文件)
client_max_body_size 50M;
# 安全响应头
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
add_header X-XSS-Protection "1; mode=block";
}
# ============================================
# HTTPS 配置(在宝塔面板申请SSL证书后自动生效)
# 如需手动配置,取消下方注释并修改域名和证书路径
# ============================================
# server {
# listen 443 ssl http2;
# listen [::]:443 ssl http2;
# server_name your-domain.com www.your-domain.com;
#
# # SSL 证书路径(宝塔面板申请后会自动填写)
# ssl_certificate /www/server/panel/vhost/cert/your-domain.com/fullchain.pem;
# ssl_certificate_key /www/server/panel/vhost/cert/your-domain.com/privkey.pem;
#
# # SSL 安全配置
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4;
# ssl_prefer_server_ciphers on;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 10m;
#
# # 以下配置同 HTTP(复制上方 root 到最后即可)
# root /www/wwwroot/CRM/dist;
# index index.html;
#
# location / { try_files $uri $uri/ /index.html; }
# location /api/ { proxy_pass http://crm_backend; proxy_http_version 1.1; 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; proxy_connect_timeout 60s; proxy_send_timeout 120s; proxy_read_timeout 120s; }
# location /socket.io/ { proxy_pass http://crm_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_read_timeout 86400s; }
# location /uploads/ { alias /www/wwwroot/CRM/uploads/; expires 30d; }
#
# gzip on; gzip_vary on; gzip_min_length 1024; gzip_proxied any; gzip_comp_level 6;
# gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/xml+rss image/svg+xml;
# client_max_body_size 50M;
# }
# HTTP 自动跳转 HTTPS(启用 SSL 后取消注释)
# server {
# listen 80;
# server_name your-domain.com www.your-domain.com;
# return 301 https://$server_name$request_uri;
# }
⚠️ 保存后如果宝塔提示 Nginx 配置检测失败,检查是否有语法错误。也可以在终端执行
nginx -t查看具体报错位置。
第十一步:访问系统并激活授权 🎉
- 浏览器访问您的域名
http://your-domain.com或http://服务器IP - 在登录页面点击左下角的 🔑 图标
- 选择「私有部署」,粘贴 系统授权码,点击「激活」
- ⚠️ 首次激活会显示管理员账号密码,请立即保存!仅展示一次!
- 登录后请 立即修改密码
第十二步:申请 SSL 证书(推荐)
启用 HTTPS 可以加密数据传输,浏览器不再显示"不安全"提示。需要域名已完成 ICP 备案。
- 在宝塔面板「网站」→ 找到站点 → 点击「设置」
- 点击左侧「SSL」→ 选择「Let's Encrypt」
- 勾选你的域名,点击「申请」
- 申请成功后,开启「强制 HTTPS」
⚠️ 申请 SSL 需要:① 域名已备案;② DNS 已解析到服务器 IP;③ 80 端口已开放。
🔄 后续更新升级
cd /www/wwwroot/CRM
# 拉取最新代码
git pull origin main
# 重新构建前端
npm install
npm run build
# 重新构建后端
cd backend
npm install
npm run build
# 重启后端服务
pm2 restart crm-backend
❓ 常见问题
Q: 宝塔面板安装后无法打开
A: ① 确认云服务器安全组已放行 8888 端口;② 在 SSH 终端执行 bt default 重新查看面板地址和密码。
Q: PM2 管理器中找不到 Node.js 20 版本
A: 在终端手动安装:curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash && source ~/.bashrc && nvm install 20
Q: 访问网站显示 502 Bad Gateway
A: 后端服务可能未启动。在终端执行 pm2 list 查看。如果没有进程,执行 cd /www/wwwroot/CRM/backend && pm2 start dist/server.js --name crm-backend。
Q: 访问显示空白页
A: ① 检查网站根目录是否指向 /www/wwwroot/CRM/dist;② Nginx 配置中是否有 try_files $uri $uri/ /index.html;;③ 检查 dist 目录下是否有 index.html 文件。
Q: WebSocket 连接失败(实时消息不推送)
A: 检查 Nginx 配置中是否正确配置了 /socket.io/ 的 WebSocket 代理,特别是 proxy_set_header Upgrade 和 Connection "upgrade" 这两行。
Q: 上传文件失败,提示文件过大
A: 检查 Nginx 配置中 client_max_body_size 是否设置(默认 50M)。如果需要更大,改为 100M 或 200M。
Q: npm install 报错或速度极慢
A: 先设置国内镜像 npm config set registry https://registry.npmmirror.com,如果仍有问题,尝试删除 node_modules 和 package-lock.json 后重试。