Openfire 5.1.2 Docker Compose 部署指南

使用 Docker Compose 部署 Openfire 5.1.2 官方镜像的实测指南,覆盖编排文件、JVM 堆限制、数据持久化、初始化向导与两个关键挂载坑的排障。

OpenfireJabber/XMPP即时通讯2026/10/26

Openfire 5.1.2 Docker Compose 部署指南

目标:使用 Docker Compose 一键部署 Openfire 5.1.2 官方镜像(含可选 MySQL 外部数据库服务),覆盖 compose 编排文件、JVM 堆限制、数据持久化、初始化向导与部署后验证,并沉淀实测中踩到的挂载与属主两个关键坑。

一、环境信息

项目内容
宿主系统Ubuntu 24.04
Docker / ComposeDocker 29.9.2,Compose v2
Openfire 镜像ghcr.io/igniterealtime/openfire:v5.1.2(官方维护)
MySQL 镜像mysql:8.0(可选外部数据源,预留)
JVM 堆-Xms256m -Xmx512m
Compose 项目名openfire-5-1-2-stack
演示域名 / 账号im.example.com;admin / q1w2e3r4

版本与镜像背景见《Openfire 5.1.2 介绍与选型指南》;裸机安装方式见《Ubuntu 24.04 安装 Openfire 5.1.2 指南》。

二、端口规划

宿主端口从 8137 起连续映射,避开常用服务端口:

宿主端口目标端口用途
81379090管理控制台 HTTP
81389091管理控制台 HTTPS
81395222客户端连接(C2S)
81405223客户端连接 TLS
81415269服务器互联(S2S)
81427070HTTP Binding(BOSH)
81437443HTTP Binding TLS(WebSocket)
81447777文件传输代理

三、编写 compose.yml

创建工作目录与数据目录:

mkdir -p /opt/openfire-stack/data/{lib,logs,mysql}
cd /opt/openfire-stack

docker-compose.yml 全文(实测可用版本):

name: openfire-5-1-2-stack
services:
  openfire:
    image: ghcr.io/igniterealtime/openfire:v5.1.2
    container_name: openfire-5-1-2-main
    hostname: openfire-main
    restart: unless-stopped
    environment:
      - OPENFIRE_OPTS=-Xms256m -Xmx512m
    ports:
      - "8137:9090"   # Admin console HTTP
      - "8138:9091"   # Admin console HTTPS
      - "8139:5222"   # Client to server
      - "8140:5223"   # Client to server TLS
      - "8141:5269"   # Server to server
      - "8142:7070"   # HTTP binding
      - "8143:7443"   # HTTPS binding
      - "8144:7777"   # File transfer proxy
    volumes:
      - ./data/lib:/var/lib/openfire
      - ./data/logs:/var/log/openfire
      - openfire-embedded-db:/usr/local/openfire/embedded-db
    networks:
      - openfire-net

  mysql:
    image: mysql:8.0
    container_name: openfire-5-1-2-mysql
    hostname: openfire-mysql
    restart: unless-stopped
    environment:
      - MYSQL_ROOT_PASSWORD=q1w2e3r4
      - MYSQL_DATABASE=openfire
      - MYSQL_USER=openfire
      - MYSQL_PASSWORD=q1w2e3r4
    volumes:
      - ./data/mysql:/var/lib/mysql
    networks:
      - openfire-net

networks:
  openfire-net:
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.61.0/24

volumes:
  openfire-embedded-db:

三个编排要点(均为实测结论):

  • JVM 堆:官方镜像通过 OPENFIRE_OPTS 传递 JVM 参数,固定 -Xms256m -Xmx512m 防止内存失控;后续在管理台可见堆上限 512MB 生效。
  • 必须整体挂载 /var/lib/openfire:官方镜像的入口脚本把 conf/、logs/、plugins/ 三个子目录软链到 /var/lib/openfire 下并在缺失时复制初始模板。⚠️ 若只单独挂载 conf 子目录,软链判断失效、模板不复制,服务启动报 Critical Error! The home directory has not been configured(详见常见问题 1)。
  • embedded-db 必须单独命名卷:内嵌数据库位于 /usr/local/openfire/embedded-db,不在上述软链清单内,挂载 /var/lib/openfire 不会使其持久化;同时空命名卷默认 root 属主,会因 openfire.lck 权限不足启动失败(详见常见问题 2)。
  • 网段 10.89.61.0/24 为显式指定,用于规避与宿主上其他网络的地址冲突,可按环境调整或删除整段 ipam 配置。

四、启动

docker compose up -d

查看状态(Up (healthy) 来自 5.1.0 起镜像自带的 healthcheck,OF-3184):

docker compose ps

实测回显:

