使用 Docker 部署 TailChat 开源即时通讯平台

news2024/10/6 4:14:09

1)介绍 TailChat

官网: https://tailchat.msgbyte.com/
作者:https://www.moonrailgun.com/about/
GitHub : https://github.com/msgbyte/tailchat

TailChat 是一款插件化易拓展的开源 IM 应用。可拓展架构赋予 Tailchat 无限可能性。前端微内核架构 + 后端微服务架构。使得 Tailchat 能够驾驭任何定制化 / 私有化的场景。面向企业与私域用户打造,高度自由的群组管理与定制化的面板展示可以让私域主能够更好的展示自己的作品,管理用户,打造自己的品牌与圈子。

image.png

2)TailChat 功能

参考:https://blog.laoda.de/archives/docker-compose-install-tailchat

  • 注重隐私:只有被邀请的成员才能加入群组
  • 防止陌生人: 只有通过昵称 + 一串随机的数字才能添加好友
  • 二维的群组空间: 通过频道来分割不同的话题
  • 高度自定义的群组空间: 通过分组和拖拽来创建独创的群组空间。
    • 同时可以通过更多的插件来增加更多的能力
  • 可以严谨,也可以乐趣。 通过插件的组合可以创造用于不同场景的 Tailchat。可以是面向娱乐,也可以是面向企业。
  • 后端微服务架构: 已经为大规模部署做好了准备。不用担心用户量大了以后怎么办
  • 用户管理
    • 基于 4 位数字标识 (战网like) 的用户名系统
    • 好友管理
  • 聊天系统
    • 私聊
    • 群聊
    • 富文本消息
      • 图片
      • 链接
      • 提及(@)
      • 代码
  • 插件系统
    • 前端插件系统 (基于 ministar 的微内核架构)
      • 自定义主题
      • 自定义面板
      • 自定义操作
      • 消息内容转换
    • 后端插件系统 ( 基于 moleculer 的微服务架构 )

3)使用场景

个人用户

  • 如果希望和朋友一起玩

    • 创建一个群组
    • 通过多个频道分割不同的话题
    • 使用网页面板来分享喜欢的网页
  • 如果希望聚集自己的粉丝圈

    • 使用机器人来订阅自己的信息并转发到聊天面板
    • 让自己的粉丝集中在一起,不需要创建无数个 qq 群/微信群
    • 多个频道让多个话题能够一起产生
  • 如果对于自己的隐私非常看中

    • 自己部署让一切都能掌控在手中

企业用户

  • 面板化设计满足企业自定义化设计需求

  • 插件化架构可以方便基于核心进行二次开发

  • 自部署的实现可以让企业价值得到保护,让企业安心

  • 开源代码方便审查

4)部署安装

4.1)安装 Docker 环境

# 高版本 Docker 安装
curl -fsSL https://get.docker.com/ | sh
# 关闭防火墙
systemctl disable --now firewalld
setenforce 0
# 启用 Docker
systemctl enable --now docker

4.2)开启 IPv4 forwarding

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
systemctl restart network
sysctl net.ipv4.ip_forward

4.3)安装 Docker-compose

curl -L https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v

4.4)创建 TailChat 目录

mkdir -p /docker/tailchat

cd /docker/tailchat

5)基于 Docker-compose 部署服务

vim docker-compose.yml
version: "3.3"

