12-生产环境部署

说明

本文档使用单台服务器进行部署,配置如下:

系统

centos7.6

内网IP

192.168.43.10

外网IP

42.194.187.243

域名

www.boxim.online

  • 本文档中所涉及的IP和域名,请替换成自己的
  • 本文档的所涉及的密码均已脱敏(语雀文档官方要求,否则无法发布),建议各位搭建时,自行重新生成每个组件的密码
  • 本文档采用的是命令行的方式进行部署,如果希望使用宝塔部署,可以参考这位小伙伴写的文档:https://blog.ovim.cn/1.html

1. 准备工作

1.1. 服务器

购买(云)服务器,并开放以下端口:

端口

协议

端口占用组件

80

tcp

nginx

443

tcp

nginx

3306

tcp

mysql

6379

tcp

redis

9001

tcp

minio

9002

tcp

minio

3478

tcp/udp

coturn

5349

tcp

coturn

40000-65535

udp

coturn

注意:腾讯云服务器开放范围端口是用”,”分隔,所以最后一条开放端口应配置:40000,65535

1.2. ssl证书

注:非必须,如果需要使用语音和视频功能,则必须要有ssl证书,可以选购买或自签的方式获取证书

1.2.1. 购买证书

可以直接选择向云厂商购买ssl证书,然后将证书放置/opt/ssl目录下,将私钥命名为server.key,证书命名为server.crt

1.2.2. 自签证书(浏览器会有警告)

自签证书流程:

 
 
 
# 进入/opt/ssl目录
mkdir /opt/ssl
cd /opt/ssl
# 安装依赖包
yum install -y openssl openssl-devel
# 生成私钥,需要输入两遍相同的密码
openssl genrsa -des3 -out server.key 2048
# 生成CSR,需输入相关信息,乱填也行
openssl req -new -key server.key -out server.csr
# 取消私钥当中的密码,需输入刚才的密码
openssl rsa –in server.key -out server.key
# 生成SSL证书
openssl x509 -req -days 3650 –in server.csr -signkey server.key -out server.crt

1.3. 域名

注:非必须,但如果要上线微信小程序,则必须要有域名

域名可向云厂商购买,大陆的服务器需要进行域名备案才可正常使用。

2. 环境安装

2.1. 安装必要工具

 
 
 
yum install net-tools
yum -y install vim*
yum install lrzsz
yum install wget
yum install unzip
yum install libevent-devel

2.2. 安装jdk17

2.2.1. 安装
 
 
 
mkdir /usr/local/data
cd /usr/local/data
wget https://mirrors.tuna.tsinghua.edu.cn/Adoptium/17/jdk/x64/linux/OpenJDK17U-jdk_x64_linux_hotspot_17.0.13_11.tar.gz
tar -xvf OpenJDK17U-jdk_x64_linux_hotspot_17.0.13_11.tar.gz -C /opt/
mv /opt/jdk-17.0.13+11 /opt/jdk17
2.2.2. 配置环境变量

在/etc/profile最下方添加:

 
 
 
export JAVA_HOME=/opt/jdk17
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
2.2.3. 刷新环境变量
 
 
 
source /etc/profile
java -version

2.3. 安装mysql8.0

2.3.1. 安装
 
 
 
# 下载 MySQL yum库
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 配置MySQL的yum库
sudo rpm -Uvh mysql80-community-release-el7-3.noarch.rpm
# 安装社区版
yum -y install mysql-community-server –nogpgcheck
# 启动mysql服务
systemctl start mysqld.service
# 开机自启动mysql服务
systemctl enable mysqld.service
2.3.2. 修改密码
 
 
 
# 在日志文件中查找password关键字,得到默认密码
grep “password” /var/log/mysqld.log
# 用默认密码登录
mysql -uroot -p
# 修改密码
ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘naQR****Gv2j7PX_’;
2.3.3. 开启远程访问
 
 
 
CREATE USER ‘im’@‘%’ IDENTIFIED BY ‘naQR****Gv2j7PX_’;
GRANT ALL PRIVILEGES ON *.* TO ‘im’@‘%’ WITH GRANT OPTION;
flush privileges;
2.3.4. 执行初始化脚本

在mysql中新建一个名为im_platform的数据库,然后执行db目录下的im-platform.sql

2.4. 安装redis6.2

2.4.1. 下载并安装
 
 
 
yum install sqlite libsqlite3-dev
yum install gcc-c++ -y
cd /usr/local/data
wget http://download.redis.io/releases/redis-6.2.14.tar.gz
tar -xf redis-6.2.14.tar.gz
cd redis-6.2.14
make
make install PREFIX=/opt/redis
cd /opt/redis
mkdir conf
cp /usr/local/data/redis-6.2.14/redis.conf ./conf
2.4.2. 修改配置
 
 
 
