IRC 服务器搭建完全指南 / 第 8 章:桥接与互通
第 8 章:桥接与互通
现代社区往往分布在多个平台。本章介绍如何将 IRC 与 Discord、Slack、Matrix 等主流平台无缝桥接。
8.1 桥接概述
8.1.1 为什么需要桥接?
┌─────────────────────────────────────────────────────────┐
│ 社区平台碎片化 │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ IRC │ │ Discord │ │ Slack │ │ Matrix │ │
│ │ 用户 A │ │ 用户 B │ │ 用户 C │ │ 用户 D │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │ │
│ └────────────┼────────────┼────────────┘ │
│ │ │ │
│ ┌──────┴────────────┴──────┐ │
│ │ 桥接(Bridge) │ │
│ └──────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
8.1.2 桥接方案对比
| 方案 | IRC ↔ Discord | IRC ↔ Slack | IRC ↔ Matrix | 维护状态 |
|---|---|---|---|---|
| matterbridge | ✅ | ✅ | ✅ | 活跃 |
| discord-irc | ✅ | ❌ | ❌ | 维护中 |
| Heisenbridge | ❌ | ❌ | ✅ | 活跃 |
| Appservice-irc | ❌ | ❌ | ✅ | 活跃 |
| slack-irc | ❌ | ✅ | ❌ | 停滞 |
推荐方案: matterbridge — 支持最多平台,配置简单,Go 编写,单二进制部署。
8.2 Matterbridge
8.2.1 安装 Matterbridge
# 下载最新版本
VERSION="1.26.0"
curl -LO "https://github.com/42wim/matterbridge/releases/download/v${VERSION}/matterbridge-${VERSION}-linux-64-bit"
mv matterbridge-${VERSION}-linux-64-bit /usr/local/bin/matterbridge
chmod +x /usr/local/bin/matterbridge
# 验证
matterbridge --version
8.2.2 基础配置
# /etc/matterbridge/matterbridge.toml
# IRC 配置
[irc]
[irc.ircserver]
Server="irc.example.com:6697"
Nick="BridgeBot"
UseTLS=true
SkipTLSVerify=false
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
# Discord 配置
[discord]
[discord.discordserver]
Token="your-discord-bot-token"
Server="your-discord-server-id"
RemoteNickFormat="[IRC] <{NICK}> "
# 桥接映射
[[gateway]]
name="main"
enable=true
[[gateway.inout]]
account="irc.ircserver"
channel="#general"
[[gateway.inout]]
account="discord.discordserver"
channel="#general"
8.2.3 完整多平台配置
# /etc/matterbridge/matterbridge.toml
[general]
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
ShowJoinLeave=false
# ===== IRC =====
[irc]
[irc.libera]
Server="irc.libera.chat:6697"
Nick="MyBridge"
UseTLS=true
NickServNick="NickServ"
NickServPassword="bridge_password"
RemoteNickFormat="[IRC] <{NICK}> "
[irc.mynet]
Server="irc.example.com:6697"
Nick="DiscordBridge"
UseTLS=true
RemoteNickFormat="[IRC] <{NICK}> "
# ===== Discord =====
[discord]
[discord.main]
Token="your-bot-token-here"
Server="123456789012345678"
RemoteNickFormat="[Discord] <{NICK}> "
# ===== Slack =====
[slack]
[slack.work]
Token="xoxb-your-slack-token"
RemoteNickFormat="[Slack] <{NICK}> "
# ===== Matrix =====
[matrix]
[matrix.main]
Server="https://matrix.example.com"
Login="bridge-bot"
Password="bridge_password"
RemoteNickFormat="[Matrix] <{NICK}> "
# ===== Telegram =====
[telegram]
[telegram.main]
Token="your-telegram-bot-token"
RemoteNickFormat="[Telegram] <{NICK}> "
# ===== 桥接映射 =====
# IRC ↔ Discord
[[gateway]]
name="irc-discord"
enable=true
[[gateway.inout]]
account="irc.mynet"
channel="#general"
[[gateway.inout]]
account="discord.main"
channel="#general"
# IRC ↔ Slack
[[gateway]]
name="irc-slack"
enable=true
[[gateway.inout]]
account="irc.mynet"
channel="#dev"
[[gateway.inout]]
account="slack.work"
channel="#dev"
# IRC ↔ Matrix
[[gateway]]
name="irc-matrix"
enable=true
[[gateway.inout]]
account="irc.mynet"
channel="#community"
[[gateway.inout]]
account="matrix.main"
channel="!abc123:matrix.example.com"
8.2.4 systemd 服务
# /etc/systemd/system/matterbridge.service
[Unit]
Description=Matterbridge Chat Bridge
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/matterbridge -conf /etc/matterbridge/matterbridge.toml
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
8.3 IRC ↔ Discord 专项
8.3.1 创建 Discord Bot
1. 访问 https://discord.com/developers/applications
2. 创建新应用 → 填写名称
3. 左侧菜单 → Bot → 创建 Bot
4. 复制 Token(用于 matterbridge 配置)
5. 左侧菜单 → OAuth2 → URL Generator
6. 选择权限: Send Messages, Read Messages, Manage Messages
7. 使用生成的 URL 邀请 Bot 到服务器
8.3.2 Discord Bot 权限
| 权限 | 用途 | 是否必需 |
|---|---|---|
| Read Messages | 读取频道消息 | ✅ |
| Send Messages | 发送消息 | ✅ |
| Manage Messages | 删除消息(可选) | ⚠️ |
| Embed Links | 嵌入链接预览 | ✅ |
| Attach Files | 发送文件 | ⚠️ |
| Read Message History | 读取历史消息 | ✅ |
8.3.3 获取 Discord IDs
# 在 Discord 设置中启用"开发者模式"
# 然后右键点击服务器/频道 → 复制 ID
# 服务器 ID: 右键服务器图标 → 复制 ID
# 频道 ID: 右键频道名称 → 复制 ID
8.3.4 discord-irc(轻量替代方案)
# 安装
npm install -g discord-irc
# 配置文件
cat > /opt/discord-irc/config.json << 'EOF'
[
{
"nickname": "IRC-Bot",
"server": "irc.example.com",
"discordToken": "your-discord-token",
"channelMapping": {
"#general": "general"
}
}
]
EOF
# 启动
discord-irc --config /opt/discord-irc/config.json
8.4 IRC ↔ Slack 专项
8.4.1 创建 Slack App
1. 访问 https://api.slack.com/apps
2. 创建新应用
3. 添加 Bot Token Scopes:
- chat:write
- channels:read
- channels:history
- users:read
4. 安装到工作区
5. 复制 Bot User OAuth Token
8.4.2 slack-irc 配置
{
"server": "irc.example.com",
"nickname": "SlackBridge",
"token": "xoxb-your-token",
"slackOptions": {},
"ircOptions": {
"sasl": true,
"nick": "SlackBridge",
"userName": "slackbridge",
"realName": "Slack IRC Bridge"
},
"channelMapping": {
"#general": "#general",
"#dev": "#development"
}
}
8.5 IRC ↔ Matrix 专项
8.5.1 Appservice-irc(官方方案)
# 安装 matrix-appservice-irc
git clone https://github.com/matrix-org/matrix-appservice-irc.git
cd matrix-appservice-irc
npm install
npm run build
# 生成注册文件
node app.js -r -f /opt/matrix-irc/irc-registration.yaml \
-u http://localhost:9999
配置文件 (config.yaml):
homeserver:
url: http://localhost:8008
domain: matrix.example.com
ircService:
servers:
irc.example.com:
name: "ExampleNet"
port: 6697
ssl: true
sslselfsign: false
botConfig:
enabled: true
nick: "IRCBot"
joinChannelsIfNoUsers: true
privateMessages:
enabled: true
federate: true
membershipLists:
enabled: true
global:
ircToMatrix:
initial: true
incremental: true
mappings:
"#general":
roomIds:
- "!abc123:matrix.example.com"
"#dev":
roomIds:
- "!def456:matrix.example.com"
8.5.2 Heisenbridge(轻量替代方案)
# 使用 pip 安装
pip install heisenbridge
# 运行
heisenbridge \
-c http://localhost:8008 \
--registration /path/to/registration.yaml \
--owner @admin:matrix.example.com
8.6 多频道桥接最佳实践
8.6.1 频道映射策略
推荐的频道映射:
IRC #general ↔ Discord #general ↔ Matrix #general
IRC #dev ↔ Discord #dev ↔ Matrix #dev
IRC #announcements ↔ Discord #announcements ↔ Matrix #announcements
IRC #random ↔ Discord #off-topic ↔ Matrix #random
注意:
- 不要桥接所有频道(保留平台特有的频道)
- 避免循环桥接(A ↔ B ↔ C ↔ A)
- 为重要频道设置独立的桥接实例
8.6.2 消息格式设计
# 推荐的格式配置
[general]
# 使用简洁的前缀格式
RemoteNickFormat="[{PROTOCOL}] <{NICK}> "
# 不显示加入/离开消息
ShowJoinLeave=false
# 不显示 Topic 更改
ShowTopicChange=false
# 消息长度限制
MessageLength=4000
8.6.3 桥接 Bot 权限
# IRC 端设置
# 给桥接 Bot 适当的模式
/mode #channel +v BridgeBot
# 设置桥接 Bot 的 vhost
/CHGHOST BridgeBot bridge.example.com
# 在 ChanServ 中注册
/CS FLAGS #channel ADD BridgeBot +Vt
8.7 Web 客户端集成
8.7.1 Kiwi IRC 嵌入
<!-- 将 Kiwi IRC 嵌入网页 -->
<iframe
src="https://kiwi.example.com/?nick=WebUser&channel=#general"
width="100%"
height="600"
frameborder="0">
</iframe>
8.7.2 TheLounge 自托管
# 安装 TheLounge
npm install -g thelounge
# 初始化
thelounge add admin
# 配置
nano ~/.thelounge/config.js
# 启动
thelounge start
// ~/.thelounge/config.js
module.exports = {
public: false,
host: "0.0.0.0",
port: 9000,
reverseProxy: true,
https: {
enabled: true,
key: "/etc/letsencrypt/live/chat.example.com/privkey.pem",
certificate: "/etc/letsencrypt/live/chat.example.com/fullchain.pem",
},
};
8.8 ⚠️ 注意事项
| 事项 | 说明 |
|---|---|
| 循环桥接 | 绝对避免 A↔B↔A 循环 |
| Bot 标识 | 确保桥接 Bot 的昵称格式清晰标识平台来源 |
| 消息延迟 | 桥接可能引入 1-3 秒延迟 |
| 文件传输 | 跨平台文件传输可能受限 |
| 历史同步 | 桥接通常不回溯同步历史消息 |
| 权限管理 | 桥接 Bot 需要适当的频道权限 |
| 令牌安全 | 所有 API Token 存储在安全位置 |
| 速率限制 | 注意各平台的 API 速率限制 |
扩展阅读
- 📖 Matterbridge 官方文档
- 📖 matrix-appservice-irc
- 📖 Heisenbridge
- 📖 Discord Developer Portal
- 📖 Slack API Documentation
下一章: 第 9 章:机器人开发 — IRC Bot 开发、脚本编写和插件系统。