【docker】开源的即时通讯系统——Tailchat 
本文发布于390天前,最后更新于256天前,其中的信息可能有所发展或是发生改变。如有疑问请联系邮箱:admin@yemengstar.com。

1.前言

项目地址:msgbyte/tailchat

官网:Tailchat (msgbyte.com)

文档:概述 | Tailchat (msgbyte.com)

概述

Tailchat 是一款插件化易拓展的开源 IM 应用。可拓展架构赋予 Tailchat 无限可能性。

前端微内核架构 + 后端微服务架构 使得 Tailchat 能够驾驭任何定制化/私有化的场景

面向企业与私域用户打造,高度自由的群组管理与定制化的面板展示可以让私域主能够更好的展示自己的作品,管理用户,打造自己的品牌与圈子。

特性

  • 完整的即时通讯基础能力
  • 插件化架构的赋予的自由拓展能力
  • 微服务架构赋予的水平拓展能力

亮点

  • 基于mini-star的前端微内核架构与基于moleculer的后端微服务架构可以适应各种用户用量,便于拓展
  • 完整的聊天系统,支持提及、面板跳转、富文本、markdown、url链接等各种语法
  • 消息reaction机制,让你通过表情表达自己
  • 文件分享与图片发送
  • 支持语音通话与视频通话
  • 完善的身份组管理,权限控制颗粒化
  • 用户管理与用户禁言
  • 邮箱认证与密码找回
  • 多种面板: 网页嵌入, 自定义html, 话题面板
  • 简易消息推送与github通知订阅
  • 后台管理平台
  • 开放平台
    • 机器人
    • OAuth
  • 插件带来的更多奇妙化学反应
    • 自定义主题
    • 在线听音乐
    • 消息加密
    • url获取元数据
    • 隔空投送
    • 任务管理
    • 在线绘图
    • 字体放大
    • 工具箱

2.使用场景

Tailchat 的设计之处就是以插件化的架构来满足不同人群对于不同需求的实现。

对于个人用户

  • 如果希望和朋友一起玩
    • 创建一个群组
    • 通过多个频道分割不同的话题
    • 使用网页面板来分享喜欢的网页
  • 如果希望聚集自己的粉丝圈
    • 使用机器人来订阅自己的信息并转发到聊天面板
    • 让自己的粉丝集中在一起,不需要创建无数个qq群/微信群
    • 多个频道让多个话题能够一起产生
  • 如果对于自己的隐私非常看中
    • 自己部署让一切都能掌控在手中

对于企业用户

  • 面板化设计满足企业自定义化设计需求
  • 插件化架构可以方便基于核心进行二次开发
  • 自部署的实现可以让企业价值得到保护,让企业安心
  • 开源代码方便审查

3.准备

3.1环境准备

夜梦这里使用的雨云服务器:https://www.rainyun.com

使用此链接注册后,绑定微信可以获得五元优惠券,并且新购、续费、升级均享受95折优惠。

系统为Ubuntu22.04

3.2安装docker

你需要安装docker和docker-compose,其中docker-compose版本推荐使用最新的2.23.0。

具体方法可以看夜梦的这篇文章:在服务器上安装docker

3.3内存空间

建议最低配置 1核2G

如果只有1C1G,建议添加SWAP。

具体添加方法可以看夜梦的这篇文章:手动添加SWAP

4.应用部署

4.1拉取镜像

从公共镜像库拉取 tailchat镜像

docker pull moonrailgun/tailchat

将下载的镜像改名为tailchat(和源码编译保持一致,如果不改的话会走源码编译流程)

docker tag moonrailgun/tailchat tailchat

4.2配置应用

新建文件夹

cd ~ && mkdir tailchat && cd tailchat

创建配置文件

vim docker-compose.yml

一般来说直接复制粘贴下面的内容填入就可以了:

version: "3.5"