# 以守护进程的方式运行
daemonize yes
# 支持远程访问
bind 0.0.0.0
# 关闭保护模式
protected-mode no
# 连接密码
requirepass PmEpfRjpBnTN6CgW
2.4.3. 安装服务

/etc/systemd/system下创建redis.service

 
 
 
[Unit]
Description=redis-server
After=network.target
 
[Service]
Type=forking
ExecStart=/opt/redis/bin/redis-server /opt/redis/conf/redis.conf
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
2.4.4. 启动
 
 
 
# 启动
systemctl start redis.service
# 开机启动
systemctl enable redis.service

2.5. 安装minio

2.5.1. 下载并安装
 
 
 
cd /usr/local/data
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/archive/minio.RELEASE.2024-07-26T20-48-21Z
mv minio.RELEASE.2024-07-26T20-48-21Z minio
chmod +x minio
mkdir /opt/minio
cp minio /opt/minio/
2.5.2. 创建配置文件

在/opt/minio下创建minio.conf:

 
 
 
#数据存放目录
MINIO_VOLUMES=“/data/minio”
#端口号设置
MINIO_OPTS=“–console-address :9002 –address :9001”
#用户名
MINIO_ROOT_USER=“admin”
#密码
MINIO_ROOT_PASSWORD=“3fBSt****uD77D6”
2.5.3. 安装服务

/etc/systemd/system下创建minio.service

 
 
 
[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.targetmsts
After=network-online.target
#minio文件具体位置
AssertFileIsExecutable=/opt/minio/minio
[Service]
# User and group 用户 组
User=root
Group=root
#创建的配置文件 minio.conf
EnvironmentFile=/opt/minio/minio.conf
ExecStart=/opt/minio/minio server $MINIO_OPTS $MINIO_VOLUMES
# Let systemd restart this service always
Restart=always
# Specifies the maximum file descriptor number that can be opened by this process
LimitNOFILE=65536
# Disable timeout logic and wait until process is stopped
TimeoutStopSec=infinity
SendSIGKILL=no
[Install]
WantedBy=multi-user.target
2.5.4. 启动服务
 
 
 
# 启动
systemctl start minio.service
# 开机启动
systemctl enable minio.service

2.6. 安装nginx

2.6.1. 下载并安装

下载地址:https://nginx.org/en/download.html,下载1.22.1版本,拷贝至服务器的/usr/local/data目录

 
 
 
acd /usr/local/data
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
tar -zxvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure –prefix=/opt/nginx –with-http_stub_status_module –with-http_ssl_module
make
make install
2.6.2. 修改配置
/opt/nginx/conf/nginx.conf
 
 
 
#user nobody;
worker_processes 1;
 
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
 
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 50M;
sendfile on;
keepalive_timeout 65;
server {
listen 443 ssl;
server_name www.boxim.online;
root html;
index index.html index.htm;
ssl_certificate /opt/ssl//server.crt;
ssl_certificate_key /opt/ssl/server.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
 
location / {
root im-web;
index index.html index.htm;
}
 
location /h5 {
alias im-h5;
index index.html index.htm;
}
 
location /admin {
alias im-admin;
index index.html index.htm;
try_files $uri $uri/ /admin/index.html;
}
 
location /api/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8888;
rewrite “^/api/(.*)$” /$1 break;
}
 
location /adm/api/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8889;
rewrite “^/adm/api/(.*)$” /$1 break;
}
 
location /file/ {
proxy_pass http://127.0.0.1:9001;
rewrite “^/file/(.*)$” /$1 break;
}
 
location = /im {
proxy_pass http://127.0.0.1:8878;
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_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
}
}
 
server {
listen 80;
server_name www.boxim.online;
rewrite ^(.*)$ https://$host$1 permanent;
}
}
2.6.3. 安装服务

/etc/systemd/system下创建nginx.service

 
 
 
[Unit]
Description=nginx service
After=network.target
 
[Service]
Type=forking
ExecStart=/opt/nginx/sbin/nginx
ExecReload=/opt/nginx/sbin/nginx -s reload
ExecStop=/opt/nginx/sbin/nginx -s quit
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
2.6.4. 启动服务
 
 
 
# 启动
systemctl start nginx.service
# 开机启动
systemctl enable nginx.service

2.7. 安装coturn(视频聊天)

说明:

  • 如果不需要音视频通话功能,无需部署coturn
  • 如果在外网使用通话功能,必须部署coturn,且服务器必须要有公网ip
  • 如果是在内网使用,且所有用户都在同一网段,无需部署coturn
  • 如果是在内网使用,且不止一个网段,这种情况理论上只要选择一个所有用户都能访问到的服务器部署coturn即可,建议直接和nginx部署在同一台服务器(这种情况作者未测试过,但理论上是没问题的)
