KUSANAGI9でLaravelデプロイ
さくらのVPSでKUSANAGI9を借りて初めてのサーバー構築・Laravelのデプロイに挑戦。
KUSANAGI9とKUSANAGI8は結構違うぞ…9の情報がほとんど無くて大変だったぞ…
何が起きても困らないよう、行動をすべてメモしておいたので、ざっくり編纂して載せておきます。
を実行し、何か聞かれたらとりあえずyes、パスワードを入力してログインできたら成功。
client_rsaのパスは各自の環境に応じて書き換えてくれ。 100.100.100.100の部分は、各自のVPSのIPv4アドレスに書き換え。
今後も仮のIPアドレスとして100.100.100.100と表記するのでその都度よろしく。
VPSのIPアドレスで始まる行を削除&&保存してからやり直せば大抵うまくいく。
(これでうまくいかなかったら警告内容をGoogle等にペーストして検索)
ssh接続している状態で、次のコマンドを実行。
とすればうまくいくかもしれない。(私は
今度は自分好みに仕立てていく。
次はユーザの追加を行う。次のコマンドで、新規ユーザtomixyを作成し、sudo権限を与える。
まずは次のコマンドで設定ファイルをvimで開く。
そして次のような記述を見つけて、以下の通りにyesとnoや冒頭の#を設定すること。
上記のように編集できたら、esc キーを押してコマンドモードに変更。
その状態で
別ウィンドウで立ち上げたターミナルでは、当然まだssh接続されていないはず。そこで、このターミナルでssh接続確認を行う。 (別ウィンドウで立ち上げず、ssh接続を一旦切って再接続を試みてもいいが、それだと設定に誤りがあった場合に二度とssh接続できなくなるぞ。私はそんな感じで10回近くOSの再インストールをする羽目になりました。)
でログインできず、
でログインできたら成功。
その代わりのポートは1024~65535番が推奨されているらしい。なんでもよいが、仮に10000だとして話を進める。
10000以外を選んだ場合は、今後の10000の部分を選んだ番号に読み替えるとともに、パケットフィルタのカスタムポートの番号もその番号に変更しておくこと。
何も表示されなければ使用可能。使用可能でなければ別な番号でトライ。
またさっきの設定ファイルを開く。
i
を押して、Portの行を次のように変更。
esc
を押し、
でログインできず、
でログインできたら成功。
試しにパスワードログインしてみる。接続確認用ウィンドウで
でログインできるはず。
vimで開いて、
i
を押して、次の行をnoに直す。
esc
を押して、
エラーが出て入れない場合もあるはず。鍵認証ログインはできないと困るので、どうにかしなければならない。
tomixyユーザの.sshディレクトリに移動
手元のMacPCの~/.ssh/id_rsa.pub をエディタ等で開いて、その内容をコピーしておく。
次のコマンドでauthorized_keys ファイルを開く。(ファイルがなかったら自動で新規作成される。)
i
を押して、さっきコピーした内容をペースト。esc
を押して、
でログインできることを確認。
それじゃ、当初の目的だったパスワードログインが不可能になっているかどうか確認してみる。
で入れなければ、成功!
このNSのデータを、お名前ドットコムの管理画面に登録することで、設定が完了する。
と入力し、パスワードを求められたらrootユーザのパスワードを入力。
独自ドメインが使用可能になっていないとエラーになるが、それでも
独自ドメインの設定が終わり、それが反映されてから先に進んでください。
(ssh接続している場合はexitで切断するか、別なウィンドウを開いて作業する。)
を実行してみる。
再度
で、Laravelプロジェクト内のディレクトリ・ファイル群が表示されたらOK。
雛形の.env.exampleファイルは輸送されてきているので、それをコピーして.envファイルを作成する。
なにやらOかNを入力せよ、と出たらOを入力。Enter
を押してくれ、と言われたら、Enter
は押さずに、
と入力して脱出。
途中何を言われようと、httpd completed.が表示されればそれでよし。
は、
に変更。
は、
に変更。
esc
を押して、
i
を押して、次の箇所を探して次の通りに記入。
ローカル環境のphpMyAdminのデータを.sqlファイル形式でエクスポートして、そのファイルを今ログインできたphpMyAdminにインポートした。
LaravelやPHPのエラーが表示される場合は、その都度Google先生に聞いて修正する。
原因はviews/Top/index.blade.phpを、コントローラで
…「Top」と「top」、大文字と小文字の不一致である。
をssh接続した状態で実行してやれば、とりあえず動くようにはなる。
を実行してGitHubに反映させる。
でrootユーザに切り替えて、
を実行。
ここでは、SSLに関する諸設定を行う。
ブラウザ上でURLにアクセスして、正常に稼働していることを確認したら、.envファイルの
興味がある方は試してみてもいいが、以下に書かれてあることだけでLaravelでのメール送信ができるようになるわけではないので注意。
つまりは配信専用。サーバでのメール受信などを行いたい方はGoogle先生へ。
i
を押して、2行め冒頭に#を追加し、
でバージョンが表示されたら成功。
postfixが選択されている(*がついている)ことを確認して、Enter
を押す。
ここにあるmain.cfは、次のようにしてバックアップを取っておく。
バックアップを取ったので堂々と書き換えを行う。
次の箇所を修正。
メールアドレスにサーバホスト名が含まれると長ったるしいので、次の行を追加。
esc
、
次のように編集。
esc
と
何回もOS再インストールしてやり直して、やっぱりレンタルサーバに委託しようかと思ったこともあったけれど。
まさか自分にもできてしまうとはね…インフラも悪くない。
個人的には大きな挑戦で大きな一歩だった。それでもまだまだこれから。フルスタック目指して引き続き頑張ります。
何が起きても困らないよう、行動をすべてメモしておいたので、ざっくり編纂して載せておきます。
環境
手元の環境はこんな感じ。
- 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アドレス:すべて許可する)
ssh(公開鍵認証)で接続
https://laraweb.net/environment/8266/
を参考に、公開鍵認証でログインできるようにしておく。
(手順をメモし忘れた&&特にはまることもなかったので丸投げ)
手元のMacのターミナルで、
ssh -i ~/.ssh/client_rsa root@100.100.100.100
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
Port 10000
: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
PasswordAuthentication no
: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
: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 -
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画面右上の+から を選択。
と にチェックを入れ、 は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
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 %
:q!
ドキュメントルートの変更
サーバーをapacheに切り替え。まあこれは多分やらなくても後に影響はない。
kusanagi httpd
まず、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=さっき確認したパスワード
:wq
で上書き保存。今度はmysql.sockの在処を探す。次のコマンドを実行して、表示されたパスを先頭の.は除いてメモすること。
cd /
find . -name "mysql.sock"
実は直すべきは.envファイルだけではない。Laravelのconfigフォルダ内のdatabase.phpにも設定を記入する必要がある。
cd /home/kusanagi/Laravel/gitリポジトリ名/config
vim database.php
'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 該当のフォルダ名
とはいえ、セキュリティ的にはpublicフォルダ内への書き込み権限を与えるのではなく、storageフォルダへのシンボリックリンクを貼るのが最良。
私の場合はIPアドレスによるアクセス制限をかけているページ(CMS管理画面)のアップロードフォームだったので権限付与だけで済ませたが、ユーザが操作する投稿フォームでは書き込み権限付与という方法は取らない方が良いだろう。
アップロード後のソースコード更新
前章で「その都度修正」と書いておきながら、修正の反映方法に触れていなかったのでここで解説する。
ローカル環境でコードを編集したら、そのプロジェクトフォルダで
git add .
git commit -m "修正内容の概要"
git push origin main
今度はVPSにssh接続して、
su -
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_DEBUG
をfalse
にしてあげてください。これ以降は完全に自分用のメモ。
興味がある方は試してみてもいいが、以下に書かれてあることだけでLaravelでのメール送信ができるようになるわけではないので注意。
メールサーバの構築
とりあえず私が実現したいのは、お問い合わせフォームに投稿された内容が私のメールアドレスに届くようにすることだけなので、そのための最小限の環境構築を行う。
つまりは配信専用。サーバでのメール受信などを行いたい方はGoogle先生へ。
なお、私はhttps://www.rem-system.com/mail-postfix01/ の見よう見まねでやっただけなので、ざっくりと実例だけを載せるだけに留める。
まず、postfixをインストール。
yum install postfix
私は現段階ではIPv6対応を考えていないので、余計なエラーが出ないように設定ファイルを書き換える。
cd /
cd etc
vim hosts
:wq
で上書き保存。正しくインストールされているか確認。
postconf mail_version
使用するメールサーバの選択。
alternatives --config mta
次はメールアドレスなどの設定を行う。
cd /etc/postfix
cp main.cf main.cf.org
vim main.cf
myhostname = サーバホスト名.独自ドメイン
mydomain = 独自ドメイン
inet_protocols = ipv4
masquerade_domains = 独自ドメイン
: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=送り先メールアドレス
:wq
で保存。設定を反映させる。
php artisan config:clear
お問い合わせフォームからメール送信成功!感動の瞬間でした。
あとがき
初めてのVPS。初めてのインフラ。
何回もOS再インストールしてやり直して、やっぱりレンタルサーバに委託しようかと思ったこともあったけれど。
まさか自分にもできてしまうとはね…インフラも悪くない。
個人的には大きな挑戦で大きな一歩だった。それでもまだまだこれから。フルスタック目指して引き続き頑張ります。
Category