EC2（Ubuntu）上のRedmineコンテナをSSLで公開するまで

EC2（Ubuntu）上で、RedmineコンテナをSSLで公開するまでの手順をまとめた。

## 環境
* AWS EC2 (Ubuntu Server 20.04 LTS (HVM), SSD Volume Type)
* Docker (version 20.10.12, build e91ed57)
* docker-compose (version 1.29.2, build 5becea4c)
* Apache 2.4.41 (Ubuntu)
* Redmine 4.2.4.stable
* certbot 0.40.0

## EC2インスタンス作成
AMIにUbuntuを選択し、インスタンスタイプにt2.microを選択して起動する。
![スクリーンショット 2022-03-06 23.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/b9cb22af-065c-b734-9b5e-d6075b487a51.png)
![スクリーンショット 2022-03-06 23.33.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/1a39f0b8-2f8f-5352-20fc-4204c8854cab.png)

## Elastic IP アドレスの関連付け
作成したEC2インスタンスにEIPを関連付け、パブリックIPを固定化する。
詳細は[AWS公式サイト](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-instance-addressing-eips-allocating)参照。

## Apacheインストール
SSHでUbuntuにログインし、Apacheをインストールする。
```
$ sudo apt update && sudo apt upgrade -y && sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
$ sudo apt install apache2 -y
```
Apacheがインストール後に起動確認していることを確認する。
```
$ sudo systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>
     Active: active (running) since Sat 2022-03-05 13:55:44 UTC; 21h ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 39249 (apache2)
      Tasks: 55 (limit: 1147)
     Memory: 11.7M
     CGroup: /system.slice/apache2.service
             ├─39249 /usr/sbin/apache2 -k start
             ├─41392 /usr/sbin/apache2 -k start
             └─41393 /usr/sbin/apache2 -k start
```
curlコマンドで、HTTPリクエストが受け付けられることを確認する。
```
$ curl localhost

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <!--
    Modified from the Debian original for Ubuntu
    Last updated: 2016-11-16
    See: https://launchpad.net/bugs/1288690
  -->

: 省略

</html>
```

## セキュリティグループでHTTPポート開放
セキュリティグループのインバウンドルールを編集して、HTTP(80)ポートを開放する。
詳細は[AWS公式サイト](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.html)参照。

## ブラウザ上からの疎通確認
ブラウザ上から、EC2のパブリック IPv4 DNS名を指定して、Apacheサーバーへアクセスし、HTTPリクエストを受け付けることを確認する。
![s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/2d034786-5042-4cd7-fae0-2c46588d43c2.png)

