openfire-docker-compose/cluster
Dan Caseley 460fc98fc0 Add config to allow for GitHub Packages instead 2025-02-12 10:00:49 +01:00
..
nginx Fix IPv6 configuration in nginx.conf files 2024-11-07 12:22:48 +01:00
plugins Clustering: use Hazelcast 5.5.0 2024-11-05 20:37:43 +01:00
sql refactor: rename openfire.sql to clarify execution order 2025-01-07 13:41:20 +00:00
xmpp Clustering: use Hazelcast 5.5.0 2024-11-05 20:37:43 +01:00
README.md docs: Add host entry help in cluster env 2024-12-18 08:04:14 +00:00
docker-compose-clustered.yml Add config to allow for GitHub Packages instead 2025-02-12 10:00:49 +01:00
docker-compose-network-dualstack.yml Add dualstack support 2024-11-05 09:47:10 +00:00
docker-compose-network-ipv4-only.yml Add dualstack support 2024-11-05 09:47:10 +00:00
start.sh Ipv6: Add `java.net.preferIPv6Addresses` property 2024-11-05 09:47:10 +00:00

README.md

Clustered configuration

Running ./start.sh -c will perform some cleanup then start the containers in a clustered configuration. When running, the system looks like this:

                   +--------------------------------------------------+
                   |           172.60.0.99                            |
                   |       +----------------+                         |
                   |       |                |+--------------+         |
(XMPP-C2S)  55222 -|-------|  Load Balancer |+-------+      |         |
(BOSH)      57070 -|       |                |        |      |         |
(BOSHS)     57443 -|       +----------------+        |      |         |
                   |           |                     |  172.60.0.30   |
                   |           |                     |  +--------+    |
                   |           |          +=============+        |    |- 5223 (XMPP-C2S)
                   |           |          |          |  | XMPP 3 |----|- 5263 (XMPP-S2S)
                   |           |          |          |  |        |    |- 9093 (HTTP-Admin)
                   |           |          |          |  +------+-+    |- 7073 (BOSH)
                   |           |          |          |         |      |
                   |      172.60.0.10     |     172.60.0.20    |      |
                   |      +--------+      |     +--------+     |      |
(XMPP-C2S)   5221 -|      |        +======+     |        |=====+      |- 5222 (XMPP-C2S)
(XMPP-S2S)   5261 -|------| XMPP 1 +============+ XMPP 2 |            |- 5262 (XMPP-S2S)
(HTTP-Admin) 9091 -|      |        |            |        |------------|- 9092 (HTTP-Admin)
(BOSH)       7071 -|      +----+---+            +----+---+            |- 7072 (BOSH)
                   |           |                     |                |
                   |           |                     |                |
                   |       +---+--+                  |                |
                   |       |      |                  |                |
(Database)   5432 -|-------|  DB  +------------------+                |
                   |       |      |                                   |
                   |       +------+                                   |
                   |      172.60.0.11                                 |
                   |                                                  |
                   +----------------172.60.0.0/24---------------------+

Note that the load balancer is configured to be less flappy, with the flappiness controlled by the nginx config, simulating simple round-robin DNS load balancing. Ports from individual servers are exposed and can be hit directly.

Openfire is configured with the following XMPP domain:

  • xmpp.localhost.example

Openfire is configured with the following hostnames:

  • xmpp1.localhost.example
  • xmpp2.localhost.example
  • xmpp3.localhost.example

The following users are configured:

  • user1 password
  • user2 password

The following MUC rooms are configured:

  • muc1
  • muc2

Hosts file entries

To access the XMPP servers and load balancer from your local machine you should add entries to your hosts file:

127.0.0.1 openfire-lb-1
127.0.0.1 xmpp.localhost.example
127.0.0.1 xmpp1.localhost.example
127.0.0.1 xmpp2.localhost.example
127.0.0.1 xmpp3.localhost.example

Client configuration

Depending on your requirements, you can configure your client to connect via the load balancer at openfire-lb-1:55222 or directly to the individual servers at:

  • xmpp1.localhost.example:5221
  • xmpp2.localhost.example:5222
  • xmpp3.localhost.example:5223

Network

The Docker compose file defines a custom bridge network with a single subnet of 172.60.0.0/24 for the clustered configuration.

When the -6 argument to ./start.sh is provided, then an additional subnet of fd23:0d79:d076::/64 is configured. Then, IPv6 is preferred for internal networking. Note that the IPv4 network remains in place, as Docker does not support IPv6-only containers.

When running with the optional -6 flag (that adds IPv6 support) the system looks like this:

                   +--------------------------------------------------+
                   |       [fd23:d79:d076::99]                        |
                   |           172.60.0.99                            |
                   |       +----------------+                         |
                   |       |                |+--------------+         |
(XMPP-C2S)  55222 -|-------|  Load Balancer |+-------+      |         |
(BOSH)      57070 -|       |                |        |      |         |
(BOSHS)     57443 -|       +----------------+        |      |         |
                   |           |                     | [fd23:d79:d076::30]
                   |           |                     |  172.60.0.30   |
                   |           |                     |  +--------+    |
                   |           |          +=============+        |    |- 5223 (XMPP-C2S)
                   |           |          |          |  | XMPP 3 |----|- 5263 (XMPP-S2S)
                   |           |          |          |  |        |    |- 9093 (HTTP-Admin)
                   |           |          |          |  +------+-+    |- 7073 (BOSH)
                   |           |          |          |         |      |
                   |  [fd23:d79:d076::10] | [fd23:d79:d076::20]|      |
                   |      172.60.0.10     |     172.60.0.20    |      |
                   |      +--------+      |     +--------+     |      |
(XMPP-C2S)   5221 -|      |        +======+     |        |=====+      |- 5222 (XMPP-C2S)
(XMPP-S2S)   5261 -|------| XMPP 1 +============+ XMPP 2 |            |- 5262 (XMPP-S2S)
(HTTP-Admin) 9091 -|      |        |            |        |------------|- 9092 (HTTP-Admin)
(BOSH)       7071 -|      +----+---+            +----+---+            |- 7072 (BOSH)
                   |           |                     |                |
                   |           |                     |                |
                   |       +---+--+                  |                |
                   |       |      |                  |                |
(Database)   5432 -|-------|  DB  +------------------+                |
                   |       |      |                                   |
                   |       +------+                                   |
                   |      172.60.0.11                                 |
                   |  [fd23:d79:d076::11]                             |
                   |                                                  |
                   +----------------172.60.0.0/24---------------------+
                                 fd23:0d79:d076::/64

Removing a node from the network

To remove a node from the network run the following command:

docker network disconnect NETWORK-NAME CONTAINER-NAME

For example:

docker network disconnect openfire-testing_openfire-federated-net openfire-testing_xmpp1_1

Adding a node to the network

To add a node to the network fun the following command:

docker network connect NETWORK-NAME CONTAINER-NAME

For example:

docker network connect openfire-testing_openfire-federated-net openfire-testing_xmpp1_1