BackEnd

DeployerでLaravelをデプロイ! 初期設定〜レシピのカスタマイズまで

投稿日:2020年11月24日 更新日:

はじめに

DeployerはPHP製のデプロイツールです。汎用性のあるツールですが、Laravelはかなり手早くデプロイできるので、実際にデプロイし、レシピをカスタマイズする方法を紹介します。

Deployerの導入

前提条件

サーバ側

  • Gitインストール済み
  • nginx, php-fpmインストール済み
  • mysqlセットアップ済み

ローカル側

  • Laravelのプロジェクトを作成済み
  • Gitリポジトリにプッシュ可能

インストール

composerでDeployerをインストールします。

インストールが完了したら、Deployerの初期設定を行います。

まず、プロジェクトの種類を選択します。今回はLaravelなので 1とします。

次に、Gitリポジトリのリモートを入力します。デプロイしたいプロジェクトのリモートのURLを指定してください。

最後に、Deployer開発チームにデータを送信するかどうか聞かれます。これはどちらでも構いません。今回は yesにします。

これで完了です。

デプロイの設定

デプロイスクリプト

デプロイスクリプトはプロジェクトのルートにある deploy.phpで行います。Laravelテンプレートを選択したため、 基本的なことをほぼテンプレートのままできてしまいます。これに少し手を加えたので、その辺りも含めて説明します。

いくつかポイントを紹介します。

  • require 'receipe/laravel.php
    Laravelテンプレートを選択した時に使用されるLaravelレシピです。Laravelの様々なartisanコマンドが使えるレシピです。詳細は後述します。
  • add('shared_dirs', ['vendor']);
    デプロイ時に共有するディレクトリを指定します。ここの指定したディレクトリは、実際のデプロイパス上ではシンボリックリンクに置き換えられ、実態は sharedディレクトリの中に存在することになります。そのため、 vendorディレクトリが毎回のデプロイで削除されずに使いまわされる、 composer installが早くなります。
    また、Laravelレシピ側でデフォルトで storageが指定されています。これにより、デプロイ毎にstorage配下のファイルが消えずに、使用し続けることができます。
  • .envファイルのコピー
    Laravelレシピでは、.envファイルは shared/.envへのシンボリックリンクが作成されるため、このパスにenvファイルをコピーします。Deployer内で使用できる変数を使用してパスとステージを特定して、適切な.envファイルを配置するようにしています。
    例えばステージ名がproductionであれば、 .env.productionをコピーするように実装しました。
  • run()では、コマンド内で {{変数名}}とすることで、変数を使用することができます。例えば、次のような変数があります。
    • deploy_path: host()->set()で指定したデプロイディレクトリを取得できます。
    • release_path: デプロイ中のソースが入っているディレクトリを取得することができます。今回の例では /var/www/laravel-deployer/releases/1が取得できます。 1はリリース毎にインクリメントされます
    • stage: 今デプロイしているステージ名を取得できます。ステージ名は host()->stage()で設定し、デプロイコマンドで指定できます。

サーバサイドの設定

今回は割愛しますが、設定に合わせて次の対応を行います。

  • /var/www/laravel-deployerディレクトリの作成
  • gitのインストール
  • ssh-keygenでキーを生成し、GithubにDeploy Keyとして登録する。
  • nginx.confで、rootを /var/www/laravel-deployer/current/publicにしておく。

デプロイコマンド

それでは、実際にデプロイしてみます。

deployは、Laravelレシピで定義されているタスク名で、ここにデプロイに最低限必要な一通りのタスクがまとまっています。productionは、ステージ名です。
実際に実行すると、次のようになります。

Deployerのディレクトリ構成

初めてデプロイが完了すると、指定したパスにディレクトリが生成されます。

  • current: releases/nへのシンボリックリンク。(nは最新のデプロイ番号)
  • releases: デプロイしたソースの実態
  • shared: deploy.phpで指定した共有ディレクトリの格納場所 (今回の例では、vendor, storageが入っています。)

