在 BESTNET 雲上建置 Redmine

在 BESTNET 雲上建置 Redmine

4 min read

本文說明如何在 BESTNET-CLOUD 上佈建的 Ubuntu 24.04 LTS 虛擬機器上建置 Redmine,
直到您能首次從瀏覽器登入為止。

LDAP/LDAPS 整合、外部 SMTP 及 Zabbix 整合將於後續文章中另行說明。
本指南著重於完成一台能穩定顯示登入畫面的 Redmine 伺服器。

本指南的目標 #

終點 #

Redmine 登入畫面可透過 HTTPS 顯示,且您能以管理員身分首次登入。

本次範圍 #

作業系統初始設定、Redmine 部署、資料庫初始化、Apache + Passenger,以及自簽 SSL。

後續步驟 #

AD / LDAPS、外部 SMTP、Zabbix 代理程式部署及監控整合將另行處理。

架構概觀 #

OS Ubuntu Server 24.04 LTS
Web/AP Apache + Passenger
DB PostgreSQL
Redmine 6.1.1
Ruby Ubuntu 24.04 附帶的 Ruby 3.2 系列
發布方式 80 → 443 重新導向,443 以自簽憑證接聽
部署位置 /opt/redmine/releases/redmine-6.1.1
備註:
本文為方便驗證,使用自簽憑證。
正式環境建議替換為商用憑證或內部 CA 憑證。

步驟 1. 更新作業系統並安裝所需套件 #

首先,將作業系統更新至最新版本,並一併安裝建置 Redmine 及連線 PostgreSQL 所需的套件。
請務必包含 libyaml-dev。

sudo apt update
sudo apt full-upgrade -y

sudo apt install -y \
  build-essential \
  ruby-full ruby-dev bundler \
  zlib1g-dev libpq-dev libyaml-dev pkg-config \
  postgresql postgresql-contrib \
  apache2 apache2-dev \
  imagemagick ghostscript \
  curl ca-certificates gnupg dirmngr apt-transport-https \
  ldap-utils tar

步驟 2. 安裝 Passenger #

新增官方 Passenger 套件庫,並將其安裝為 Apache 模組。

curl https://oss-binaries.phusionpassenger.com/auto-software-signing-gpg-key-2025.txt \
  | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/phusion.gpg >/dev/null

echo "deb https://oss-binaries.phusionpassenger.com/apt/passenger noble main" \
  | sudo tee /etc/apt/sources.list.d/passenger.list

sudo apt update
sudo apt install -y passenger libapache2-mod-passenger

sudo a2enmod passenger
sudo a2enconf servername
echo "ServerName rdm.bestnetllc.co.jp" | sudo tee /etc/apache2/conf-available/servername.conf

sudo apache2ctl configtest
sudo systemctl reload apache2

使用下列指令驗證運作情形:

sudo /usr/bin/passenger-config validate-install
sudo /usr/sbin/passenger-memory-stats

步驟 3. 準備 Redmine 使用者與部署目錄 #

採用 releases 目錄方式部署,以利日後升級。

sudo adduser --system --group --home /opt/redmine --shell /bin/bash redmine

sudo mkdir -p /opt/redmine/releases
sudo chown -R redmine:redmine /opt/redmine

步驟 4. 設定 PostgreSQL #

為 Redmine 建立專用的角色與資料庫。

sudo -u postgres psql
CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD '<DB_PASSWORD>' NOINHERIT VALID UNTIL 'infinity';
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;
\q

步驟 5. 部署 Redmine 原始碼 #

本範例使用 6.1.1 版本,請視維護版本需要自行調整。

cd /tmp
curl -L -o redmine-6.1.1.tar.gz https://www.redmine.org/releases/redmine-6.1.1.tar.gz

sudo -u redmine tar xzf redmine-6.1.1.tar.gz -C /opt/redmine/releases
sudo ln -sfn /opt/redmine/releases/redmine-6.1.1 /opt/redmine/current

步驟 6. 設定 database.yml #

這是常見的陷阱。請僅保留 PostgreSQL 的設定,並移除 MySQL 的範例。

cd /opt/redmine/releases/redmine-6.1.1

sudo tee config/database.yml > /dev/null <<'EOF'
production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: "<DB_PASSWORD>"
  encoding: utf8
  schema_search_path: public
EOF

同時準備用於加密金鑰的 configuration.yml。

sudo -u redmine cp config/configuration.yml.example config/configuration.yml
default:
  database_cipher_key: "<LONG_RANDOM_STRING>"

production:

步驟 7. 執行 bundle install 與資料庫初始化 #

執行 gem 安裝、密鑰產生、資料庫遷移,以及初始資料載入。

sudo chown -R redmine:redmine /opt/redmine

sudo -u redmine -H bash -lc '
  cd /opt/redmine/releases/redmine-6.1.1
  rm -rf vendor/bundle
  bundle config set --local path vendor/bundle
  bundle config set --local without "development test"
  bundle install
  bundle exec rake generate_secret_token
  RAILS_ENV=production bundle exec rake db:migrate
  RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data
'
備註:
若出現 yaml.h not found,代表缺少 libyaml-dev。
若 mysql2 出現在 bundle 安裝清單中,代表 MySQL 設定
可能仍殘留於 config/database.yml 中。

步驟 8. 建立自簽憑證 #

本範例將建立具備 CA:FALSE 與 SAN 的自簽憑證。
相較於舊方法,此方式可避免瀏覽器與 Apache 出現過多警告。

sudo mkdir -p /etc/apache2/ssl

