さくらレンタルサーバーにLaravelを入れてとりあえず動くようにした話

# はじめに
さくらインターネット（スタンダード）にSSH接続して環境設定した話。
ついでに色々設定いじって本番環境として稼働できるように調整した話とか。

# サーバー設定
## ssh接続

```bash:console(local)
ssh (username)@(hostname).sakura.ne.jp
password : 'Your password'
```

## 文字コード設定
デフォルトの設定のままだと日本語ファイルが文字化けする。
設定を変える。
ついでに使い慣れたbashで操作できるようにしておく。

```bash:console(sakura)
cd ~
# 以下、なければ新規に作る...設定ファイルは下記参照
vim ~/.bashrc
vim ~/.bash_profile
vim ~/.vimrc

# bashへ切り替え
chsh -s /usr/local/bin/bash

# 一旦ログアウトして設定を反映させる
exit
```

<details><summary>各設定ファイル記述</summary><div>

```ini:~/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# User specific aliases and functions
alias h='history 25'
alias j='jobs -l'
alias la='ls -a'
alias lf='ls -FA'
alias ll='ls -lA'
alias vi='jvim3 -K TTT -k t'

# A righteous umask
umask 22

export EDITOR=jvim3
export LANG=ja_JP.UTF-8
export PAGER=more
export BLOCKSIZE=K
export PKG_DBDIR=~/db/pkg
```

```ini:~/.vimrc
# 矢印キーでDとかBとか表示される問題の解決
set nocompatible
# バックスペースキーで文字削除できない問題の解決
set backspace=indent,eol,start
```

```ini:~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi

# User specific environment and startup programs
PATH=$PATH:$HOME/bin

# environment language
LANG=ja_JP.UTF-8;
MM_CHARSET=UTF_8;

export PATH
```
</div></details>

## composerのインストール
composerを入れておかないと依存関係の解決ができないため、入れる。

2015−05−25追記：
`composer install` したらタスクが殺されてしまいました...。
どうやら処理に時間がかかりすぎるとダメみたいです？
FTPでファイルアップロードして対応。謎。

```bash:console(sakura)
cd ~
mkdir bin
# 環境変数PATHに$HOME/binが含まれていることを確認
cat ~/.profile | grep HOME/bin
# インストール
curl -sS https://getcomposer.org/installer | php -- --install-dir=bin --filename=composer
chmod 755 bin/composer

# アップデート
composer self-update
```
# プロジェクト設定
## プロジェクトをcloneする

```bash:console(sakura)
cd ~/www/
git clone 'repository'

# 依存関係の注入とアップデート
cd /{project_root}
composer install
composer update
composer dump-autoload
```

後から気づきましたが、プロジェクト本体を``/home/{account_name}/www``直下に置く必要はなく、**シンボリックリンク**さえ置いておけばいいようです。
面倒なのでこのまま行きます。

## さくらインターネット側設定
独自ドメインで公開する場合、事前に取得しといてください。
SSL化までするなら反映までに数十分～数時間かかる場合があるので注意。

