---
title: 在BESTNET云上搭建Redmine
description: "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 集成将在后续的单独文章中介绍。…"
url: "https://bestnetllc.co.jp/zh-hans/docs/%e5%9c%a8bestnet%e4%ba%91%e4%b8%8a%e6%90%ad%e5%bb%baredmine/"
updated: "2026-10-14"
category: Tech Blog
---

# 在BESTNET云上搭建Redmine

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 服务器。

## 本指南的目标

### 最终目标

通过 HTTPS 显示 Redmine 登录界面，并可首次以管理员身份登录。

### 本次范围

操作系统初始设置、Redmine 部署、数据库初始化、Apache + Passenger 以及自签名 SSL。

### 后续步骤

AD / LDAPS、外部 SMTP、Zabbix agent 部署以及监控集成将另行处理。

## 架构概览

| 操作系统 | Ubuntu Server 24.04 LTS |
| --- | --- |
| Web/AP | Apache + Passenger |
| 数据库 | 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`。
如果 bundle 的目标中出现 `mysql2`，很可能是
`config/database.yml` 中仍残留 MySQL 的配置。

## 步骤 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
