【GCP】お手軽無料！ HTTPS の Redmine docker

# 【2022-04-05 追々記】
つい先日、再度無料で構築すべく、同じ工程をやってみました。
下記リンクのほうが新しいコンソール画面にもなっているので、こちらも参考にして下さい。
https://daylifehack.com/gcp-redmine-371/

# 【2020/12/30 再び追記】結果的に無料だった
2020/03/14 に固定外部IP有料化と記事を更新しましたが、**実質無料**のようです。
有料に変更にはなったのですが、「無料」という扱いから「有料だけど、割引するよ」という形になったようです。
実質無料スタイルになったみたいですね。

# 概要
Redmine＆docker-compose で、HTTPS を使いたいと思って調べたのですが、ドンピシャな情報がありませんでした。  

```Container-Optimized OS``` にて docker-compose コンテナなど使って試行錯誤しましたが、上手く行かなかったので通常のVMにて。  

GCP上の無料枠で構築。証明書がオレオレなので、半分くらい真面目な構築です。  
小さいインスタンスの割に意外とサクサク動く HTTPS 無料 Redmine。

* オレオレ証明書
* [docker](https://www.docker.com/)
* [docker-compose](http://docs.docker.jp/compose/toc.html)
* [Google Compute Engine](https://cloud.google.com/compute/?hl=ja)
* [Redmine](http://redmine.jp/)

GCP は新規作成でなくともよいが、GCE の Always Free 枠が空いていることが前提です。（無料がいいなら）

# GCP登録
GCE は作成するにあたって、無料トライアルを登録必須。
GCPプロジェクトを作成。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/76f93bd2-49f3-725d-d22a-3d53a07eabe5.png)



# インスタンス作成
Compute Engine ページで VM 作成。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/1fe5b9ce-e222-e0ae-1ae9-018eeea3842e.png)


さて、GCE の無料枠は以下のように (2019-06-13 現在) 書いてあるので、当てはまるように。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/7976e1f5-a9da-22ed-81b3-45f660b3b2e2.png)

今回は↓のようにしました。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/93f7c325-be48-5f5d-24e5-9784f4092734.png)

ここで注意したいのが、**ディスクの容量はデフォルト10Gになっていますが、30Gまで無料** なのでせっかくなら30Gに変更しましょう。  
「720時間が無料」ということは、30日間無料。  
31日まである月は、ご丁寧にここが744時間になります。  


# まずはスワップファイル作成
無事に VM が作成完了。  
メモリが非常に少ないので、スワップで補います。

```sh
$ 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
```

# オレオレ証明書作成

次に、SSH で中に入り証明書を作成。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/adca7083-0ef4-6903-cbd2-939ef0d3c9a3.png)

サクッといきます。
最後の工程は結構時間がかかる(ことが多い)。

```sh
$ 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
Signature ok
.
.
.
$ openssl dhparam -out dhparam.pem 2048
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.
.
.
```

# タイムゾーンをJSTに

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

# docker と docker-compose をインストール
[docker 公式手順](https://docs.docker.com/install/linux/docker-ce/debian/) に従ってインストールします。

#### docker インストール

```sh
$ 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
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]
$ 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
```

ユーザーのdockerグループ追加の反映のために、**ここで一旦SSHを抜ける** (SSHウインドウを閉じる)。
そして再度SSHで中に。

```sh
$ docker run hello-world
.
.
.
Hello from Docker!
.
.
.
```

無事に docker のインストールが完了。
sudo なしで docker コマンドが実行できるようになりました。

ちなみに、docker グループへのユーザー追加はセキュリティの問題があるので注意しておきましょう。
詳しくは各自調べてください。

#### docker-compose インストール

```sh
$ sudo -i
# curl -L https://github.com/docker/compose/releases/download/1.24.0/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 1.24.0, build 0aa59064
```
無事に docker-compose もインストールが完了。

# Redmine 用の docker-compose.yml 作成

```~/redmine-docker/docker-compose.yml``` を作成します。  
ブラウザ上のviで貼り付けようとすると (少なくとも私は) 上手くいかなかったので、右上の歯車アイコンから、作成したファイルを直接アップロードすると楽でした。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/c17a098f-1c7d-9e9a-5de5-54739acb3c22.png)


```~/redmine-docker/docker-compose.yml
version: '2'
services:
  postgresql:
    image: sameersbn/postgresql:9.6-4
    environment:
    - DB_USER=redmine
    - DB_PASS=password
    - DB_NAME=redmine_production

  redmine:
    image: sameersbn/redmine:4.0.3-2
    depends_on:
    - postgresql
    environment:
    - TZ=Asia/Tokyo

    - DB_ADAPTER=postgresql
    - DB_HOST=postgresql
    - DB_PORT=5432
    - DB_USER=redmine
    - DB_PASS=password
    - DB_NAME=redmine_production

    - REDMINE_PORT=443
    - REDMINE_HTTPS=true
    - REDMINE_RELATIVE_URL_ROOT=
    - REDMINE_SECRET_TOKEN=
    - NGINX_HSTS_MAXAGE=2592000
    
    - REDMINE_SUDO_MODE_ENABLED=false
    - REDMINE_SUDO_MODE_TIMEOUT=15

    - REDMINE_CONCURRENT_UPLOADS=2

    - REDMINE_BACKUP_SCHEDULE=
    - REDMINE_BACKUP_EXPIRY=
    - REDMINE_BACKUP_TIME=

    ports:
    - 443:443
    - 80:80
    volumes:
    - ./volumes/redmine/certs:/home/redmine/data/certs
```

ホームにアップロードされるので、 ```~/redmine-docker/``` 内にファイルを移動します。

```sh
$ mv ~/docker-compose.yml ~/redmine-docker/docker-compose.yml
```

起動も気長に待ちましょう。

``` sh
$ cd ~/redmine-docker/
$ docker-compose up -d
```


さて、GCEの外部IPのところをクリックしてアクセスすると…
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/20cd1708-e2a1-b1cc-86c9-9efa47e8046c.png)

オレオレ証明書のワンクッション。  
詳細設定から「～ にアクセスする（安全ではありません）」を選択。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/313ee991-8fb9-1296-0ec1-806ae564da75.png)

無事にオレオレ証明書を使用した Redmine が出来上がりました。  

管理者
初期ID：admin
初期PW：admin
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434319/9e2e2b4a-a76a-06a4-cac9-dff267321e9b.png)
    

[参考]
https://sakura-bird1.hatenablog.com/entry/2019/03/12/034152
https://github.com/sameersbn/docker-redmine