Redmine 7.0 をDockerで動かす手順(Docker Compose / PostgreSQL)
この記事では、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では、次の処理を行います。
- Redmine 7.0.0の公式Dockerイメージを使用する
- ガントチャートなどの日本語PDF出力に必要なNoto CJKフォントを追加する
- Pandoc 3.10をインストールする
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_app と redmine_postgres の STATUS が Up(または 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.yml や Dockerfile を変更した場合は、docker compose down の後に docker compose up -d --build で反映してください。