Apache Fineract 1.15.0 Docker Compose 部署指南
使用 Docker Compose 一条命令部署 Apache Fineract 1.15.0 与 MariaDB 11,涵盖官方镜像的 MariaDB 驱动缺失适配、覆盖 entrypoint、数据库初始化、JVM 堆内存限定(256–512MB)、端口映射与 REST 全链路验证,并给出等价 docker run 方式。部署流程在 Ubuntu 22.04 + Docker 环境实测通过。
Apache Fineract 1.15.0 Docker Compose 部署指南
目标:使用 Docker Compose 一键部署 Apache Fineract 1.15.0(开源核心银行/数字金融服务平台)与 MariaDB 数据库,涵盖官方镜像缺失 MariaDB JDBC 驱动的适配、覆盖 entrypoint、数据库初始化、JVM 堆内存限定、端口映射与 REST 全链路业务验证,并给出等价的
docker run方式。部署流程在 Ubuntu 22.04 + Docker(Compose v2)环境实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS(x86_64)
- Docker 版本:Docker Engine(含 Compose v2 插件)
- 组件版本:Apache Fineract 1.15.0
- 应用镜像:
apache/fineract:latest(详见镜像选型说明) - 数据库镜像:
mariadb:11 - 编排目录:
/opt/data/ops/fineract-compose - 网络:compose 项目自定义 bridge 网络
fineract-net - 端口映射:
8443(应用 HTTPS,上下文/fineract-provider) - 服务名:
fineract(应用)、mariadb(数据库) - 默认管理员:
mifos/password;租户标识固定default - 数据库账号:
root/q1w2e3r4 - JVM 堆:
-Xmx512m -Xms256m
二、镜像选型说明
| 镜像 | 版本 | 说明 |
|---|---|---|
apache/fineract:latest(本文实测) | 实测该标签当前为 1.16.0-SNAPSHOT(develop 分支快照,内置 JDK 25 / Zulu25.36,classpath 仅含 postgresql-42.7.13.jar) | 官方镜像不锁版本且不含 MariaDB 驱动,需卷挂载驱动并覆盖 entrypoint |
| 自构建 1.15.0 镜像 | Apache Fineract 1.15.0 | 由官方二进制发行包 apache-fineract-bin-1.15.0.tar.gz 构建,可精确锁定 1.15.0 与本文档版本一致(推荐生产使用) |
mariadb:11 | 11.8.9-MariaDB | 元数据库,需启用 utf8mb4 |
💡 说明:官方镜像
latest会漂移且仅含 PostgreSQL 驱动。若要求与《Ubuntu 22.04 安装 Apache Fineract 1.15.0 指南》版本严格一致,建议以apache-fineract-bin-1.15.0.tar.gz自构建镜像后替换image字段;本文实测流程以apache/fineract:latest打通全链路。
三、前置条件
- 已安装 Docker Engine 与 Docker Compose 插件:
docker --version && docker compose version - 宿主机已规划部署目录
/opt/data/ops/fineract-compose - 可访问 Maven 镜像以下载 MariaDB JDBC 驱动
四、部署步骤
4.1 创建部署目录与文件清单
mkdir -p /opt/data/ops/fineract-compose
cd /opt/data/ops/fineract-compose
目录结构:
fineract-compose/
├── docker-compose.yml
├── driver/mariadb-java-client-3.5.3.jar # 官方镜像缺失的 MariaDB 驱动
└── initdb/01-create-default-db.sql # 初始化 fineract_default 库
4.2 准备 MariaDB JDBC 驱动
官方镜像 classpath 不含 MariaDB 驱动,需自备并卷挂载:
mkdir -p /opt/data/ops/fineract-compose/driver
cd /opt/data/ops/fineract-compose/driver && \
curl -sSL -o mariadb-java-client-3.5.3.jar \
'https://maven.aliyun.com/repository/public/org/mariadb/jdbc/mariadb-java-client/3.5.3/mariadb-java-client-3.5.3.jar'
ls -lh
实测回显:
-rw-r--r-- 1 root root 746140 mariadb-java-client-3.5.3.jar
4.3 数据库初始化脚本
保存为 /opt/data/ops/fineract-compose/initdb/01-create-default-db.sql:
CREATE DATABASE IF NOT EXISTS fineract_default CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES ON fineract_default.* TO 'root'@'%';
FLUSH PRIVILEGES;
💡 说明:
fineract_tenants由 compose 的MARIADB_DATABASE环境变量创建;fineract_default由本初始化脚本创建。两库的 schema 均由应用首次启动时 Liquibase 自动迁移。
4.4 编写 docker-compose.yml
保存为 /opt/data/ops/fineract-compose/docker-compose.yml:
services:
mariadb:
image: mariadb:11
container_name: fineract-compose-db
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: q1w2e3r4
MARIADB_DATABASE: fineract_tenants
TZ: UTC
command:
- "--character-set-server=utf8mb4"
- "--collation-server=utf8mb4_general_ci"
- "--innodb-snapshot-isolation=OFF"
volumes:
- ./initdb:/docker-entrypoint-initdb.d:ro
- fineract-db-data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 30
networks: [fineract-net]
fineract:
image: apache/fineract:latest
container_name: fineract-compose-app
restart: unless-stopped
depends_on:
mariadb:
condition: service_healthy
entrypoint:
- "/bin/sh"
- "-c"
- "exec java -Xmx512m -Xms256m -cp /opt/driver/mariadb-java-client-3.5.3.jar:$$(cat /app/jib-classpath-file) -Duser.home=/tmp -Duser.timezone=UTC -Dfile.encoding=UTF-8 org.apache.fineract.ServerApplication"
environment:
FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME: org.mariadb.jdbc.Driver
FINERACT_HIKARI_JDBC_URL: jdbc:mariadb://mariadb:3306/fineract_tenants
FINERACT_HIKARI_USERNAME: root
FINERACT_HIKARI_PASSWORD: q1w2e3r4
FINERACT_DEFAULT_TENANTDB_HOSTNAME: mariadb
FINERACT_DEFAULT_TENANTDB_PORT: "3306"
FINERACT_DEFAULT_TENANTDB_UID: root
FINERACT_DEFAULT_TENANTDB_PWD: q1w2e3r4
FINERACT_DEFAULT_TENANTDB_NAME: fineract_default
FINERACT_DEFAULT_TENANTDB_IDENTIFIER: default
TZ: UTC
volumes:
- ./driver:/opt/driver:ro
ports:
- "8443:8443"
networks: [fineract-net]
volumes:
fineract-db-data:
networks:
fineract-net:
driver: bridge
⚠️ 注意:
entrypoint覆盖为java -cp /opt/driver/mariadb-java-client-3.5.3.jar:$(cat /app/jib-classpath-file) ... org.apache.fineract.ServerApplication,将 MariaDB 驱动前置到 classpath,并以-Xmx512m -Xms256m限定 JVM 堆。$$(...)中的双美元符用于在 compose 层转义 shell 命令替换。
4.5 启动
cd /opt/data/ops/fineract-compose
docker compose up -d
实测回显:
Network fineract-compose_fineract-net Created
Volume fineract-compose_fineract-db-data Created
Container fineract-compose-db Created
Container fineract-compose-app Created
Container fineract-compose-db Started
Container fineract-compose-db Waiting
Container fineract-compose-db Healthy
Container fineract-compose-app Started
查看服务状态:
docker compose ps
实测回显:
NAME IMAGE SERVICE STATUS PORTS
fineract-compose-app apache/fineract:latest fineract Up 0.0.0.0:8443->8443/tcp
fineract-compose-db mariadb:11 mariadb Up (healthy) 3306/tcp
4.6 启动日志与健康检查
docker compose logs fineract | grep -E 'Tomcat started|Started ServerApplication'
实测回显:
2026-10-11 12:59:51.075 - INFO 1 [default] --- [main] TomcatWebServer : Tomcat started on port 8443 (https) with context path '/fineract-provider'
2026-10-11 12:59:51.081 - INFO 1 [default] --- [main] ServerApplication : Started ServerApplication in 114.875 seconds (process running for 115.404)
curl -sk https://localhost:8443/fineract-provider/actuator/health
实测回显:
{"groups":["liveness","readiness"],"status":"UP"}
4.7 REST 业务验证
所有业务 API 均需请求头:Authorization: Basic bWlmb3M6cGFzc3dvcmQ=、Fineract-Platform-TenantId: default、Content-Type: application/json。
管理员登录:
curl -sk -X POST 'https://localhost:8443/fineract-provider/api/v1/authentication' \
-H 'Authorization: Basic bWlmb3M6cGFzc3dvcmQ=' -H 'Fineract-Platform-TenantId: default' \
-H 'Content-Type: application/json' -d '{"username":"mifos","password":"password"}'
实测回显:
{"username":"mifos","userId":1,"authenticated":true,"officeId":1,"officeName":"Head Office",
"roles":[{"id":1,"name":"Super user"}],"isTwoFactorAuthenticationRequired":false}
新建客户:
curl -sk -X POST 'https://localhost:8443/fineract-provider/api/v1/clients' \
-H 'Authorization: Basic bWlmb3M6cGFzc3dvcmQ=' -H 'Fineract-Platform-TenantId: default' \
-H 'Content-Type: application/json' -d '{"officeId":1,"legalFormId":1,"firstname":"Compose","lastname":"Client",
"externalId":"CLI-CMP-001","dateFormat":"dd MMMM yyyy","locale":"en","active":true,
"activationDate":"10 October 2026","submittedOnDate":"10 October 2026"}'
实测回显:
{"officeId":1,"clientId":1,"resourceId":1,"resourceExternalId":"CLI-CMP-001"}
新建贷款产品:
curl -sk -X POST 'https://localhost:8443/fineract-provider/api/v1/loanproducts' \
-H 'Authorization: Basic bWlmb3M6cGFzc3dvcmQ=' -H 'Fineract-Platform-TenantId: default' \
-H 'Content-Type: application/json' -d '{"name":"Compose Loan","shortName":"CMPL","currencyCode":"USD",
"digitsAfterDecimal":2,"inMultiplesOf":0,"principal":2000,"numberOfRepayments":12,"repaymentEvery":1,
"repaymentFrequencyType":2,"interestRatePerPeriod":12,"interestRateFrequencyType":2,"amortizationType":1,
"interestType":0,"interestCalculationPeriodType":1,"transactionProcessingStrategyCode":"mifos-standard-strategy",
"accountingRule":1,"daysInYearType":365,"daysInMonthType":30,"isInterestRecalculationEnabled":false,
"locale":"en","dateFormat":"dd MMMM yyyy"}'
实测回显:
{"resourceId":1}
建贷款账户 → 审批 → 放款:
curl -sk -X POST 'https://localhost:8443/fineract-provider/api/v1/loans' \
-H 'Authorization: Basic bWlmb3M6cGFzc3dvcmQ=' -H 'Fineract-Platform-TenantId: default' \
-H 'Content-Type: application/json' -d '{"clientId":1,"productId":1,"principal":2000,"loanTermFrequency":12,
"loanTermFrequencyType":2,"numberOfRepayments":12,"repaymentEvery":1,"repaymentFrequencyType":2,
"interestRatePerPeriod":12,"interestRateFrequencyType":2,"amortizationType":1,"interestType":0,
"interestCalculationPeriodType":1,"transactionProcessingStrategyCode":"mifos-standard-strategy",
"expectedDisbursementDate":"10 October 2026","submittedOnDate":"10 October 2026","loanType":"individual",
"locale":"en","dateFormat":"dd MMMM yyyy"}'
实测回显:
{"officeId":1,"clientId":1,"loanId":1,"resourceId":1}
随后以 command=approve(状态 200 Approved)与 command=disburse(状态 300 Active)完成审批与放款。
4.8 验证堆参数与数据库版本
应用进程堆参数:
docker exec fineract-compose-app sh -c 'cat /proc/1/cmdline | tr "\0" " "'
实测回显:
java -Xmx512m -Xms256m -cp /opt/driver/mariadb-java-client-3.5.3.jar:... org.apache.fineract.ServerApplication
数据库版本与字符集:
docker exec fineract-compose-db mariadb -uroot -pq1w2e3r4 -N -e "SELECT VERSION(); SHOW VARIABLES LIKE 'character_set_server';"
实测回显:
11.8.9-MariaDB-ubu2404
character_set_server utf8mb4
结论:Docker Compose(MariaDB 11.8.9 + Fineract 镜像)一键部署成功,宿主机 :8443 健康检查 UP,业务链路(登录/建客户/建贷款产品/建贷款账户/放款)全部通过。
五、数据持久化说明
fineract-db-data命名卷持久化 MariaDB 数据目录/var/lib/mysql,容器重建后库数据保留。initdb/目录以只读挂载到/docker-entrypoint-initdb.d,仅在数据卷为空(首次初始化)时执行。
💡 说明:若需将数据库文件落到宿主机指定路径,可将命名卷替换为绑定挂载,如
- ./data/db:/var/lib/mysql,并确保宿主机目录属主与容器内 mysql 用户一致。
六、常用环境变量表
| 环境变量 | 实测值 | 说明 |
|---|---|---|
FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME | org.mariadb.jdbc.Driver | 数据源驱动类 |
FINERACT_HIKARI_JDBC_URL | jdbc:mariadb://mariadb:3306/fineract_tenants | 租户库连接串(服务名 mariadb) |
FINERACT_HIKARI_USERNAME / FINERACT_HIKARI_PASSWORD | root / q1w2e3r4 | 数据源账号 |
FINERACT_DEFAULT_TENANTDB_HOSTNAME / _PORT | mariadb / 3306 | 默认租户库地址 |
FINERACT_DEFAULT_TENANTDB_NAME | fineract_default | 默认租户库名 |
FINERACT_DEFAULT_TENANTDB_IDENTIFIER | default | 租户标识 |
MARIADB_ROOT_PASSWORD | q1w2e3r4 | MariaDB root 密码 |
MARIADB_DATABASE | fineract_tenants | 初始创建的租户库 |
TZ | UTC | 时区 |
七、常用配置参数说明
| 配置 | 说明 |
|---|---|
image: mariadb:11 | 数据库镜像 |
command: --character-set-server=utf8mb4 | 强制服务器字符集 utf8mb4 |
command: --innodb-snapshot-isolation=OFF | 关闭快照隔离(规避迁移期锁表问题) |
entrypoint: java -cp <driver>:$(cat /app/jib-classpath-file) | 将 MariaDB 驱动前置到 classpath |
-Xmx512m -Xms256m | JVM 堆限定(256–512MB) |
ports: "8443:8443" | 应用 HTTPS 端口映射 |
depends_on: condition: service_healthy | 等待数据库健康后再启动应用 |
更多参数见《Apache Fineract 1.15.0 配置参数详解》。
八、等价 docker run 运行方式
不加 Compose,可用单条 docker run 启动应用:
docker run -d --name fineract-compose-app --network fineract-net \
-p 8443:8443 \
-v /opt/data/ops/fineract-compose/driver:/opt/driver:ro \
-e FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME=org.mariadb.jdbc.Driver \
-e FINERACT_HIKARI_JDBC_URL='jdbc:mariadb://mariadb:3306/fineract_tenants' \
-e FINERACT_HIKARI_USERNAME=root -e FINERACT_HIKARI_PASSWORD=q1w2e3r4 \
-e FINERACT_DEFAULT_TENANTDB_HOSTNAME=mariadb -e FINERACT_DEFAULT_TENANTDB_PORT=3306 \
-e FINERACT_DEFAULT_TENANTDB_UID=root -e FINERACT_DEFAULT_TENANTDB_PWD=q1w2e3r4 \
-e FINERACT_DEFAULT_TENANTDB_NAME=fineract_default -e FINERACT_DEFAULT_TENANTDB_IDENTIFIER=default \
--entrypoint "/bin/sh" apache/fineract:latest \
-c "exec java -Xmx512m -Xms256m -cp /opt/driver/mariadb-java-client-3.5.3.jar:\$(cat /app/jib-classpath-file) -Duser.home=/tmp org.apache.fineract.ServerApplication"
💡 说明:
--network fineract-net需先创建 bridge 网络(docker network create fineract-net),并先以mariadb:11启动名为mariadb的数据库容器。
九、常用运维命令
# 停止并移除容器(保留数据卷)
cd /opt/data/ops/fineract-compose
docker compose down
# 停止并连带移除数据卷
docker compose down -v
# 后台启动
docker compose up -d
# 查看应用日志
docker compose logs -f fineract
# 重启服务
docker compose restart fineract
十、常见问题(FAQ)
Q1:应用启动报找不到 MariaDB 驱动 / No suitable driver。
官方镜像 classpath 仅含 postgresql 驱动。需卷挂载 mariadb-java-client-3.5.3.jar 并覆盖 entrypoint,将其前置到 classpath。
Q2:迁移报 Incorrect string value '\xE2\x82\xA1'。
数据库字符集不是 utf8mb4。确认 command 中带 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci,并保证 initdb 脚本以 utf8mb4 建库。
Q3:应用在数据库就绪前启动导致连接失败。
depends_on 已配置 condition: service_healthy,等待 healthcheck.sh --connect --innodb_initialized 通过后再启动应用。
Q4:$$(cat /app/jib-classpath-file) 未展开。
compose 中 $ 需转义为 $$;若在 shell 直接执行 docker run,改用 \$(...)。
十一、参考链接
- Apache Fineract 官方发行目录:
https://downloads.apache.org/fineract/1.15.0/ - Apache Fineract 项目主页:
https://fineract.apache.org/
系列其他文档:《Ubuntu 22.04 安装 Apache Fineract 1.15.0 指南》《CentOS 8 安装 Apache Fineract 1.15.0 指南》《Apache Fineract 1.15.0 配置参数详解》《Apache Fineract 1.15.0 常用 CLI 命令与工具详解》。