## ドメイン名取得
任意のドメイン名取得サービスを利用して、EIPと紐づけるドメイン名を取得する。今回は、無料のドメイン名を利用するため、[Freenom](https://www.freenom.com/ja/index.html)を利用する。
Register a New Domainを選択
![スクリーンショット 2022-03-06 23.40.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/1416ffa6-f229-367b-ec3c-52593e58158c.png)
任意のドメイン名を入力して、利用可能かをチェック
![スクリーンショット 2022-03-06 23.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/3d601102-13ad-e739-a657-9501d5603c57.png)
トップレベルドメインの中から、任意のドメインを選択して、Get it now!選択
![スクリーンショット 2022-03-06 23.41.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/426a7f04-89c7-eeae-1905-c8cec15d2744.png)
Checkoutを押下
![スクリーンショット 2022-03-06 23.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/586c90bf-9788-dff2-65d9-bd0fc86788cb.png)
Use DNSから、ドメイン名に対応するIPアドレスを入力してContinue
![スクリーンショット 2022-03-06 20.41.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/4a539a43-9d98-0423-c642-27120bd93fb3.png)
I have read and agree to Teams & Conditionsにチェック後、Complete Order押下
![スクリーンショット 2022-03-06 23.48.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/0a93f013-bddd-4888-2680-da338375ba73.png)

※DNS設定は反映まで数時間〜72時間程度かかる。

## nslookupでDNS適用確認
nslookupコマンドで、DNS適用を確認する。
適用前
```
$ nslookup docker-redmine.tk
Server:		127.0.0.53
Address:	127.0.0.53#53

** server can't find docker-redmine.tk: NXDOMAIN
```
適用後
```
$ nslookup docker-redmine.tk
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	docker-redmine.tk
Address: 54.238.xx.xx
```

## ドメイン名を指定してHTTPアクセス確認
curlコマンドで、ドメイン名を指定してHTTPリクエストを受け付けるか確認する。
```
$ curl http://docker-redmine.tk/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
: 以降、省略
```

## certbotを利用してSSL証明書取得
certbotをインストールして、Let's Encryptの無料SSL証明書を取得する。
```
$ sudo apt install certbot python3-certbot-apache -y
$ #以下のコマンドを用いて、SSL証明書を取得する
$ #certbot-auto certonly --webroot -w [ApacheのDocumentRoot] -d [取得したドメイン名] --email [管理者メールアドレス] -n --agree-tos --debug
$ certbot-auto certonly --webroot -w /var/www/html -d docker-redmine.tk --email your-account@gmail.com -n --agree-tos --debug
```

## SSL証明書の適用
Apacheの設定ファイルで、作成したSSL証明書を適用する。
```
$ sudo vim /etc/apache2/sites-available/docker-redmine.tk.conf
```
設定ファイル内容
```
<VirtualHost *:80>
  ServerName docker-redmine.tk
  RewriteEngine on
  RewriteRule (.*)?$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
  ServerName docker-redmine.tk

  <Proxy *>
    Require all granted
  </Proxy>

  SSLEngine on
  SSLCertificateFile /etc/letsencrypt/live/docker-redmine.tk/cert.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/docker-redmine.tk/privkey.pem
  SSLCertificateChainFile /etc/letsencrypt/live/docker-redmine.tk/chain.pem
</VirtualHost>
```
設定ファイルのリロード
```
$ sudo systemctl reload apache2
```

## セキュリティグループでHTTPSポート開放
セキュリティグループのインバウンドルールを編集して、HTTPS(443)ポートを開放する。
なお、HTTP(80)ポートのインバウンドルールについては、不要であればこのタイミングで削除する。

## HTTPSリクエスト受付確認
curlコマンドを利用して、HTTPSリクエストを受け付けるか確認する。
```
$ curl https://docker-redmine.tk/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
: 以降、省略
```

## dockerのインストール
dockerをインストールする。
```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
$ sudo apt install docker-ce -y
```
dockerサービス起動確認
```
$ sudo systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset>
     Active: active (running) since Sun 2022-03-06 11:00:33 UTC; 1h 52min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 45440 (dockerd)
      Tasks: 12
     Memory: 62.4M
     CGroup: /system.slice/docker.service
             └─45440 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/con>
```
次回のログイン時からdockerコマンドをsudoなしに実行するための設定を行う。
```
$ sudo usermod -aG docker ${USER}
```
dockerコマンド実行確認
```
$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

## docker-composeのインストール
docker-compose(1.29.2)をインストールする。
```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
```

## Redmine用のdocker-compose.yml編集
Redmineのコンテナを作成するdocker-compose.ymlを編集する。
```
$ mkdir redmine && cd redmine
$ vim docker-compose.yml
```
docker-compose.ymlの内容
```
version: '3.1'

services:
  redmine:
    image: 'redmine:latest'
    restart: always
    ports:
      - '3000:3000'
    volumes:
      - './redmine-files:/usr/src/redmine/files'
    environment:
      REDMINE_DB_POSTGRES: redmine-db
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine
      TZ: Asia/Tokyo

  redmine-db:
    image: 'postgres:latest'
    restart: always
    volumes:
      - './redmine-db-data:/var/lib/postgresql/data'
    environment:
      POSTGRES_ROOT_PASSWORD: redmine
      POSTGRES_USER: redmine
      POSTGRES_PASSWORD: redmine
      POSTGRES_DATABASE: redmine
      TZ: Asia/Tokyo
```

## Redmineコンテナ起動
docker-composeを使って、Redmineコンテナをバックグラウンドで起動する。
```
$ docker-compose up -d
```
コンテナ起動確認
```
docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS          PORTS                                       NAMES
3a48fb781c59   redmine:latest    "/docker-entrypoint.…"   25 seconds ago   Up 23 seconds   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   redmine_redmine_1
a1ff7df30033   postgres:latest   "docker-entrypoint.s…"   25 seconds ago   Up 23 seconds   5432/tcp                                    redmine_redmine-db_1
```

curlコマンドで、3000ポート指定でRedmineサービスの起動を確認する。
```
$ curl localhost:3000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<title>Redmine</title>
: 以降、省略
```

## Apacheのmod_proxyでポートフォワード
Apacheの設定ファイルを編集し、コンテキストルート「/」にアクセスした際に、Redmineの3000ポートへフォワードさせる。
```
$ sudo vim /etc/apache2/mods-enabled/proxy.conf
```
設定ファイルの編集内容
```
<IfModule mod_proxy.c>
        ProxyRequests Off
        <Proxy *>
           AddDefaultCharset off
           Order deny,allow
           Deny from all
           Allow from all
        </Proxy>
        ProxyPass / http://localhost:3000/
        ProxyPassReverse / http://localhost:3000/
</IfModule>
```
Apacheのサービス再起動を実行する。
```
$ sudo systemctl restart apache2
```
curlコマンドで、コンテキストルートにHTTPSでアクセスした際、Redmineのページへフォワードされることを確認する。
```
$ curl https://docker-redmine.tk/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<title>Redmine</title>
: 以降、省略
```

## ブラウザから、HTTPSでRedmineアクセス確認
HTTPS指定でブラウザからドメイン名を指定してアクセスする。
![スクリーンショット 2022-03-06 23.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/9f549ede-6e33-70a0-a92c-f02136ee9563.png)
![スクリーンショット 2022-03-06 22.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23018/8fb6871e-c347-4d28-f1ad-aa194e26ee91.png)
※Redmineの初期ログインID/パスワードは共に「admin」

## 注意事項
Redmineを快適にサービス提供するための動作環境は、メモリは最低4GB以上あったほうが良い。今回は無料で環境構築を済ませるため、EC2のインスタンスタイプをt2.micro（メモリ1GB）としたが、このままだと動作が非常に重く、使い物にならない。利用ユーザー数をもとに、適切なインスタンスタイプを選択する必要がある。