【打工日常】云原生之搭建私有化web在线聊天软件LumenIM

一、LumenIM介绍

1.LumenIM简介

Lumen IM 是一个网页版在线聊天项目,前端使用 Naive UI + Vue3,后端采用 GO 开发。

2.LumenIM功能

基于 WebSocket 服务做消息即时推送
支持私聊及群聊
支持多种聊天消息类型 例如:文本、代码块、图片及其它类型文件,并支持文件下载
支持聊天消息撤回、删除(批量删除)、转发消息(逐条转发、合并转发)、群禁言
支持编写个人笔记、支持笔记分享(好友或群)。

3.LumenIM项目地址

前端:https://gitee.com/gzydong/LumenIM
后端:https://gitee.com/gzydong/go-chat

二、本次实践介绍

1. 本次实践简介

a.本次实践部署环境为个人腾讯云的测试环境,若是生产环境请谨慎部署;

b.本次实践使用了mysql、redis、nginx以及前后端的开源包进行启动测试。

2. 本地环境规划

本次实践环境规划:通过docker启动nginx、mysql、redis,以及本地启动前后端

三、检查本地Docker环境

1. 检查本地Docker版本

 
  1. 检查Docker版本:docker version

  2. root@WellDone:/home/goodjob# docker version

  3. Client: Docker Engine - Community

  4. Version: 25.0.0

  5. API version: 1.44

  6. Go version: go1.21.6

  7. Git commit: e758fe5

  8. Built: Thu Jan 18 17:09:49 2024

  9. OS/Arch: linux/amd64

  10. Context: default

  11. Server: Docker Engine - Community

  12. Engine:

  13. Version: 25.0.0

  14. API version: 1.44 (minimum version 1.24)

  15. Go version: go1.21.6

  16. Git commit: 615dfdf

  17. Built: Thu Jan 18 17:09:49 2024

  18. OS/Arch: linux/amd64

  19. Experimental: false

  20. containerd:

  21. Version: 1.6.27

  22. GitCommit: a1496014c916f9e62104b33d1bb5bd03b0858e59

  23. runc:

  24. Version: 1.1.11

  25. GitCommit: v1.1.11-0-g4bccb38

  26. docker-init:

  27. Version: 0.19.0

  28. GitCommit: de40ad0

  29. root@WellDone:/home/goodjob#

2. 检查Docker服务状态

检查Docker服务状态,确保Docker服务正常运行。

 
  1. systemctl status docker

  2. root@WellDone:/home/goodjob/Downloads# systemctl status docker

  3. ● docker.service - Docker Application Container Engine

  4. Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)

  5. Active: active (running) since Wed 2024-01-24 08:54:31 CST; 1 day 4h ago

  6. TriggeredBy: ● docker.socket

  7. Docs: https://docs.docker.com

  8. Main PID: 1549 (dockerd)

  9. Tasks: 65

  10. Memory: 419.5M

  11. CPU: 38.874s

  12. CGroup: /system.slice/docker.service

  13. ├─ 1549 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

  14. ├─ 2010 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 6379 -container-ip 172.17.0.2 -container-port 6379

  15. ├─ 2016 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 6379 -container-ip 172.17.0.2 -container-port 6379

  16. ├─ 2029 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5432 -container-ip 172.17.0.3 -container-port 5432

  17. ├─ 2036 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5432 -container-ip 172.17.0.3 -container-port 5432

  18. ├─123083 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8888 -container-ip 172.17.0.4 -container-port 8080

  19. └─123095 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8888 -container-ip 172.17.0.4 -container-port 8080

  20. 1月 24 08:54:31 WellDone dockerd[1549]: time="2024-01-24T08:54:31.067895045+08:00" level=info msg="API listen on /run/docker.sock"

  21. 1月 24 08:54:31 WellDone systemd[1]: Started Docker Application Container Engine.

  22. 1月 24 16:13:48 WellDone dockerd[1549]: time="2024-01-24T16:13:48.185008219+08:00" level=info msg="ignoring event" container=8ad99af82d8a41dd661d>

  23. 1月 24 16:13:48 WellDone dockerd[1549]: time="2024-01-24T16:13:48.189484205+08:00" level=warning msg="ShouldRestart failed, container will not be>

  24. 1月 24 21:58:08 WellDone dockerd[1549]: time="2024-01-24T21:58:08.024915139+08:00" level=info msg="ignoring event" container=27fd28e2993f31b170b8>

  25. 1月 24 21:58:08 WellDone dockerd[1549]: time="2024-01-24T21:58:08.029986730+08:00" level=warning msg="ShouldRestart failed, container will not be>

  26. 1月 25 10:46:16 WellDone dockerd[1549]: time="2024-01-25T10:46:16.329180722+08:00" level=info msg="Container failed to exit within 10s of signal >

  27. 1月 25 10:46:16 WellDone dockerd[1549]: time="2024-01-25T10:46:16.350757439+08:00" level=info msg="ignoring event" container=b1223add00f36bbb3246>

  28. 1月 25 10:49:21 WellDone dockerd[1549]: time="2024-01-25T10:49:21.993755983+08:00" level=info msg="Container failed to exit within 10s of signal >

  29. 1月 25 10:49:22 WellDone dockerd[1549]: time="2024-01-25T10:49:22.015822650+08:00" level=info msg="ignoring event" container=edb0e153b45dbe62acd8>

  30. lines 1-28/28 (END)

