Beego をSSLで使ってみた

#現在について
VPSサーバをtime4vpsにて借りているのだが、そこでツイッターのタイムラインを取得してDBにて保存し、画像があれば画像をダウンロードする常駐プログラムをGolangで書いてみた。
そこでGolangが思いの外常駐系のプログラムを書きやすかったことから、Golangへの興味心が強くなった。
次に目をつけたのがGolangを用いてのWEBシステム構築である。
とりあえずレベルでWEBにあるコードを使ってローカルホストでWEBを起動してみた。
ところが本職でJavaを使っていること、Springフレームワークを使っていることでもう一歩進んでみようとなった。

そんなわけで本題

__Beegoを使ってWEBをSSLでとりあえず動かしてみた。__

#前提
（私の）

* time4vpsdeでサーバーを借りている
* CentOS 6を使用している（アップデートしたらなんか7になったから7かも）
* WEBサーバ系（Apache、Tomcat、nginx）を一通り削除
* Linuxのコマンドをなんとなく知っている

# Golangをインストール
忘れた
[こことか](https://qiita.com/estaro/items/23c10fe7e43a2a70e689)
[こことか](https://qiita.com/okatai/items/4beaf74d284f5bdfae4b)
見てた気がする
今yum実行してみたら1.9系が入ったので上のリンクで直でインストールしてパスを通したはず。
##補足
Linuxはコマンドベースで「cd」とか使うはずだが、このコマンドは実はただのプログラムでそのプログラムを直叩きしても動く。
ところが毎回「/home/user/cd」とか打つのがめんどくさい。
これを「cd」と入れれば「/home/user/」のディレクトリの「cd」プログラムを使用するということを行う方法が存在している。
それを行うことをパスを通すと言ったりする。
原則的に優先度順であればそれを使いなければ次のを使うみたいな動きだったはずだ
##補足2
```
$ vim ~/.bashrc
```
にてGOPATHを知っていしたほうがどこにソースを置くかどこを見に行くかが楽になるかもしれない


#beegoインストール

```
$ go get github.com/astaxie/beego
$ go get github.com/beego/bee
```

にてインストールを行う
※ ここでコマンドがないと出たらだいたいGolangが入っていないか権限が違うかインストールしたユーザが違う。

```
$ cd {GOPATHのアドレス}/src
$ bee new ｛プロジェクト名｝
```

でプロジェクトを作成してもいいししなくても良い
{GOPATHのアドレス}は補足2で書いたことがうまい感じに行けてたらそこに移動してプロジェクトを作成する。

[Githubの（私の）ここ](https://github.com/in-noob/5go_jp)
みたいなのができたらOKGithubとかから持ってきても良いしプロジェクトを作っても良い今回の私は作成した。

とりあえず

```
$ cd ｛プロジェクト名｝
$ bee run
```

で起動する。

基本的な運用は誰がどうするかではあるが、GithubにコミットしCloneして実行が一番手っ取り早いかもしれない。

#SSL通信
上に記載しているところまででローカルホストまたはポート開放などをしっかり行い、「conf/app.conf」にて80番ポートを設定してsudoコマンドを用いて起動すればWEBとして見ることが可能です。
次にSSL通信についてざっくりかきます。

##Let's Encrypt 
こちらSSLの証明書を無料でくれるサービスで一部界隈では有名なサービスです。
なんたって各種LinuxOSにインストールしておきコマンドを何度か入れるだけで該当場所にSSL通信に必要な証明書とキーを配置してくれる。
###インストール
```
$ sudo yum install epel-release
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
$ sudo chmod a+x /usr/bin/certbot-auto
$ sudo certbot-auto --os-packages-only --non-interactive
```
上記でSSL証明書発行してくれているサービスのクライアントが入る

###証明書発行

```
$ certbot-auto certonly -d ｛ドメイン名｝ --email ｛メールアドレス｝
$ certbot-auto certonly -d ｛ドメイン名｝
```
このどちらかを入れる
どうもメールアドレスを記載しておくとSSL証明書がキレそうになると送信されるらしいです。

ここまででSSL証明書が発行され特定ディレクトリに保存されます。

```
/etc/letsencrypt/live/
```
ディレクトリは上記にドメイン名で作成されているはずです。

私は1度目SSL証明書発行時に失敗しました
理由は80番ポートを既にBeegoが専有していたからでした。
killコマンドで終了して再度「certbot-auto certonly...」を実行するとうまくいきました。

###成功時のログ
下記に一応成功したときのログを記載

```
Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for ｛ドメイン名｝
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/｛ドメイン名｝/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/｛ドメイン名｝/privkey.pem
   Your cert will expire on 2018-12-13. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

これでSSLに必要な準備が完了

##Beego側の設定
アプリはとりあえず終了しておき、httpとhttpsに用いるポート番号（80,443）を開けておきます。
###conf/app.conf
beegoのプロジェクトにて

```
vim conf/app.conf
```

を使用することでbeegoの設定ファイルを開けます。

そこで

```
appname = ｛プロジェクト名かアプリケーション名｝
httpport = 80
runmode = prod

EnableHTTPS = true
HTTPSPort = 443
HTTPSCertFile = "/etc/letsencrypt/live/｛ドメイン名｝/fullchain.pem"
HTTPSKeyFile = "/etc/letsencrypt/live/｛ドメイン名｝/privkey.pem"
```

上記を参考に編集します。
基本WEBは縛りがない場合、80番をHTTPで使用し、443でHTTPSを使用します。

```
$ bee run &
```
などでバックグラウンドでアプリケーションを起動し、正常に起動すればSSL証明書を用いてのHTTPS通信が行えるようになります。

#その他
ここでは記載していないが行っておくべきこと気にしておくべきこと

* ポート開放及び閉鎖などの制御
* ファイアーウォール導入時のSSH通信などのポート番号設定
* SSL証明書には期限があり注意が必要（Let'sEncryptの有効期限は3ヶ月）
* CRONでもいいから自動更新をONにしておく
* 更新するコマンドがログを見る限り「certbot-auto renew」となっているがWEBでよく見るのは「certbot renew」バージョンによって違う？
* パーミッションについてはよきにはからってほしい

以上

#からの追記！
上記では

```
$ bee run &
```
としていたかと思います。

ところが、

```
$ nohup sudo bee run &
```
が正解でした。

起動後しばらく動いているのですが、少なくとも日をまたぐとアプリが終了してしまっておりました。
上記のようにログアウト後も処理を続けるコマンドを用いることで想定通り動くようになりました。
それと当方の環境では

```
$ sudo firewall-cmd --add-port=80/tcp --zone=public --permanent
$ sudo firewall-cmd --add-port=443/tcp --zone=public --permanent
$ sudo firewall-cmd --reload
```
こんな感じのものを入力してファイアーウォールにて許可を出さねばなりませんでした。
（記述間違ってたり足りなかったらごめんなさい）

コマンドにて起動確認やら登録されているか確認やらリロードして再起動して適応されているかを確認したりが必要でしたので記載しておきます。

更に、sudoで管理者権限で実行していますが、visudoコマンドでゴニョゴニョ登録して実行できるようにしましたので、別途調べて見る必要があるかもしれません。
一般ユーザーと管理者ユーザーでは使えるコマンドに制限があったり、登録されていないコマンドがあったり、相対パス上ユーザが異なるのでたどり着けなかったりするのでそのあたりは留意しておいたら幸せになれるかもしれません。

これで終了です。