mixhostへLaravelプロジェクトをデプロイする方法
結構苦戦したので自分のメモ用に書いておきます。
結論
- リモートリポジトリにプロジェクトをpush
- sshでmixhostにアクセス
- git cloneしてpublic_html/xxx.com/laravel のような形でプロジェクトを入れる
- composer installする
- .envを作成、編集する
- php artisan migrateする
- php artisan key:generateする
- mvでpublic下を、ドメインフォルダ直下に移す
- シンボリックリンクを貼る
- index.phpの内容を編集する
Laravelプロジェクトをリモートリポジトリにpushする
mixhostにプロジェクトを上げる上で、git cloneしてしまうのが非常に楽なので、ひとまずリモートリポジトリにpushしてしまいます。Laravel側の設定で.envなどのファイルは上がらないようになっているのでセキュリティは特に問題ない……はず。
git push origin main
など、コマンド打ちます。
mixhostにsshアクセスする
- sshを使ってアクセスしましたが、おそらくmixhostのcpanelにあるターミナルからでもできると思います。
1.mixhostで鍵を生成する
cpanel上の『SSH アクセス』を開きます。
SSHキーの管理
新しいキーの生成
- Key Nameに任意の名前
- パスワードに任意のパス(私はmixhostのパスワード生成ツールを使いました)
- キーの種類:RSA(デフォルト)
- キーサイズ:4096(多いほど高セキュリティ、昔読んだ記事で4096にしとけみたいなのを見た気がするので)
その後、公開キーおよび秘密キーを『表示/ダウンロード』からダウンロードします。
2.~/.sshに保存する
- 1.で生成したキーを~/.sshに保存します。
- 昔「~/.sshってなんだよ!」って思ったので補足しておくと、windowsであればC:/Users/username/.sshのことです。("~"はホームディレクトリのこと、ホームディレクトリとはログイン直後にいるディレクトリのこと)
3.configを作る
.sshディレクトリに2つのキーを保存したらconfigを作成します。作っておくと、sshでアクセスするとき楽なので。
Host mixhost_ssh(任意の名前)
HostName <xxx.mixh.jp>
User <user名>
IdentityFile <~/.ssh/秘密キー名>
IdentitiesOnly yes
って感じの内容を書いて、.sshに保存します。
3-1.configについて説明
HostName
→ cpanelの一般情報の欄に書かれている、プライマリドメインを記入します。(多分xxx.mixh.jpだと思うけど、登録時期によって変わるのかも)
User
→ ユーザー名を書きます。これも一般情報のところにあります。
IdentityFile 秘密キーを指定します。仮にsomethingという秘密キーなら、 ~/.ssh/something と言う感じになります。
IdentitiesOnly yes
→IdentityFileが必要な場合yesとします。IdentityFileはログインするための秘密鍵で必要となるため、yesとしています。
仮に、
- プライマリドメイン motoishi.mixh.jp
- ユーザー名 motoishimotoi
- 秘密鍵ファイル名 something
であるなら、
Host mixhost_ssh(任意の名前)
HostName motoishi.mixh.jp
User motoishimotoi
IdentityFile ~/.ssh/something
IdentitiesOnly yes
といった内容になります。
4.aurhorizedに設定する
mixhostで生成した公開キーの認証ステータスは、デフォルトだとnot authorizedとなっており、これだとsshでアクセスすることはできません。
なので、管理からこれをauthorizedに変更しておきます。
sshからgit cloneする
先程のconfigであれば
ssh mixhost_ssh
としてアクセスします。(要求されるパスワードはキー生成時に設定したもの)
※ちなみにwindowsの私はPowershellを使っています。
アクセスしたら、git cloneで、リモートリポジトリにpushしたものを入れます。
どこにgit cloneするのか
サブドメインに設定するなどの場合、また色々変わってきそうですが、私の場合は
- public_html/something.com/laravel
- のようなディレクトリにプロジェクトが生成されるようにしました。
git clone <URL> laravel
みたいな具合です。
なお、パスワードに関してはGithubは2021年の8月からTokenを使う必要が出ているので、アカウントの『Settings>Developer settings>Personal access tokens>Generate new token』からrepoに対してアクセスできるよう定義してトークンを作っておきましょう。
composer install の実行
Laravelプロジェクトを稼働させるためにcomposer installをする必要があるのですが、単にphp composer installとした場合、正常に動作しませんでした。
php composer install
->Could not open input file: composer
which composerとすると、以下のディレクトリが示されました。
which composer
->/opt/cpanel/composer/bin/composer
そこで、
php /opt/cpanel/composer/bin/composer install
としたところ、php versionが低いというエラーが返ってきます。
2021年10月時点で、mixhostのphpのデフォルトversionは7.0.33のようですので、このようにしてバージョンを上げた上で実行します。
ea-php74 /opt/cpanel/composer/bin/composer install
これで、正常にcomposer installが実行されました。
なお、ea-php74はmixhostで提供されているものです。cpanel>MultiPHPマネージャー からPHPバージョンの欄を見るとその文字列が確認できます。
.envの編集
.envは.gitignoreされているので現状ありません。そこで、
cp .env.example .env
として、.envファイルの雛形を用意します。(.env.exampleはLaravelが用意しているもの)
その後
vi .env
として、内容を編集します。
(viは'i'でインサートモード、'esc'で解除して、':wq'で編集内容を保存できます。保存せず閉じる場合は':q!'です。)
私の場合は
- APP_URL(LaravelをデプロイするURL)
- APP_ENV (productにする)
- DB_HOST=localhost
- DB-DATABASE=xx
- DB_USERNAME=xx
- DB_PASSWORD=xx
あたりです。(DBの設定は話変わりすぎるから触れません)
php artisan migrateする
事前に用意しておいたDBにテーブル作成します。
php artisan key:generateする
APP_KEYが設定されます。
この記事によると暗号化系の処理に使われているみたいですね。
mvでファイルを移動する
laravelプロジェクトにあるpublicディレクトリに移動して、
mv index.php ../../index.php
mv .htaccess ../../.htaccess
mv web.config ../../web.config
mv robots.txt ../../robots.txt
mv favicon.ico ../../favicon.ico
として、ドメイン名ディレクトリの直下に中身を移します。こうすることで、例えばsomething.comにアクセスするとweb.phpに設定した'/'にアクセスできます。
ただ、これだけだと色々問題が生じるのでシンボリックリンクを張ります。
ln -s ~/public_html/something.com/ ~/public_html/something.com/laravel/public
シンボリックリンクはwindowsにおけるショートカットみたいなもので、laravelプロジェクトのpublicにアクセスした場合、something.com直下にアクセスしたのと同じ扱いになります。これによってLaravel内部の処理が適切に行われます。
index.phpの内容を編集する
現状だと、index.php内の一部パスが不適切になっているので編集します。
# require __DIR__.'/../bootstrap/autoload.php';
require __DIR__.'/laravel/bootstrap/autoload.php';
~~~
# $app = require_once __DIR__.'/../bootstrap/start.php';
$app = require_once __DIR__.'/laravel/bootstrap/app.php';
当たり前ですが、パスはディレクトリ構成によって変わってくるので適時変更してください。
以上!
これで設定したドメインにアクセスすれば適切に表示される…はずです。
細かい部分端折ってたりするので、そのへんは適時調整してください。
編集内容を反映するには
git pullすればいいです。
git fetchしてgit merge origin/mainとかでもいいと思います。
Discussion