NAME                   IMAGE                                    COMMAND                  SERVICE    CREATED          STATUS                    PORTS
openfire-5-1-2-main    ghcr.io/igniterealtime/openfire:v5.1.2   "/sbin/entrypoint.sh"    openfire   46 minutes ago   Up 46 minutes (healthy)   3478-3479/tcp, 5005/tcp, 5229/tcp, 5262-5263/tcp, 5275-5276/tcp, 0.0.0.0:8139->5222/tcp, 0.0.0.0:8140->5223/tcp, 0.0.0.0:8141->5269/tcp, 0.0.0.0:8142->7070/tcp, 0.0.0.0:8143->7443/tcp, 0.0.0.0:8144->7777/tcp, 0.0.0.0:8137->9090/tcp, 0.0.0.0:8138->9091/tcp
openfire-5-1-2-mysql   mysql:8.0                                "docker-entrypoint.s…"   mysql      46 minutes ago   Up 46 minutes             3306/tcp, 33060/tcp

五、初始化向导

浏览器访问 http://<宿主IP>:8137 进入 Openfire Setup 向导,五步:

  1. 语言选择:默认 English;
  2. 服务器设置:域名 im.example.com(生产填真实对外域名),其余默认;
  3. 数据源:本篇实测选择默认 Embedded Database(数据落在 openfire-embedded-db 命名卷);如需外部库可选 Standard Database Connection,JDBC 主机填 openfire-mysql:3306、库名 openfire、账号 openfire/q1w2e3r4(compose 已预留该服务与库;MySQL 外部库路径未在本篇实测展开,以官方文档为准);
  4. 用户资料:默认数据库存储;
  5. 管理员账户:跳过(默认 admin/admin)。

⚠️ 脚本化驱动向导时注意:数据源步骤第一次 POST 返回 200 但库并未初始化,页面中还有隐藏的 followup 表单(csrf/next/mode/continue 字段),需两段式提交才能完成数据源写入;浏览器人工操作则无感。

完成后登录管理台并立即改密:Users/Groups → admin → Password 改为 q1w2e3r4,返回:

user-password.jsp?success=true&username=admin

六、部署验证

用 admin / q1w2e3r4 登录 http://<宿主IP>:8137,控制台首页(Server Information)实测显示:

Version: Openfire 5.1.2  Server Directory: /usr/local/openfire  XMPP Domain Name: im.example.com
Java Version: 17.0.19 Eclipse Adoptium -- OpenJDK 64-Bit Server VM
Appserver: jetty/12.0.38  Server Host Name (FQDN): im.example.com  OS / Hardware: Linux / amd64
Memory 147.88 MB of 512.00 MB (28.9%) used

Memory … of 512.00 MB 证明 OPENFIRE_OPTS 的堆上限已生效。再从宿主确认关键端口映射连通:

curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8137/login.jsp
200

5222 等 XMPP 端口在向导完成后才会开始监听,用 nc -zv <宿主IP> 8139 或直接跑一个 XMPP 客户端验证。

七、日常运维

docker compose logs -f openfire      # 跟踪日志
docker compose restart openfire      # 重启 Openfire
docker compose stop && docker compose up -d   # 停止与再启动
docker compose down                  # 停止并移除(命名卷保留)

数据持久化清单:

挂载点宿主位置内容
/var/lib/openfire./data/libconf/(openfire.xml 等)、plugins/
/var/log/openfire./data/logs运行日志
/usr/local/openfire/embedded-db命名卷 openfire-embedded-db内嵌数据库全部文件
/var/lib/mysql./data/mysqlMySQL 数据(启用外部库时使用)

升级时替换 image 标签后 docker compose up -d 重建即可,以上持久化数据均不随重建丢失。

八、常见问题

1. 启动报 Critical Error! The home directory has not been configured 原因:只把 conf 子目录单独挂载到 /var/lib/openfire/conf,入口脚本判断 conf 目录"已存在"而跳过模板复制。解决:整体挂载 /var/lib/openfire(如本篇 compose),删除该子目录挂载后 docker compose up -d 重建。

2. 内嵌库启动报 Permission denied(openfire.lck) 原因:openfire-embedded-db 空命名卷默认 root 属主,Openfire 进程以 uid 100/gid 101 运行无法写入。解决:

docker run --rm -v openfire-5-1-2-stack_openfire-embedded-db:/db busybox chown -R 100:101 /db
docker compose restart openfire

3. 管理台登录报 500(Database setup or configuration error) 原因:向导数据源步骤未真正完成(脚本化驱动时常见,见两段式提交说明)。解决:清空 embedded-db 命名卷后重新走完向导,或人工在浏览器完整走一遍向导。

4. 8139(5222)端口连不通 向导未完成前 XMPP 端口不监听,属正常现象;完成向导后即恢复。

九、参考