本文最后更新于 2024-05-19,

若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。

本站只有Telegram群组为唯一交流群组, 点击加入

文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请

1716121599897.webp
1716121611279.webp

功能

  • 注重隐私,只有被邀请的成员才能加入群组

  • 防止陌生人,只有通过昵称+一串随机的数字才能添加好友

  • 二维的群组空间,通过频道来分割不同的话题

  • 高度自定义的群组空间, 通过分组和拖拽来创建独创的群组空间。同时可以通过更多的插件来增加更多的能力

  • 可以严谨,也可以乐趣。通过插件的组合可以创造用于不同场景的 Tailchat。可以是面向娱乐,也可以是面向企业

  • 后端微服务架构,已经为大规模部署做好了准备。不用担心用户量大了以后怎么办

  • 用户管理

    • 基于4位数字标识(战网like)的用户名系统
    • 好友管理
  • 聊天系统

    • 私聊
    • 群聊
    • 富文本消息
      • 图片
      • 链接
      • 提及(@)
      • 代码
  • 插件系统

    • 前端插件系统(基于 ministar的微内核架构)

      • 自定义主题
      • 自定义面板
      • 自定义操作
      • 消息内容转换
    • 后端插件系统(基于 moleculer的微服务架构)

  • 开放平台

    • Connect ID
    • (其他正在开发中)
  • 快速跳转

使用场景

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

对于个人用户

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

对于企业用户

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

项目文档:https://tailchat.msgbyte.com/
项目代码:https://github.com/msgbyte/tailchat

插件中心

1716121805017.webp

各类主题

1716121853764.webp

Github订阅机器人

1716121904364.webp

安装Docker🐳

利用Docker-compose搭建,易于更新

先建立一个文件夹

mkdir -p ~/tailchat &&cd $_

vim docker-compose.yml

docker-compose填入以下内容:

环境变量可以自行参考文档按需修改

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: com.msgbyte.tailchat
    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     #同上
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - internal
      - default

networks:
  internal:
    name: tailchat-internal

修改好之后,注意切换成英文输入法,然后按一下 esc,然后 :wq 保存退出。

再次编辑 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=adswddWEQ@4  # 改成自己的密钥

# file
API_URL=https://chat.poiblog.com   # 改成自己的网站

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

# SMTP
SMTP_SENDER=
SMTP_URI=

# metrics
PROMETHEUS=1

按一下 esc,然后 :wq 保存退出,之后

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

运行

docker-compose up -d

我们现在可以输入 http://ip:8080/访问了。

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

tailchatdocker-compose.yml配置默认提供了如下配置:

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

更新

cd ~/tailchat # 进入docker-compose所在的文件夹

docker-compose pull    # 拉取最新的镜像

docker-compose up -d   # 重新更新当前镜像

docker image prune  # prune 命令用来删除不再使用的 docker 对象。删除所有未被 tag 标记和未被容器使用的镜像

卸载

cd ~/tailchat # 进入docker-compose所在的文件夹

docker-compose down    # 停止容器,此时不会删除映射到本地的数据

rm -rf ~/tailchat # 完全删除映射到本地的数据

反向代理

参考教程:安装及使用

⚠️Nginx Proxy Manager(以下简称NPM)会用到80、443端口,所以本机不能占用(比如原来就有Nginx)

互联网使用请确保完成了域名解析