【docker】开源的即时通讯系统——Tailchat

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 环境准备

使用此链接注册后,绑定微信可以获得五元优惠券,并且新购、续费、升级均享受 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 展示

登录界面

【docker】开源的即时通讯系统——Tailchat

使用界面

【docker】开源的即时通讯系统——Tailchat

后台界面

【docker】开源的即时通讯系统——Tailchat

6. 反向代理

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

© 版权声明
THE END
文章不错?点个赞呗
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容