そのため、Webサーバは current配下を見れば最新のソースが格納されていることになります。

レシピ

requireされている receipe/laravel.phpには他にも様々なレシピがあります。デプロイタスクに組み込むこともできますし、直接タスクを実行することもできます。
例えば、マイグレーションはデプロイタスクに組み込まず、任意のタイミングで実行したい場合は $ vendor/bin/dep artisan:migrate productionで実行できます。

レシピをカスタマイズする方法

レシピをカスタマイズするには、deploy.phpの実装でいくつかやり方があるので、紹介します。

コンフィグの追加/上書き

レシピで set()で定義されているコンフィグは、追加したり上書きしたりできます。追加するには add(キー, 値)、上書きするには set(キー、値)とします。

任意のタスクを、定義済みタスクの前後に追加

deployタスクのように、一連のタスクを実行するタスクの中に、任意のタスクを追加したい場合があります。先ほどの例では次のように使用しています。

deploy:copy:envは自前のタスクですが、これを deploy:sharedの前に実行させています。
deploy:sharedタスクは、実際のソースをシンボリックリンクに置き換えますが、その際に shared内に対象ディレクトリもしくはファイルが無ければ、それぞれからの状態で生成します。
これが.envファイルで行われてしまうと、後からコピーする時に、空ファイルをいちいち削除しなければならなくなってしまうため、事前にenvファイルを shared/.envにコピーさせたかったからです。
参考までに実際の deploy:sharedタスクで、shared_filesの処理は次のようになっています。

 

おまけ

Github Actionsでもデプロイできるようにしてみたので、簡単に紹介します。作成したワークフローはこちらです。

3つポイントがあります。

  1. SSHキーは、GithubのSecretsに登録しておきます。
  2. deploy.phpの git_ttyはGithub Actionsでは動作しなかったので、falseにします。
  3. あらかじめknown_hostsに登録しておきます。

個人用のプロジェクト程度であれば、これで十分便利に使用できると思いました。

さいごに

いかがでしたか。Deployerはテンプレートやレシピが充実していて、主要なフレームワークやCMSで簡単にデプロイできることが分かりました。Laravelの公式パッケージで envoyと言うツールもありますが、Deployerの方がレシピが豊富なので便利だと思いました。

おすすめ書籍

PHPフレームワークLaravel入門 第2版PHPフレームワーク Laravel実践開発PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応よくわかるPHPの教科書 【PHP7対応版】

blog-page_footer_336




blog-page_footer_336




-BackEnd
-,

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

rails

RailsでS3に画像をアップロードする

1 はじめに2 今回やりたいこと3 下準備3.1 ImageMagickをインストールする3.2 Gemをインストールする4 レコード生成時にファイルを指定してアップロードする4.1 アップローダを作 ...

laravel logo

Laravelのバッチ処理を作る

1 はじめに2 環境3 artisanコマンド作成4 artisanコマンドをバッチとして登録する5 さいごに6 おすすめ書籍 はじめに こんにちは。webアプリにつきもののバッチ処理ですが、もちろん ...

rails

さらば「rails migrate」、よろしく「ridgepole」

1 はじめに2 Ridgepoleとは3 rails migrateではなく、Ridgepoleを選定した理由4 rails migrateからRidgepoleへの移行手順5 capistrano3 ...

php logo

PHP入門 〜文字列と数値の操作〜

1 はじめに2 基本ルール2.1 開始と終了のタグ2.2 ホワイトスペース2.3 大文字と小文字の区別2.4 コメント2.5 変数の定義3 文字列の操作3.1 文字列の定義3.2 無駄なスペースを削除 ...

Docker上のLaravelのログをFluentdに出力する

1 はじめに2 環境3 Fluentdについて4 目的5 Fluentd本体はdocker-composeで導入5.1 fluentd5.2 db5.3 app5.4 web6 Laravelからログ ...

フォロー

follow us in feedly

blog-page_side_responsive

2020年11月
1234567
891011121314
15161718192021
22232425262728
2930 

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。
Get it on App Store
Get it on Google Play