services:
  # Tailchat Core Services
  service-core:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: core/gateway,core/user/*.service.js,core/group/*.service.js,core/chat/*.service.js,core/file,core/plugin/registry,core/config
      PORT: 3000
    depends_on:
      - mongo
      - redis
      - minio
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api-gw.rule=PathPrefix(`/`)"
      - "traefik.http.services.api-gw.loadbalancer.server.port=3000"
    networks:
      - internal

  # Open Platform
  service-openapi:
    build:
      context: .
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    environment:
      SERVICES: openapi/app,openapi/bot,openapi/integration,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

  # Plugin Service (All Plugins)
  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

  # Database
  mongo:
    image: mongo:4
    restart: on-failure
    volumes:
      - data:/data/db
    networks:
      - internal

  # Data cache and Transporter
  redis:
    image: redis:alpine
    restart: on-failure
    networks:
      - internal

  # Persist Storage
  minio:
    image: minio/minio
    restart: on-failure
    networks:
      - internal
    environment:
      MINIO_ROOT_USER: tailchat
      MINIO_ROOT_PASSWORD: com.msgbyte.tailchat
    volumes:
      - storage:/data
    command: minio server /data --console-address ":9001"

  # Router
  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:
      - 11000:80
      - 127.0.0.1:11001:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - internal
      - default

networks:
  internal:
    name: tailchat-internal

volumes:
  data:
  storage:

保存后退出即可。然后我们配置环境变量

vim docker-compose.env

修改 docker-compose.env 文件的配置,以下字段推荐修改:

  • API_URL 对外可访问的url地址,用于文件服务访问, 可以是域名(如果设置了域名需要进行反向代理)也可以是ip。 如果出现发送图片不能正常显示就是这个变量没有设置
  • SECRET 服务端加密秘钥,用于生成Token. 默认为 tailchat
LOGGER=true
LOGLEVEL=info
SERVICEDIR=services

TRANSPORTER=redis://redis:6379

REDIS_URL=redis://redis:6379
MONGO_URL=mongodb://mongo/tailchat
SECRET=

# file
API_URL=https://tailchat-nightly.moonrailgun.com

# minio
MINIO_URL=minio:9000
MINIO_USER=tailchat
MINIO_PASS=com.msgbyte.tailchat

# SMTP
SMTP_SENDER=
SMTP_URI=

# metrics
PROMETHEUS=1

# Admin
ADMIN_USER=tailchat
ADMIN_PASS=

4.3启动应用

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

docker-compose up -d

访问 http://<server ip>:11000 即可打开tailchat

注意部分云服务可能需要手动开放防火墙端口。

4.4注意事项

docker-compose.env文件中提供了部分环境变量可供配置。

tailchat 的docker-compose.yml配置默认提供了如下配置:

  • mongodb: 持久化数据库
  • redis: KV数据库与消息中转服务
  • minio: 分布式文件服务

其中持久化文件(数据库, 文件存储)通过 docker volume 统一管理

4.5部署管理后台(可选)

创建管理后台配置:

vim admin.yml 

贴入配置文件

version: "3.3"

services:
  # 后台应用
  tailchat-admin:
    build:
      context: ../
    image: tailchat
    restart: unless-stopped
    env_file: docker-compose.env
    depends_on:
      - mongo
      - redis
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.admin.rule=PathPrefix(`/admin`)"
      - "traefik.http.services.admin.loadbalancer.server.port=3000"
    networks:
      - internal
    command: pnpm start:admin

在环境变量 docker-compose.env 中设置管理后台的账号和密码:

vim docker-compose.env
ADMIN_USER=tailchat
ADMIN_PASS=<这里写入独立的后台密码, 不要告知其他人>

然后使用多文件方式启动应用:

docker compose -f docker-compose.yml -f admin.yml up -d 

注意先后顺序,因为admin.yml依赖docker-compose.yml所以要放在后面

此时访问后台地址后面追加/admin/即可访问:

https://tailchat.example.com/admin/ 或者 http://<server ip>:11000/admin/

注意不要忘记在最后有一个/

5.应用使用

5.1展示

登录界面

使用界面

后台界面

6.反向代理

如果你想通过域名进行访问,不仅要在配置文件中进行设置,而且需要进行反向代理。

具体操作可以看夜梦的这两篇文章:

【docker】反向代理神器——Nginx Proxy Manager

【docker】Nginx Proxy Manager的使用

本文为夜梦星尘原创文章。
文章作者:夜梦星尘
文章链接:【docker】开源的即时通讯系统——Tailchat 
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自夜梦星尘
支持作者:夜梦星尘的爱发电
上一篇
下一篇