sudo tee /tmp/rdm-openssl.cnf > /dev/null <<'EOF'
[req]
default_bits = 4096
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C  = JP
ST = Tokyo
L  = Tokyo
O  = BestNetLLC
OU = IT
CN = rdm.bestnetllc.co.jp

[v3_req]
basicConstraints = critical,CA:FALSE
keyUsage = critical,digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = rdm.bestnetllc.co.jp
EOF

sudo openssl req -x509 -nodes -newkey rsa:4096 -sha256 -days 3650 \
  -keyout /etc/apache2/ssl/rdm.bestnetllc.co.jp.key \
  -out /etc/apache2/ssl/rdm.bestnetllc.co.jp.crt \
  -config /tmp/rdm-openssl.cnf

sudo chmod 600 /etc/apache2/ssl/rdm.bestnetllc.co.jp.key
sudo chmod 644 /etc/apache2/ssl/rdm.bestnetllc.co.jp.crt

步驟 9. 設定 Apache VirtualHost #

連接埠 80 會重新導向至 443,而連接埠 443 則將 Redmine 的 public 目錄設為 DocumentRoot。
直接使用實際路徑可避免因符號連結而導致的 403 錯誤。

sudo a2enmod ssl rewrite headers

sudo tee /etc/apache2/sites-available/redmine.conf > /dev/null <<'EOF'
<VirtualHost *:80>
    ServerName rdm.bestnetllc.co.jp
    RewriteEngine On
    RewriteRule ^/(.*)$ https://rdm.bestnetllc.co.jp/$1 [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName rdm.bestnetllc.co.jp
    DocumentRoot /opt/redmine/releases/redmine-6.1.1/public

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/rdm.bestnetllc.co.jp.crt
    SSLCertificateKeyFile /etc/apache2/ssl/rdm.bestnetllc.co.jp.key

    PassengerRuby /usr/bin/ruby
    PassengerAppEnv production

    <Directory /opt/redmine/releases/redmine-6.1.1/public>
        Options FollowSymLinks
        AllowOverride all
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/redmine_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/redmine_ssl_access.log combined
</VirtualHost>
EOF

sudo a2ensite redmine
sudo a2dissite 000-default
sudo a2dissite default-ssl

sudo apache2ctl configtest
sudo systemctl reload apache2

步驟 10. 調整權限並重新啟動 #

為了讓 Apache 能存取 Redmine 底下的檔案,也要為上層目錄授予執行權限。

sudo chmod 755 /opt
sudo chmod 755 /opt/redmine
sudo chmod 755 /opt/redmine/releases
sudo chmod 755 /opt/redmine/releases/redmine-6.1.1
sudo chmod 755 /opt/redmine/releases/redmine-6.1.1/public

sudo -u redmine mkdir -p /opt/redmine/releases/redmine-6.1.1/tmp/pdf
sudo -u redmine mkdir -p /opt/redmine/releases/redmine-6.1.1/public/assets

sudo touch /opt/redmine/releases/redmine-6.1.1/tmp/restart.txt
sudo systemctl restart apache2

步驟 11. 確認首次存取 #

首先,確認本機連線是否正常。

curl -kI https://127.0.0.1/
openssl s_client -connect 127.0.0.1:443 -servername rdm.bestnetllc.co.jp </dev/null

在瀏覽器中存取 https://rdm.bestnetllc.co.jp。
由於使用的是自簽憑證,瀏覽器會顯示警告,但只要出現 Redmine 的登入畫面即表示成功。

初始登入:
使用者名稱 admin / 密碼 admin

首次登入後,請立即變更管理員密碼,
並在 Redmine 的「管理 → 設定 → 一般」中,將主機名稱與通訊協定配合 https 進行設定。

建置過程中容易遇到的陷阱 #

1. Passenger 套件庫的 GPG 錯誤 #

若使用舊的金鑰 URL,可能會因 NO_PUBKEY 而失敗。
統一改用官方的新金鑰檔案,通常就能解決。

2. 因 yaml.h not found 導致 Psych 建置失敗 #

多半是缺少 libyaml-dev 所致。
請先補裝該作業系統套件,再重新執行 bundle install。

3. mysql2 出現在 bundle 安裝清單中 #

當 config/database.yml 中仍殘留 MySQL 的範例定義時,容易發生此情況。
將其整理為僅保留 PostgreSQL 用的 production 定義即可解決。

4. 出現 ERR_SSL_PROTOCOL_ERROR #

可能是 443 的 VirtualHost 未啟用,或是其他網站仍維持啟用狀態。
使用 apache2ctl -S 確認已啟用的 vhost,較容易釐清問題所在。

5. 出現 403 Forbidden #

透過 current 符號連結存取時,可能會遇到權限問題。
將實際路徑直接指定為 DocumentRoot,並從 /opt 開始往下授予搜尋權限,通常即可改善。

總結 #

至此,您已在 BESTNET-CLOUD 上建置採用 Ubuntu 24.04 / Apache + Passenger / PostgreSQL 架構的
Redmine 伺服器,並可透過 HTTPS 進行首次登入。

  • Redmine 原始碼已完成部署
  • 可連線至 PostgreSQL
  • 應用程式可透過 Apache + Passenger 啟動
  • 可使用自簽憑證於 443 接聽
  • 可在瀏覽器中顯示登入畫面

下一篇文章將進一步說明 AD / LDAPS 驗證、外部 SMTP,以及透過 Zabbix 進行的監控整合。

© BestNet Tech Blog

Updated on 2026年10月14日

What are your feelings

  • Happy
  • Normal
  • Sad

©2020 BESTNET.LLC . All Rights Reserved.