My Redmine Gen.2 を支えるインフラストラクチャー
Far End Technologies Corporation自己紹介・会社紹介
サービス紹介吉岡 隆行
Takayuki Yoshioka
所属
ファーエンドテクノロジー（株）
コミュニティー
Matsue.rb
JAWS-UG Shimane
好きなサービスAWS Amplifyファーエンドテクノロジー株式会社

所在地
コアビジネス
OSS関連

島根県松江市（2008年9月設立）
SaaS提供Redmine改善活動、Redmine.JP の運営

• 2009年9月 サービス開始• 国内約900社様にご提供• Redmineのコミッターが在籍• 採用パッチの半数以上が弊社開発

概要• 2019年7月からMy Redmineのインフラ環境を再構築してきました。そして2020年2月にMy Redmine Gen.2としてリリースされて半年が経過しました。

• 今回はインフラに使用されている技術とサービス（主にAWS）のいくつかをピックアップし、皆様にご紹介できればと思います。

• 注意）コンテナ（Docker）関連の話が多くなるかと思いますがご理解ください。アジェンダ
1. 全体構成
2. 利用サービス
3. 構築のポイント(1) Redmine(Rails)のコンテナ化(2) マルチテナントについて

全体構成

rails console
rake task …

利用サービス

Managed Service
AWSの責任範囲のなるべく広いサービスを選択
なるべくこの辺りのサービスを使う

利用（API）
アプリケーション
ミドルウェア
冗長化・バックアップ
OSの管理
サーバ（物理）ネットワーク（物理）EC2FargateLambdaetc…

RDS
Route53
S3
etc…

コンテナ（Docker）のオーケストレーションサービスの選択

FargateAWS ECS（Amazon Elastic Container Service）

Cluster :Fargateの場合はネームスペースのようなもの
Service :タスクの管理、スケジュールングなど
Task:
デプロイの最小単位（複数のコンテナを管理）

Fargateの特徴• サーバーレスなのでホストOSの管理不要。
（セキュリティのパッチ当てなど）• スケール時のキャパシティーを余分に持たなくても良い。
• SSHでログインできない。

その他、主要サービスRedmine
AWS WAF

Application
Auto Scaling

FargateAuroraS3

CodeBuild

CodeCommit

Amplify

API Gateway

AppSync

DynamoDB

Step Functions

LambdaCloudWatch

SNS

SQS

KinesisData Firehose

AthenaEC2ECS

S3 Glacier

Systems Manager

CloudTrail

CloudFormation

RDS

Route53

ELB

Secrets
Manager

Elastic Container
Registry

CodePipeline

周辺システムデプロイ・CI/CD
サービスアカウント管理

構築のポイント
Redmine（Rails）のコンテナ化
マルチテナントのアーキテクチャ

構築のポイント
Redmine（Rails）のコンテナ化
マルチテナントのアーキテクチャ

コンテナについて

Redmineを動かすために必要なもの• Ruby ランタイム（Ruby 2.6）
• 依存ミドルウェア（ImageMagic, PostgreSQL）• 依存ライブラリ（rails, rmagick, pg）
依存関係を含めた実行環境を一つのイメージにまとめてしまう。

イメージごとデプロイできる！

コンテナと仮想マシンの比較

出典：https://www.docker.com/resources/what-containerコンテナのメリット
1. 開発環境と本番環境の違いがなくなる
2. Infrastructure as Code に向いている
3. CI/CDと相性が良い（DevOpsに向いている）

コンテナの利用の注意点
1. イメージをbuildする作業や管理対象が増える
2. 状態を持たせる構成は難しい（データの永続化）

Redmineコンテナ化

Redmineで考慮が必要なこと（永続化が必要なデータ）•DB（データベース）•ログ•添付ファイルDB（データベース）について
RDS Aurora PostgreSQL 互換エディション

Logの扱い

Sidecar Pattern（コンテナを二つ使用）でログ収集用コンテナ（ﬂuentd）を使用してログの収集

