😍

mixhostへLaravelプロジェクトをデプロイする方法

2021/10/13に公開

結構苦戦したので自分のメモ用に書いておきます。

結論

  • リモートリポジトリにプロジェクトを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が設定されます。

https://qiita.com/yk2220s/items/dcbf54c6d1f33a0cb06f

この記事によると暗号化系の処理に使われているみたいですね。

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