OpenIsle
OpenIsle
话题发帖我的消息关于🔥 活动
类别
好玩 & 轻松交流 x 271
技术 & 开发调优 x 138
软件 & 资源 x 67
资讯 & 快讯 x 44
运营反馈 x 37
水深火热 x 13
Crypto x 10
标签
纯水 x 234
软件开发 x 107
人工智能 x 66
抽奖 x 64
开源共建 x 45
快问快答 x 33
夸克网盘 x 31
搬运 x 24
百度网盘 x 14
ChatGPT x 13
查看更多
仿QQ即时通讯HuLa服务端docker搭建教程(上)
技术 & 开发调优
软件开发
纯水
avatar
清风 开山鼻祖
1.23 21:04

接着也是把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启动所有容器,

最终启动如下:

image.png

说明:其中rocketmq这个服务有三个容器,有启动顺序,若是发现某个容器启动失败后重启即可。minio-mc不是常驻服务,一般启动后没多久会停止,属于正常现象。


总结

其实自己搭建完后发现并不难,主要就是前期的准备,比如路径要对齐,配置文件要修改这些。关键的也就是这些,目前主要的关键点有:

  • 各个地基服务的路径要和docker-compose里面的路径要对齐,路径不存在需要先补齐路径
  • 每个地基服务例如rocketmq的配置等等,都要自己修改完善,
  • 数据库的库名和文件名可能没对上,导入SQL文件时需要自行分辨,以环境变量为准或者docker-compose.yml里面的内容为准
  • 最后也是提醒一点,尽量在部署时把里面的账号密码提前记住,例如nacos,账号密码都是nacos,可以通过docker-compose.yml里面的内容来查看

基本上搭建到这里地基就已经搭建的差不多了,后续步骤就是搭建springboot了


题外话:当时是想着绕过nacos来部署的,但是他使用到分布式了,而且还有网关服务,要是不使用nacos的话,也就是网关服务等都没用了,要拆开来弄,太麻烦了就使用nacos进行分布式部署了,当然这个好处也是显而易见的。

emoji
1
1
Sort by:
返回
暂无评论