services:
  # 应用网关
  service-gateway:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: core/gateway
      PORT: 3000
    depends_on:
      - mongo
      - redis
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api-gw.rule=PathPrefix(`/`)"
      - "traefik.http.services.api-gw.loadbalancer.server.port=3000"
    networks:
      - internal

  # 用户服务
  service-user:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: core/user/*
    depends_on:
      - mongo
      - redis
    networks:
      - internal

  # 群组服务
  service-group:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: core/group/*
    depends_on:
      - mongo
      - redis
    networks:
      - internal

  # 聊天服务
  service-chat:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: core/chat/*
    depends_on:
      - mongo
      - redis
    networks:
      - internal

  # 文件服务 / 插件注册中心 / 配置服务
  service-file:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: core/file,core/plugin/registry,core/config
    depends_on:
      - mongo
      - redis
      - minio
    networks:
      - internal

  service-openapi:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: openapi/app,openapi/oidc/oidc
      OPENAPI_PORT: 3003
      OPENAPI_UNDER_PROXY: "true"
    depends_on:
      - mongo
      - redis
      - minio
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.openapi-oidc.rule=PathPrefix(`/open`)"
      - "traefik.http.services.openapi-oidc.loadbalancer.server.port=3003"
    networks:
      - internal

  # 插件服务(所有插件)
  service-all-plugins:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICEDIR: plugins
    depends_on:
      - mongo
      - redis
      - minio
    networks:
      - internal

  # 数据库
  mongo:
    image: mongo:4
    restart: on-failure
    volumes:
      - ./data:/data/db
    networks:
      - internal

  # 数据缓存与中转通讯
  redis:
    image: redis:alpine
    restart: on-failure
    networks:
      - internal

  # 存储服务
  minio:
    image: minio/minio
    restart: on-failure
    networks:
      - internal
    environment:
      MINIO_ROOT_USER: tailchat
      MINIO_ROOT_PASSWORD: P@ssw0rd123456
    volumes:
      - ./storage:/data
    command: minio server /data --console-address ":9001"

  # 路由转发
  traefik:
    image: traefik:v2.1
    restart: unless-stopped
    command:
      - "--api.insecure=true" # Don't do that in production!
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entryPoints.web.address=:80"
      - "--entryPoints.web.forwardedHeaders.insecure" # Not good
    ports:
      - 8080:80            			 # 8080 可以改成自己服务器上没有被占用的端口
      - 127.0.0.1:11001:8080     # 11001 同上
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - internal
      - default

networks:
  internal:
    name: tailchat-internal

5.1)创建环境变量文件

vim docker-compose.env
LOGGER=true
LOGLEVEL=info
SERVICEDIR=services

TRANSPORTER=redis://redis:6379

CACHER=redis://redis:6379

REDIS_URL=redis://redis:6379
MONGO_URL=mongodb://mongo/tailchat
SECRET=P@ssw0rd123456  # 改成自己的密钥

# file
API_URL=http://192.168.80.8  # 改成自己的网站

# minio
MINIO_URL=minio:9000
MINIO_USER=tailchat
MINIO_PASS=P@ssw0rd123456

# SMTP
SMTP_SENDER=
SMTP_URI=

# metrics
PROMETHEUS=1

5.2)拉取镜像

docker pull moonrailgun/tailchat
docker tag moonrailgun/tailchat tailchat # 修改 tag 以让配置文件能够识别

5.3)创建服务

cd /docker/tailchat    # 确保来到 docker-compose 文件所在的文件夹下

# 确保配置文件 ( docker-compose.yml 和 docker-compose.env ) 在当前目录下
# 执行如下命令一键启动
docker-compose up -d

6)访问 TailChat

http://服务器IP地址:8080

image.png
image.png
image.png
image.png
image.png
image.png

参考: 【好玩儿的Docker项目】激情畅聊!十分钟搭建一个插件化易拓展的开源即时聊天(IM)应用——Tailchat

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

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

相关文章

[Java EE] 多线程(五):单例模式与阻塞队列

1. 单例模式 单例模式是校招中最长考的设计模式之一,首先我们来谈一谈什么是设计模式: 设计模式就好像象棋中的棋谱一样,如果红方走了什么样的局势,黑方就有一定地固定地套路,来应对这样的局势,按照固定地套路来,可以保证在该局势下不会吃亏. 软件开发也是同样的道理,有很多…

harbor私仓搭建及其他服务器如何使用私仓详解

目录 主机规划1.harbor安装(harbor服务器)1.harbor介绍2.为harbor生成自签发证书(可选)3.安装Harbor4.Harbor使用 2.宿主机docker安装(server服务器)1. 设置主机名2. 安装需要的软件包3. 设置yum源4. 查看docker版本5. 安装Docker…

Shell和Linux权限

目录 shell Liunx权限 用户 sudo Linux的权限管理 文件访问者的分类 文件的属性 文件的权限 文件全权限值的表示方法 1.字符表示 2.八进制数值表示 用户符号 修改文件访问权限 修改文件拥有者 修改拥有者和所属组 修改所属组 文件目录的权限的含义 问题 粘滞…

【网络原理】震惊~~ 这是我见过最详细的TCP和UDP讲解

前言. 传输层: 传输层是TCP/IP协议五层模型中的第四层。他的主要工作是负责两台主机之间的数据传输.TCP和UDP都是传输层中的重要协议.再谈端口号(Port): 标识了⼀个主机上进行通信的不同的应用程序 0 - 1023: 知名端口号, HTTP, FTP, SSH等这些广为使用的应用层协议, 他们的端…

Leetcode算法训练日记 | day30

专题九 贪心算法 一、重新安排行程 1.题目 Leetcode:第 332 题 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场…

对于AIGC(人工智能)我们应该如何看待

文章目录 前言一、AIGC技术的现状与特点二、AIGC技术在各个领域的应用三、AIGC技术对未来社会的影响四、AIGC技术的可能发展方向 前言 随着科技的飞速发展,人工智能与大数据的结合日益紧密,AIGC(人工智能生成内容)技术作为这一领域…

【产品经理修炼之道】- 车载语音产品需求分析与产品设计

目录 一、车载语音产品概述 1. 车载语音交互具有以下特点和优势 2. 车载语音产品脑图框架 二、需求与竞品分析 1. 车载语音交互痛点分析 2. 基于实际驾驶情景的分析 3. 车载语音体验地图 4. 车载语音产品的竞品分析 三、需求分类与功能设计 1. 车载语音产品场景控制划…

划分子网练习

某个院系有4个专业,A专业有100台主机,B专业有58台主机,C专业有30台主机,D专业有28台主机,现申请了一个C类地址:192.32.250.0。 (1)请尝试为他们分配请按要求划分子网,使…

php动态高亮web源代码

php动态高亮web源代码 注:配置好不允许高亮的文件名,安全第一 #php实现动态展示目录树结构源代码 适用于开放源代码,结合html缓存使用效果更佳,因循环较多不适合放首页 能力有限没实现行号 演示:show source|开放…

短视频素材去哪里找,而且不带水印的那种?

为了确保视频创作者能够接触到全球范围内的优质资源,下面列出的视频素材网站各具特色,提供从标准视频到高动态范围(HDR)的素材,满足你在不同项目中的需求。 1. 蛙学府 (中国) 提供专业级的视频素材,特别适…

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型。随着信息技术的快速发展,数字化转型已成为各行各业的重要趋势。在糖果加工制造领域,智能工厂数字孪生可视化平台的出现,为行业数字化转型注入了新的活力。 糖果加工制…

【002_音频开发_基础篇_Linux音频架构简介】

002_音频开发_基础篇_Linux音频架构简介 文章目录 002_音频开发_基础篇_Linux音频架构简介创作背景Linux 音频架构ALSA 简介ASoC 驱动硬件架构软件架构MachinePlatformCodec ASoC 驱动 PCMALSA设备文件结构 ALSA 使用常用概念alsa-libALSA Open 流程ALSA Write 流程2种写入方法…

抖音获客新技能,品牌光彩夺目秘籍!

在数字化的浪潮中,社交媒体营销已成为品牌推广的重要手段。尤其是短视频平台,以其快速、直观的特点捕获了亿万用户的注意力。在这样的背景下,抖音作为一个重量级的短视频平台,吸引了大量的企业和品牌入驻,希望通过短视…

Rancher 应用商店离线环境使用

前言 Rancher (v2.5 ) 应用商店可以方便的安装 Helm3 构建的应用,并且支持私有 helm 应用仓库,方便了内网离线环境下的使用。本文以内网离线环境为前提、以 MySQL 5.7.43 版本为应用举例,从零开始手把手教你如何制作并应用。 1、环境准备 1.…

H5点击复制功能 兼容安卓、IOS

效果图 HTML代码 <div>链接&#xff1a;<span style"color: #FF8A21" click"CopyUrl" id"copyId"> https://blog.csdn.net/qq_51463650?spm1000.2115.3001.5343</span> </div>复制方法 const CopyUrl () > {let …

Git工具的使用

文章目录 Git概述本地仓库命令远程仓库命令分支操作标签操作 IDEA上执行Git Git概述 一般工作流程如下&#xff1a; 从远程仓库中克隆 Git 资源作为本地仓库&#xff1b; 从本地仓库中checkout代码然后进行代码修改&#xff1b; 在提交本地仓库前先将代码提交到暂存区&#xff…

利用Spring Boot后端与Vue前端技术构建现代化电商平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

python基础——正则表达式

&#x1f4dd;前言&#xff1a; 这篇文章主要想讲解一下python中的正则表达式&#xff1a; 1&#xff0c;什么是正则表达式 2&#xff0c;re模块三匹配 3&#xff0c;元字符匹配 4&#xff0c;具体示例 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&am…

【C++】STL-vector的使用

目录 1、什么是vector&#xff1f; 2、vector的使用 2.1 vector的定义 ​编辑 2.2 遍历修改数据 2.3 迭代器 2.4 vector空间增长问题 2.5 vector的增删查改 3、迭代器失效 3.1 会引起其底层空间改变的操作&#xff0c;都有可能是迭代器失效 3.2 指定位置元素的删除操…

【Linux】如何进行用户之间的切换——指令su

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …