GCP

【GCP】無料で HTTPS 対応の Redmine

GCP の無料枠を使い、どうにか HTTPS に対応した Redmine を docker で構築したいの巻

Redmine

schedule

こんにちは、しがないエンジニアです。Redmine 便利ですよね。今、筆者の現場では Jira でタスク管理をしていますが、 Redmine を使用している現場もまだまだ多いと思います。 Redmine は今現在も、人気のプロジェクト管理ツールの一つです。

Redmine を docker (docker-compose) で構築、かつ SSL 暗号化して使いたいと思って調べました。しかし、これといってぴったり当てはまる情報がなかったので、構築したものを紹介します。

AWS の資格記事でAWSを紹介しました(【合格体験記】AWS SAP (Solutions Architect Professional))。AWS は無料利用枠が1年間と限られていて、永久に無料で使う方法はありません

なので、今回は筆者が GCP 上の GCE(Google Compute Engine) 無料利用枠のみを使用し、構築したものを紹介します。

GCP は Always Free という期限なしの無料枠が存在します。その範囲で構築します。

GCP 無料利用枠

Redmine は GCP 上の、GCE 無料利用枠を使います。公式ドキュメント https://cloud.google.com/free/docs/gcp-free-tier/ ページで無料利用枠を確認します。

GCE 無料利用枠

無料利用枠は下記のようになっています。

GCE の無料利用枠

  • e2-micro の VM タイプ
  • 30 GB の標準永続ディスク
  • 5 GB のスナップショット

この項目からはみ出ないように構築していきます。

Redmine の構築

アカウント作成

GCP のアカウントを持っていない人は、まずアカウントを作成しましょう。Google にて GCP と検索すれば、トップに GCP のページが出てきます。

GCP

詳細は割愛しますが、画面の指示にしたがって GCP へ登録しましょう。利用規約は最低限チェックし「同意して続行」を押下します。

GCP アカウント作成

GCE 有効化

GCE を初めて作成する際、下記のような画像が表示されます。「有効にする」を押下し、少し待ちましょう。

GCE 初回

また、「無料トライアル」を有効にする際、クレジットカード情報を入れる必要がありますが、これはほぼ本人確認の意味です。

無料利用枠を利用している限り料金はかかりません。それに、CPU バーストで課金される可能性はありますが、無料クレジット枠 $300 が用意されていて、そこから消費されます。

無料利用枠

注釈をすると、中国との通信は無料利用枠を外れるなどの細かい例外もあります。料金が数円程度生じるようになったら何かしら対策は必要です。

インスタンス作成

GCP のコンソール左ペインより、「Conpute Engine」→「VM インスタンス」と押下します。

インスタンス作成

インスタンス作成を押下します。

GCE コンソール

リージョンとマシンタイプ

インスタンス名は今回 redmine としました。リージョンは us-west1 です。

マシンも忘れずに e2-micro へと変更します。

インスタンス設定1

リージョンの選定

無料利用枠の候補として、下記リージョンが挙げられます。今回 us-west1 を選んだ理由は、日本との物理的距離が最も近いのが us-west1 だったからです。物理的距離が近いということは、基本的に通信経路が短くなります。なので、特別な理由が無い限りレスポンスは近いほうが早いです。

  • us-west1
    オレゴン:日本とのおおよその距離 8,089 km
  • us-central1
    アイオワ:日本とのおおよその距離 9,879 km
  • us-east1
    サウスカロライナ:日本とのおおよその距離 11,211 km

ディスク

ディスクの設定ですが、こちらも無料利用枠の対象となるように変更します。

無料利用枠対象は、タイプが標準永続ディスク、容量が 30 GB までです。容量がデフォルトでは 10 GB となっているので、せっかくなら 30 GBに拡張しましょう。

インスタンス設定2

ファイアウォール設定

また、ファイアウォール設定の HTTP と HTTPS は共に許可しておきます。

インスタンス設定3

以上でインスタンスの設定は完了です。完了して作成しましょう。

SSH 接続

GCE コンソールに戻り、作成したインスタンスのステータスが緑色のチェック状態になっていたら準備完了です。「SSH」を押下し、インスタンスに接続します。