2.7.1. 下载

下载并拷贝至服务器的/usr/local/data目录

2.7.2. 编译安装
 
 
 
cd /usr/local/data
tar -zxvf coturn-4.5.1.1.tar.gz
cd coturn-4.5.1.1
./configure –prefix=/opt/coturn
make
make install
2.7.3. 创建用户
 
 
 
cd /opt/coturn/bin
./turnadmin -k -u admin -r www.boxim.online -p UrHH****nFvBTMV
2.7.4. 生成证书
 
 
 
mkdir /opt/coturn/ssl
openssl dhparam -out /opt/coturn/ssl/dhparams.pem 2048
openssl req -x509 -newkey rsa:2048 -keyout /opt/coturn/ssl/turn_server_pkey.pem -out /opt/coturn/ssl/turn_server_cert.pem -days 99999 -nodes
2.7.5. 修改配置
/opt/coturn/etc/turnserver.conf
 
 
 
# 网卡名(ip addr命令查看自己的网卡名)
relay-device=eth0
# 密码
cli-password=UrHH****nFvBTMV
# 内网IP
listening-ip=192.168.43.10
listening-port=3478
tls-listening-port=5349
# 内网IP
relay-ip=192.168.43.10
relay-threads=500
# 外网IP
external-ip=42.194.187.243
# 设置用户名和密码,跟上面创建的用户的账号密码一致
user=admin:UrHH****nFvBTMV
# udp端口范围
min-port=40000
max-port=65535
# 外网IP绑定的域名
realm=www.boxim.online
# 打开密码验证
lt-cred-mech
# 证书
cert=/opt/coturn/ssl/turn_server_cert.pem
pkey=/opt/coturn/ssl/turn_server_pkey.pem
dh-file=/opt/coturn/ssl/dhparams.pem
2.7.6. 启动
 
 
 
/opt/coturn/bin/turnserver -v -r www.boxim.online:3478 -a -o -c /opt/coturn/etc/turnserver.conf
2.7.7. 验证

检测生效网站:点这里,出现done提示表示成功

d2b5ca33bd20250831150535

3. 部署服务

3.1. 部署后端服务

3.1.1. 修改im-platfrom配置文件

im-platfrom的resource目录修改application-prod.yml文件

 
 
 
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/im_platform?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true
username: im
password: naQR****Gv2j7PX_
data:
redis:
host: localhost
port: 6379
password: PmEpfRj****N6CgW
 
minio:
endpoint: http://127.0.0.1:9001 #内网地址
domain: https://www.boxim.online/file #外网访问地址
accessKey: admin
secretKey: 3fBSt****uD77D6
bucketName: box-im
imagePath: image
filePath: file
videoPath: video
 
webrtc:
max-channel: 9 # 多人通话最大通道数量,最大不能超过16,建议值:4,9,16
iceServers: #coturn配置
– urls: stun:www.boxim.online:3478
username: admin
credential: UrHH****nFvBTMV
– urls: turn:www.boxim.online:3478
username: admin
credential: UrHH****nFvBTMV
3.1.2. 修改im-server配置文件

im-server的resource目录修改application-prod.yml文件

 
 
 
spring:
data:
redis:
host: 127.0.0.1
port: 6379
password: PmEpfRj****N6CgW
3.1.3. 编译

进入盒子IM代码根目录,执行

 
 
 
mvn clean package -Dmaven.test.skip=true

将生成的im-platform.jar和im-server.jar拷贝到服务器的/data/boxim目录

3.1.4. 启动
 
 
 
cd /data/boxim
# 启动im-platform
nohup java -jar im-platform.jar –spring.profiles.active=prod &
# 启动im-server
nohup java -jar im-server.jar –spring.profiles.active=prod &

3.2. 部署web端

修改im-web的配置文件.env.production (主要是将www.boxim.online换成自己的域名或ip)

 
 
 
ENV = ‘production’
# app名称
VUE_APP_NAME = “盒子IM”
# 接口地址
VUE_APP_BASE_API = ‘https://www.boxim.online/api’
# ws地址
VUE_APP_WS_URL = ‘wss://www.boxim.online/im’

这里注意:如有您没有部署ssl证书,https需要改成http,wss需要改成ws,很多小伙伴都栽在这里

在im-web目录进入命令行,执行打包命令:

 
 
 
npm install
npm run build

将生成的dist目录压缩,拷贝至服务器的/opt/nginx目录,执行命令:

 
 
 
unzip dist.zip
mv dist im-web
rm -rf dist.zip
systemctl restart nginx.service