添付ファイル候補の比較
Amazon S3

Amazon EFS

アプリケーションの変更が必要（プラグインなど）

アプリケーションの変更が不要

ランニングコストが安い

ランニングコストが高め

そもそも開発当時FargateではEFS連携ができなかった。

添付ファイル
添付ファイルの保存先をS3にできるPluginを開発（redmica̲s3）

開発 裏話（苦労話）ﬁles├── app

添付ファイルが保存│ ├── controllers│ ├── helpers

tmp/thumbnails
添付ファイルのサムネイルが保存。

│ ├── models│ └── views├── ﬁles│ ├── xxxxxxx

tmp/imports
CSVインポート時に一時ファイルが保存。

│ ├── xxxxxxx│ └── xxxxxxx└── tmp├── cache├── imports└── thumbnails

https://github.com/redmica/redmica_s3

構築のポイント
Redmine（Rails）のコンテナ化
マルチテナントのアーキテクチャ

ホスティングサービス（SaaS）
ビジネスモデルの話
シングルテナントよりマルチテナントで単価を抑えたい（1顧客1サーバは厳しい。複数の顧客でサーバを共有する）

実装方法
Apache + Passenger を選択プロセスごとに環境変数を切替える！

マルチテナント
1. Redmineをステートレスに設計(1) DBサーバを利用。ログと添付ファイルをS3へ保存(2) 設定情報（database.yml, s3.yml）に値は環境変数を利用する。
2. Apacheの子プロセスごと（ドメインごと）に設定情報（環境変数）が変わる。
（接続するDB、添付ファイルの保存先が変わる）

ソースコードの共有化が実現

構成図

構成図

1. Docker起動時にS3から環境変数等の情報を取得

設定情報はS3に保存

db:
name: [db_name]user: [user_name]password: [password]s3:
bucket: [user_bucket]
folder: [user_folder]property:
sub_domain: [sub_domain]
limit_ips:- ‘192.168.xx.xx'- '192.168.xx.xx'※サンプルイメージ構成図

1. Docker起動時にS3から環境変数等の情報を取得

Confファイルを生成<VirtualHost *:80>
ServerName siteA.example.jp
DocumentRoot /var/lib/siteA/public
RailsEnv production
PassengerEnabled on
SetEnv RAILS_DB db001
SetEnv RAILS_DB_USERNAME dbuser001
SetEnv RAILS_DB_PASSWORD xxxxxxxx
SetEnv S3_FOLDER_NAME user001...
</VirtualHost>※サンプルイメージ構成図

2. SiteAへアクセス

1. Docker起動時にS3から環境変数等の情報を取得

Redmineの設定ファイルの変更# database.yml
production:
adapter: postgresql
database: <%= ENV['RAILS_DB'] %>username: <%= ENV['RAILS_DB_USERNAME'] %>password: <%= ENV['RAILS_DB_PASSWORD'] %>host: <%= ENV['RAILS_DB_HOST'] %># s3.yml
production:
bucket: <%= ENV['S3_BUCKET_NAME'] %>folder: <%= ENV['S3_FOLDER_NAME'] %>※サンプルイメージ構成図

2. SiteAへアクセス

1. Docker起動時にS3から環境変数等の情報を取得

余談

運用編
• アプリケーションのデプロイ方法（小規模な変更）• アプリケーションのデプロイ方法（Migration ありの大規模な変更）• サービスアカウント（お客様）の新規登録・変更・停止・データ削除

まとめ(1) 利用サービス→ サーバレス、フルマネージドサービスを選択。
(2) Redmine(Rails)のコンテナ化→ 添付ファイルの扱いはS3プラグインで解決。
(3) マルチテナントについて→ 固有のデータの排除とソースコードの共有化。

• 2009年9月 サービス開始• 国内約900社様にご提供• Redmineのコミッターが在籍• 採用パッチの半数以上が弊社開発

ご清聴ありがとうございました。