强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 ↔ DiscordIRC ↔ SlackIRC ↔ 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 速率限制

扩展阅读


下一章: 第 9 章:机器人开发 — IRC Bot 开发、脚本编写和插件系统。