GCPでのRedmine環境構築（Apache + Passenger + CentOS Stream）

GCP上にVMインスタンスを作成し、CentOS Streamを使用してRedmineを構築する手順の概要です。

# 動作原理と構成の概要

- **Apache (httpd)** は、ブラウザからのHTTPリクエストを受け取り、Passengerに渡します。
- **Passenger** はApacheとRedmine（Ruby on Railsアプリケーション）をつなぐ役割を持ちます。
- **MariaDB** は、Redmineのデータを保管するデータベースとして動作します。
- **Ruby on Rails (Redmine)** はWebアプリケーションとして動作し、Passengerを介してApacheと通信します。

ApacheはHTTPリクエストを受け取り、PassengerがRedmineを起動・管理してリクエストを処理します。

---

# 権限設定の重要性

Redmineの構築で頻繁に起こるエラーの多くは、ファイルやディレクトリの権限設定が不適切なことが原因です。

Apacheは通常、`apache`というユーザーで実行されます。Passengerを通じてRedmine(Railsアプリケーション)を起動・管理するため、Redmineのファイルやフォルダの所有者を`apache:apache`とする必要があります。

# 基本的な権限付与の考え方

ファイルの所有者・グループが`apache:apache`となるのは、Apache経由で動作するPassengerとRailsがファイルを自由にアクセスできるようにするためです。ApacheプロセスがRedmineのファイル・フォルダへの書き込みや読み込みを確実に行えるようにするためです。

基本的な権限の付与コマンド例：

```bash
sudo chown -R apache:apache /var/lib/redmine
sudo chmod -R 755 /var/lib/redmine
sudo chmod -R 775 /var/lib/redmine/log /var/lib/redmine/tmp /var/lib/redmine/public/assets
sudo chmod 750 /var/lib/redmine/config
```

- `/var/lib/redmine/log`, `/var/lib/redmine/tmp`, `/var/lib/redmine/public/assets` はApacheユーザーによる書き込みが必須のため775を設定します。
- `/var/lib/redmine/config` は安全のため750とし、外部からの読み取りを制限します。

権限設定を怠ると、PassengerやRedmineの起動エラー（500エラー）やファイルへのアクセス拒否エラーが発生します。

権限設定を適切に行うことで、上記エラーを回避し、Redmineを安定して動作させることができます。

# 具体的なコマンド

## 1. VMのインスタンス生成

### 1.1 CentOS Stream 9 VMの作成

- クラウド (GCP、AWS など) または仮想環境で CentOS Stream 9 の VM を作成。
- SSH鍵を登録し、SSHログインが可能な状態に設定。

## 1.2 システムアップデート

```
sudo dnf update -y
```

## 1.3 ファイアウォール設定

```
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
```

## 1.4 SELinuxの無効化

```
sestatus
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
sudo grubby --update-kernel ALL --args selinux=0
sudo reboot
```

## 2. Apacheのインストールと動作確認

```
sudo dnf install -y httpd
sudo systemctl enable --now httpd
sudo apachectl configtest
```

ブラウザで`http://<サーバーIP>`にアクセスし、Apacheのテストページ表示を確認。

## 3. Rubyの導入（CRBリポジトリの有効化）

```
sudo dnf module reset ruby
sudo dnf module enable ruby:3.1
sudo dnf config-manager --set-enabled crb
sudo dnf install -y ruby ruby-devel gcc gcc-c++ make automake autoconf bison \
libyaml-devel openssl-devel readline-devel curl-devel zlib-devel libffi-devel \
curl libcurl-devel mariadb-devel
```

## 3. PassengerインストールとApache連携

```
sudo gem install passenger -N
sudo dnf install -y rubygem-rake httpd-devel apr-devel apr-util-devel
sudo /usr/local/share/gems/gems/passenger-6.0.26/bin/passenger-install-apache2-module
```

Apache設定ファイル（`/etc/httpd/conf.d/passenger.conf`）

