PHPerのためのLaravel forgeとDigital Oceanで簡単サーバー管理

この記事はうるる Advent Calendar 2019 9日目の記事です。


#はじめに
この記事は下記の方を対象にしています。
- インフラやサーバー周りが苦手のPHPのサーバーサイドエンジニア
- 自分でサービス開発をしたいエンジニア
- エンジニアなりたての方

インフラとかサーバーとかよくわからないし、怖いし、面倒ですよね。私もそうでしたので、よくわかります。

私自身はプログラマ歴４年のサーバーサイドエンジニア。自分でサービスをやっているため、必要に迫られてサーバー管理を嫌々やっています。（本当にサーバー管理キライですw）

この記事ではLaravel forgeとDigital Oceanを使って楽に環境構築を行います。

# Laravel forge is 何？？

<img width="1092" alt="スクリーンショット 2019-12-08 21.58.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/721f15bf-471b-d369-899a-2937a43fc45d.png">

- Laravel 開発者のためのサーバー管理ツール
- Laravel開発者のTaylor Otwellさんを中心に開発。Laravelとの相性が抜群に良い
- Digital OceanやAWS、その他のVPSと簡単に連携でき、すぐにLaravelのアプリケーションが動かせる
- Gitからの自動デプロイ、Redis,Queueなどアプリケーションに必要なことが簡単に設定できる

# Digital Ocean is 何？？
- アメリカのクラウドサービスの会社。 VPS、DB、クラウドストレージサービスを安く、シンプルな使い勝手で提供。
- アメリカのスタートアップがよく使っている
- AWSよりシンプルで安く、簡単なサービスと認識してもらえればOK！


# forgeを使って、Digital Oceanにサーバーを作る

- forge, DOともにアカウントを取得する
    - forgeは5日間無料トライアルあり。月額12ドルから使えます。
    - DOは利用した分だけ課金されます。サーバーは最小構成なら月500円程で立てれます。
- DOの管理画面にてAPIを発行
    - 作り方はここの通り。https://www.digitalocean.com/docs/api/create-personal-access-token/
- forgeの画面にて先ほどのDOのAPIを入力
    - My Account ->Profile -> Server ProvidersにてAPIを入力
<img width="1157" alt="スクリーンショット 2019-12-08 22.40.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/2ef77be8-9e0a-c31c-a07f-bd4d0431f69b.png">

<img width="1177" alt="スクリーンショット 2019-12-08 22.33.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/4e999e27-ca7b-9b43-783c-65521feb5de3.png">


- forgeの画面でcreateサーバーにて、Digital Oceanをクリック
    - 連携が成功していたらcredentialにDigital Oceanの自分の名前が表示されます

<img width="1095" alt="スクリーンショット 2019-12-08 22.23.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/74f1c2b2-7087-98d9-acdf-89a4b11b454b.png">

-  Nameを決めて、Region,Server sizeなどを選択して、create Serverボタンをクリック。今回はadvent-calendarというサーバーを作ります
- すぐにDigial Oceanと連携して構築し始めます。

<img width="1046" alt="スクリーンショット 2019-12-08 22.23.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/766e342c-32d7-9311-0005-3c978f07ae7b.png">

- DO側の画面
    - 先ほど名前をつけたサーバーが出来ています
    - 実際にはプロビジョニングに10分くらいかかります
    - 完了するとforgeから完了メールが届きます。このメールにSudo passwordやDBパスワードが書いてあるので保存しておく
<img width="1020" alt="スクリーンショット 2019-12-08 22.24.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/e30867e4-cbd9-f03a-c428-d6b9c216510c.png">


# サイトの公開
- Forgeに戻って、先ほど作ったサーバーを選択する
<img width="1009" alt="スクリーンショット 2019-12-08 22.53.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/d504243c-7aec-cf71-dc05-b769b731cf73.png">

- New Siteにドメインを追加する（例：advent-calendar-test.com）
<img width="984" alt="スクリーンショット 2019-12-08 23.00.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/0d02e943-9e5e-e4aa-bd70-3bc5a88167a7.png">

- active siteに先ほど作ったサイトが追加される。サイト名をクリック
<img width="841" alt="スクリーンショット 2019-12-08 23.02.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/66e20f5f-3f68-f9d4-d8a1-fa979f375bcf.png">

