Chatto是一款功能齐全的基于Web的聊天应用程序,您可以使用自己的服务器来托管它。
Chatto主要特点:
- 功能齐全:除了普通的文本消息外,还支持文件共享、视频嵌入以及带屏幕共享的语音/视频通话。
- 部署简单:Chatto只是一个单独的二进制文件,无需单独的数据库。或者您可以使用Docker Compose
- 灵活的权限和角色:服务器管理员可以精细控制谁可以做什么以及在哪里可以做。
- 高性能:后端和前端都非常精简,资源占用低,对性能进行了极致的优化。
- 注重数据保护和隐私:Chatto使用每个用户的密钥加密消息文本和选定的持久帐户字段
部署前需要准备:
- 一个域名,添加A解析记录:chatto.example.com / livekit.chatto.example.com
- 一个SMTP账户,供Chatto发送用户注册邮件
本文不使用官方文档的Docker Compose方式来部署,原因是官方文档使用了Caddy容器,这会把服务器的80 / 443端口独占。本文改为使用主机的NGINX反向代理。
安装NGINX、CertBot、Docker:
apt update
apt install curl nginx python3-certbot-nginx
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
新建compose文件:
mkdir /opt/chatto && cd /opt/chatto && nano docker-compose.yml
写入如下内容:
services:
nats:
image: nats:latest
command: ["--jetstream", "--store_dir=/data", "--auth=${NATS_TOKEN}"]
volumes:
- nats_data:/data
healthcheck:
test: ["CMD", "nats-server", "--help"]
interval: 5s
timeout: 3s
retries: 3
livekit:
image: livekit/livekit-server:latest
command:
- --config
- /etc/livekit.yaml
ports:
- "50000-50200:50000-50200/udp" # WebRTC media (UDP, must be direct)
- "3478:3478/udp" # TURN/STUN relay for NAT traversal
- "127.0.0.1:7880:7880"
volumes:
- ./livekit.yaml:/etc/livekit.yaml:ro
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://localhost:7880"]
interval: 5s
timeout: 3s
retries: 3
chatto:
image: ghcr.io/chattocorp/chatto:latest
env_file: .env
environment:
PUID: "${PUID:-1000}"
PGID: "${PGID:-1000}"
depends_on:
nats:
condition: service_healthy
livekit:
condition: service_healthy
ports:
- "127.0.0.1:4000:4000"
volumes:
nats_data:
新建livekit配置文件:
nano livekit.yaml
写入如下内容:
port: 7880
rtc:
port_range_start: 50000
port_range_end: 50200
use_external_ip: true
turn:
enabled: true
udp_port: 3478
keys:
chatto: 729594219c7e...
webhook:
urls:
- https://chatto.example.com/webhooks/livekit
api_key: chatto
logging:
level: info
1.keys使用如下命令生成:
openssl rand -hex 32
2.webhook.urls改为你自己的域名:
https://chatto.example.com/webhooks/livekit
新建.env文件:
nano .env
写入如下内容:
PUID=1000
PGID=1000
NATS_TOKEN=
CHATTO_OWNERS_EMAILS=imlala@example.com
CHATTO_NATS_EMBEDDED_ENABLED=false
CHATTO_NATS_CLIENT_URL=nats://nats:4222
CHATTO_NATS_CLIENT_AUTH_METHOD=token
CHATTO_NATS_CLIENT_TOKEN=
CHATTO_WEBSERVER_URL=https://chatto.example.com
CHATTO_WEBSERVER_PORT=4000
CHATTO_WEBSERVER_COOKIE_SIGNING_SECRET=
CHATTO_WEBSERVER_COOKIE_ENCRYPTION_SECRET=
CHATTO_CORE_SECRET_KEY=
CHATTO_CORE_ASSETS_SIGNING_SECRET=
CHATTO_LOG_LEVEL=info
CHATTO_LOG_FORMAT=json
CHATTO_OPERATOR_API_ENABLED=true
CHATTO_OPERATOR_API_SOCKET_PATH=/tmp/chatto/operator.sock
# SMTP is required for direct email/password registration, email verification,
# and password reset. Replace these placeholders with your provider settings.
CHATTO_SMTP_ENABLED=true
CHATTO_SMTP_HOST=mail.example.com
CHATTO_SMTP_PORT=587
CHATTO_SMTP_TLS=mandatory
# Use when CHATTO_SMTP_HOST is an IP address or internal alias but the certificate is issued for a DNS name.
# CHATTO_SMTP_TLS_SERVER_NAME=mail.example.com
# Insecure; use only for trusted internal SMTP servers with self-signed or mismatched certificates.
# CHATTO_SMTP_TLS_SKIP_VERIFY=false
CHATTO_SMTP_USERNAME=smtp
CHATTO_SMTP_PASSWORD=passwd
CHATTO_SMTP_FROM=smtp@example.com
CHATTO_PUSH_ENABLED=true
CHATTO_PUSH_VAPID_PUBLIC_KEY=
CHATTO_PUSH_VAPID_PRIVATE_KEY=
CHATTO_PUSH_VAPID_SUBJECT=mailto:imlala@example.com
CHATTO_LIVEKIT_ENABLED=true
CHATTO_LIVEKIT_URL=wss://livekit.chatto.example.com
CHATTO_LIVEKIT_API_KEY=chatto
CHATTO_LIVEKIT_API_SECRET=
1.以下这些变量的值:
NATS_TOKEN=
CHATTO_NATS_CLIENT_TOKEN=
CHATTO_WEBSERVER_COOKIE_SIGNING_SECRET=
CHATTO_WEBSERVER_COOKIE_ENCRYPTION_SECRET=
CHATTO_CORE_SECRET_KEY=
CHATTO_CORE_ASSETS_SIGNING_SECRET=
全部使用如下命令生成:
openssl rand -hex 32
请注意NATS_TOKEN与CHATTO_NATS_CLIENT_TOKEN的值应保持一致,NATS_TOKEN用作NATS容器,而CHATTO_NATS_CLIENT_TOKEN是Chatto用于连接NATS容器的。
2.CHATTO_PUSH_VAPID_PUBLIC_KEY和CHATTO_PUSH_VAPID_PRIVATE_KEY用作Web通知,如果您需要启用消息通知,则需要使用如下命令生成:
docker run --rm node:24-alpine npx --yes web-push generate-vapid-keys --json
3.CHATTO_LIVEKIT_API_KEY和CHATTO_LIVEKIT_API_SECRET的值应与livekit.yaml内的值保持一致,这是Chatto与Livekit通信的关键。
4.CHATTO_WEBSERVER_URL和CHATTO_LIVEKIT_URL请确保改为您自己的域名。
5.CHATTO_OWNERS_EMAILS请改为您的邮箱,且稍后您在注册账户的时候请使用这个邮箱,因为只有使用这个邮箱注册的账户才拥有管理员权限。
6.配置与SMTP相关的环境变量,因为Chatto注册的时候需要验证您的邮箱。
全部可配置的环境变量见官方文档:https://docs.chatto.run/reference/environment-variables/
启动:
docker compose up -d
新建NGINX站点配置文件:
nano /etc/nginx/sites-available/chatto
写入如下内容:
upstream chat_backend {
server 127.0.0.1:4000;
}
upstream livekit_backend {
server 127.0.0.1:7880;
}
server {
listen 80;
listen [::]:80;
server_name chatto.example.com;
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location / {
proxy_pass http://chat_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 80;
listen [::]:80;
server_name livekit.chatto.example.com;
location / {
proxy_pass http://livekit_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}
}
启用站点:
ln -s /etc/nginx/sites-available/chatto /etc/nginx/sites-enabled/chatto
签发证书:
certbot --nginx
简单测试了下,各项功能全部正常,群聊:
私聊:
这个项目的布局很明显是仿Discord的,但是目前仅实现了单群组,意思就是你部署的实例只能创建一个群组,不能创建多个。不知道后续作者会不会实现多群组的功能。整体使用下来没发现什么明显的问题,功能也非常完善了,硬要说我感觉差了点什么的话,就是不支持自定义表情包。
我还知道另外一个聊天程序是目前开源当中对Discord还原度最高的,但是这个程序目前BUG有点多,且架构非常臃肿,需要启动18个容器,你没看错整整18个容器。。。我有点纠结要不要水一篇文章= =
荒岛




















