Views: 1
1. 前言
项目地址:msgbyte/tailchat
文档:概述 | 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. 反向代理
如果你想通过域名进行访问,不仅要在配置文件中进行设置,而且需要进行反向代理。
The post 【docker】开源的即时通讯系统——Tailchat first appeared on 七玩网.
暂无评论内容