### 管理コンソールにつなぐ
![2018-02-19_13h24_52.png](https://qiita-image-store.s3.amazonaws.com/0/165355/62dc5635-d97b-4984-c98a-ba9f4c14add0.png)
さくらインターネットのサーバーコンソールに接続します。
「ドメイン設定」項目の「ドメイン/SSL接続」から対象のドメインを選択します。

### 「マルチドメインの対象フォルダ」を「('プロジェクトルート')/public」に変更
![2018-02-19_13h28_17.png](https://qiita-image-store.s3.amazonaws.com/0/165355/3a54be21-4403-a50b-06f9-4100204911c9.png)
[**前に話した**](https://qiita.com/tosite0345/items/b9ec1594f359f03b0403#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%83%AB%E3%83%BC%E3%83%88%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E8%A1%8C%E3%81%86)通り、Laravelは``/{project_root}/public``以下の``index.php``で全てのアクセスを捌いています。
ですので、今回も同様に、指定フォルダの中に``/{project_root}/public``を設定します。

>Laravelは一度``/[project]/public/index.php``にアクセスさせて、そこで全てのアクセスを捌いている模様。
なのでデフォルトのドキュメントルートを変更して、``public``へとルーティングするように設定を変える。


## .htaccess設定
なんかここいじらないとうまくいかないっぽい。
[**こちらの記事**](https://qiita.com/michimani/items/1e4d3fffcbec1d44e39e#htaccess%E3%81%AE%E5%86%85%E5%AE%B9%E5%A4%89%E6%9B%B4)を参考に、``.htaccess``の値に追記する。

<details><summary>.htaccess設定値</summary><div>

```diff:{project_root}/public.htaccess
<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

+   RewriteBase /

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>
```
</div>
</details>

## データベース設定
データベースの設定も変更してあげる必要がある。
基本的には``.env``だけでいいのだけど、環境によっては``{project_root}/config/database.php``をいじいじする必要があるかもしれない。
なお、ここで言う``{db_host}``などの変数は下記資料をご参考に。
当然、設定し終わったらいつもの``php artisan config:cache``を忘れないようにする。
![2018-02-20_10h53_02.png](https://qiita-image-store.s3.amazonaws.com/0/165355/d4569bca-174a-02dc-ce4b-a920d7be42a0.png)

```ini:{project_root}/.env
DB_CONNECTION=mysql
DB_HOST={db_host}.db.sakura.ne.jp
DB_PORT=3306

DB_DATABASE={account_name}_{db_name}
DB_USERNAME={db_user_name}
DB_PASSWORD={db_password}
```

## CRON設定
[**前の記事**](https://qiita.com/tosite0345/items/b9ec1594f359f03b0403#supervisor%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B)ではOSに``supervisor``サービスを入れられていたので良かったが、さくらサーバーではそれができない。
root権限必要だからね。
ほとほと困っていたところに調べてみたらCRONが使えることが判明。
設定しました。でもCRONもハマったので。

### 事前にジョブを作成

![2018-02-19_13h05_18.png](https://qiita-image-store.s3.amazonaws.com/0/165355/d7f19469-1fe7-7198-dcb1-d03e9500984a.png)
「新規項目の追加」から

![2018-02-19_13h05_56.png](https://qiita-image-store.s3.amazonaws.com/0/165355/d77e1e02-cbac-71a5-c519-f31b0bc2c7e9.png)
実行コマンドを登録します。
今回登録したコマンドはこれ。
ポイントは、先にプロジェクトルートへ``cd``している点。
``artisan``へのフルパスを記述しても通りませんでした。

なお、**登録できるCRONは5つまで**みたいです。注意。

```bash:cron
# 先に自プロジェクトに移動しておかないとartisanがうまく動かない
cd /home/{account_name}/www/{project_name}; /usr/local/bin/php artisan queue:work

# わるいれい
/usr/local/bin/php /home/{account_name}/www/{project_name}/artisan queue:work
```

### スケジュールを登録
実例を参考に。
なお、最短でも５分おきぐらいじゃないと怒られて登録できません。残念。

+ ５分おきに実行したい場合

|項目|値|
|----|----|
|月|*|
|日|*|
|時|*|
|分|*/5|
|曜日|日 月 火 水 木 金 土|

...多分ググったほうが早いです。

## メール設定
Jobの実行結果をメールしたりすることもあると思うので。
Gmailのアカウントをそのまま使ってもいいのだけどね。

### 事前に管理コンソールからアカウントを作成しておく
![2018-02-19_12h56_59.png](https://qiita-image-store.s3.amazonaws.com/0/165355/a74b2a27-4bb9-6b80-693e-88b31cee3aed.png)

### .envファイルの修正
``.env``ファイルのメール設定を次のように修正。
``info@{account_name}.sakura.ne.jp``を例に解説する。

```ini:{project_root}/.env
MAIL_DRIVER=smtp
MAIL_HOST={account_name}.sakura.ne.jp
MAIL_PORT=587
MAIL_USERNAME=info@{account_name}.sakura.ne.jp
# 独自ドメインであれば、info@{独自ドメイン}でも可能
MAIL_FROM_NAME={display_user_name}
MAIL_PASSWORD={password}
MAIL_ENCRYPTION=tls
```

### テストメール送信
**以下の操作はssh接続後のさくらサーバー上で行うこと。**

念のため``composer``やら``cache``やらを再設定しときます。
当然だけどさくらサーバー内でしかメール送れないからな！
``homestead``上で設定してもメール送れないからな！
~~ハマったなんて言わないもん~~

```bash:console(sakura)
cd /home/{account_name}/www/{project_name}

# キャッシュの設定
composer dump-autoload
php artisan config:cache

php artisan tinker

### tinker ###
Mail::raw('Test Mail', function($message) { $message->to('{test_address}')->subject('test'); });
# =>null ... nullが返ってくればテスト成功
```

# 所感
さくらインターネットしゅごい。
[**ステージング環境**](https://help.sakura.ad.jp/hc/ja/articles/115000200481--%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97-%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0-%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E3%82%B5%E3%83%BC%E3%83%90%E4%BD%9C%E6%88%90-%E5%89%8A%E9%99%A4%E6%89%8B%E9%A0%86)とかもらくらく作れちゃうっぽい。