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を選択して起動する。
Elastic IP アドレスの関連付け
作成したEC2インスタンスにEIPを関連付け、パブリックIPを固定化する。
詳細はAWS公式サイト参照。
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公式サイト参照。
ブラウザ上からの疎通確認
ブラウザ上から、EC2のパブリック IPv4 DNS名を指定して、Apacheサーバーへアクセスし、HTTPリクエストを受け付けることを確認する。
ドメイン名取得
任意のドメイン名取得サービスを利用して、EIPと紐づけるドメイン名を取得する。今回は、無料のドメイン名を利用するため、Freenomを利用する。
Register a New Domainを選択
任意のドメイン名を入力して、利用可能かをチェック
トップレベルドメインの中から、任意のドメインを選択して、Get it now!選択
Checkoutを押下
Use DNSから、ドメイン名に対応するIPアドレスを入力してContinue
I have read and agree to Teams & Conditionsにチェック後、Complete Order押下
※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指定でブラウザからドメイン名を指定してアクセスする。
※Redmineの初期ログインID/パスワードは共に「admin」
注意事項
Redmineを快適にサービス提供するための動作環境は、メモリは最低4GB以上あったほうが良い。今回は無料で環境構築を済ませるため、EC2のインスタンスタイプをt2.micro(メモリ1GB)としたが、このままだと動作が非常に重く、使い物にならない。利用ユーザー数をもとに、適切なインスタンスタイプを選択する必要がある。