接着也是把Hula搭建成功了 继续,原本之前写了一部分了,奈何中间有段时间太忙了,现在才有时间,废话不多说,现在开始
1、前提
先声明,由于官方是使用微服务+Nacos部署的,不使用Nacos的话改动较大,所以这里也使用官方的步骤来部署
拉取前,先确保服务器或者运行微服务的系统环境有java环境、maven环境和docker以及docker-compose,这里建议Java>=21,maven=3.9.x
将项目(https://github.com/Breeze-mi/HuLa-Server) 克隆下来,放到服务器上,同时可以提前将项目内的两个SQL文件以及 nacos 命名空间数据 压缩包下载到自己电脑上,后续需要。然后将docs/install/这个目录下的docker文件夹移动到/home/目录下(最方便的做法), 即最后的实际路径为/home/docker,后续步骤都是在这个文件夹下进行的 ,然后创建必要的路径:
mkdir /home/docker/rocketmq/broker/conf/ /home/docker/rocketmq/ broker/logs/ /home/docker/rocketmq/broker/store/ /home/rocketmq/store/ -p
chmod 777 /home/docker/rocketmq/broker/conf/
chmod 777 /home/docker/rocketmq/broker/logs/
chmod 777 /home/docker/rocketmq/broker/store/
chmod 777 /home/docker/rocketmq/timerwheel/
这里的路径要和docker-compose.yml里的一样,以及docs/install/docker/env/。
其中,docs/install/docker/env/下面的环境变量稍后需要配置(或者保持不动,后续命名空间的部分环境以这个为准,这部分主要是配置mysql、Redis和nacos的环境)
这里主要是先提前准备需要部署的文件和文件夹等环境,
2. 搭建地基服务
2.1、修复完善rocketmq配置
跟上面的一样,需要修复补齐和完善对应路径的文件,下面先修复rocketmq
定位到docs/install/docker/rocketmq/broker/conf/broker.conf这个文件(一般有,若无则手动创建)
然后写入以下内容:
#所属集群名字
brokerClusterName=DefaultCluster
# 启用Proxy模式(可选,默认NONE)
proxyMode=NONE
# 启用Controller模式(集群部署需配置)
enableControllerMode=false
#broker名字,注意此处不同的配置文件填写的不一样,如果在broker-a.properties使用:broker-a,
#在broker-b.properties使用:broker-b
brokerName=broker-a
#0 表示Master,>0 表示Slave
brokerId=0
#nameServer地址,分号分割
#namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
namesrvAddr=rocketmq-namesrv:9876 #命名空间对应的地址,若同属同一docker网络下,可以使用容器名
#启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed
#brokerIP1 设置宿主机IP,不要使用docker 内部IP
brokerIP1=10.22.19.130
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭 !!!这里仔细看是false,false,false
autoCreateTopicEnable=true
enableAutoCreateSystemTopic=true
# 必须设置为true(与proxy协调)
enableAutoCreateSubscriptionGroup=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
listenPort=10911
#此参数控制是否开启密码,不开启可设置false
aclEnable=false
#删除文件时间点,默认凌晨4点
deleteWhen=04
#文件保留时间,默认48小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mappedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mappedFileSizeConsumeQueue=3000000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/home/rocketmq/store/commitlog
#消费队列存储
storePathConsumeQueue=/home/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/home/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
# 延迟消息配置
timerWheelEnable=true
# 启用延迟消息功能
enableScheduleMessage=true
# 定义延迟级别
messageDelayLevel=1s 3s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
# 确保此目录存在且可写
timerStorePath=/home/docker/rocketmq/timerwheel
# 时间轮刷新间隔
timerFlushIntervalMs=1000
# 时间轮精度
timerPrecisionMs=1000
# 调度消息服务线程数
scheduleMessageServiceThreadPoolNums=4
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘 SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
# 堆外内存限制(需与 JVM 参数一致)
maxDirectMemorySize=1g
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
注意这里有个坑brokerIP1=10.22.19.130,这个是服务器的IP,用的是服务器的IP而不是容器名,然后里面的存储路径等路径需要确保存在并赋权,否则手动创建,部分配置可看上面注释说明。然后保存修改后的broker.conf。
2.2 修复SRS服务器配置
定位到docs/install/docker/srs/srs_conf_7088.conf这个文件下(若不存在则手动创建,以下不再赘述)
写入配置:
# 基础运行配置
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
# 低延迟优化
vhost __defaultVhost__ {
tcp_nodelay on;
min_latency on;
}
# HTTP API 服务(用于服务器状态管理)
http_api {
enabled on;
listen 1985;
crossdomain on;
}
# HTTP 服务器(用于H5播放器拉流)
http_server {
enabled on;
listen 7088;
dir ./objs/nginx/html;
}
# WebRTC 信令服务器配置
rtc_server {
enabled on;
listen 8000; # WebRTC信令端口
candidate 10.22.19.130; # 公网IP 服务器IP,需要改
}
# 虚拟主机配置
vhost __defaultVhost__ {
# WebRTC 模式配置
rtc {
enabled on;
# 关闭 RTMP 转 WebRTC(避免强制中转,因为要实现P2P打视频)
rtmp_to_rtc off; # on:表示支持RTMP推流转WebRTC播放
rtc_to_rtmp off; # on:表示支持WebRTC推流转RTMP播放
# P2P模式必须开启NACK
nack on;
# 开启TWCC带宽估计
twcc on;
}
# HTTP-FLV 流配置
http_remux {
enabled on;
mount [vhost]/webrtc/;
}
# HLS 流配置(用于兼容性)
hls {
enabled off;
}
# 低延迟播放配置
play {
gop_cache off; # 关闭GOP缓存降低延迟
queue_length 10; # 减小播放队列长度
}
}
这里主要是修改Webrtc的服务器地址,即candidate 10.22.19.130;这行,需要改成服务器的公网ip,而不是容器的ip,修改好后,保存,
2.3、搭建Turn服务
由于官方是使用编译等的方法搭建的,所以这边我们采用dockerCompose的方法..
新建 docs/install/docker/turn/docker-compose-turn.yml 这个文件,写入一下配置:
version: '3.8'
services:
turn:
image: coturn/coturn:latest
container_name: turnserver
restart: always
# ⚠️ 核心网络配置:
# TURN 服务需要映射大量的 UDP 端口 (49152-65535)。
# 使用 host 网络模式 (network_mode: host) 是最简单、最高效的方式,
# 它可以让容器直接使用宿主机的网络,避免了手动映射所有端口的麻烦。
# ❗ 仅适用于 Linux 宿主机。
network_mode: host
user: root
# 挂载配置文件
volumes:
# - ./turn/turnserver.conf:/etc/turnserver.conf:ro
- ./turn/turnserver.conf:/etc/coturn/turnserver.conf:ro
# 容器启动命令:强制使用挂载的配置文件
# command: turnserver -n -c /etc/turnserver.conf
entrypoint:
- turnserver
- -n
- -c
- /etc/coturn/turnserver.conf # <-- 使用新的路径
environment:
- TZ=Asia/Shanghai
创建./turn/turnserver.conf(一般会有),同时修改以下关键部分:
#网卡名,可使用ifconfig查询网卡名称,确保和正在使用的网卡名一致
relay-device=eno1
#内网IP,docker部署建议0.0.0.0
#listening-ip=10.22.19.130
listening-ip=0.0.0.0
#公网IP,服务器ip
external-ip=10.22.19.130
#用户名密码,创建IceServer时用
user=chr:123456
#一般与turnadmin创建用户时指定的realm一致
#realm=hulaspark.com
# 1. 认证域 (Realm):保持宿主机 IP,用于客户端鉴权。
realm=10.22.19.130
#端口号
listening-port=3478
#不开启会报CONFIG ERROR: Empty cli-password, and so telnet cli interface is disabled! Please set a non empty cli-password!错误
cli-password=qwerty
# 禁用 IPv6
no-udp6
no-tcp6
#cert=/etc/turn_server_cert.pem
#pkey=/etc/turn_server_pkey.pem
#dh-file=/etc/coturn/dhparam.pem
修改好后,保存,由于Turn服务是单独的服务,启动后不影响其他的,所以可以单独启动,然后可以使用https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 这个
测试地址来进行测试。
到这里后,基本差不多了,同时最后再检查一遍docs/install/docker/env/mysql.env这个文件的环境变量,确保没问题并记住里面的账号密码后,继续,
2.3 启动mysql
先确保docker文件夹下的路径都有权限(为了方便这里直接全部777了)
然后执行命令
cd /home/docker & docker-compose up -d mysql
然后等待容器启动成功即可,
2.4、导入SQL文件
到这里就可以导入之前准备好的SQL文件了,等mysql启动后,正常运行后使用Navicat连接数据库,创建与SQL文件同名的库即可,这里也有个小坑,他给的mysql-schema.sql这个SQL,实际导入对应的数据库名为nacos,其余的两个SQL对应文件名即可。(尽量使用utf8mb4以及utf8mb4_unicode_ci创建数据库) ,确保导入成功后,重启mysql即可。(注意:Navicat 连接数据库时使用的是13306的端口,因为当时我是在局域网下部署的;SQL文件可以进入容器内再导入,这里为了方便就使用Navicat了。mysql的账号密码都在环境变量下,自行查看即可)
2.5、启动所有地基服务,
确保最终home/docker/env/下面的三个环境变量等都配置修改正确了,例如数据库密码等,当数据库启动且稳定后,在/home/docker/路径下,运行docker-compose up -d启动所有容器,
最终启动如下:

说明:其中rocketmq这个服务有三个容器,有启动顺序,若是发现某个容器启动失败后重启即可。minio-mc不是常驻服务,一般启动后没多久会停止,属于正常现象。
总结
其实自己搭建完后发现并不难,主要就是前期的准备,比如路径要对齐,配置文件要修改这些。关键的也就是这些,目前主要的关键点有:
- 各个地基服务的路径要和docker-compose里面的路径要对齐,路径不存在需要先补齐路径
- 每个地基服务例如rocketmq的配置等等,都要自己修改完善,
- 数据库的库名和文件名可能没对上,导入SQL文件时需要自行分辨,以环境变量为准或者docker-compose.yml里面的内容为准
- 最后也是提醒一点,尽量在部署时把里面的账号密码提前记住,例如nacos,账号密码都是nacos,可以通过docker-compose.yml里面的内容来查看
基本上搭建到这里地基就已经搭建的差不多了,后续步骤就是搭建springboot了
题外话:当时是想着绕过nacos来部署的,但是他使用到分布式了,而且还有网关服务,要是不使用nacos的话,也就是网关服务等都没用了,要拆开来弄,太麻烦了就使用nacos进行分布式部署了,当然这个好处也是显而易见的。