web部署完成,访问地址:

https://www.boxim.online

3.3. 部署h5端

修改im-uiapp的.env.js,将ENV变量修改为“PROD”,并将url中的www.boxim.online换成自己的域名或IP:

 
 
 
const ENV = “PROD”;
const UNI_APP = {}
if(ENV==“DEV”){
}
if(ENV==“PROD”){
UNI_APP.BASE_URL = “https://www.boxim.online/api”;
UNI_APP.WS_URL = “wss://www.boxim.online/im”;
}
export default UNI_APP

通过hbuilderx打开im-uniapp目录,选择项目,然后选择菜单:发行->网站PC-web或H5

d2b5ca33bd20250831150800

输入域名,点击“发行”:

d2b5ca33bd20250831150811

将导出的h5目录(新版的hbuilderx也可能是web目录)压缩,拷贝至服务器的/opt/nginx目录并解压,修改包名为im-h5

h5部署完成,访问地址:

https://www.boxim.online/h5

3.4. 部署微信小程序

注:打包小程序前需安装注册账号并获取appid

同样的方式修改im-uiapp的.env.js,可参考H5打包

通过hbuilderx打开im-uniapp目录,选择项目,然后选择菜单:发行->自定义发行->开发环境-微信小程序,填入您的appid后,点击”发行按钮”:

d2b5ca33bd20250831150824

点击”上传”,填写版本号和备注信息后,然后上传

d2b5ca33bd20250831150835

登录微信公众平台,提交审核:

d2b5ca33bd20250831150846

提交后等待审核通过,然后发布审核版本即可。

注:从作者发布小程序的经历来看,小程序的审核不通过的概率非常高,但是理由却非常不固定,所以千万不要一次不通过就放弃,失败后进行申诉或者多提交几次,说不定就过了。

3.5. 打包安卓APP

同样的方式修改im-uiapp的.env.js,可参考H5打包

打包安卓APP前需要先生成证书,打开cmd执行:

 
 
 
keytool -genkey -alias boxim -keyalg RSA -keysize 2048 -validity 36500 -keystore boxim.keystore

d2b5ca33bd20250831150912

输入密码和相关的信息后,会在当前目录生成证书文件boxim.keystore,然后在hubilderx选择菜单 发行->原生APP-云打包

d2b5ca33bd20250831150923

按图中填写信息,完成后右下角点击”打包”,打包生成后,控制台会打印apk下载链接:

d2b5ca33bd20250831150935

通过链接下载,然后后发布到应用市场即可

3.6. 打包IOS APP(略)

4. 部署后台管理

4.1. 部署后台服务

4.1.1. 下载代码

下载后台管理代码,开源版地址:https://gitee.com/bluexsx/box-im-admin

4.1.2. 创建数据库

在mysql中新建一个名为im_admin的数据库,然后执行代码中db目录下的im-admin.sql

4.1.3. 修改im-admin配置文件

在ruoyi-admin包里面的application-prod.yml

 
 
 
spring:
data:
redis:
host: localhost
port: 6379
password: PmEpfRj****N6CgW
datasource:
dynamic:
primary: admin
datasource:
admin:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/im_admin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
username: im
password: naQR****Gv2j7PX_
platform:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/im_platform?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
username: im
password: naQR****Gv2j7PX_
 
minio:
endpoint: http://127.0.0.1:9001 #内网地址
domain: https://www.boxim.online/file #外网访问地址
accessKey: admin
secretKey: 3fBSt****uD77D6
bucketName: box-im
imagePath: image
filePath: file
videoPath: video
4.1.4. 编译

进入盒子IM管理端代码根目录,执行

 
 
 
mvn clean package -Dmaven.test.skip=true

将生成的im-admin.jar拷贝到服务器的/data/boxim目录

4.1.5. 启动
 
 
 
cd /data/boxim
# 启动im-platform
nohup java -jar im-admin.jar –spring.profiles.active=prod &

4.2. 部署后台web端

修改im-admin-ui里面的.env.production,主要是替换VITE_APP_BASE_API的域名:

 
 
 
# 生产环境
VITE_APP_BASE_API = ‘https://www.boxim.online/adm/api’

在im-admin-ui目录进入命令行,执行打包命令:

 
 
 
npm install
npm run build

将生成的dist目录压缩,拷贝至服务器的/opt/nginx目录,执行命令:

 
 
 
unzip dist.zip
mv dist im-admin
rm -rf dist.zip
systemctl restart nginx.service

后台web部署完成,访问地址:

https://www.boxim.online/admin

默认管理员账号: admin/admin123

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容