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


関連記事

Go言語

Go 1.18で追加されるGenericsの紹介

1 はじめに2 GoのGenerics2.1 Genericsの主な仕様2.2 Genericsの制限3 Genericsを使ってみる3.1 基本形3.2 呼び出しの際の型引数を省略する3.3 型制約 ...

aws

Amazon API Gatewayざっくり概要

1 はじめに2 Amazon API Gatewayとは?2.1 なにができる?2.2 作成できるAPIの種類2.3 REST APIとHTTP APIの違い3 Amazon API Gatewayの ...

Pythonで書かれたスクレイピングのコードをRubyで書いてみる

1 はじめに2 仕様3 ソースコード4 使用したモジュール、Gem5 対象ページを取得6 XPATHから目的のものを抜き出す7 次のページのリンクを取得する8 さいごに はじめに 以前、技術評論社さん ...

Stripe Connectを使って継続課金にクーポンを適用する

1 はじめに2 クーポンについて2.1 クーポンのタイプ2.2 期間2.3 引き換え回数制限2.4 その他3 クーポンの作成4 クーポンの使用4.1 定期支払にクーポンを適用4.2 Checkoutで ...

Laravelの開発環境をdocker-composeで一から構築してみる

1 はじめに2 nginxでwebサーバを立てる2.1 default.conf作成2.2 index.html作成2.3 nginxコンテナ起動3 nginxでPHP-FPMを動作させる3.1 do ...

フォロー

blog-page_side_responsive

2020年11月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

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