ejabberd

此文档仍在编写中!

ejabberd 是高性能的 XMPP 服务器,可以轻松扩展到大型公共服务器,但对于自托管来说并不太重。它可以相对容易地从 Linux 发行版存储库安装,默认配置适用于运行良好的 XMPP 服务器。然而,这些默认设置往往相当保守,如果您想更好地支持新式 XMPP 功能,就需要进行一些调整。所有 ejabberd 模块设置的官方文档都可以在此处找到。

教程

必要条件:

  • 域名
  • 服务器

本教程从单个虚拟主机[^1]开始。例如,example.net 是域。将所有 example.net 实例替换为您自己的域。

[^1]:虚拟主机允许在一台服务器上运行多个 XMPP 服务。例如,一个 XMPP 服务的域名是 example.net,另一个 XMPP 服务的域名是 example.org,两者在某种程度上是分开的,就像它们在不同的服务器上运行一样。

XMPP 服务器上的每个服务都需要 DNS A/AAAA 记录和 SRV 记录。

A 记录:

  • example.net
  • muc.example.net(用于群聊)
  • upload.example.net(用于 HTTP 文件上传)
  • pubsub.example.net(用于 pubsub 节点)
  • proxy.example.net(用于文件传输代理)
  • turn.example.net(用于 STUN/TURN)

每个都指向要运行 ejabberd 的服务器的 IP 地址。

为每个创建 SRV 记录,指向解析到服务器的域,如下所示:

