Redmine 7.0 をDockerで動かす手順(Docker Compose / PostgreSQL)

 •  分類: ,  •  本村真一

Redmine 7.0をDockerで動かす手順OGP画像

この記事では、Docker と Docker Compose を使って Redmine 7.0 系を起動する手順を紹介します。

本手順では、Redmineの公式DockerイメージとPostgreSQLを使用します。データベースのパスワードや secret_key_base などの機密情報は、Docker Secretsを使ってコンテナへ渡します。

Redmine 7.0では、Pandocを利用して .docx.xlsx.pptx.odt の添付ファイルをプレビューできるようになりました(詳細はこちらをご覧ください)。

この機能の利用にはPandoc 3.8.3以降が推奨されているため、本手順ではPandoc 3.10を公式Dockerイメージへ追加します。

Redmineとは:
Redmineはオープンソースのプロジェクト管理ソフトウェアです。オンプレミスのサーバなど自分で用意した環境に自由にインストールできるほか、 クラウドサービス の利用も可能です。Redmineについて詳しくは Redmine.JP をご覧ください。

本手順で作成される環境

項目 内容
Redmine Redmine 7.0.0(redmine:7.0.0をベースにビルド)
データベース PostgreSQL 16(postgres:16-bookworm
Pandoc Pandoc 3.10
コンテナ実行環境 Docker Engine、Docker Compose v2
アクセス先 http://localhost:8080
ポート ホストの8080番ポートからRedmineコンテナの3000番ポートへ転送
データの永続化 Docker volumes
機密情報 Docker Secrets
タイムゾーン Asia/Tokyo

Pandocについて

Redmine 7.0以降では、Pandocを利用して次の添付ファイルをダウンロードせずにプレビューできるようになりました。

  • Microsoft Word(.docx
  • Microsoft Excel(.xlsx
  • Microsoft PowerPoint(.pptx
  • LibreOffice Writer(.odt

ただ、Redmine 7.0.0の公式DockerイメージにPandocは含まれていませんので自分で追加する必要があります。

キューアダプターについて

Redmine 7.0の「管理」→「情報」では、本番環境のActive Jobキューアダプターが、デフォルトの:asyncから変更されているか確認されます。:asyncのままの場合は警告が表示されます。

本手順では、用途によって次のように使い分けます。

用途 設定 動作
一時的な検証・評価 設定ファイルを作成しない Redmine標準のAsyncAdapterを使用
継続的な利用 :inlineを設定 ジョブをキューに保持せず、その場で実行

なお、ここでいう「検証」は利用目的を指していて、Rails の test 環境のことではありません。どちらの用途の場合も、Redmine自体は production 環境で起動します。

事前準備

  • Docker Engine と Docker Compose v2 が利用できること(docker compose version が動くこと)
  • openssl が利用できること(Secrets の生成に使用)
  • ホスト側で 8080 ポートが空いていること

以降の作業は、任意の作業ディレクトリで実行します(例: ~/redmine)。

セットアップ手順

1. 作業用ディレクトリを作成する

mkdir redmine
cd redmine

2. Docker Secrets用の機密情報を作成する

DB パスワードと Redmine の secret_key_base を生成し、ファイルに保存します。

# DB パスワード(24文字)を生成して保存
openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 24 > db_password.txt
# secret_key_base(128文字)を生成して保存
openssl rand -hex 64 > secret_key_base.txt

作成したファイルは機密情報そのものです。第三者に読まれないように権限を設定します。

chmod 600 db_password.txt secret_key_base.txt

なお、Git などでバージョン管理する場合は、これらのファイルを必ずコミット対象から外してください(例: .gitignore に追記)。

db_password.txt
secret_key_base.txt

3. キューアダプターの利用方法を選ぶ

用途に応じて利用方法を選んでください。

一時的な検証・評価で利用する場合

設定ファイルを作成せず、Redmine標準の AsyncAdapter を使用します。このアダプターはメモリ上でジョブを処理するため、コンテナを停止・再起動すると、処理待ちのジョブが失われる可能性があります。

Redmineの機能を一時的に確認する用途であれば、そのままでも構いません。ただし、「管理」→「情報」にはキューアダプターに関する警告が表示されます。

継続的に利用する場合

設定ファイル additional_environment.rb を作成し、以下の内容を保存します。

config.active_job.queue_adapter = :inline

この設定では、メール送信などのジョブがバックグラウンドキューへ保存されず、その場で実行されます。

4. Dockerfileを作成する

Dockerfile (拡張子なし)を以下の内容で作成します。

# syntax=docker/dockerfile:1

FROM redmine:7.0.0

ARG PANDOC_VERSION=3.10
ARG TARGETARCH
ARG GITHUB_API_VERSION=2026-03-10

# 日本語フォントとPandocをインストールする
RUN set -eux; \
    case "$TARGETARCH" in \
      amd64|arm64) \
        ;; \
      *) \
        echo "Unsupported architecture: $TARGETARCH" >&2; \
        exit 1; \
        ;; \
    esac; \
    \
    apt-get update; \
    apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        fontconfig \
        fonts-noto-cjk; \
    \
    PANDOC_ASSET="pandoc-${PANDOC_VERSION}-1-${TARGETARCH}.deb"; \
    PANDOC_RELEASE_API="https://api.github.com/repos/jgm/pandoc/releases/tags/${PANDOC_VERSION}"; \
    \
    echo "GitHub Release APIからPandocのリリース情報を取得します"; \
    echo "対象ファイル: ${PANDOC_ASSET}"; \
    \
    HTTP_STATUS="$( \
        curl \
            --silent \
            --show-error \
            --location \
            --retry 3 \
            --output /tmp/pandoc-release.json \
            --write-out '%{http_code}' \
            --header "Accept: application/vnd.github+json" \
            --header "X-GitHub-Api-Version: ${GITHUB_API_VERSION}" \
            --header "User-Agent: redmine-docker-build" \
            "$PANDOC_RELEASE_API" \
    )"; \
    \
    if [ "$HTTP_STATUS" != "200" ]; then \
        echo "GitHub Release APIの呼び出しに失敗しました" >&2; \
        echo "HTTP status: $HTTP_STATUS" >&2; \
        echo "Response body:" >&2; \
        cat /tmp/pandoc-release.json >&2 || true; \
        exit 1; \
    fi; \
    \
    ruby -rjson -e ' \
      asset_name = ARGV.fetch(0); \
      release = JSON.parse(File.read("/tmp/pandoc-release.json")); \
      assets = release.fetch("assets"); \
      asset = assets.find { |item| item["name"] == asset_name }; \
      abort("Pandoc asset not found: #{asset_name}") unless asset; \
      download_url = asset["browser_download_url"]; \
      digest = asset["digest"]; \
      abort("Download URL was not found: #{asset_name}") unless download_url.is_a?(String) && !download_url.empty?; \
      abort("Unexpected download URL: #{download_url.inspect}") unless download_url.start_with?("https://github.com/jgm/pandoc/releases/download/"); \
      abort("Valid SHA256 digest was not found: #{asset_name}: #{digest.inspect}") unless digest.is_a?(String) && digest.match?(/\Asha256:[0-9a-fA-F]{64}\z/); \
      File.write("/tmp/pandoc-url.txt", "#{download_url}\n"); \
      File.write("/tmp/pandoc-sha256.txt", "#{digest.delete_prefix("sha256:")}\n"); \
      warn("Pandoc asset found: #{asset_name}"); \
      warn("SHA256: #{digest}"); \
    ' "$PANDOC_ASSET"; \
    \
    PANDOC_URL="$(cat /tmp/pandoc-url.txt)"; \
    PANDOC_SHA256="$(cat /tmp/pandoc-sha256.txt)"; \
    \
    case "$PANDOC_URL" in \
      "https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/${PANDOC_ASSET}") \
        ;; \
      *) \
        echo "Unexpected Pandoc download URL: $PANDOC_URL" >&2; \
        exit 1; \
        ;; \
    esac; \
    \
    echo "Pandocをダウンロードします"; \
    curl \
        --fail \
        --show-error \
        --location \
        --retry 3 \
        --output /tmp/pandoc.deb \
        "$PANDOC_URL"; \
    \
    echo "${PANDOC_SHA256}  /tmp/pandoc.deb" \
        | sha256sum -c -; \
    \
    apt-get install -y --no-install-recommends \
        /tmp/pandoc.deb; \
    \
    rm -f \
        /tmp/pandoc.deb \
        /tmp/pandoc-release.json \
        /tmp/pandoc-url.txt \
        /tmp/pandoc-sha256.txt; \
    rm -rf /var/lib/apt/lists/*; \
    \
    fc-cache -f; \
    pandoc --version

# additional_environment.rbがある場合にだけRedmineへ組み込む
RUN --mount=type=bind,target=/tmp/build-context \
    set -eux; \
    if [ -f /tmp/build-context/additional_environment.rb ]; then \
        install \
            -o redmine \
            -g redmine \
            -m 0644 \
            /tmp/build-context/additional_environment.rb \
            /usr/src/redmine/config/additional_environment.rb; \
        echo "additional_environment.rbを組み込みました"; \
    else \
        echo "additional_environment.rbがないため、Redmineの標準設定を使用します"; \
    fi

このDockerfileでは、次の処理を行います。

  1. Redmine 7.0.0の公式Dockerイメージを使用する
  2. ガントチャートなどの日本語PDF出力に必要なNoto CJKフォントを追加する
  3. Pandoc 3.10をインストールする
  4. additional_environment.rbが存在する場合にだけ、Redmineへ組み込む

5. docker-compose.ymlを作成する

docker-compose.ymlを以下の内容で作成します。

networks:
  redmine_network:
    driver: bridge

volumes:
  postgres_data:
  redmine_files:
  redmine_plugins:
  redmine_themes:

secrets:
  db_password:
    file: ./db_password.txt
  secret_key_base:
    file: ./secret_key_base.txt

services:
  postgres:
    image: postgres:16-bookworm
    container_name: redmine_postgres
    restart: always

    networks:
      - redmine_network

    volumes:
      - postgres_data:/var/lib/postgresql/data

    environment:
      POSTGRES_USER: redmine_user
      POSTGRES_DB: redmine_production
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password

    secrets:
      - db_password

    healthcheck:
      test:
        [
          "CMD-SHELL",
          "pg_isready -U redmine_user -d redmine_production -h localhost"
        ]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

  redmine:
    build:
      context: .
      dockerfile: Dockerfile

    container_name: redmine_app
    restart: always

    ports:
      - "8080:3000"

    networks:
      - redmine_network

    depends_on:
      postgres:
        condition: service_healthy

    volumes:
      - redmine_files:/usr/src/redmine/files
      - redmine_plugins:/usr/src/redmine/plugins
      - redmine_themes:/usr/src/redmine/themes

    environment:
      REDMINE_DB_POSTGRES: postgres
      REDMINE_DB_DATABASE: redmine_production
      REDMINE_DB_USERNAME: redmine_user
      REDMINE_DB_PASSWORD_FILE: /run/secrets/db_password

      REDMINE_SECRET_KEY_BASE_FILE: /run/secrets/secret_key_base

      TZ: Asia/Tokyo
      REDMINE_PLUGINS_MIGRATE: "1"

    secrets:
      - db_password
      - secret_key_base

6. コンテナを起動する

docker compose up -d --build

※初回は DB イメージのダウンロードや、フォントを組み込んだ Redmine のビルドが走るため、数分かかる場合があります。

起動状態を確認します。

docker compose ps

redmine_appredmine_postgresSTATUSUp(または running)であれば成功です。

7. 日本語の初期データを登録する

デフォルトの「トラッカー」や「ステータス」などを日本語で登録します。

docker compose exec redmine bash -lc '
  export REDMINE_DB_PASSWORD="$(cat /run/secrets/db_password)"
  export SECRET_KEY_BASE="$(cat /run/secrets/secret_key_base)"
  env RAILS_ENV=production REDMINE_LANG=ja \
    bundle exec rake redmine:load_default_data
'

特にエラーが表示されず、コマンドの実行が終了すれば完了です。

8. ブラウザでアクセスする

ブラウザで以下へアクセスします。

http://localhost:8080

初期ログイン情報は以下です。

  • ログインID: admin
  • パスワード: admin

初回ログイン直後にパスワード変更が求められるので、任意の強力なパスワードに変更してください。

日常運用(停止・再開)

※必ず、この手順で作成した redmine ディレクトリで実行してください。

終了(停止して削除)

コンテナを停止して削除します(データは Docker Volumes に残るため消えません)。

docker compose down

再開

停止した状態から再び起動します。

docker compose up -d

docker-compose.ymlDockerfile を変更した場合は、docker compose down の後に docker compose up -d --build で反映してください。

作成: 2026-07-31 16:00  •  分類: ,