四、部署过程

 
  1. ```

  2. 1.下载前后端程序

  3. # 前端部分:

  4. #到opt目录下创建该程序的存放路径

  5. cd /opt

  6. mkdir LumenIm

  7. cd LumenIm

  8. git clone https://gitee.com/gzydong/LumenIM.git

  9. git clone https://github.com/gzydong/go-chat.git

  10. 2.下载下来后,要部署编译,先前端:

  11. yarn install

  12. #需要先安装yarn

  13. yum install npm

  14. npm install -g yarn

  15. 3.安装依赖包后,构建生产环境配置

  16. yarn build

  17. 4.ll -a查看LumenIm全部的配置文件,找到.env.electron,接口的地址写上,具体的ip根据你自己的服务器的公网地址去写。

  18. ENV = 'production'

  19. VITE_BASE=./

  20. VITE_ROUTER_MODE=hash

  21. VITE_BASE_API=http://43.138.153.157:9503

  22. VITE_SOCKET_API=ws://43.138.153.157:9504

  23. 5.然后启动本地开发环境桌面客户端

  24. yarn electron:dev

  25. 6.mysql、redis、nginx部署,我这边是直接docker compose启动的

  26. version: '3'

  27. services:

  28. redis:

  29. image: 'redis:latest'

  30. volumes:

  31. - '/opt/redis/data:/data'

  32. - '/opt/redis/conf/redis.conf:/etc/redis/redis.conf'

  33. privileged: true

  34. container_name: redis

  35. ports:

  36. - '6379:6379'

  37. restart: always

  38. mysql_dba:

  39. image: 'mysql:latest'

  40. environment:

  41. - MYSQL_ROOT_PASSWORD=111111

  42. volumes:

  43. - '/etc/localtime:/etc/localtime:ro'

  44. - '/opt/mysql/conf:/etc/mysql/conf.d'

  45. - '/opt/mysql/data:/var/lib/mysql'

  46. - '/opt/mysql/log:/var/log/mysql'

  47. privileged: true

  48. restart: always

  49. container_name: mysql_dba

  50. ports:

  51. - '3306:3306'

  52. nginx:

  53. image: 'nginx:latest'

  54. restart: always

  55. volumes:

  56. - '/etc/localtime:/etc/localtime:ro'

  57. - '/opt/LumenIm/LumenIM/dist:/opt/LumenIm/LumenIM/dist'

  58. - '/opt/nginx/nginx.conf:/etc/nginx/nginx.conf'

  59. ports:

  60. - '80:80'

  61. container_name: nginx

  62. 以上具体每个容器的路径自己设定

  63. ####nginx配置文件如下:

  64. user nginx;

  65. worker_processes auto;

  66. error_log /var/log/nginx/error.log notice;

  67. pid /var/run/nginx.pid;

  68. events {

  69. worker_connections 1024;

  70. }

  71. http {

  72. include /etc/nginx/mime.types;

  73. default_type application/octet-stream;

  74. log_format main '$remote_addr - $remote_user [$time_local] "$request" '

  75. '$status $body_bytes_sent "$http_referer" '

  76. '"$http_user_agent" "$http_x_forwarded_for"';

  77. access_log /var/log/nginx/access.log main;

  78. server {

  79. listen 80;

  80. server_name localhost;

  81. root /opt/LumenIm/LumenIM/dist;

  82. index index.html;

  83. location / {

  84. try_files $uri $uri/ /index.html;

  85. }

  86. location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {

  87. expires 7d;

  88. }

  89. location ~ .*\.(js|css)?$ {

  90. expires 7d;

  91. }

  92. }

  93. sendfile on;

  94. #tcp_nopush on;

  95. keepalive_timeout 65;

  96. #gzip on;

  97. #include /etc/nginx/conf.d/*.conf;

  98. }

  99. 7.后端部署:

  100. 拷贝项目根目录下 config.example.yaml 文件为 config.yaml 并正确配置相关参数

  101. cp config.example.yaml config.yaml

  102. 我这边的配置如下:

  103. # 项目配置信息

  104. app:

  105. env: dev

  106. debug: false

  107. juhe_key: "xxxxxxx"

  108. admin_email:

  109. -

  110. public_key: |

  111. -----BEGIN PUBLIC KEY-----

  112. xxxxxxx

  113. -----END PUBLIC KEY-----

  114. private_key: |

  115. -----BEGIN RSA PRIVATE KEY-----

  116. xxxxx

  117. -----END RSA PRIVATE KEY-----

  118. server:

  119. http: 9503

  120. websocket: 9504

  121. tcp: 9505

  122. # 日志配置

  123. log:

  124. # 日志文件路径 *请使用绝对路径*

  125. path: "/path/to/.../runtime"

  126. # Redis 相关配置

  127. redis:

  128. host: 43.138.153.157:6379

  129. auth: xxxxx

  130. database: 0

  131. # Mysql 数据库配置

  132. mysql:

  133. host: 43.138.153.157

  134. port: 3306

  135. charset: utf8mb4

  136. username: root

  137. password: 111111

  138. database: go_chat

  139. collation: utf8mb4_general_ci

  140. # Jwt 配置

  141. jwt:

  142. secret: 836c3fea9bba4e04d51bd0fbcc5

  143. expires_time: 3600

  144. buffer_time: 3600

  145. openai:

  146. key: "xxxx"

  147. proxy: "https://api.openai.com"

  148. # 跨域配置

  149. cors:

  150. origin: "*"

  151. headers: "Content-Type,Cache-Control,User-Agent,Keep-Alive,DNT,AccessToken,Authorization"

  152. methods: "OPTIONS,GET,POST,PUT,DELETE"

  153. credentials: false

  154. max_age: 600

  155. # 文件系统配置【oss,qiniu 暂不支持】

  156. filesystem:

  157. default: local

  158. local:

  159. # 文件保存的根目录

  160. root: "/path/xx/lumenim/"

  161. # 公开的 bucket

  162. bucket_public: "public"

  163. # 私有的 bucket

  164. bucket_private: "private"

  165. endpoint: "im-cdn.gzydong.com"

  166. ssl: false

  167. minio:

  168. secret_id: "xxxxxx"

  169. secret_key: "xxxxx"

  170. # 公开的 bucket

  171. bucket_public: "im-static"

  172. # 私有的 bucket

  173. bucket_private: "im-private"

  174. endpoint: "im-cdn.gzydong.com:9000"

  175. ssl: false

  176. # 邮件配置

  177. email:

  178. host: smtp.163.com

  179. port: 465

  180. username: xxxxx

  181. password: xxxxx

  182. fromname: "Lumen IM 在线聊天"

  183. 以上是配置文件内容

  184. 8.这时候要安装依赖包

  185. go mod tidy

  186. #但是要先安装go,以下是步骤

  187. wget https://golang.google.cn/dl/go1.21.0.linux-amd64.tar.gz

  188. tar -xvf go1.21.0.linux-amd64.tar.gz

  189. vim /etc/profile

  190. mkdir /home/gopath

  191. source /etc/profile

  192. go version

  193. 出来版本即可,要1.21.0

  194. 这时候执行go mod tidy,会有一段时间,后面就可以了

  195. #其中有可能下载会遇到go 下载github包提示: dial tcp 172.217.160.81:443: i/o timeout ,这时候执行下面,然后重新安装依赖就可以

  196. go env -w GOPROXY=https://goproxy.cn

  197. ##然后再安装依赖包

  198. go mod tidy

  199. 9.安装相关依赖命令行工具

  200. make install

  201. 10.安装完成后,要初始化数据库

  202. go run ./cmd/lumenim migrate

  203. #这时候又会遇到问题,有以下的,各自执行就行

  204. 问题: 运行electorn . 报错:error while loading shared libraries: libX11-xcb.so.1

  205. yum install libX11-devel --nogpg

  206. 问题: error while loading shared libraries: libatk-bridge-2.0.so.0

  207. yum install at-spi2-atk -y

  208. 问题:error while loading shared libraries: libgtk-3.so.0

  209. yum install gtk3 -y

  210. 问题:error while loading shared libraries: libXss.so.1

  211. yum install libXScrnSaver* -y

  212. 问题:error while loading shared libraries: libdrm.so.2

  213. yum install libdrm*

  214. 问题:error while loading shared libraries: libgbm.so.1

  215. yum install libgbm*

  216. 11.再次初始化数据库

  217. go run ./cmd/lumenim migrate

  218. ##这时候可能会爆内存,我服务器比较小,4g,直接爆了,虚拟内存加了8g,然后初始化成功了

  219. 下面是加交换分区的方法

  220. 创建要作为swap分区的文件:增加1GB大小的交换分区,则命令写法如下,其中的count等于想要的块的数量(bs*count=文件大小)。

  221. dd if=/dev/zero of=/root/swapfile bs=1M count=1024

  222. 格式化为交换分区文件:

  223. mkswap /root/swapfile #建立swap的文件系统

  224. 启用交换分区文件:

  225. swapon /root/swapfile #启用swap文件

  226. 使系统开机时自启用,在文件/etc/fstab中添加一行:

  227. /root/swapfile swap swap defaults 0 0

  228. 12.这时候完成后,启动后端即可

  229. go run ./cmd/lumenim http # 本地启动 http 服务

  230. go run ./cmd/lumenim commet # 本地启动 websocket 服务

六、访问LumenIM首页

访问地址http://43.138.153.157/auth/login?redirect=/message,这是我的测试服务器的地址,大家可以访问玩玩,账号密码:13188886666,111222

图片

图片

图片

图片

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

15.接口自动化学习-Mock(挡板/测试桩)

场景: 新需求还未开发时,使用mock提早介入测试,等后边开发后,进行调试 三方接口返回效率低,使用mock技术走通流程 1.mock方式 (1)如果会写django或flask,可以写简单对应的代码 (…

Mysql--基础知识点--0.1--脏读、不可重复读、幻读

1 脏读、不可重复读、幻读 1.1 脏读 如果一个事务读到了另一个事务已修改且未提交的数据,则发生了脏读现象。 1.2 不可重复读 在一个事务里面多次读取同一个数据,若前后两次读到的数据不一致,则发生不可重复读现象。 1.3 幻读 在一个…

redis7 for windows的安装教程

本篇博客主要介绍redis7的windows版本下的安装教程 1.redis介绍 Redis(Remote Dictionary Server)是一个开源的,基于内存的数据结构存储系统,可用作数据库、缓存和消息代理。它支持多种数据结构,如字符串、哈希表、列…

【软考高项】二十六、范围管理基础内容

一、管理基础 产品范围和项目范围 产品范围强调结果,项目范围强调结果 管理的新实践 :需求一直是项目管理的关注重点,需求管理过程结束于需求关闭,即把产品、服务或成果移交给接收方,以便长期测量、监控、实现并维持收…

three.js 学习笔记 | 光线投射技术 - 包围盒(碰撞检测)

文章目录 three.js 学习笔记光线投射技术实现3D场景交互事件 THREE.Raycaster坐标系的转换案例:选中的模型变为红色 包围盒Box3 - 碰撞检测AABB包围盒辅助器Box3Helper案例1:创建AABB包围盒/包围球computeBoundingBox与boundingBox 搭配使用,…

vivado Aurora 8B/10B IP核(1)

Aurora 8B/10B IP 支持 Kintex -7, Virtex -7 FPGA GTP 和 GTH 收发器,Artix -7 FPGA GTP 收发器, Zynq -7000 GTP and GTP 收发器。Aurora 8B/10B IP core 可以工作于单工或者全双工模式。IP CODE的使用也非常简单,支持 AMBA总线的 AXI4-Stream 协议。…

字符串函数及其模拟实现

目录 strlen函数介绍模拟实现 strcpy函数介绍模拟实现 strcat函数介绍模拟实现 strcmp函数介绍模拟实现 strncpy函数介绍模拟实现 strncat函数介绍模拟实现 strncmp函数介绍模拟实现 strtokstrstr函数介绍模拟实现 strerrorperror strlen 函数介绍 函数介绍: 字符串…

Leetcode 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:digits “23” 输出:[“a…

React真的好难用

我发现React就像个宗教一样,网络上总有一群信徒。信徒:React天下第一,谁也不能说他不好。 网络上大佬对React的评价一般有几类: React跟Vue比就是手动档和自动档的区别,高手都开手动档。—— 就一个破打工的&#xf…

cJSON的使用

文章目录 一、CJSON初识二、CJSON解析器基础三、CJSON解析数据JSON解析基础CJSON解析数组数据CJSON解析嵌套数据 五、创建JSON数据 一、CJSON初识 JSON (JavaScript Object Notation)是一种轻量级的数据交换格式,常用于在网络之间传输数据。它是一种文本格式&#…

河南新办灌溉排涝乙级资质预算分析

河南新办灌溉排涝乙级资质的预算分析是一个涉及多方面因素的综合考量。以下是对该预算的详细分析: 首先,人员费用是预算中的重要组成部分。这包括聘请符合资质要求的技术人员、工程师和其他相关人员的薪酬、社保等费用。这些费用会根据所需人员的数量、资…

JavaScript云LIS系统源码 前端框架JQuery+EasyUI+后端框架MVC+SQLSuga大型医院云LIS检验系统源码 可直接上项目

JavaScript云LIS系统源码 前端框架JQueryEasyUI后端框架MVCSQLSuga大型医院云LIS检验系统源码 可直接上项目 云LIS系统概述: 云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作&#xff…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

视频输入c++ 调用 libtorch推理

1、支持GPU情况 libtorch 支持GPU情况比较奇怪,目前2.3 版本需要在链接器里面加上以下命令,否则不会支持gpu -INCLUDE:?ignore_this_library_placeholderYAHXZ 2 探测是否支持 加一个函数看你是否支持torch,不然不清楚,看到…

Hive函数详解

Hive 是一个建立在 Hadoop 上的数据仓库基础架构,它提供了类似于 SQL 的查询语言,称为 HiveQL,用于对存储在 Hadoop 分布式文件系统中的数据进行查询和分析。 1.函数简介 Hive会将常用的逻辑封装成函数给用户进行使用,类似于Jav…

Web前端开发 小实训(一) 成绩分类统计

用于学生web前端开发课程实训练习,掌握基本语法和数据类型 实训目的 使用分支语句,完成分数统计与等级对比,通过输入框输入分数,可以根据分数多少划分等级。 参考思路: 分析题目:根据输入分数进行等级划分。 操作过…

springboot如何使用RedisTemplate

第一步&#xff1a;创建一个spring boot项目 第二步&#xff1a;pom导入redis相关依赖 <!--reids依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </depen…

Go语言中的goroutine调度是如何实现的?

文章目录 一、M:N调度模型二、GMP模型三、调度过程四、调度优化五、示例代码 在Go语言中&#xff0c;goroutine是一种轻量级的线程&#xff0c;它使得并发编程变得更加简单和高效。而goroutine的调度则是Go运行时&#xff08;runtime&#xff09;系统负责的一个核心任务&#x…

Postman,一个功能强大的API开发和测试工具

最近有小伙伴说在找 postman 的使用教程&#xff0c;案例等文章。 那么今天我就来写一个。 Postman 是一个功能强大的 API 开发和测试工具&#xff0c;它提供了丰富的功能&#xff0c;帮助开发人员更好地管理、测试和文档化 API。无论是单独开发还是团队协作&#xff0c;Postma…

[1688]jsp工资投放管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 工资投放管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…