(所有记录的格式均为 _service._proto.name IN SRV 优先级 权重 端口 目标主机

_xmpp-client._tcp   IN SRV  5 0 5222 example.net.
_xmpps-client._tcp  IN SRV  5 0 5223 example.net.
_xmpp-server._tcp   IN SRV  5 0 5269 example.net.
_xmpps-server._tcp  IN SRV  5 0 5270 example.net.

_xmpp-client._tcp.muc   IN SRV  5 0 5222 example.net.
_xmpps-client._tcp.muc  IN SRV  5 0 5223 example.net.
_xmpp-server._tcp.muc   IN SRV  5 0 5269 example.net.
_xmpps-server._tcp.muc  IN SRV  5 0 5270 example.net.

为每个子域(从 muc 开始),不包括 turn.example.net

最后,为 STUN/TURN 添加一组 SRV 记录。

_stun._udp   IN SRV  5 0 3478 turn.example.net.
_stun._tcp   IN SRV  5 0 3478 turn.example.net.
_stuns._tcp  IN SRV  5 0 5349 turn.example.net.

_turn._udp   IN SRV  5 0 3478 turn.example.net.
_turn._tcp   IN SRV  5 0 3478 turn.example.net.
_turns._tcp  IN SRV  5 0 5349 turn.example.net.

额外信息:由于这些 SRV 委托记录,可以选择在 example.net 以外的服务器上托管 XMPP(即,如果将一个域上的服务拆分到多个服务器)。更多信息请访问 XEP-0368

打开端口:

TCP: 80 443 5222 5223 5269 5270 3478 5349 49152-65535

UDP: 3478 49152-65535

80443 用于 web 服务器,5222522352695270 用于 XMPP,其余用于 STUN/TURN。

  • 为您的域名以及多个子域名获取 SSL 证书,总而言之:

    • example.net
    • muc.example.net
    • upload.example.net
    • pubsub.example.net
    • proxy.example.net
    • proxy.example.net
  • proxypass http://127.0.0.1:5443 通过:

  • 确保对于 /xmpp,您也有代理 websockets 所需的一切。如果您使用 Nginx,请增加 HTTP 上传的 client_max_body_size

  • make sure the certificate files are readable and/or in a place that is readable by the ejabberd account.

为了避免使用 Nginx + Certbot 之类的东西,请使用内置的 ejabberd acme 模块,但本文假设希望在同一系统上托管其他 web 服务,在这种情况下,每个 HTTP 服务都将反向代理到单个 HTTPS web 服务。

最后安装系统包。确保构建有 PostgreSQL 支持。

Confirm the file /etc/ejabberd/ejabberd.yml exists, and is readable by the account that runs Ejabberd (almost definitely ejabberd), by, if necessary, copying over the example ejabberd.yml or wget/curling it from the github repo. If it is obtained from the repo, make sure the version corresponds to the version of Ejabberd packaged by your OS.

应该为每个虚拟主机创建一个单独的数据库,因为这会使事情更清楚,此外,将来更容易迁移单个虚拟主机。然而,如此处所述,现在也存在只使用一个的能力。

遵循操作系统的标准 PostgreSQL 安装说明。完成此操作后,以管理员身份连接到数据库,然后:

  1. create an Ejabberd database account with CREATE USER ejabberd WITH PASSWORD 'your_password';. Don't forget to change the password, and note it down.
  2. 使用 CREATE DATABASE ejabberd_example OWNER ejabberd; 为虚拟主机创建数据库。将 example 替换为与虚拟主机相对应的内容。
  3. 退出 psql shell,并使用命令 curl -s https://raw.githubusercontent.com/processone/ejabberd/master/sql/pg.sql | sudo -u ejabberd psql ejabberd_example 从 GitHub 导入数据库模式(再次替换 example)。

首先将 hosts 下的 localhost 替换为虚拟主机(例如 example.net),然后列出之前在 certfiles 下获得的证书文件。

hosts:
  - example.net

certfiles:
  - "/etc/ejabberd/certs/*/*"

现在在 YAML 文件的 root 级别设置 default_db: sql。后面应该是 host_config 和虚拟主机的数据库配置,如下所示。根据设置自定义每个值。

host_config:
  example.net:
    sql_type: pgsql
    sql_server: "localhost"
    sql_port: 5432
    sql_username: "ejabberd"
    sql_password: "postgres_password"
    sql_database: "ejabberd_example"
    auth_method: sql
    auth_password_format: scram

listen 下,确保每个端口上都启用了所有正确的服务,包括端口 5270(非默认)上的 s2s TLS:

listen:
  -
    port: 5222
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
  -
    port: 5223
    tls: true
    module: ejabberd_c2s
    max_stanza_size: 262144
    shaper: c2s_shaper
    access: c2s
    starttls_required: true
  -
    port: 5269
    module: ejabberd_s2s_in
    max_stanza_size: 524288
  -
    port: 5270
    tls: true
    module: ejabberd_s2s_in
    max_stanza_size: 524288

接下来,启用 HTTP 服务器和 STUN/TURN 服务器模块。将 turn_ipv4_addressip 设置为服务器的 IPv4 地址。HTTP 服务器的 TLS 将关闭,因为它通过之前设置的 web 服务器进行反向代理。

  -
    port: 5443
    module: ejabberd_http
    request_handlers:
      /xmpp/admin: ejabberd_web_admin
      /xmpp/bosh: mod_bosh
      /xmpp/upload: mod_http_upload
      /xmpp/ws: ejabberd_http_ws
      /.well-known/host-meta: mod_host_meta
      /.well-known/host-meta.json: mod_host_meta
  -
    port: 3478
    transport: udp
    module: ejabberd_stun
    use_turn: true
    turn_min_port: 49152
    turn_max_port: 65535
    # The server's public IPv4 address:
    turn_ipv4_address: 0.0.0.0
  -
    port: 5349
    transport: tcp
    module: ejabberd_stun
    use_turn: true
    tls: true
    turn_min_port: 49152
    turn_max_port: 65535
    ip: 0.0.0.0
    turn_ipv4_address: 0.0.0.0

在 root 下设置 s2s_use_starttls: required

At this point it is possible to set up some ACLs. acls are just the access control lists, set up access_rules corresponding to your needs, which will be what are passed to module settings. At the minimum an admin account is recommended. Example:

acl:
  admin:
    user: juliet@example.net
  capulet:
    - user: juliet@example.net
	- user: tybalt@example.net
  nurse:
    - user: angelica@example.net

access_rules:
  household:
    allow: capulet
    allow: nurse

mod_disco 下添加滥用地址。也可以根据 XEP-0157 添加其他联系地址:

modules:
# ...
  mod_disco:
    server_info:
    -
      modules: all
      name: "abuse-addresses"
      urls: ["mailto:abuse@example.net"]

添加 mod_host_meta

  mod_host_meta:
    bosh_service_url: "https://@HOST@/xmpp/bosh"
    websocket_url: "wss://@HOST@/xmpp/ws"

编辑 mod_mam,并将 assume_mam_usage 更改为 false,如果不希望默认在服务器上存档消息,则将 default 更改为 never

  mod_mam:
    db_type: sql
    assume_mam_usage: never
    default: never

添加 mod_stun_disco 以向客户端通告 STUN 服务,分别将 0.0.0.0example.net 更改为服务器的 IP 和主机名:

  mod_stun_disco:
    credentials_lifetime: 12h
    services:
        -
          host: 0.0.0.0
          port: 3478
          type: stun
          transport: udp
          restricted: false
        -
          host: 0.0.0.0
          port: 3478
          type: turn
          transport: udp
          restricted: true
        -
          host: turn.example.net
          port: 5349
          type: stuns
          transport: tcp
          restricted: false
        -
          host: turn.example.net
          port: 5349
          type: turns
          transport: tcp
          restricted: true

将主机设置为 muc 子域,否则它将尝试使用 conference.example.net。默认情况下,在 default_room_options 中设置 mam: false 将禁用服务器端消息存档。

  mod_muc:
    host: muc.example.net
    access:
      - allow
    access_admin:
      - allow: admin
    access_create: muc_create
    access_persistent: muc_create
    access_mam:
      - allow
    default_room_options:
      mam: false
  mod_proxy65:
    access: local
    max_connections: 5
  mod_http_upload:
    put_url: https://@HOST@/xmpp/upload
    docroot: /var/www/ejabberdupload
    max_size: 1073741824
    custom_headers:
      "Access-Control-Allow-Origin": "https://@HOST@"
      "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
      "Access-Control-Allow-Headers": "Content-Type"

Create the folder for the docroot, and ensure it is owned by the ejabberd account. Change max_size (the max upload size) to whatever is preferred.

  mod_pubsub:
    access_createnode: pubsub_createnode
    plugins:
      - flat
      - pep
    force_node_config:
      ## Avoid buggy clients to make their bookmarks public
      storage:bookmarks:
        access_model: whitelist

启动 ejabberd 服务器!

使用 sudo -u ejabberd ejabberdctl register admin example.net password 注册 admin@example.net,密码为 password

compliance.conversations.im 有一个合规性测试程序来测试服务器。正确设置一切后,可以选择更改配置 root 下的 loglevel

将在 https://example.net/xmpp/admin 上提供一个管理页面。

额外的好东西!

可以使用 mod_conversejs 设置 conversejs。可能需要更新 web 服务器配置以代理新端点(下面的 /chat)。

listen:
  -
    port: 5443
    module: ejabberd_http
    request_handlers:
      /xmpp/bosh: mod_bosh
      /xmpp/ws: ejabberd_http_ws
      /chat: mod_conversejs

modules:
  mod_conversejs:
    websocket_url: "ws://@HOST@/xmpp/ws"
    bosh_service_url: "https://@HOST@/xmpp/bosh"

对于每个附加虚拟主机,都应该创建一个新的数据库,并将其添加到配置的数据库部分。例如:

host_config:
  example.net:
    sql_type: pgsql
    sql_server: "localhost"
    sql_port: 5432
    sql_username: "ejabberd"
    sql_password: "postgres_password"
    sql_database: "ejabberd_net"
    auth_method: sql
    auth_password_format: scram
  example.org:
    sql_type: pgsql
    sql_server: "localhost"
    sql_port: 5432
    sql_username: "ejabberd"
    sql_password: "postgres_password"
    sql_database: "ejabberd_org"
    auth_method: sql
    auth_password_format: scram

配置文件中的声明之间不能有冲突,因此,如果在 root 的 modules 下声明了 mod_mucmod_proxy65mod_http_uploadmod_pubsub,则在 root 的 append_host_config 下为每个虚拟主机必须删除复制它们(以及虚拟主机之间的其他配置差异)。示例如下:

append_host_config:
  example.org:
    modules:
      mod_muc:
        host: muc.example.org
        access_create: org_account
        access_persistent: org_account
        access:
          - allow
        access_admin:
          - allow: admin
        default_room_options:
          mam: false
      mod_proxy65:
        access: org_account
        max_connections: 5
      mod_http_upload:
        access: org_account
        put_url: https://@HOST@/xmpp/upload
        docroot: /var/www/ejabberdupload
        max_size: 1073741824
        custom_headers:
          "Access-Control-Allow-Origin": "https://@HOST@"
          "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
          "Access-Control-Allow-Headers": "Content-Type"
      mod_pubsub:
        access_createnode: org_account
        plugins:
          - flat
          - pep
        force_node_config:
          ## Avoid buggy clients to make their bookmarks public
          storage:bookmarks:
            access_model: whitelist
  example.net:
    modules:
      mod_muc:
        hosts:
          - muc.example.net
        access_create: net_account
        access_persistent: net_account
        access:
          - allow
        access_admin:
          - allow: admin
        default_room_options:
          mam: false
      mod_proxy65:
        access: net_account
        max_connections: 5
      mod_http_upload:
        access: net_account
        put_url: https://@HOST@/xmpp/upload
        docroot: /var/www/ejabberdupload
        max_size: 1073741824
        custom_headers:
          "Access-Control-Allow-Origin": "https://@HOST@"
          "Access-Control-Allow-Methods": "GET,HEAD,PUT,OPTIONS"
          "Access-Control-Allow-Headers": "Content-Type"
      mod_pubsub:
        access_createnode: net_account
        plugins:
          - flat
          - pep
        force_node_config:
          ## Avoid buggy clients to make their bookmarks public
          storage:bookmarks:
            access_model: whitelist

As above, it is possible to disable access to certain services per virtualhost using ACLs, in order to e.g. prevent accounts on example.net from creating MUCs on muc.example.org.

在这种情况下,将 mod_stun_disco 更改为这个,并且不启用 STUN/TURN 的 listen 选项。生成认证密钥并将其与 TURN 服务器实例共享。

  mod_stun_disco:
    secret: "auth_secret"
    services:
      -
        host: turn.example.net
        type: stun
      -
        host: turn.example.net
        type: turn

最初改编自:blos.sm

支持聊天

这显然不是详尽的列表,如果您有很好的建议,请在此处联系我们: servers@joinjabber.org (网页聊天) (xmpp)