```
LoadModule passenger_module /usr/local/share/gems/gems/passenger-6.0.26/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /usr/local/share/gems/gems/passenger-6.0.26
  PassengerDefaultRuby /usr/bin/ruby
  PassengerInstanceRegistryDir /var/run/passenger
</IfModule>
```

```
sudo mkdir -p /var/run/passenger
sudo chown root:root /var/run/passenger
sudo chmod 755 /var/run/passenger
```

Apache再起動とPassengerステータス確認

```
sudo systemctl restart httpd
sudo env PASSENGER_INSTANCE_REGISTRY_DIR=/var/run/passenger \
/usr/local/share/gems/gems/passenger-6.0.26/bin/passenger-status
```

## 4. MariaDBセットアップ

```
sudo dnf install -y mariadb-server mariadb-devel
sudo systemctl enable --now mariadb
sudo mysql_secure_installation
```

Redmine用DB作成

```
sudo mysql -u root -p
CREATE DATABASE redmine DEFAULT CHARACTER SET utf8mb4;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
FLUSH PRIVILEGES;
EXIT;
```

## 4. Redmineセットアップ

```
sudo dnf install -y wget
sudo mkdir /var/lib/redmine
sudo chown apache:apache /var/lib/redmine
cd /var/lib/redmine
sudo -u apache wget https://www.redmine.org/releases/redmine-6.0.4.tar.gz
sudo -u apache tar zxvf redmine-6.0.4.tar.gz --strip-components=1
```

`database.yml`を編集（`/var/lib/redmine/config/database.yml`）

```
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  password: "secret"
  encoding: utf8mb4
```

依存関係インストール

```
cd /var/lib/redmine
sudo bundle install --system
```

## 4. 権限設定

権限の設定を明確にしておく

```
sudo chown -R apache:apache /var/lib/redmine
sudo chmod -R 755 /var/lib/redmine
sudo chmod -R 775 /var/lib/redmine/log /var/lib/redmine/tmp /var/lib/redmine/public/assets
sudo chmod 750 /var/lib/redmine/config
```

## 5. secret_key_base設定とDBマイグレーション

ランダム文字列生成

```
ruby -rsecurerandom -e 'puts SecureRandom.hex(64)'
```

productionログと権限設定

```
sudo touch /var/lib/redmine/log/production.log
sudo chmod 0664 /var/lib/redmine/log/production.log
sudo chown apache:apache /var/lib/redmine/log/production.log
```

credentials設定

```
sudo chown -R apache:apache /var/lib/redmine/config
sudo chmod 750 /var/lib/redmine/config
sudo chown apache:apache /var/lib/redmine/.gitignore

cd /var/lib/redmine
sudo -u apache EDITOR=vi RAILS_ENV=production bundle exec rails credentials:edit
```

エディタで設定

```
production:
  secret_key_base: "生成したランダム文字列"
```

DBマイグレーション

```
sudo mkdir -p /var/lib/redmine/public/assets
sudo chown -R apache:apache /var/lib/redmine/public/assets
sudo chmod -R 755 /var/lib/redmine/public/assets

sudo -u apache bundle exec rake db:migrate RAILS_ENV=production
```

## 6. ApacheのRedmine用設定

`/etc/httpd/conf.d/redmine.conf`

```
<VirtualHost *:80>
    DocumentRoot /var/lib/redmine/public

    <Directory /var/lib/redmine/public>
        Require all granted
        Options -MultiViews
    </Directory>

    PassengerEnabled on
    PassengerAppRoot /var/lib/redmine
    PassengerRuby /usr/bin/ruby
</VirtualHost>
```

Apache再起動と動作確認

```
sudo apachectl configtest
sudo systemctl restart httpd
```

ブラウザで`http://<サーバーIP>`にアクセスし、Redmineのトップページが表示されることを確認

- 初期アカウント: admin / admin

以上で、Redmineが正常に動作します。