インスタンス一覧

無事に SSH 接続ができました。

Linux redmine2 4.19.0-19-cloud-amd64 #1 SMP Debian 4.19.232-1 (2022-03-07) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
xxxxxxx@redmine2:~$

スワップファイルの作成

e2-micro はメモリが非常に抑えられた VM です。なので、メモリの少なさを補うためにスワップファイルを作成します。

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

自己証明書作成

自己証明書を作成します。巷の呼び方は「オレオレ証明書」です。通信の暗号化等については、ここでは詳しく触れませんのでご了承ください。今回鍵は 2048 bit としています。しかし、この鍵の長さでも私は 10 分ほど時間がかかりました。

mkdir -p ~/redmine-docker/volumes/redmine/certs
cd ~/redmine-docker/volumes/redmine/certs
openssl genrsa -out redmine.key 2048
openssl req -new -key redmine.key -out redmine.csr

ここで対話形式入力になるので、サンプルとして下記で入力します。

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Redmine Test Corp.
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:redmine.sample.local
Email Address []:
A challenge password []:
An optional company name []:
openssl x509 -req -days 3650 -in redmine.csr -signkey redmine.key -out redmine.crt
openssl dhparam -out dhparam.pem 2048

タイムゾーン変更

デフォルトではタイムゾーンが UTC なので JST に変更します。

sudo apt-get install -y dbus
sudo timedatectl set-timezone Asia/Tokyo

docker インストール

docker 公式手順 に従ってインストールします。

sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg2 \
    software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER

ユーザーのグループ追加反映のために一旦 SSH ウインドウを一度閉じ、再度接続し直します。

docker run hello-world

無事に docker がインストールされていた場合、下記のように Hello from Docker! と表示されます。

ydak_redmi@redmine2:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete 
Digest: sha256:6d60b42fdd5a0aa8a718b5f2eab139868bb4fa9a03c9fe1a59ed4946317c4318
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

docker-compose インストール

手順に従い、 docker-compose をインストールしていきます。

sudo -i
curl -L https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
exit
docker-compose --version

表示が Docker Compose version v2.3.3 でしたらインストールされています。

docker-compose.yml 作成

docker-compose を使用してコンテナを起動するので、docker-compose.yml を作成します。

cd ~/redmine-docker/
vi docker-compose.yml

下記 <DB_PASSWORD> の部分は各自で適宜変更してください。

コンテナ起動

docker-compose up -d

これでターミナルでの作業は完了です。SSH ターミナルは閉じてしまいましょう。

Redmine へのアクセス

さて、ここまで完了したら GCE コンソールへ戻り、「外部 IP」を押下してアクセスしてみましょう。

インスタンス一覧

docker-compose 自体の処理が完了しても、Redmine が起動中で表示できないことがあります。アクセスできない場合、数分待った後アクセスしてみましょう。

今回は自己証明書を利用しているので、初回はブラウザに警告が表示されると思います。しかし、意図的に自己証明書を利用しているので問題ありません。「詳細設定」→「xxx.xxx.xxx.xxx にアクセスする(安全ではありません)」を選択し、アクセスしましょう。

警告

これで無事に自己証明書の SSL を用いた Redmine が GCP 上にできあがりました。

Redmine

初期ログイン

  • ログイン ID:admin
  • パスワード:admin
ログイン

ログインすると、パスワードの変更が求められるので変更します。

パスワード変更

本当に無料利用枠で CPU 大丈夫なの?という人もいると思うので、実際にチケットを作成し、編集などもしてみました。

チケット

起動時こそ多少バーストしたものの、チケット作成時も含め、その後は落ち着いた状態を保っています。

Redmine コンソールを使用している時は、約 10 %ほどの CPU 使用率です。

CPU

まとめ

いかがでしたか。手間はかかりますが、GCP クラウドを利用した Redmine の構築ができました。個人的なタスク管理するために建てるのは、 Redmine だと大げさかもしれません。しかし、複数人でやりとりをする際には、通常の使い方であれば CPU もバーストせずに利用できそうですね。

-GCP
-, , ,