
erlangsolutions/mongooseimMongooseIM是Erlang Solutions推出的健壮高效的XMPP服务器,专为大型部署设计。它针对企业用途开发,具备容错能力,可利用多集群机器资源,并能在需要时轻松扩展容量(只需添加服务器/虚拟机)。
本仓库中的所有镜像均通过CircleCI基础设施构建,对应以下场景:
用于构建镜像的Dockerfile可在此处查看Dockerfile。
可通过以下命令创建并启动容器:
bashdocker run -dtP -h mongooseim-1 --name mongooseim-1 erlangsolutions/mongooseim
若要运行PR 1006的构建镜像,命令如下:
bashdocker run -dtP -h mongooseim-1 --name mongooseim-1 erlangsolutions/mongooseim:PR-1006
可通过docker logs mongooseim-1检查日志,应显示类似以下内容:
... MongooseIM cluster primary node mongooseim@mongooseim-1 Clustered mongooseim@mongooseim-1 with mongooseim@mongooseim-1 Root: /usr/lib/mongooseim Exec: /usr/lib/mongooseim/erts-13.1.5/bin/erlexec -boot /usr/lib/mongooseim/releases/6.1.0/start -embedded -config /usr/lib/mongooseim/etc/app.config -args_file /usr/lib/mongooseim/etc/vm.args -args_file /usr/lib/mongooseim/etc/vm.dist.args -- live --noshell -noinput +Bd when=2023-10-24T14:28:03.386139+00:00 level=warning what=report_transparency pid=<0.574.0> at=service_mongoose_system_metrics:report_transparency/1:175 text="We are gathering the MongooseIM system's metrics to analyse the trends and needs of our users, improve MongooseIM, and know where to focus our efforts. For more info on how to customise, read, enable, and disable these metrics visit: \ - MongooseIM docs - \ [***] \ - MongooseIM GitHub page - [***] \ The last sent report is also written to a file log/system_metrics_report.json" report_filename=log/system_metrics_report.json
可通过telnet对MongooseIM节点进行健康检查。需提供容器IP(通常为127.0.0.1)和映射到容器5222端口的宿主机端口。可使用以下命令查找端口:
$ docker ps -f "name=mongooseim-1" --format "{{.Names}}: {{.Ports}}" mongooseim-1: 0.0.0.0:32772->4369/tcp, 0.0.0.0:32771->5222/tcp, 0.0.0.0:32770->5269/tcp, 0.0.0.0:32769->5280/tcp, 0.0.0.0:32768->9100/tcp
上述示例中,容器内5222端口映射到宿主机32771端口,可用于检查服务器是否监听该端口:
$ telnet 127.0.0.1 32771 Connected to localhost. Escape character is '^]'.
成功!MongooseIM已开始接受XMPP连接。
此镜像还暴露了其他可能有用的端口,详情请参考Dockerfile。
bashdocker exec mongooseim-1 /usr/lib/mongooseim/bin/mongooseimctl account registerUser --username $USER --domain $XMPP_HOST --password $PASSWORD
其中:
bash$ docker exec mongooseim-1 /usr/lib/mongooseim/bin/mongooseimctl account registerUser --username alice --domain localhost --password secret123 { "data" : { "account" : { "registerUser" : { "message" : "User alice@localhost successfully registered", "jid" : "alice@localhost" } } } }
可通过Docker卷挂载自定义配置文件覆盖默认配置。假设本地机器有目录mongooseim-1,包含以下内容:
bash$ tree mongooseim-1 mongooseim-1 └── mongooseim.toml └── app.config └── vm.args
可通过以下命令运行容器:
bashdocker run -dt -h mongooseim-1 --name mongooseim-1 -p 5222:5222 -v `pwd`/mongooseim-1:/member erlangsolutions/mongooseim
服务器将使用自定义配置文件。vm.dist.args文件也可通过相同方式覆盖。
集群设置有两种方法:默认自动集群和手动集群(可更精确控制集群形成)。
要使用默认集群行为,容器的名称(--name选项)和主机名(-h选项)需带有-n后缀,其中n是从1开始的连续整数(可通过MASTER_ORDINAL环境变量配置),例如mongooseim-1、mongooseim-2等。确保先启动带有-${MASTER_ORDINAL}后缀的节点(如-h mongooseim-1和--name mongooseim-1),其他节点将连接到该节点加入集群。
以下几点很重要:
若在docker/docker-compose中使用,以下参数必须设置为相同值。第二个及后续容器也有相同要求。
-h选项为容器设置HOSTNAME环境变量,进而设置机器的长主机名。start.sh脚本在NODE_TYPE=name时使用它生成Erlang节点名。若NODE_TYPE=sname(默认),则使用短主机名。若-h提供的值已是短主机名,则直接使用;否则截断(不含'.'的最长部分)。--name用于提供容器间的自动DNS解析。详见Docker网络文档。主机名格式:
${NODE_NAME}-${MASTER_ORDINAL}格式。这使start.sh能识别集群的主节点。${NODE_NAME}-N主机名格式,其中N > ${MASTER_ORDINAL}。创建用户定义的桥接网络并启动两个节点:
bashdocker network create mim docker run -dt --net mim -h mongooseim-1 --name mongooseim-1 erlangsolutions/mongooseim docker run -dt --net mim -h mongooseim-2 --name mongooseim-2 erlangsolutions/mongooseim
节点应已形成集群。检查:
bash$ docker exec mongooseim-1 /usr/lib/mongooseim/bin/mongooseimctl mnesia systemInfo --keys '["running_db_nodes"]' { "data" : { "mnesia" : { "systemInfo" : [ { "result" : [ "mongooseim@mongooseim-2", "mongooseim@mongooseim-1" ], "key" : "running_db_nodes" } ] } } } $ docker exec mongooseim-2 /usr/lib/mongooseim/bin/mongooseimctl mnesia systemInfo --keys '["running_db_nodes"]' { "data" : { "mnesia" : { "systemInfo" : [ { "result" : [ "mongooseim@mongooseim-1", "mongooseim@mongooseim-2" ], "key" : "running_db_nodes" } ] } } }
默认集群可作为Kubernetes StatefulSet部署的一部分工作,但需两项更改:
MASTER_ORDINAL需设为0,因为StatefulSet实例从0开始计数NODE_TYPE需设为name(使用长名称),因为Kubernetes使用内部DNS的FQDN解析pod IP。注意,要使pod域名正常工作,需运行与StatefulSet匹配的无头服务(详见[***]手动集群方法需通过CLUSTER_WITH环境变量显式指定要加入的集群节点名称。也可通过设置JOIN_CLUSTER=false(默认true)在容器启动时完全禁用集群。
手动指定要加入的集群节点名称:
bashdocker run -dt --net mim -h first-node --name first-node -e JOIN_CLUSTER=false erlangsolutions/mongooseim docker run -dt --net mim -h second-node --name second-node -e CLUSTER_WITH=mongooseim@first-node erlangsolutions/mongooseim
第一条命令启动节点并禁止加入任何集群(因无其他节点)。第二条命令告知第二个节点加入第一个节点的集群。
检查节点是否形成集群:
bash$ docker exec first-node /usr/lib/mongooseim/bin/mongooseimctl mnesia systemInfo --keys '["running_db_nodes"]' { "data" : { "mnesia" : { "systemInfo" : [ { "result" : [ "mongooseim@second-node", "mongooseim@first-node" ], "key" : "running_db_nodes" } ] } } } $ docker exec second-node /usr/lib/mongooseim/bin/mongooseimctl mnesia systemInfo --keys '["running_db_nodes"]' { "data" : { "mnesia" : { "systemInfo" : [ { "result" : [ "mongooseim@first-node", "mongooseim@second-node" ], "key" : "running_db_nodes" } ] } } }
MongooseIM可与多种数据库和外部服务集成。例如,运行PostgreSQL容器:
bashdocker run -d --name mongooseim-postgres --net mim \ -e POSTGRES_PASSWORD=mongooseim -e POSTGRES_USER=mongooseim \ -v ${PATH_TO_MONGOOSEIM_PGSQL_FILE}:/docker-entrypoint-initdb.d/pgsql.sql:ro \ -p 5432:5432 postgres
${PATH_TO_MONGOOSEIM_PGSQL_FILE}是MongooseIM仓库中priv/pgsql.sql文件的绝对路径。
别忘了在mongooseim.toml中配置出站连接池以连接设置的服务!
Mnesia文件位于容器内/var/lib/mongooseim目录。某些情况下,更新镜像时需保留这些文件,此时应将/var/lib/mongooseim目录挂载到宿主机目录。
可使用CETS替代Mnesia - 详见教程。需启动所有节点时设置JOIN_CLUSTER=false,因为CETS使用关系数据库发现集群节点。
bashdocker run -dt --net mim -h mongooseim-1 --name mongooseim-1 -v `pwd`/mongooseim-1:/member -e JOIN_CLUSTER=false erlangsolutions/mongooseim docker run -dt --net mim -h mongooseim-2 --name mongooseim-2 -v `pwd`/mongooseim-2:/member -e JOIN_CLUSTER=false erlangsolutions/mongooseim
检查两个节点的CETS状态以确认集群成功:
bash$ docker exec mongooseim-1 /usr/lib/mongooseim/bin/mongooseimctl cets systemInfo { "data" : { "cets" : { "systemInfo" : { (...) "availableNodes" : [ "mongooseim@mongooseim-1", "mongooseim@mongooseim-2" ] } } } } $ docker exec mongooseim-2 /usr/lib/mongooseim/bin/mongooseimctl cets systemInfo { "data" : { "cets" : { "systemInfo" : { (...) "availableNodes" : [ "mongooseim@mongooseim-2", "mongooseim@mongooseim-1" ] } } } }



manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务