KUSANAGI9でLaravelデプロイ <- TetraCalibers
TetraCalibers :
    -   for : science student & programmer
KUSANAGI9でLaravelデプロイ
    さくらのVPSでKUSANAGI9を借りて初めてのサーバー構築・Laravelのデプロイに挑戦。 KUSANAGI9とKUSANAGI8は結構違うぞ…9の情報がほとんど無くて大変だったぞ…
    何が起きても困らないよう、行動をすべてメモしておいたので、ざっくり編纂して載せておきます。

     

    環境

     

    手元の環境はこんな感じ。
    • macOS Big Sur
    • MacBook Pro (13-inch, M1, 2020)
    • Apple M1チップ
    • メモリ8GB

     

    さくらのVPS契約プランはこんな感じ。
    • 石狩第1ゾーン
    • SSD 50GB
    • 仮想2Core
    • 1GB メモリ

     

    VPSでのOSインストール時の設定はこんな感じ。
    • 標準OSのKUSANAGI9(CentOS Stream8 x86_64)
    • スタートアップスクリプトは利用しない
    • パケットフィルターは利用する
    • SSHキーは登録しない

     

    パケットフィルターの設定はこんな感じ。
    • SSH:TCP 22(送信元IPアドレス:すべて許可する)
    • Web:TCP 80/443(送信元IPアドレス:すべて許可する)
    • メール:TCP 25/110/143/465/587/993/995(送信元IPアドレス:すべて許可する)
    • カスタム:TCP 10000(送信元IPアドレス:すべて許可する)
    カスタムポートは10000番としているが、1024~65535番ならなんでもOK。

     

    ssh(公開鍵認証)で接続

     https://laraweb.net/environment/8266/ を参考に、公開鍵認証でログインできるようにしておく。
    (手順をメモし忘れた&&特にはまることもなかったので丸投げ)

     

    手元のMacのターミナルで、
    ssh -i ~/.ssh/client_rsa root@100.100.100.100
    
    を実行し、何か聞かれたらとりあえずyes、パスワードを入力してログインできたら成功。
    client_rsaのパスは各自の環境に応じて書き換えてくれ。 100.100.100.100の部分は、各自のVPSのIPv4アドレスに書き換え。
    今後も仮のIPアドレスとして100.100.100.100と表記するのでその都度よろしく。

     

    さて、ちょっとどういう警告内容だったか忘れたのだが、とりあえず謎の警告が出たら、~/.ssh/known_hosts をエディタで開いて、
    VPSのIPアドレスで始まる行を削除&&保存してからやり直せば大抵うまくいく。
    (これでうまくいかなかったら警告内容をGoogle等にペーストして検索)

     

    KUSANAGIの初期設定

     

    さて、ここからはKUSANAGIさんを遠隔操作しての作業になる。
    ssh接続している状態で、次のコマンドを実行。
    dnf update -y
    

     

    KUSANAGI9ならこれだけで大丈夫らしいのだが、もし何か予想外の事態が起きたら、
    yum update kusanagi -y
    yum --enablerepo=remi update -y
    dnf update -y
    
    とすればうまくいくかもしれない。(私はdnf update -y だけで済むことを知らずにこの3つを実行した。)

     

    上記のコマンドでKUSANAGIさんの中身が最新の状態になった。
    今度は自分好みに仕立てていく。

     

    ますはinit。私は次のコマンドを実行した。(各々異なるのでまだ実行すな)
    kusanagi init --tz Asia/Tokyo --lang ja --keyboard ja --passwd ユーザkusanagi用のパスワード --phrase SSHユーザ鍵用のパスワード --dbrootpass データベースroot用のパスワード --httpd24 --php80 --mariadb10.3
    

     --httpd24 によって、nginxではなくApacheサーバを使うことになる。--php80 によって、PHP8.0が使えるようにセットアップされる。-mariadb10.3 でMariaDBのバージョンを10.3に指定。ローカル開発環境MAMPのMySQL5.7と互換性があるバージョンを指定した。

     

    これらのオプションの詳細はhttps://kusanagi.tokyo/kusanagi9/document/kusanagi-init/ を参照。

     

    MariaDBとMySQLの互換性については、https://qiita.com/katzueno/items/e735950c7440f232ef27 を参考にした。

     

    …よし、initしてくれ。
    次はユーザの追加を行う。次のコマンドで、新規ユーザtomixyを作成し、sudo権限を与える。
    useradd -G wheel tomixy
    

     

    ユーザtomixyのパスワードを設定。次のコマンドを実行するとパスワード設定のための対話が始まる。
    passwd tomixy
    

     

    セキュリティ設定1-rootログインの禁止

     

    tomixyユーザでssh鍵認証ログインができるようにし、 rootでのログインができないようにしていく。

     

    tomixyユーザでの鍵認証ログイン設定用ディレクトリを作成
    mkdir /home/tomixy/.ssh
    

     

    このディレクトリへのアクセス権を適切に設定
    chmod 700 /home/tomixy/.ssh/
    

     

    鍵認証ログイン設定ファイルを編集していく。
    まずは次のコマンドで設定ファイルをvimで開く。
    sudo vim /etc/ssh/sshd_config
    

     

    ターミナルがおどろおどろしいエディタっぽくなったら、とりあえずiキーを押して書き込みモードにする。
    そして次のような記述を見つけて、以下の通りにyesとnoや冒頭の#を設定すること。

     

    PermitRootLogin no
    PasswordAuthentication yes
    PubkeyAuthentication yes
    #GSSAPIAuthentication yes
    #GSSAPICleanupCredentials no
    UsePAM yes
    

     

    それぞれの行がバラバラの場所にあるので、矢印キーでスクロールさせて注意深く探して欲しい。
    上記のように編集できたら、esc キーを押してコマンドモードに変更。
    その状態で:wq と入力すれば、ファイルが上書き保存される。

     

    さて、設定を書き換えたので再起動。
    systemctl restart sshd.service
    

     

    今のターミナルはそのままで、別ウィンドウのターミナルを立ち上げる。
    別ウィンドウで立ち上げたターミナルでは、当然まだssh接続されていないはず。そこで、このターミナルでssh接続確認を行う。 (別ウィンドウで立ち上げず、ssh接続を一旦切って再接続を試みてもいいが、それだと設定に誤りがあった場合に二度とssh接続できなくなるぞ。私はそんな感じで10回近くOSの再インストールをする羽目になりました。)

     

    ssh -i ~/.ssh/client_rsa root@100.100.100.100
    
    でログインできず、
    ssh -i ~/.ssh/client_rsa tomixy@100.100.100.100
    
    でログインできたら成功。

     

    成功したら、確認用に開いたターミナルはexitを実行して接続を切っておく。

     

    セキュリティ設定2-ssh接続ポートの変更

     

    デフォルトではssh接続用のポートは22になっているが、このポートは当然開いているものだと思って不正アクセスしようとする輩が集まるらしい。 そこで、22番ポートを閉鎖し、代わりの別なポートを開放する処置を行っておく。
    その代わりのポートは1024~65535番が推奨されているらしい。なんでもよいが、仮に10000だとして話を進める。
    10000以外を選んだ場合は、今後の10000の部分を選んだ番号に読み替えるとともに、パケットフィルタのカスタムポートの番号もその番号に変更しておくこと。

     

    さて、選んだポートが使用可能かどうかを調べておく。
    sudo lsof -i:10000
    
    何も表示されなければ使用可能。使用可能でなければ別な番号でトライ。

     

    使用可能なポートが見つかったら、それを設定ファイルに書き込んでおく。
    またさっきの設定ファイルを開く。
    sudo vim /etc/ssh/sshd_config
    
    i を押して、Portの行を次のように変更。
    Port 10000
    
    esc を押し、:wq で上書き保存。

     

    設定を書き換えたので再起動。
    systemctl restart sshd.service
    

     

    また別ウィンドウで接続チェック。
    ssh -i ~/.ssh/client_rsa tomixy@100.100.100.100
    
    でログインできず、
    ssh -i ~/.ssh/client_rsa tomixy@100.100.100.100 -p 10000
    
    でログインできたら成功。

     

    セキュリティ設定3-パスワードログインの禁止

     

    パスワードは総当たり攻撃でいずれ破られるので、鍵認証でないとログインできないようにしておく必要がある。
    試しにパスワードログインしてみる。接続確認用ウィンドウでexit して、
    ssh tomixy@100.100.100.100 -p 10000
    
    でログインできるはず。

     

    ログインできちゃったらアウトなので、また設定ファイルを書き換える。
    vimで開いて、
    sudo vim /etc/ssh/sshd_config
    
    i を押して、次の行をnoに直す。
    PasswordAuthentication no
    
    esc を押して、:wq で上書き保存。再起動。
    systemctl restart sshd.service
    

     

    また接続確認用ウィンドウでexitしてから次の鍵認証ログインを試みる。
    ssh -i ~/.ssh/client_rsa tomixy@100.100.100.100 -p 10000
    
    エラーが出て入れない場合もあるはず。鍵認証ログインはできないと困るので、どうにかしなければならない。

     

    ログインできなかった場合は次の処置を行う。
    tomixyユーザの.sshディレクトリに移動
    cd /home/tomixy/.ssh
    

     

    ちょっと一旦仮想世界から離れて。
    手元のMacPCの~/.ssh/id_rsa.pub をエディタ等で開いて、その内容をコピーしておく。

     

    はい仮想世界に復帰。
    次のコマンドでauthorized_keys ファイルを開く。(ファイルがなかったら自動で新規作成される。)
    sudo vim authorized_keys
    
    i を押して、さっきコピーした内容をペースト。esc を押して、:wq で上書き保存。

     

    再起動。
    systemctl restart sshd.service
    

     

    接続確認用ウィンドウで、
    ssh -i ~/.ssh/client_rsa tomixy@100.100.100.100 -p 10000
    
    でログインできることを確認。

     

    よっしゃ鍵認証ログインが回復。
    それじゃ、当初の目的だったパスワードログインが不可能になっているかどうか確認してみる。
    ssh tomixy@100.100.100.100 -p 10000
    
    で入れなければ、成功!

     

    本当はファイアウォールとかもやるんだろうけど、今回はパケットフィルタがあるので割愛。

     

    独自ドメイン取得とDNS設定

     

    これに関してはVPSやドメイン取得サービスによって手順が異なるので、流れだけ述べることにする。

     

    私はお名前ドットコムでドメインを取得し、さくらのVPS管理画面上の設定はhttps://laraweb.net/environment/8344/ を見て行った。

     

    この設定を行うことで、さくらのVPSのドメインコントロールパネルでNS(ネームサーバー)を確認することができるようになる。
    このNSのデータを、お名前ドットコムの管理画面に登録することで、設定が完了する。

     

    設定完了からドメイン名でアクセスできるようになるまでに24~72時間ほどかかると言われたが、私の場合は一晩寝たらアクセスできるようになっていた。

     

    実行環境をセットアップ

     

    sudoを入力するのが面倒なので、rootユーザに切り替えよう。
    su -
    
    と入力し、パスワードを求められたらrootユーザのパスワードを入力。

     

    Laravelのために必要なLAMPセットを用意する。 私は次のコマンドを実行した。これも各々異なるのでまだ実行すな。
    kusanagi provision --lamp --fqdn www.独自ドメイン --email メールアドレス --dbname データベース名 --dbuser ユーザ名 --dbpass パスワード Laravel
    

     

    最後のLaravelは任意のフォルダ名でOK。以降、Laravelという単語はここで最後に指定したフォルダ名に置き換えてくれ。

     

    オプションの詳細はhttps://kusanagi.tokyo/kusanagi9/document/kusanagi-provision/ を参照。

     

    しかし、--email オプションは絶対に指定すること。
    独自ドメインが使用可能になっていないとエラーになるが、それでも--noemail では絶対にダメ。
    独自ドメインの設定が終わり、それが反映されてから先に進んでください。

     

    これで、高速化チューニングされたLAMP一式が使えるようになり、プロジェクト格納用ディレクトリLaravelが新規作成される。

     

    LaravelプロジェクトをGitHubに登録

     

    ここからは既に完成済みのLaravelプロジェクトを公開する作業に入る。 ここまでで構築した環境にLaravelを新規インストールする場合は、「VPS Laravel インストール」などと検索すればいくらでも解説記事が見つかるので、別な記事を読むことをおすすめする。

     

    まずはLaravelプロジェクトをGitHubに登録する必要があるのだが、この作業に関しては開発中に既に行っている場合も多いだろう。 まだ登録していない人に向けて、概要だけ述べることとする。細かい話はGoogle先生へ。

     

    GitHubのアカウントを作成し、SSHキーの設定が済んだら、ブラウザ上のGitHub画面右上の+からNew Repository を選択。

     Repository Name を入力し、public を選択。

     Add a README fileAdd .gitignore にチェックを入れ、.gitignore template はLaravelを選択。

     

    すると、Laravelのうち公開したらまずい設定ファイルやnode_modulesフォルダ・venderフォルダは自動で公開対象から除外されるようになる。

     

    リポジトリが作成されたら、緑色のCodeボタンをクリックし、SSH keyをコピーしておく。

     

    今度は手元のPCのターミナルを開いて、次のコマンドを一つずつ実行していく。
    (ssh接続している場合はexitで切断するか、別なウィンドウを開いて作業する。)
    cd プロジェクトディレクトリのパス/
    git init
    git add .
    git commit -m “first commitなどの任意のメッセージ”
    git remote add origin さっきコピーしたリポジトリのSSHkey
    git push origin main
    

     

    各コマンドの意味については、https://note.com/koushikagawa/n/nfccf06fa845b がわかりやすい。

     

    既にプロジェクトディレクトリ内に.gitディレクトリが存在する場合は、それを削除してからgit init すること。

     git push origin main で謎のエラーが出た場合は、次のように対処する。

     

    まずgit branch を実行してみて、* master としか表示されない場合は、
    git checkout -b main
    
    を実行してみる。
    再度git branch を実行してみて、* main と表示されるようになったら、https://qiita.com/yuta_mimi/items/d34a1440914cac128239 通りに進めていけば大概うまくいくはず。

     

    ブラウザでGitHubリポジトリ画面をリロードしてみて、Laravelプロジェクト内の大量のファイルやフォルダが追加されていたら、登録成功。 緑色のCodeボタンをクリックし、HTTPS URLをコピーしておく。

     

    gitでLaravelプロジェクトをデプロイ

     

    さて、再度ssh接続してVPSの遠隔操作に戻る。

     

    VPS上のプロジェクトディレクトリ内に、GitHubに登録した内容を持ってくる。
    cd /home/kusanagi/Laravel
    sudo git clone さっきコピーしたリポジトリのHTTPS_URL
    

     

    ちゃんと輸送成功しているか確認。
    cd リポジトリ名
    ls
    
    で、Laravelプロジェクト内のディレクトリ・ファイル群が表示されたらOK。

     

    KUSANAGIデフォルトのDocumentRootは削除しておく。
    cd ..
    sudo rmdir DocumentRoot
    

     

    .envファイルを設定

     

    輸送されてきたLaravelプロジェクトには、.envファイルが存在しない。 .envファイルは機密情報を含んでいるので、GitHubにアップロードする時点で除外されているのだ。
    雛形の.env.exampleファイルは輸送されてきているので、それをコピーして.envファイルを作成する。
    cd gitリポジトリ名
    sudo cp .env.example .env
    

     

    .envファイル内の設定を書き換える。
    vim .env 
    

     i を押して、次の部分を書き換えていく。(APP_DEBUGはまだtrueにしておく。)

    APP_NAME=プロジェクト名
    APP_ENV=production
    APP_KEY=
    APP_DEBUG=true
    APP_URL=公開後のURL
    
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=データベース名(kusanagi provisionのオプションで指定した名前)
    DB_USERNAME=
    DB_PASSWORD=
    

     esc を押してコマンドモードへ。
    このファイルは読み取り専用になっているので、次のおまじないを使って強制上書き保存する。

    :w !sudo tee %
    
    なにやらOかNを入力せよ、と出たらOを入力。Enter を押してくれ、と言われたら、Enter は押さずに、
    :q!
    
    と入力して脱出。

     

    ドキュメントルートの変更

     

    サーバーをapacheに切り替え。まあこれは多分やらなくても後に影響はない。
    kusanagi httpd
    
    途中何を言われようと、httpd completed.が表示されればそれでよし。

     

    まず、apacheの設定ファイルは次の場所にある。
    cd ./etc/opt/kusanagi/httpd/conf.d
    

     

    さて、vimで開いて編集。
    vim Laravel.conf
    

     

    DocumentRoot /home/kusanagi/Laravel/DocumentRoot
    
    は、
    DocumentRoot /home/kusanagi/Laravel/gitリポジトリ名/public
    
    に変更。

     

    <Directory "/home/kusanagi/Laravel/DocumentRoot">
    
    は、
    <Directory "/home/kusanagi/Laravel/gitリポジトリ名/public">
    
    に変更。

     

    ServerAdminの項目にはメールアドレスを記入。

     

    いくつか同じ記述があるので、必ず最後の行まで見て全てを書き換えること。

     esc を押して、:wq で上書き保存。

     

    再起動。
    kusanagi restart
    

     

    アプリケーションのセットアップ

     

    まず、アクセス権を適切に設定する。
    cd ~
    cd /home/kusanagi/Laravel/gitリポジトリ名
    chown -R httpd.www storage/
    chown -R httpd.www bootstrap/cache/
    

     

    再起動。
    kusanagi restart
    

     

    この状態でブラウザにURLを入力してアクセスすると、Fatal errorが表示される。 それもそのはず。Laravelのコアであるvenderディレクトリがまだ無いのだから。 というわけで、インストール。
    composer install
    

     

    ブラウザリロードしてみると、今度はNo application encryption key has been specifiedエラーに。 アプリケーションキーが無いと言われているので、生成。
    php artisan key:generate
    

     

    データベース接続

     

    ブラウザリロードすると、今度はSQLSTATE[HY000] [2002] No such file or directoryエラーに。 つまり、データベースに接続できていない。まあ何も設定してないから当たり前なんだが。

     

    まず、MySQLのユーザ名とパスワードを特定するため、MySQL設定ファイルの在処を探す。
    cd /
    find . -name ".my.cnf"
    ./root/.my.cnf
    

     

    表示されたパスに移動。
    cd ./root
    

     

    パスワードとユーザ名を確認する。ちゃんとメモしておくこと。
    cat .my.cnf
    

     

    判明したパスワードとユーザ名を.envファイルに記入する。
    cd /home/kusanagi/Laravel/gitリポジトリ名
    vim .env
    

     i を押して、次の部分を変更。

    DB_USERNAME=さっき確認したユーザー名
    DB_PASSWORD=さっき確認したパスワード
    
    esc を押して、:wq で上書き保存。

     

    今度はmysql.sockの在処を探す。次のコマンドを実行して、表示されたパスを先頭の.は除いてメモすること。
    cd /
    find . -name "mysql.sock"
    

     

    実は直すべきは.envファイルだけではない。Laravelのconfigフォルダ内のdatabase.phpにも設定を記入する必要がある。
    cd /home/kusanagi/Laravel/gitリポジトリ名/config
    vim database.php
    
    i を押して、次の箇所を探して次の通りに記入。

     

    'default' => env('DB_CONNECTION', 'mysql'),
    
    'mysql' => [
        'driver' => 'mysql',
        'url' => env('DATABASE_URL'),
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', '設定したデータベース名'),
        'username' => env('DB_USERNAME', 'さっき確認したユーザ名'),
        'password' => env('DB_PASSWORD', 'さっき確認したパスワード'),
        'unix_socket' => env('DB_SOCKET', 'さっき確認したmysql.sockのパス'),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'prefix_indexes' => true,
        'strict' => false,
        'engine' => null,
        'options' => extension_loaded('pdo_mysql') ? array_filter([
            PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
        ]) : [],
    ],
    

     esc を押して、:wq で上書き保存。

     

    phpMyAdminのインストール

     

    ブラウザでアクセスするので、ドキュメントルートにインストールする。
    cd ../public
    wget https://files.phpmyadmin.net/phpMyAdmin/5.1.1/phpMyAdmin-5.1.1-all-languages.zip
    

     

    zipファイルを解凍。
    unzip phpMyAdmin-5.1.1-all-languages.zip
    

     

    フォルダ名が長いので、適当な名前(例としてsampledb)に変更。
    mv phpMyAdmin-5.1.1-all-languages sampledb
    

     

    zipファイルはもういらないので、削除。
    rm -rf phpMyAdmin-5.1.1-all-languages.zip
    

     

    ブラウザでプロジェクトURL/sampledb にアクセスすると、phpMyAdminのログイン画面が表示されるはず。

     

    データ移行の方法はなんでもいいのだが、私はローカル環境で書き溜めたデータが膨大だったため、
    ローカル環境のphpMyAdminのデータを.sqlファイル形式でエクスポートして、そのファイルを今ログインできたphpMyAdminにインポートした。

     

    ブラウザで表示確認

     

    ブラウザでサーバのIPアドレスにアクセスして、トップページが表示されれば成功。
    LaravelやPHPのエラーが表示される場合は、その都度Google先生に聞いて修正する。

     

    参考までに私の事例を紹介しておく。

     

    まず、IPアドレスにアクセスすると、トップページ用のViewが見つからないというエラーが出た。
    原因はviews/Top/index.blade.phpを、コントローラでview('top.index') と呼び出していたことだった。

     

    何がまずいのかわかるだろうか?
    …「Top」と「top」、大文字と小文字の不一致である。

     

    どうやら、MacOSはディレクトリ名の大文字と小文字を区別しないが、CentOSは厳格に区別するらしい。 そのため、ローカル環境では大文字と小文字が一致していなくても問題なく動いていたが、サーバに上げた途端に動かなくなったのである。

     

    また、別ページからトップページへ戻る用のaタグは、href="/" という指定では本番環境では機能しない。href="{{ url('/') }}" としてやれば正常に機能するようになる。

     

    他にも、画像アップロードフォームをテストした際に、「public/images/フォルダへの書き込み権限がない」というエラーも出た。 その場合は、
    sudo chmod 777 該当のフォルダ名
    
    をssh接続した状態で実行してやれば、とりあえず動くようにはなる。

     

    とはいえ、セキュリティ的にはpublicフォルダ内への書き込み権限を与えるのではなく、storageフォルダへのシンボリックリンクを貼るのが最良。

     

    私の場合はIPアドレスによるアクセス制限をかけているページ(CMS管理画面)のアップロードフォームだったので権限付与だけで済ませたが、ユーザが操作する投稿フォームでは書き込み権限付与という方法は取らない方が良いだろう。

     

    アップロード後のソースコード更新

     

    前章で「その都度修正」と書いておきながら、修正の反映方法に触れていなかったのでここで解説する。

     

    ローカル環境でコードを編集したら、そのプロジェクトフォルダで
    git add .
    git commit -m "修正内容の概要"
    git push origin main
    
    を実行してGitHubに反映させる。

     

    今度はVPSにssh接続して、
    su -
    
    でrootユーザに切り替えて、
    cd /home/kusanagi/Laravel/gitリポジトリ名
    git pull origin main
    
    を実行。

     

    ブラウザでリロード(場合によってはスーパーリロード)すると、変更が反映されているはず。

     

    SSLの設定

     

    さて、プロビジョン実行時に--noemail オプションは使うなと散々うるさく言ったので、ここまで来ている方は既にSSL化が済んでいるはず。
    ここでは、SSLに関する諸設定を行う。

     

    まず、SSL設定ファイルは未だにデフォルトのドキュメントルートをドキュメントルートだと思っているので、それを訂正する必要がある。
    cd /etc/letsencrypt/renewal
    vim www.独自ドメイン.conf
    

     

    変更すべきは次の場所。それ以外の行はいじらなくてよし。
    [renewalparams]
    webroot_path = /home/kusanagi/Laravel/gitリポジトリ名/public,
    
    [[webroot_map]]
    独自ドメイン = /home/kusanagi/Laravel/gitリポジトリ名/public
    www.独自ドメイン = /home/kusanagi/Laravel/gitリポジトリ名/public
    

     

    次に、SSL証明書の自動更新をONにしておく。
    cd /home/kusanagi/Laravel
    kusanagi ssl --auto on
    

     

    そして、http://へのアクセスをhttps://にリダイレクトさせるようにする。(いわゆる常時SSL化)
    kusanagi ssl --https redirect Laravel
    

     

    以上で基本的な運用環境構築は終わり!お疲れ様でした〜
    ブラウザ上でURLにアクセスして、正常に稼働していることを確認したら、.envファイルのAPP_DEBUGfalse にしてあげてください。

     

    これ以降は完全に自分用のメモ。
    興味がある方は試してみてもいいが、以下に書かれてあることだけでLaravelでのメール送信ができるようになるわけではないので注意。

     

    メールサーバの構築

     

    とりあえず私が実現したいのは、お問い合わせフォームに投稿された内容が私のメールアドレスに届くようにすることだけなので、そのための最小限の環境構築を行う。
    つまりは配信専用。サーバでのメール受信などを行いたい方はGoogle先生へ。

     

    なお、私はhttps://www.rem-system.com/mail-postfix01/ の見よう見まねでやっただけなので、ざっくりと実例だけを載せるだけに留める。

     

    まず、postfixをインストール。
    yum install postfix
    

     

    私は現段階ではIPv6対応を考えていないので、余計なエラーが出ないように設定ファイルを書き換える。
    cd /
    cd etc
    vim hosts
    
    i を押して、2行め冒頭に#を追加し、:wq で上書き保存。

     

    正しくインストールされているか確認。
    postconf mail_version
    
    でバージョンが表示されたら成功。

     

    使用するメールサーバの選択。
    alternatives --config mta
    
    postfixが選択されている(*がついている)ことを確認して、Enter を押す。

     

    次はメールアドレスなどの設定を行う。
    cd /etc/postfix
    
    ここにあるmain.cfは、次のようにしてバックアップを取っておく。
    cp main.cf main.cf.org 
    
    バックアップを取ったので堂々と書き換えを行う。
    vim main.cf
    
    次の箇所を修正。
    myhostname = サーバホスト名.独自ドメイン
    mydomain = 独自ドメイン
    inet_protocols = ipv4
    
    メールアドレスにサーバホスト名が含まれると長ったるしいので、次の行を追加。
    masquerade_domains = 独自ドメイン
    
    esc:wq を押して上書き保存。

     

    設定が反映されていることを確認。
    postconf -n
    

     

    メールサーバを再起動。
    systemctl restart postfix
    

     

    まだサーバが起動していなかった場合は、次のコマンドで起動。
    systemctl start postfix.service
    

     

    PC起動時にメールサーバを自動で有効化するよう設定。
    systemctl enable postfix.service
    

     

    ここまで来たら基本的な環境は整っているので、メール送信をテストしてみる。

     

    メールサーバとお話しするために、telnetコマンドをインストール。
    yum -y install telnet
    

     

    telnetコマンドを利用してSMTP接続をする。
    telnet localhost 25
    

     

    挨拶をしてみる。
    helo 任意のメッセージ
    250 サーバホスト名.独自ドメイン
    

     

    ちゃんとお話しできるようなので、次のようにメール送信を依頼してみる。
    mail from:任意の名称@独自ドメイン
    250 2.1.0 Ok
    rcpt to:送り先メールアドレス
    250 2.1.5 Ok
    354 End data with <CR><LF>.<CR><LF>
    メールで送りたいメッセージ  
    .
    250 2.0.0 Ok: queued as 2BA9655E2
    

     

    実際にメールが届いたら成功!届かない場合は迷惑メールフォルダもチェック。

     

    メールが届いたらさよならの挨拶をする。
    quit
    221 2.0.0 Bye
    Connection closed by foreign host.
    

     

    Laravelでのメール送信設定

     

    Laravelのお問い合わせフォームからメールが送信されるように設定していく。 Mailableクラスなどを使ったプログラミングが別途必要なので、試してみたい方は「Laravel メール」などと検索して自分好みのプログラムを作ってみてね。

     

    以下、完全に自分用のメモ。

     

    .envファイルのメール設定を書き換えれば良いので、
    cd /home/kusanagi/Laravel/gitリポジトリ名
    vim .env
    
    次のように編集。
    MAIL_MAILER=smtp
    MAIL_HOST=127.0.0.1
    MAIL_PORT=25
    MAIL_USERNAME=なんでもよし
    MAIL_PASSWORD=なんでもよし
    MAIL_ENCRYPTION=null
    MAIL_FROM_ADDRESS=任意の名前@独自ドメイン
    MAIL_FROM_NAME="${APP_NAME}"
    MAIL_ADMIN=送り先メールアドレス
    
    esc:wq で保存。

     

    設定を反映させる。
    php artisan config:clear
    

     

    お問い合わせフォームからメール送信成功!感動の瞬間でした。

     

    あとがき

     

    初めてのVPS。初めてのインフラ。
    何回もOS再インストールしてやり直して、やっぱりレンタルサーバに委託しようかと思ったこともあったけれど。
    まさか自分にもできてしまうとはね…インフラも悪くない。
    個人的には大きな挑戦で大きな一歩だった。それでもまだまだこれから。フルスタック目指して引き続き頑張ります。