Redmine 7.0 Docker Compose 部署实战

Redmine 7.0.2 官方镜像 Docker Compose 部署实战:PostgreSQL 主线与 MariaDB 11.8 对照双栈编排、默认数据装载、管理员初始化、项目/Issue/附件端到端验证、备份恢复实测与三条排障实录,附 k8s Bitnami Chart 形态溯源(2026-10-27 实测)。

RedmineRedmineDocker ComposePostgreSQL2026/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.2postgres:18官方安装文档推荐的生产首选,本篇主测试环境
MariaDB 对照线redmine:7.0.2mariadb: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 即对照线,差异集中在四处:

  1. 连接变量:REDMINE_DB_MYSQL 替代 REDMINE_DB_POSTGRES,镜像据此在 database.yml 中生成 mysql2 适配器配置;
  2. 事务隔离级别:启动参数强制 --transaction-isolation=READ-COMMITTED(官方要求,默认的 REPEATABLE-READ 会导致 Redmine 报锁异常);
  3. 字符集:utf8mb4 + utf8mb4_unicode_ci,兼容四字节字符;
  4. 编码变量:应用侧 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 配置参数详解》。