本文发布于409天前,最后更新于275天前,其中的信息可能有所发展或是发生改变。
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环境准备
系统为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镜像
代码语言:javascript复制docker pull moonrailgun/tailchat
将下载的镜像改名为tailchat(和源码编译保持一致,如果不改的话会走源码编译流程)
代码语言:javascript复制docker tag moonrailgun/tailchat tailchat
4.2配置应用
新建文件夹
代码语言:javascript复制cd ~ && mkdir tailchat && cd tailchat
创建配置文件
代码语言:javascript复制vim docker-compose.yml
一般来说直接复制粘贴下面的内容填入就可以了:
代码语言:javascript复制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:
保存后退出即可。然后我们配置环境变量
代码语言:javascript复制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)在当前目录下,执行以下命令一键启动
代码语言:javascript复制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部署管理后台(可选)
创建管理后台配置:
代码语言:javascript复制vim admin.yml
贴入配置文件
代码语言:javascript复制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
代码语言:javascript复制ADMIN_USER=tailchat
ADMIN_PASS=<这里写入独立的后台密码, 不要告知其他人>
然后使用多文件方式启动应用:
代码语言:javascript复制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的使用