bottleで作ったWebアプリをHerokuで公開（デプロイ）するまで

# 結論
bottleを使ったアプリケーションをHerokuで公開する。
# はじめに
PythonのbottleでWebアプリケーションを作りHerokuなるものを使ってデプロイしようとしたものの、なかなか上手くいかなかったためアウトプットとして記事を書いてみます。初めての投稿かつ初心者なため色々指摘していただければありがたいです。
# 環境
- Windows10
- Python 3.8.3
- bottle 0.12.18
- numpy 1.18.5
- scikit-learn 0.23.1

# 参考にしたサイト
- [Herokuとpythonのwebフレームワークbottleを使ってWebアプリ(オウム返し)を作る【入門者向け】](https://qiita.com/pafu/items/3dec433318222670cd6e)
- [Heroku×bottleを使って4分33秒でWebアプリを公開する](https://qiita.com/ohbarye/items/55ec574f10685a012baf)

基本的にこれらのサイトの手順で問題ないと思いますが、僕は何かとバグってしまったのでその際に参考にしていただければと思います。

# 手順
1. Herokuのアカウントを作る
2. Heroku CLIをインストールする
3. Webアプリを作る
4. デプロイしたいファイルを格納するディレクトリを作る（以下のファイルが必要）
    * main.py
    * requirement.txt
    * Procfile
    * runtime.txt
    * その他のファイル（bottleのテンプレートファイルとか）
5. gitコマンドでコミットする
6. Herokuにデプロイする

# Herokuのアカウント作成
[ここ](https://signup.heroku.com/)からアカウントを作成できます。

# Heroku CLIのインストール
[ここ](https://devcenter.heroku.com/articles/heroku-cli)からHeroku CLIをインストールします。
僕はWindowsだったので、インストーラーをDLした後`heroku-x64.exe`を実行しました。選ぶところは全てデフォルトのままでやりました。

# Webアプリの作成
作ってください。リモート環境で動くかに注意してください。
リモート環境で動かすときは、以下のコードにしていましたが、

```python
run(host="localhost",port=8080,debug=True)
```
デプロイする際は以下のコードに変えました。このあたり何をしているのかよく分かっておらず、とりあえず写経したというところです。

```python
run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
```

# デプロイしたいファイルを格納するディレクトリを作る
main.pyとその他のファイルについては特に言うことはありません。
**<font color="Red">注意ポイント</font>**
**requirement.txt, Procfile, runtime.txtの文字コードに注意しましょう。
utf-16 LEなる文字コードではデプロイできず、utf-8ならばデプロイできました。**

## requirement.txt
これは、インポートしたいモジュールとそのバージョンを記述するファイルです。numpyなどを利用する際にはパッケージがあるようなのですが、僕はエラーを修正できなかったため止めました。
以下のような内容になりました。
`モジュール名==バージョン`という記法です。

```python:requirement.txt
bottle==0.12.18
numpy==1.18.5
scikit-learn==0.23.1
```

## Procfile
これは、実行するpythonのファイルを記述するファイルだと思います（理解が浅い）。また、Procfile.windowsというファイルも作成し、以下のように記述しました。
以下の`main.py`の部分は自分のPythonファイルの名前に変更してください。bottleではなく、flaskを利用している場合以下の書き方ではないようです。

```python:Procfile
web: python main.py
```
```python:Procfile.windows
web: python main.py runserver 0.0.0.0:5000
```

## runtime.txt
これは実行するPythonのバージョンです。[Herokuのサポートするバージョンが決まっている](https://devcenter.heroku.com/articles/python-support)らしく、とりあえず`Python-3.8.5`にしました。自分の実行環境と違いましたが、イケました（おそらく良くない）。
**大文字と小文字を間違えるとエラーになるようなので、注意しましょう。**

```python:runtime.txt
python-3.8.5
```

## 注意（もう一度）
**requirement.txt, Procfile, runtime.txtの文字コードに注意しましょう。
utf-16 LEなる文字コードではデプロイできず、utf-8ならばデプロイできました。**

# gitコマンドでコミットする
デプロイしたいディレクトリに移動し、そのディレクトリをコミットします。

```
cd (デプロイしたいディレクトリ)
git init
git add --all
git commit -m "first commit"
```

# Herokuにデプロイする
いよいよHerokuにデプロイします。
~~僕はアプリ作成よりもこちらで時間を喰ってしまいました~~

## Herokuへのログイン
まずHerokuにログインします。Herokuに登録したメールアドレスとパスワードを聞かれるので入力します。

```
heroku login
```
上手くいくと、以下のように表示されます。

```
Logged in as 自分のメアド
```

## アプリ作成からデプロイ
次に以下のように実行します。これは、アプリをHerokuで作成しています。`heroku create`をすると、アドレスを教えてくれますが、そのアドレスがWebアプリのアドレスになります。この場合、名前は適当に設定されますが自分でも設定できるようです。

```
heroku create
```

最後に、プッシュします。

```
git push heroku master
```
上手くいくと、以下のようなコードが表示されるはずです。

```
remote: Verifying deploy... done.
```
逆に、上手く行かないと、以下のようなコードが表示されてしまいます。

```
error: failed to push some refs to 'https://git.heroku.com/XXXXXXX.git'
```
このとき、エラーコードの上をよく見るとどこで詰まったのかを教えてくれますがそこまで親切ではありません。そこで、`https://git.heroku.com/XXXXXXX.git`のページに行くと、詳しいログを確認できるためそこで詳しい情報を知りましょう。

## アプリの確認
デプロイすることができれば、

```
heroku open
```
でそのアプリを確認できます。