Raspberry Pi 3をwebサーバにして作ったアプリをデプロイ

[Raspberry Pi Advent Calendar 2019](https://qiita.com/advent-calendar/2019/raspberry-pi) 6日目の記事です

#概要
Raspberry Pi 3を自宅のWebサーバにしてWebアプリをデプロイ、
自宅のネットワーク外からでもアクセスできるようにすることが目標です。

Raspberry Pi 3のOSには**Raspbian**を選択。
centOSがなぜか起動できなかったんでこっちでやります。
#手順
##microSDのフォーマット
ラズパイ用のmicroSDをFAT32でフォーマットします。
因みにフォーマットする側のホストOSは**LinuxMint18.3'Sylvia'**
利用するソフトは**gparted**です。

まずは、`apt install gparted`でgpartedをインストールした後、起動します。(スーパーユーザ権限で)
すると、GUIでポチポチやるだけでmicroSDをフォーマットできます。
以下はフォーマット後の画面です。
![Screenshot at 2019-12-03 14-07-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261602/b078ff1d-944b-e58c-206b-b5c563a2d179.png)

説明の必要がないくらい簡単なので、特に作業の委細は述べません。

##microSDにOSインストール
インストール、とはいっても、[公式サイト](https://www.raspberrypi.org/downloads/)からダウンロードしたNOOBSの中身ををmicroSDにぶち込んで起動するだけです。

公式が遅い時は[ミラー](https://www.raspbian.org/RaspbianMirrors)からどうぞ。

**参考**
>https://qiita.com/tukiyo3/items/c8555eacb67466b81bc8

##LAN外からssh接続できるように設定
OSのインストールが完了したていで話を続けます。

ここからはラズパイ内で設定をいじっていくことになるわけですが、毎回ラズパイ本体にキーボードとマウス、ディスプレイを繋いで作業をするのは面倒なので、sshで接続できるようにします。

まず、`sudo raspi-config`でラズパイのssh接続設定を有効にします。

GUIで操作できますので「5. Interfacing Options」→「P2 SSH」と選択し、enabledしてください。

変更はreboot後に適用されます。

次に、ラズパイのローカルipを固定します。固定のファイルは`/etc/dhcpcd.conf`になります。ネット上では　`/etc/network/interfaces`だという記事が多いのですが、どうやらRaspbian Jessieから変更があったらしい。

```/etc/dhcpcd.conf
interface [インターフェース名]
static ip_address=[固定したいローカルip]
static routers=[デフォルトゲートウェイのip]
static domain_name_servers=[DNSサーバのip]
```

と記述すればipが固定されます。
これでひとまずLAN内からはssh接続ができます。

```console
ssh pi@[固定したip] -p 22
```
とコマンドを打って接続を確認。

###公開鍵認証方式の設定
ここまでで、パスワード認証方式でのssh接続はできました。しかし、のちのちLAN外から接続するとなると、セキュリティの面で公開鍵認証方式を利用するのが好ましいです。

自分は[この記事](https://qiita.com/3no3_tw/items/4b5975a9f3087edf4e20)の「公開鍵認証方式の設定」を参考にしました。

##ルータのポートフォワーディング設定
LAN外から届いたssh接続をLAN内のラズパイ宛に届けてやるための設定をします。

ご家庭で使用中のルータの設定画面を開いてみてください。

<img width="1233" alt="スクリーンショット 2019-12-04 20.15.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261602/5989babd-32be-7300-569d-ecc828665ca2.png">
右下の詳細設定を選択します。

<img width="1230" alt="スクリーンショット 2019-12-04 20.16.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261602/4628feef-1a44-4681-4846-b5748e36811f.png">
「セキュリティー」→「ポート変換」を選択し、ssh(22),http(80),https(443)番ポートへのアクセスを全て先ほどの固定したipが受け取るように設定します。

これで外部からアクセスできるはずです。しかしこのままでは、グローバルipが変わってしまった際の対処が面倒。なのでDDNSを取得して解決します。

##DDNSを取得
[MyDNS](https://www.mydns.jp)でドメインを取得します。

サイトで登録後、IDとパスワードがメールで来るのでそれをもとにログインします。

ログイン後、「DOMAIN INFO」を選択し、取得したいドメインを記載します。
ドメインが他と干渉しなければOKとでるはずなので、取得は完了。

ただ、ドメインを取得しても、ドメイン名を関連づけたい回線から定期的にIPアドレスを通知しないといけません。
実際、１週間以上通知がないとドメインが使えなくなってしまうみたいです。

通知の方法はいくつかあるのですが、ここではラズパイ側から毎時間httpのbasic認証でアクセスをすることにしました。

```/etc/cron.hourly/mydns
#!/bin/sh

wget -O - 'http://ID:PASS@www.mydns.jp/login.html' > /dev/null
```

こんなシェルスクリプトをcronに書いておく。

そして`crontab -u pi -e`で設定ファイルに書き込みます。

```console
Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.tiny
  3. /bin/ed

Choose 1-3 [1]: 2
```

easiestって言ってくれるあたり優しさを感じます。

書き込む内容は以下

```console
0 * * * * /etc/cron.hourly/mydns >/dev/null 2>&1
```

`crontab -l`で現在の設定が確認できます。

また、cronの動作の確認は公式サイトのLOG INFOでできるはずです。
ただし、サーバの負荷の関係で同じアクセスに関しては24時間に一度しか表示されないので注意。

**参考**
>https://qiita.com/mizuki_takahashi/items/89699f87fb10d812748a
>http://dotnsf.blog.jp/archives/1034948871.html

##デプロイ
なんだかんだここが一番だるい。

Raspbianにapache2が標準でついてたのでもうこれでいいや。

```/etc/apache2/apache2.conf
<Directory "/var/www/[laravelapp]/public">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
```

```/etc/apache2/sites-available/000-default.conf
DocumentRoot "/var/www/[laravelapp]/public"
```

と記述。

矛盾がないように`/var/www/`下で`git clone [リモートリポジトリのURL]`をします。

あとは、**php**,**mysql**,**composer**等入れて各種設定を済ます**だけ**なのだが、ここが一番大変だった。いろいろごちゃごちゃやったので記憶がないです。

phpの拡張機能、特にPDOとか、mbstringあたりのエラーが出まくって大変だった。

php.iniのコメントアウト外し、apache2の再起動とかを忘れると無駄に時間を食います。

そしてやっとこさトップページが出たのでかんせ〜い**と思ったら...**

###トラブル
ログイン画面や登録画面へ行くと404エラーが出る。

ルーティングはしっかり機能しているはずなのに何で...

原因はすぐにわかりました。

先ほどの`apache2.conf`に`Allowoverride All`が記述されていないのが原因でした。

これがないとpublic下の.htaccessが動かんらしい。

よくみると、初期状態では`Allowoverride None`となってますね...

**参考**
>https://qiita.com/msht0511/items/b32122413745d0a3d50a

同様の理由で、apacheのmod_rewrite機能も有効化しないといけないみたいでした。

```console
sudo a2enmod rewrite
sudo service apache2 restart
```

で解決。

#おわり
最近作った弐寺のクリアランプマネージャです。(予告なくサービスの公開を終了するかもしれません)→[地力Estimator](https://3ch0.mydns.jp/estimator/public)


ぜひ[こちら](https://qiita.com/HO_Pollyanna/private/1de9dd6219589cf690d6)の記事も読んでみてください。