Laravelプロジェクトのサーバ環境構築

linuxサーバーにて、laravelの環境を構築したので備忘。

##ローカルにlaravelプロジェクトの作成
既存サーバー環境にlaravelにて開発した別プロジェクトがいたので、バージョンを合わせてプロジェクトの作成。
既存laravelのバージョン確認。
laravelのルートディレクトリにて下記を実行。

```
php artisan -V
```

```title:結果
5.5.20
```
LTS(Long-Term Stability:長期間安定性)のバージョン。

今回はlaradockを使用しているので、dockerにてlaravelプロジェクトの作成。
こちらを参照。
https://qiita.com/tomborius/items/6a5f3a8e4f6f477d96c7

１点だけ違うのが、laravelのバージョン指定をして作成。

```
composer create-project "laravel/laravel=5.5.*" project_name
```

##git管理
ローカルに作成したプロジェクトをbitbucketにて管理する。
bitbucketにて新規プロジェクト用のリポジトリを新規作成。

git管理したいプロジェクトのディレクトリまで移動して下記を実行。

```
git init
git add -A
git commit -m "first commit"
```

ローカルのリポジトリとリモートのリポジトリを紐付け。
bitbucketのクローンするときに出てくるhttpをコピーして下記に貼り付け。

```
git remote add origin https://xxxxxx@bitbucket.org/yyyyyyyyy/zzzzzzzzz.git
```

準備が整ったのでpush

```
git push origin master
```

エラー...

```
failed to push some refs to 'https://xxxxxx@bitbucket.org/yyyyyyyyy/zzzzzzzzz.git'
```

どうやら、ローカルのreadmeとリモートのreadmeとで競合が発生。
ローカルの方を強制的に正しいこととする。

```
git merge --allow-unrelated-histories origin/master
git push origin master
```
成功。
あとは、使う想定のブランチを切る。


##サーバに新プロジェクト用のドメインを追加
rootにてサーバにログイン。
useraddにてユーザを追加する。

```
useradd new_user
```
ついでに、パスワードも変更しておく。

```
passwd new_user
```

new_userにて再度サーバにログイン。

ルートにするディレクトリにて、クローンを実行。
このとき、このあとに作成する自動デプロイ機能を活用するために、httpではなくsshにてクローンをする。

##envファイル

```
cp .env.sample .env
```
.envの中を対処プロジェクトによって変更する。

##デプロイ
envoyファイルの作成

```php
@include("./vendor/autoload.php")

@servers(['dev' => ['new_user@192.168.xxx.yyy']])

@story('deploy_dev',  ['on' => 'dev'])
chdir_app_root
git_develop
migrate
remove_cache
@endstory

@task('chdir_app_root')
cd ~/htdocs
@endtask

@task('git_develop')
cd ~/htdocs
git pull origin develop
@endtask

@task('remove_cache')
cd ~/htdocs
~/bin/composer dump-autoload
php artisan clear-compiled
php artisan optimize
php artisan config:cache

rm -f ~/htdocs/bootstrap/cache/config.php
@endtask

@task('migrate')
cd ~/htdocs
php artisan migrate
@endtask
```

デプロイを実施。
下記をルートディレクトリにて実行。

```
envoy run deploy_dev
``` 

gitからのpullはできたけど、エラー…
`/vendor/autoload.php`
がない。

そもそも、composerがインストールされていない！
とりあえずはcomposerのインストール。

```
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

「composer」で使用できるようにbinへ移動。

```
mv composer.phar /usr/local/bin/composer
```

composerのインストール完了！
そしたら、composer.jsonから必要なライブラリをインストール。

```
composer install
```

`/vendor/autoload.php`が作成されたことを確認。

再度envoy → 正常に完了。


##apacheの設定
まずはconfigの設定。
既存のapacheにプロジェクトを追加するので、現状の設定を確認。
まずは、`/etc/httpd/conf/httpd.conf`の内容を確認。

複数サイトの管理をしているので、サイトごとのconfigをincludeしている。
`IncludeOptional conf.d/*.conf`

`/etc/httpd/conf.d`の.confを確認。
`ssl.conf`にサイトごとの記載あり。

既存の書き方を真似て、virtualhostを追記。

あとやったとこと：
・virtualhostにて記載しているログファイルの書き出しディレクトリの整備
・pathへの追記
・ssl接続の設定

**この辺りの設定をミスると、apache再起動時に再起動しなくなるので注意！！**

最後に、apacheに変更後の設定を反映させる。
すでに動いている環境があるので、再起動ではなく`reload(graceful)`を行う。

```
systemctl reload httpd
```

systemctlでのreloadがhttpdのgracefulになる記述は下記。

```
cat /usr/lib/systemd/system/httpd.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
Environment=LANG=C

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
```

実行後、apacheのステータスを確認する。

```
systemctl status httpd
```
エラーになっていなければ完了。

作成したサイトにアクセス。

```
403 Forbidden
You don't have permission to access / on this server
```

パーミッションの設定は確かに何もしていない。
新規で作成したディレクトリのパーミッションを変更。
そもそも、パーミッションについてあまり知らない…
@shisamaさんの記事が非常にわかりやすかったので、下記リンクになります。
https://qiita.com/shisama/items/5f4c4fa768642aad9e06

```title:permissionの変更対象
・ルートディレクトリ(755)
・~/laravel/public/storage/logs(777)
・~/laravel/public/storage/framework(777)
　※framework内の全ディレクトリ
```

再度実行。

```
RuntimeException 
No application encryption key has been specified.
```

またまたエラー。
調べると`.env`の`APP_KEY`がないとのこと。
下記を実行。

```
php artisan key:generate
```

その後.envのAPP_KEYが入っていることを確認。
再度アクセスし、Laravel起動を確認し完了。