BESTNET Tech Blog
在 BESTNET-CLOUD 上建置 Redmine 的步驟 #
Ubuntu 24.04 / Apache + Passenger / PostgreSQL / HTTPS 伺服器設定指南
用於啟用 Redmine 6.1 系列
本文說明如何在 BESTNET-CLOUD 上佈建的 Ubuntu 24.04 LTS 虛擬機器上建置 Redmine,
直到您能首次從瀏覽器登入為止。
LDAP/LDAPS 整合、外部 SMTP 及 Zabbix 整合將於後續文章中另行說明。
本指南著重於完成一台能穩定顯示登入畫面的 Redmine 伺服器。
本指南的目標 #
架構概觀 #
| 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 憑證。
本文為方便驗證,使用自簽憑證。
正式環境建議替換為商用憑證或內部 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 /