php開発環境の管理に超便利なLaravel Forgeの始め方 (上)

# Laravel Forgeとは

![Laravel Forge   Instant PHP Servers.png](https://qiita-image-store.s3.amazonaws.com/0/7519/1e403e51-648f-c435-27a2-d928699b8a60.png)

[Laravel Forge](https://forge.laravel.com/)とは、phpのフレームワークとして人気のある[Laravel](https://laravel.com/)をメンテナンスしているLaravel LLCが運営するサービスで、PHPのウェブアプリを[DigitalOcean](https://www.digitalocean.com/), [Linode](https://www.linode.com/), [AWS](https://aws.amazon.com/jp/)などのクラウド環境にホスティングするための環境構築を楽にしてくれます。[WordPress](https://wordpress.org/)にも対応しているので、ウェブサイトのホスティングにも使えます。

# 開発環境の管理に最適

元々、Laravelで作成したウェブアプリをスケーラブルにデプロイできる本番環境は何かないものか、と探しているときに見つけたものですが、ざっと試してみたところ、どうやら複数のサーバーインスタンスをひとまとめに管理するようなオーケストレーション向けのツールではなくて、むしろその逆に、一つのインスタンスに複数のアプリ環境を構築するのに向いているサービスだということが分かってきました。

当社は受託で沢山のウェブサイトやシステムをクライアントに提供しているので、毎回本番環境の他に開発環境を立てるのはそれなりに手間がかかります。開発環境は、ローンチ後に使われることはあまりないのですが、忘れた頃に追加開発や修正の依頼が来るので、保守が続く限り手放せません。なので、出来るだけリソースを節約するために一つのインスタンスに沢山の環境を入れて、サブドメインでVirtual Hostを割り振るという使い方をしているわけです。（もちろん、アクセスは社内IPに限定します）

しかし、この管理がなかなかめんどくさいのです。サバ管には、こんな依頼がひっきりなしに飛んできます。

- 新規案件が取れたので環境作って！
- この環境だけBasic認証いれて！
- クライアント確認が入るからこの環境だけIP制限外して！
- この環境に○○さん（開発者）のWriteパーミッションが欲しい！
- WordPress入れるからDBを一つ割り当てお願い！

てな具合です。

ある程度の規模感の開発案件であれば、個人がそれぞれローカルにDocker建ててGitHbub flowで云々、とかいうのがモダンな手法なんでしょうが、3日で仕上げなければならないウェブサイトのマークアップなんかは共有環境で数人でババッと仕上げちゃった方が速かったりしますからね。

Laravel Forgeはこんなあなたのお悩みを解決してくれます。（回し者ではありません）

# AWSにForge用のインスタンスを立てる

Laravel Forgeはあくまで環境構築の楽にしてくれるツールで、自ら開発環境をホスティングしません。別途DigitalOceanやAWSなどのアカウントが必要です。今回は、AWSに立ててみましょう。インスタンスの起動はForge側からやるので、まずはAWSのIAMユーザーを用意して、キーをForgeに登録します。ここではAmazonEC2FullAccessを割り当てました。

![IAM Management Console.png](https://qiita-image-store.s3.amazonaws.com/0/7519/64b0085f-55b5-1561-18d0-e1cbd0eb5b40.png)

![IAM Management Console (1).png](https://qiita-image-store.s3.amazonaws.com/0/7519/2bc9dfe3-ea76-eda5-9028-e565e9093b5a.png)

![IAM Management Console (2).png](https://qiita-image-store.s3.amazonaws.com/0/7519/80971ab3-9b50-2498-53cc-0cbaa0efc0df.png)

![IAM Management Console (3).png](https://qiita-image-store.s3.amazonaws.com/0/7519/1f9bfda5-967a-38fd-d805-637d3b76b7fb.png)

![IAM Management Console (4).png](https://qiita-image-store.s3.amazonaws.com/0/7519/731452a4-a4ad-1279-4346-e970e194fbfc.png)

ここで、アクセスキーIDとシークレットアクセスキーを控え、Forgeの管理画面のMy AccountからService Providerとして登録します。Profile Nameは分かりやすいものをつけておくと良いでしょう。

![Laravel Forge   PHP Hosting For Artisans.png](https://qiita-image-store.s3.amazonaws.com/0/7519/9cd98726-c0dd-238c-d2a6-546ee6e06e19.png)

Service Providerを登録すると、サーバーの作成（AWSの場合はEC2の起動）が出来るようになります。

![Laravel Forge   PHP Hosting For Artisans (5).png](https://qiita-image-store.s3.amazonaws.com/0/7519/820f6012-ac71-c875-ac3f-3f24225d5e30.png)

credentialsには先ほど登録したService Providerを選択します。NameはForgeがデフォルトで適当な名前を付けてくれるのですが、長くて覚えにくいので適当なサーバー名を振りましょう（当社では伝統的にサーバー名はトランペッターの名前と決まっています）。サーバーのサイズは後でAWS側で変更可能なのでとりあえずt2.nanoを選択しておきました。VPCはDefaultを選択すると、Laravel Forgeという名前のVPCを自動的に作ってくれるようです（デフォルトのVPCという意味ではないようです）。既存のVPCも選べるみたいですが、何か制限があるようで手元の環境ではうまく行かなかったです。

ここでデータベースの種類を選んでおけば、インスタンス内にDBサーバーを立ててもらえます。小さなインスタンスの場合にはウェブサーバーと同居するのは微妙なところですが、ここにDBを作成しておけば、後々管理画面からDBやDBユーザーの管理が出来るので便利です。その意味でも開発サーバー向けといえると思います。もちろんアプリ側でRDSにつなぎ替えるなども出来ますが、そうするとその利便性は失われるので、微妙なところだと思います。

![Laravel Forge   PHP Hosting For Artisans (6).png](https://qiita-image-store.s3.amazonaws.com/0/7519/e75a0905-d417-1903-93a3-78d14cb36de1.png)

Create Serverで先に進むと、設定に問題が無ければこんなモーダルが表示されます。これらは後で必要になるので控えておきましょう。プロビジョニングは10分ぐらいかかるので、コーヒーでも飲みながら待ちましょう。時々管理画面で進捗を確認しても良いですが、完了すると登録メールアドレスにメールが飛んできます。（上記パスワードはメールにも記載されています）

プロビジョニングが完了したら、サーバー設定からsshログイン用の公開鍵を登録しましょう。ちなみに、My Accountに予め公開鍵を登録しておけば、サーバーを作成する際に毎回コピーされるようです。頻繁にサーバーを作成するのであれば、そちらの方が便利でしょう。この際にログイン用のIP Addresssも控えておきます。

![Laravel Forge   PHP Hosting For Artisans (8).png](https://qiita-image-store.s3.amazonaws.com/0/7519/367b50c3-c1b0-8238-3292-5cdda090fb61.png)

![Laravel Forge   sandoval.png](https://qiita-image-store.s3.amazonaws.com/0/7519/511a664b-6e8f-7808-d6e2-18957b78a8d4.png)

ここまで来れば、あとは作成したサーバーにforgeユーザーでsshでログイン出来ます。(xxx.xxx.xxx.xxx は実際のIPアドレスを入力）

```bash
$ ssh -i .ssh/forge forge@xxx.xxx.xxx.xxx
Enter passphrase for key '.ssh/forge':
Welcome to Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-1007-aws x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Tue Jul 24 10:01:05 UTC 2018

  System load:  0.0                Processes:           99
  Usage of /:   16.4% of 19.32GB   Users logged in:     0
  Memory usage: 72%                IP address for eth0: 10.0.1.23
  Swap usage:   0%


  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

8 packages can be updated.
7 updates are security updates.


*** System restart required ***
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

forge@sandoval:~$ ls ~
default
forge@sandoval:~$ ls ~/default/
public
forge@sandoval:~$ ls ~/default/public/
index.php
forge@sandoval:~$ cat ~/default/public/index.php 
<?php phpinfo();
```

どうやら、OSはUbuntuのようで、forgeのホームディレクトリにdefatulのサイトが配置されています。先ほど控えたIPアドレスにブラウザーでアクセスすると、デフォルトのサイトにphpinfoが立ち上がっています。なお、sudoの際には先ほど控えたSudo Passwordが必要です（ちょっとめんどくさいですね）。

![phpinfo  .png](https://qiita-image-store.s3.amazonaws.com/0/7519/5e13673f-398c-6fbf-7622-949c97295321.png)

最後に、sshポートのアクセスの制限をかけておきましょう。(下記追記参照)<del>どうもRuleの設定がうまくいかない場合があるようなので、</del>予めsshログインしておいて、ufwコマンドできちんと設定されているか確認した方が良いかもしれません。もしくは、AWSのセキュリティルール側で閉じる方法もあると思います（どうやらForgeが作成するデフォルトのセキュリティグループは全ポート開放という恐ろしい設定のようなので）。

![Laravel Forge   sandoval (4).png](https://qiita-image-store.s3.amazonaws.com/0/7519/168e42a8-74f8-cc08-b620-5573ca3e9020.png)

### 2018年07月25日追記 (2022年11月30日IP修正)
Laravel Forgeは管理画面からの設定変更もsshアクセスを使っているようで、そのための穴を開ける必要があるようです。サポートに確認したところ、下記の2つのIPを使っているとのことですので、それらを追記しました。Anyの設定を消す前にこれらを追加する必要がありそうです。

- 159.203.150.232
- 159.203.150.216
- 45.55.124.124

(参考) https://forge.laravel.com/docs/1.0/introduction.html#forge-ip-addresses

![Laravel Forge   sandoval (14).png](https://qiita-image-store.s3.amazonaws.com/0/7519/eb39ef63-a05d-2c12-bd94-856ad22ab84f.png)

次回は、Server内にSiteを作成する方法などについてご紹介したいと思います。

# 本記事のリスト
- php開発環境の管理に超便利なLaravel Forgeの始め方 (上)
- [php開発環境の管理に超便利なLaravel Forgeの始め方 (中)](https://qiita.com/MasaGon/items/54bfd67812de9db533a7)
- [php開発環境の管理に超便利なLaravel Forgeの始め方 (下)](https://qiita.com/MasaGon/items/7892d25a6469947ed20b)