- Gitのレポジトリ情報を追加する
<img width="1002" alt="スクリーンショット 2019-12-08 23.05.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/60a55ea2-f46f-e0ba-5c42-db252186a272.png">
- 試しにLaravelのGit Repositlyを追加
<img width="991" alt="スクリーンショット 2019-12-08 23.06.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/f1d7840c-fec7-f4ec-81db-131d710205ff.png">

- 勝手にデプロイし始めます
<img width="965" alt="スクリーンショット 2019-12-08 23.07.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/44574744-45d6-60e6-d546-8f94ab3a628f.png">

- デプロイ完了したらこの画面。
 <img width="1007" alt="スクリーンショット 2019-12-08 23.09.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/aa878d6d-c233-d864-e018-37d99ecdaf6a.png">

- デプロイしたい時は右上のDeploy Nowをクリック
- 自動デプロイは Enable Quick Deploy をクリック。これにしておくとGitが更新されるたびに自動デプロイが走ります
- 設定したドメインは、ドメインを管理しているサイトでDNSでAレコードにIPアドレスを追加すれば表示されます。(今回の例ではIPアドレスは159.89.200.65。 Digital Oceanのサイトでも確認できるが、ご丁寧にforgeの中でもちゃんと書いてある) 

<img width="811" alt="スクリーンショット 2019-12-08 23.11.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/c4588956-5e76-8990-9c57-10d354c1c2cb.png">

- advent-calendar-test.comはアクセスしてみても、私がドメイン持ってないので表示されません。念のため。



# その他設定

- envはここで設定。 LaravelのEnvをコピペして、本番用に書き換えれば使えます
<img width="968" alt="スクリーンショット 2019-12-08 23.10.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/d9665dba-da91-cbbd-d2b1-8616237a5223.png">

- SSLも設定可能。Let's encryptあるので、わかんない人はそれクリックしておけばOK。勝手にSSLが反映されます。

<img width="977" alt="スクリーンショット 2019-12-08 23.10.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/69bd3e57-7fb4-f03b-3e99-5c5f8d2b1d2b.png">

- Workerも画面から簡単に設定できる。RedisでもDatabaseでも設定可能です。
<img width="972" alt="スクリーンショット 2019-12-08 23.10.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/1ac3e979-34c3-e595-cef2-dfb5062a7e86.png">

- Cronだけはサーバー画面から設定する。トップメニューのServersからサーバーを選び、設定する
<img width="984" alt="スクリーンショット 2019-12-08 23.24.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330419/1796495d-2809-a1f1-5256-617dd3c3c744.png">

# その他補足

- 設定はServer details, Site detailsの二つがあり、設定するものによって場所が違う。サイトがシンプルすぎて、何がどこにあるか最初わからないので注意する。
- ForgeはSudo passwordがたまに求めらるが、サイト上からは見れない。provisioning時のメールにある。最初わからなすぎてパニクった。
- Digital Oceanはサーバーのバックアップを１週間ごとに取ってくれる。外部サービス使えば、毎日バックアップしてくれます。
- DOは、managed Database (RDSのパクリ）、 Spaceというオブジェクトストレージ（S3のパクリ）を持っています。この二つは安いのに超便利。 これ以外にもロードバランサーやちょっとしたサーバー監視ツールもある。小規模サービスであればAWS出なくても、DOで十分に事足ります。 
- Digital Oceanに関してはこの記事がよく説明されています。https://nekonenene.hatenablog.com/entry/hello-digitalocean

# まとめ

forgeとDigital oceanを使えば、簡単にサーバー構築が出来ます。二つとも海外のサービスなので、基本英語。なので、最初はとっつきにくいです。ただ、その分ネットに情報はたくさんあるし、わかってくれば使いこなせます。

forge のキャッチコピーはServer management doesn't have to be a nightmare.
直訳すると「サーバー管理は悪夢である必要がありません」という意味です。　そのコピーの通り、誰でも簡単に操作できるし、楽に管理できます！　

価格も安いし、ぜひ、使ってみてくださいねー！



Advent Calendar 9日目でした。
明日10日目は Hiroaki Moriyamaさんによる記事を乞うご期待！
https://adventar.org/calendars/4548