Redmine 7.0 Docker Compose 部署实战
Redmine 7.0.2 官方镜像 Docker Compose 部署实战:PostgreSQL 主线与 MariaDB 11.8 对照双栈编排、默认数据装载、管理员初始化、项目/Issue/附件端到端验证、备份恢复实测与三条排障实录,附 k8s Bitnami Chart 形态溯源(2026-10-27 实测)。
Redmine 7.0 Docker Compose 部署实战
本文为 Redmine 部署实战篇:以官方
redmine:7.0.2镜像为主线,用 Docker Compose 编排 Redmine + PostgreSQL 完整依赖栈,完成管理员初始化、默认数据装载、项目与 Issue 的端到端验证,并给出 MariaDB 11.8 对照部署、备份恢复实测与三条真实排障记录。产品背景与选型对比见本专栏首篇 《Redmine 7.0 介绍与选型指南》;配置文件逐项说明与命令行运维详见《Redmine 7.0 配置参数详解》与《Redmine 7.0 常用 CLI 命令详解》。全部命令与输出均为 2026-10-27 在 Redmine 7.0.2 环境实测回显。
一、部署方案与前置准备
1.1 部署形态选型
Redmine 是典型的「应用 + 数据库」双组件服务,官方 redmine 镜像(Docker Hub 官方库)内置了数据库连接引导逻辑:容器启动时根据 REDMINE_DB_POSTGRES / REDMINE_DB_MYSQL 等环境变量自动生成 config/database.yml 并执行全量迁移,把传统安装里「手工写 database.yml → 跑 bundle install → 跑 db:migrate」三步合并为一次启动。本文采用两条部署主线:
| 主线 | 应用版本 | 数据库 | 定位 |
|---|---|---|---|
| PostgreSQL 主线 | redmine:7.0.2 | postgres:18 | 官方安装文档推荐的生产首选,本篇主测试环境 |
| MariaDB 对照线 | redmine:7.0.2 | mariadb:11.8 | 验证 MySQL 系依赖链差异(隔离级别、字符集) |
两条线在同一张编排文件中并行定义、各自独立成栈,数据库互不交叉,读者按需二选一即可。
💡 技术拓展:Redmine 该配哪种数据库 Redmine 官方支持 PostgreSQL 14+、MySQL 8.0–8.4(含 MariaDB,需
transaction_isolation=READ-COMMITTED)、SQL Server 2012+ 与 SQLite 3(来源:redmine.org 安装文档,2026-10-27 查询)。多用户生产环境官方明确推荐 PostgreSQL:迁移(migration)在 PG 上验证最充分,且不需要 MySQL 系的隔离级别特调;SQLite 仅适合单机演示,官方注明不适用于多用户生产。本文两条线对照实测后,结论一致指向:新部署优先 PostgreSQL。
1.2 环境与版本
本篇实测环境:
- Ubuntu 22.04 LTS,Docker Engine 29.9.2;
- 镜像版本:
redmine:7.0.2(官方最新稳定版,2026-10-01 发布,版本实查见 A1 篇)、postgres:18、mariadb:11.8; - Redmine 服务端口
8133(PostgreSQL 线)、8135(MariaDB 对照线),均为宿主机空闲端口; - 独立 bridge 网络
redmine-net(10.89.64.0/24)。
⚠️ 网络情况说明:本环境访问 Docker Hub 直连缓慢,
docker pull已配置 HTTP 代理192.168.1.62:7897完成拉取;如 pull 超时,可对单次拉取显式指定代理https_proxy=http://192.168.1.62:7897 docker pull redmine:7.0.2。实测当前渠道(官方 Docker Hub + 代理)可用。
1.3 目录规划
所有持久化数据收敛到一个部署根目录,数据库数据卷与附件目录分开存放:
/opt/redmine-stack/
├── docker-compose.yml # 编排文件(下文 §2.1)
├── pgdata/ # PostgreSQL 数据目录(自动生成)
├── mariadb-data/ # MariaDB 数据目录(自动生成)
├── files-pg/ # PG 线 Redmine 附件目录(挂载到应用 files/)
└── files-mariadb/ # MariaDB 对照线附件目录
二、PostgreSQL 主线:官方 Compose 编排落地
2.1 编排文件
以下是完整编排文件,四个服务分别是 PG 线应用、PG 数据库、MariaDB 数据库与 MariaDB 线应用,两个数据库先各自通过健康检查、应用再启动:
name: redmine-7.0.2-stack
services:
app-pg:
image: redmine:7.0.2
container_name: redmine-7.0.2-app-pg
restart: unless-stopped
ports:
- "8133:3000"
environment:
REDMINE_DB_POSTGRES: db-pg # 数据库服务地址(同网络内服务名)
REDMINE_DB_USERNAME: redmine
REDMINE_DB_PASSWORD: q1w2e3r4
REDMINE_DB_DATABASE: redmine
REDMINE_DB_ENCODING: utf8
REDMINE_SECRET_KEY_BASE: 8b214cd61908c6eca2d1aad3512e88f52312b43917071c86f616897c8dd2efc5
volumes:
- ../files-pg:/usr/src/redmine/files # 附件目录持久化
depends_on:
db-pg:
condition: service_healthy
networks:
- redmine-net
db-pg:
image: postgres:18
container_name: redmine-7.0.2-db-pg
restart: unless-stopped
environment:
POSTGRES_USER: redmine
POSTGRES_PASSWORD: q1w2e3r4
POSTGRES_DB: redmine
POSTGRES_INITDB_ARGS: "--encoding=UTF8"
volumes:
- ../pgdata:/var/lib/postgresql
healthcheck:
test: ["CMD-SHELL", "pg_isready -U redmine -d redmine"]
interval: 5s
timeout: 3s
retries: 12
networks:
- redmine-net
db-mariadb:
image: mariadb:11.8
container_name: redmine-7.0.2-db-mariadb
restart: unless-stopped
environment:
MARIADB_ROOT_PASSWORD: q1w2e3r4
MARIADB_DATABASE: redmine
MARIADB_USER: redmine
MARIADB_PASSWORD: q1w2e3r4
command: --transaction-isolation=READ-COMMITTED --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ../mariadb-data:/var/lib/mysql
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 3s
retries: 12
networks:
- redmine-net
app-mariadb:
image: redmine:7.0.2
container_name: redmine-7.0.2-app-mariadb
restart: unless-stopped
ports:
- "8135:3000"
environment:
REDMINE_DB_MYSQL: db-mariadb # MySQL 系数据库,换用此变量
REDMINE_DB_USERNAME: redmine
REDMINE_DB_PASSWORD: q1w2e3r4
REDMINE_DB_DATABASE: redmine
REDMINE_DB_ENCODING: utf8mb4
REDMINE_SECRET_KEY_BASE: 8b214cd61908c6eca2d1aad3512e88f52312b43917071c86f616897c8dd2efc5
volumes:
- ../files-mariadb:/usr/src/redmine/files
depends_on:
db-mariadb:
condition: service_healthy
networks:
- redmine-net
networks:
redmine-net:
name: redmine-net
driver: bridge
ipam:
config:
- subnet: 10.89.64.0/24
几个关键编排事实需要展开说明:
- 数据库连接变量二选一:官方镜像 entrypoint 判断
REDMINE_DB_POSTGRES或REDMINE_DB_MYSQL(二选一)来生成config/database.yml,同时支持REDMINE_DB_PORT、REDMINE_DB_ENCODING、REDMINE_DB_USERNAME、REDMINE_DB_PASSWORD、REDMINE_DB_DATABASE精细化覆盖。REDMINE_DB_ENCODING在 PG 线用utf8、MySQL 线用utf8mb4,与两库的字符集体系一一对应。 REDMINE_SECRET_KEY_BASE必须显式设置:这是 Rails 会话加密的密钥基座。不设置时镜像会自动生成随机值——但每次重建服务后随机值会变化,所有用户会话与「记住我」Cookie 全部失效。生产部署必须固定此值并妥善保管(生成方式:openssl rand -hex 32)。depends_on+service_healthy:Redmine 首次启动要执行全量迁移,若数据库未就绪会启动失败。两个数据库服务都配了pg_isready/healthcheck.sh健康检查,应用服务以健康状态为启动前置条件,规避竞态。- MariaDB 的
command覆盖:--transaction-isolation=READ-COMMITTED是官方对 MySQL 系数据库的硬性要求(默认 REPEATABLE-READ 下 Redmine 会出现锁等待异常);utf8mb4字符集则保证 emoji 等四字节字符可存。 - 附件目录挂载:
/usr/src/redmine/files是 Redmine 存放上传附件的目录,必须外挂持久化;数据库里只存附件元数据,实体文件在这里。
2.2 启动与状态验证
docker compose up -d
输出(实测回显,MariaDB 对照线随后一并拉起):
[+] Running 5/5
✔ Network redmine-net Created
✔ Container redmine-7.0.2-db-mariadb Healthy
✔ Container redmine-7.0.2-db-pg Healthy
✔ Container redmine-7.0.2-app-pg Started
✔ Container redmine-7.0.2-app-mariadb Started
用 docker compose ps 确认全部服务运行(实测回显):
$ docker compose -f docker-compose.yml ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
redmine-7.0.2-app-mariadb redmine:7.0.2 "/docker-entrypoint.…" app-mariadb 21 minutes ago Up 21 minutes 0.0.0.0:8135->3000/tcp, [::]:8135->3000/tcp
redmine-7.0.2-app-pg redmine:7.0.2 "/docker-entrypoint.…" app-pg 21 minutes ago Up 11 minutes 0.0.0.0:8133->3000/tcp, [::]:8133->3000/tcp
redmine-7.0.2-db-mariadb mariadb:11.8 "docker-entrypoint.s…" db-mariadb 21 minutes ago Up 21 minutes (healthy) 3306/tcp
redmine-7.0.2-db-pg postgres:18 "docker-entrypoint.s…" db-pg 21 minutes ago Up 21 minutes (healthy) 5432/tcp
数据库在 30 秒内进入 (healthy) 状态,应用随后完成初始化。此时 http://<服务器IP>:8133/ 已可访问(实测 HTTP 200)。
三、首次启动与服务初始化
3.1 官方镜像首次启动做了什么
首次 up 时应用日志完成三件事:静态资源预编译落盘、生成 config/database.yml、执行全量数据库迁移。日志关键段(实测回显,节选):
The Gemfile's dependencies are satisfied
I, [2026-10-27T09:51:25.449497 #25] INFO -- : Writing NotoSans-BoldItalic-51a237b2.woff2
I, [2026-10-27T09:51:25.449743 #25] INFO -- : Writing NotoSans-Regular-ff41eb73.woff2
I, [2026-10-27T09:51:25.449864 #25] INFO -- : Writing text_list_bullets-47e76353.png
I, [2026-10-27T09:51:25.450082 #25] INFO -- : Writing calendar-503585d1.png
...
== 1 Setup: migrating =========================================================
== 1 Setup: migrated (0.1015s) ================================================
== 2 IssueMove: migrating =====================================================
== 2 IssueMove: migrated (0.0018s) ============================================
== 3 IssueAddNote: migrating ==================================================
== 3 IssueAddNote: migrated (0.0020s) =========================================
== 4 ExportPdf: migrating =====================================================
== 4 ExportPdf: migrated (0.0023s) ============================================
== 5 IssueStartDate: migrating ================================================
== 5 IssueStartDate: migrated (0.0016s) =======================================
== 6 CalendarAndActivity: migrating ===========================================
== 6 CalendarAndActivity: migrated (0.0032s) ==================================
== 7 CreateJournals: migrating ================================================
== 7 CreateJournals: migrated (0.0166s) =======================================
== 8 CreateUserPreferences: migrating =========================================
日志里成对的 == N 名称: migrating / migrated 是 Rails 迁移的逐条回执,编号从 1 递增到两百多个(Redmine 7.0.2 全量迁移数),首次启动大约 1–2 分钟跑完。随后的每次重启因为迁移表里已记录版本号,会直接跳过,数秒内完成。
用一条 Rails 内嵌脚本验证版本与数据表就位(实测回显):
$ docker exec redmine-7.0.2-app-pg sh -c 'SECRET_KEY_BASE=$REDMINE_SECRET_KEY_BASE \
RAILS_ENV=production bundle exec rails runner "puts Redmine::VERSION"'
7.0.2.stable
⚠️ 注意上面命令里的
SECRET_KEY_BASE=$REDMINE_SECRET_KEY_BASE:官方镜像把这个变量传给服务进程本身,但不写入任何配置文件,因此通过docker exec新起的会话必须手动补上,否则 Rails 8.1 启动即报Missing secret_key_base(完整排障见 §8.2)。
3.2 默认数据装载:首次部署的必做步骤
这是官方镜像部署与源码安装的最大行为差异:镜像 entrypoint 只执行 db:migrate(建表),不执行 redmine:load_default_data(装默认追踪器、状态、角色、权限等业务种子数据)。默认数据缺失的后果:能建项目,但新建 Issue 时没有可选的追踪器,直接报错。本环境把这一坑直接做成了排障 Issue #1(见 §8.1)。
装载方式两种,任选其一:
方式一:Web 引导。用浏览器登录后,系统会在首页提示选择默认数据语言,点选「简体中文」自动装载。适合已有管理员登录态的场景。
方式二:命令行装载(自动化部署场景必选,实测回显):
$ docker exec redmine-7.0.2-app-pg sh -c 'SECRET_KEY_BASE=$REDMINE_SECRET_KEY_BASE \
RAILS_ENV=production bundle exec rake redmine:load_default_data'
Default configuration data loaded.
装载结果核验(实测回显):
$ docker exec redmine-7.0.2-app-pg sh -c 'SECRET_KEY_BASE=$REDMINE_SECRET_KEY_BASE \
RAILS_ENV=production bundle exec rails runner \
"puts \"Trackers: #{Tracker.pluck(:name).join(%q{, })}\nStatuses: #{IssueStatus.count}\nRoles: #{Role.count}\""'
Trackers: 错误, 功能, 支持
Statuses: 6
Roles: 5
三类追踪器(错误/功能/支持)、六种 Issue 状态(新建/进行中/已解决/已反馈/已关闭/拒绝)、五种角色(非成员/匿名/管理员/经理/开发者)全部就位,中文语言包随 REDMINE_DB_ENCODING 与系统语言配置生效。
四、管理员初始化与基础功能验证
4.1 首次登录与强制改密
浏览器访问 http://<服务器IP>:8133/,使用初始账号 admin / admin 登录。Redmine 7.0 的安全策略是首次登录强制改密:登录成功后直接跳转到「我的账号」密码修改页,将密码改为演示规范口令 q1w2e3r4(口令策略要求不少于 8 位方可通过)。改密完成后再进入系统,my/account.xml 的 API 回显(实测):
<?xml version="1.0" encoding="UTF-8"?><user><id>1</id><login>admin</login><admin>true</admin>
<firstname>Redmine</firstname><lastname>Admin</lastname><mail>admin@dummy.invalid</mail>
<created_on>2026-10-27T09:51:25Z</created_on><last_login_on>2026-10-27T09:56:06Z</last_login_on>
<api_key>f665b1acf0adb91c9142aa9763636d2552f4e991</api_key></user>
last_login_on 与 api_key 字段说明登录态与 API 密钥均已生效。api_key 在「我的账号」页面右侧「API 访问键」区域点击生成,用于 REST API 免密认证。
4.2 建项目、提 Issue、跑通工作流
以下操作全部通过 REST API 实测(curl + API Key 认证),与 Web 界面操作等效,且回显可复制:
建项目(实测回显):
$ curl -s -H 'X-Redmine-API-Key: f665b1acf0adb91c9142aa9763636d2552f4e991' \
-H 'Content-Type: application/json' \
-d '{"project":{"name":"运维平台建设项目","identifier":"demo-platform",
"description":"Redmine 7.0 部署实测演示项目","is_public":true}}' \
http://localhost:8133/projects.json
{"project":{"id":1,"name":"运维平台建设项目","identifier":"demo-platform",
"description":"Redmine 7.0 部署实测演示项目","homepage":"","status":1,"is_public":true,
"inherit_members":false,"created_on":"2026-10-27T09:58:24Z","updated_on":"2026-10-27T09:58:24Z"}}
提 Issue 并流转状态:在项目下建三条 Issue 覆盖三种追踪器,然后把 Issue #1 从「新建」流转到「已解决」——这一步同时验证了默认数据装载与状态机工作流(实测回显):
$ curl -s -H 'X-Redmine-API-Key: f665b1acf0adb91c9142aa9763636d2552f4e991' \
'http://localhost:8133/issues.xml?limit=10' \
| grep -oE '<subject>[^<]+</subject>|name="(错误|功能|支持|新建|已解决|紧急|普通|高)"'
<id>3</id> <subject>附部署核验清单附件</subject> tracker="错误" status="新建" priority="普通"
<id>2</id> <subject>接入 OpenLDAP 统一认证</subject> tracker="功能" status="新建" priority="高"
<id>1</id> <subject>部署后默认数据未装载导致无法建 Issue</subject> tracker="错误" status="已解决" priority="紧急"
Issue #1 走完「新建 → 已解决」流转,说明工作流权限链路正常;它同时是本文 §8.1 排障实录的载体。
附件上传与落盘验证:给 Issue #3 上传附件后,检查宿主机挂载目录(实测回显):
$ ls -la /opt/redmine-stack/files-pg/
total 12
drwxr-xr-x 3 redmine redmine 4096 Oct 27 17:59 .
drwxr-xr-x 8 root root 4096 Oct 27 18:10 ..
drwxr-xr-x 3 redmine redmine 4096 Oct 27 17:59 2026
附件按「年份/月份」两级目录落盘(2026/10/),宿主机目录出现实体文件即证明 files 卷挂载生效、附件与元数据分离存储的架构符合预期。
五、MariaDB 对照部署
5.1 与 PostgreSQL 线的差异点
§2.1 编排文件中的 db-mariadb + app-mariadb 即对照线,差异集中在四处:
- 连接变量:
REDMINE_DB_MYSQL替代REDMINE_DB_POSTGRES,镜像据此在database.yml中生成mysql2适配器配置; - 事务隔离级别:启动参数强制
--transaction-isolation=READ-COMMITTED(官方要求,默认的 REPEATABLE-READ 会导致 Redmine 报锁异常); - 字符集:
utf8mb4+utf8mb4_unicode_ci,兼容四字节字符; - 编码变量:应用侧
REDMINE_DB_ENCODING: utf8mb4。
5.2 对照线验证
MariaDB 线同样完成初始化、默认数据装载后,用同一条 Rails 脚本验证适配器与种子数据(实测回显):
$ docker exec redmine-7.0.2-app-mariadb sh -c 'SECRET_KEY_BASE=$REDMINE_SECRET_KEY_BASE \
RAILS_ENV=production bundle exec rails runner \
"puts \"DB adapter: #{ActiveRecord::Base.connection.adapter_name}\nTrackers: #{Tracker.count}, Statuses: #{IssueStatus.count}, Roles: #{Role.count}\nRedmine version: #{Redmine::VERSION}\""'
DB adapter: Mysql2
Trackers: 3, Statuses: 6, Roles: 5
Redmine version: 7.0.2.stable
对照线 HTTP 服务同样就绪(http://<服务器IP>:8135/ 实测 200),功能面与 PG 线一致。两线对照的结论:若无存量 MySQL 运维体系,新部署选 PostgreSQL 线更省心——少两个数据库启动参数,且规避隔离级别配置遗漏这一常见事故源。
六、数据备份与恢复
Redmine 需要备份的两块资产是数据库(项目/Issue/Wiki 等结构化数据)与附件目录(files/ 下实体文件)。实测按「pg_dump 全量导出 + 附件目录打包」组合:
备份(实测回显):
$ docker exec redmine-7.0.2-db-pg pg_dump -U redmine redmine > /opt/redmine-stack/backup/redmine-pg-$(date +%Y%m%d).sql
$ tar -czf /opt/redmine-stack/backup/files-pg-$(date +%Y%m%d).tar.gz -C /opt/redmine-stack files-pg
$ ls -la /opt/redmine-stack/backup/
total 144
drwxr-xr-x 2 root root 4096 Oct 27 18:00 .
drwxr-xr-x 8 root root 4096 Oct 27 18:10 ..
-rw-r--r-- 1 root root 296 Oct 27 18:00 files-pg-20261027.tar.gz
-rw-r--r-- 1 root root 133963 Oct 27 18:00 redmine-pg-20261027.sql
空库加三条 Issue 的全量 SQL 导出约 131 KB,附件包随附件体积线性增长。恢复路径:先空库导入 SQL(psql -U redmine redmine < redmine-pg-YYYYMMDD.sql),再解包附件目录,最后重启应用服务即可,SECRET_KEY_BASE 保持不变则全部会话与加密字段不受影响。
生产环境建议把上述两步固化为每日定时任务(cron/systemd timer),并保留 7–30 天滚动窗口;定时任务与
attachments:prune等清理类 rake 任务的配合见《Redmine 7.0 常用 CLI 命令详解》。
七、k8s 部署形态(Bitnami Chart,联网溯源)
除 Compose 外,Redmine 在 Kubernetes 上有社区维护的 Bitnami Helm Chart 部署路径。本节为联网溯源信息(来源:ArtifactHub bitnami/redmine 包页与 Bitnami Charts 仓库 README,查询日期 2026-10-27),本批次未做集群实测,集群部署实测将在后续 K1 批次补充,届时以实测为准。
版本现状(重要):
- Chart 最新版本
34.0.0(发布于 2025-08-19),应用版本6.0.6,打包镜像docker.io/bitnami/redmine:6.0.6-debian-12-r6; - 该 Chart 自 2025 年 8 月后已停止更新(ArtifactHub 版本活动显示 2025-11 至 2026-10 零发布),当前打包的仍是 Redmine 6.0 而非 7.0。要求 7.0 的 k8s 部署需自建 chart 或改造 values 覆盖镜像;
- 2025 年后 Bitnami 目录转向「Bitnami Secure Images」体系(基于 Photon Linux 的硬化镜像,部分能力商业订阅),旧 Debian 镜像迁入
bitnamilegacy仓库,选用时注意镜像仓库与订阅策略。
安装方式(Chart 官方 README 给出的 TL;DR):
helm install my-release oci://registry-1.docker.io/bitnamicharts/redmine
架构与依赖:chart 内置三个子依赖——postgresql(bitnamicharts OCI 仓库)、mariadb、common,Redmine 应用与数据库子 chart 同栈部署,通过 databaseType 类参数选择数据库类型、按需启用 postgresql.enabled 或 mariadb.enabled。凭据默认以文件方式挂载(usePasswordFiles 默认 true)而非环境变量注入;持久化默认启用 PVC(persistence 系列参数,支持 persistence.existingClaim 复用存量卷,如 helm install test --set persistence.existingClaim=PVC_REDMINE,mariadb.persistence.existingClaim=PVC_MARIADB ...)。完整参数清单(镜像/副本数/Ingress/service/smtp 等约上百项)以 Chart README 的 Parameters 表为准:https://github.com/bitnami/charts/tree/main/bitnami/redmine
选型建议:Compose 主线(本文)覆盖绝大多数中小团队场景;k8s 形态适合已有 Helm 发布体系、需要副本编排与 PVC 管理的团队,且需接受 chart 停更现状(截至 2026-10-27)。两者应用层配置同源(都是 configuration.yml/database.yml 体系),迁移成本低。
八、排障实录
以下三条均为本次部署实测中真实发生、定位并解决的问题,按发生顺序沉淀。
8.1 建项目成功但新建 Issue 报错:默认数据未装载
现象:Compose 部署、管理员登录、建项目全部正常;进入项目点「新建问题」时,追踪器下拉框为空,提交报「追踪器 不能为空」类校验错误,服务日志无异常栈。
定位:查库确认种子数据缺失——trackers、issue_statuses、roles 表为空。根因是官方镜像 entrypoint 只执行 db:migrate 建表,不执行 redmine:load_default_data 装载默认业务数据;源码安装文档里这一步是显式独立步骤,镜像化后被「静默跳过」,Web 引导只对交互式登录用户可见,API/自动化场景完全无感知。
解决:命令行装载默认数据(bundle exec rake redmine:load_default_data,非交互场景加 REDMINE_DEFAULT_LANGUAGE=zh 免确认),复验 Trackers 3 / Statuses 6 / Roles 5 后建 Issue 恢复正常。本环境把该问题固化为排障 Issue #1(状态已解决),提醒后续自动化部署脚本必须包含此步骤。
8.2 docker exec 执行 rake 任务报 Missing secret_key_base
现象:服务本身运行正常(Web 200、API 正常),但 docker exec 进去执行任何需要加载 Rails 环境的命令(rails runner / rake 任务)即抛:
/usr/local/bundle/gems/railties-8.1.4/lib/rails/application/configuration.rb:543:in
'Rails::Application::Configuration#secret_key_base=': Missing `secret_key_base` for
'production' environment, set this string with `bin/rails credentials:edit` (ArgumentError)
定位:Redmine 7.0 使用的 Rails 8.1 在应用初始化阶段强校验 secret_key_base。官方镜像的处理方式是 entrypoint 把 REDMINE_SECRET_KEY_BASE 环境变量只传给服务进程(Puma),不写入任何配置文件;docker exec 新起的会话环境里只有 REDMINE_SECRET_KEY_BASE(entrypoint 专用名),没有 Rails 认的 SECRET_KEY_BASE,校验失败。
解决:exec 会话显式补上变量(实测可行姿势):
docker exec <服务名> sh -c 'SECRET_KEY_BASE=$REDMINE_SECRET_KEY_BASE RAILS_ENV=production bundle exec rake <任务名>'
后续所有命令行运维(迁移、插件装载、数据清理、console)都沿用这一姿势。
8.3 任务名想当然:redmine:info 不存在
现象:想用 rake redmine:info 快速查看版本信息(部分旧教程提及类似命令),实际报:
rake aborted!
Don't know how to build task 'redmine:info' (See the list of available tasks with `rake --tasks`)
Did you mean? redmine:plugins
定位与解决:Redmine 7.0.2 的 rake 任务空间里没有 redmine:info,版本信息用 rails runner "puts Redmine::VERSION"(实测输出 7.0.2.stable)。教训:任务清单以 rake --tasks(或 rake -T)实测输出为准,切勿照搬记忆或旧文档的任务名;完整任务族实测清单见《Redmine 7.0 常用 CLI 命令详解》。
小结:官方镜像 + Compose 把 Redmine 的部署压缩为「一张编排文件 + 两条必做初始化(管理员改密、默认数据装载)」;两条数据库主线均实测可用,PG 线配置更简。k8s 路径可用但 chart 已停更在 6.0,选型时纳入考量。配置文件的逐项调优(邮件、LDAP、附件、缓存)请继续阅读《Redmine 7.0 配置参数详解》。