Ubuntu 16.04でDeployerを使用してLaravelアプリケーションを自動的に展開する方法

前書き

Laravelは、認証、ルーティング、キャッシュなどの一般的なWeb開発タスクを簡単にするために設計されたオープンソースのPHP Webフレームワークです。 Deployerは、Laravel、CodeIgniter、Symfony、Zend Frameworkなどの人気のある多くのフレームワークをすぐにサポートする、オープンソースのPHPデプロイメントツールです。

Deployerは、Gitリポジトリからサーバーにアプリケーションを複製し、https://getcomposer.org/ [Composer]を使用して依存関係をインストールし、手動で行う必要がないようにアプリケーションを構成することにより、展開を自動化します。 これにより、アップロードや構成ではなく、開発により多くの時間を費やすことができ、より頻繁にデプロイできます。

このチュートリアルでは、ダウンタイムなしでLaravelアプリケーションを自動的にデプロイします。 これを行うには、コードを展開するローカル開発環境を準備し、アプリケーションを提供するためにNginxとMySQLデータベースを使用して運用サーバーを構成します。

前提条件

このガイドを始める前に、次のものが必要です。

ステップ1-ローカル開発環境のセットアップ

ローカルマシンからアプリケーションを作成およびデプロイするため、ローカル開発環境を構成することから始めます。 Deployerは、ローカルコンピューターから展開プロセス全体を制御するため、インストールから始めます。

*ローカルマシン*で、ターミナルを開き、 `+ curl +`を使用してDeployerインストーラーをダウンロードします。

curl -LO https://deployer.org/deployer.phar

次に、短いPHPスクリプトを実行して、インストーラーがhttps://deployer.org/download[Deployer-download page]にある最新のインストーラーのSHA-1ハッシュと一致することを確認します。 強調表示された値を最新のハッシュに置き換えます。

php -r "if (hash_file('sha1', 'deployer.phar') === '') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('deployer.phar'); } echo PHP_EOL;"
OutputInstaller verified

Deployerをシステム全体で使用可能にします。 ローカルマシンでWindowsまたはmacOSを実行している場合、このコマンドを実行する前に `+ / usr / local / bin / dep +`ディレクトリを作成する必要がある場合があることに注意してください。

sudo mv deployer.phar /usr/local/bin/dep

実行可能にします。

sudo chmod +x /usr/local/bin/dep

次に、*ローカルマシン*でLaravelプロジェクトを作成します。

composer create-project --prefer-dist laravel/laravel  "5.5.*"

ローカルマシンに必要なソフトウェアをすべてインストールしました。 それが整ったら、アプリケーションのGitリポジトリの作成に進みます。

手順2-リモートGitリポジトリへの接続

Deployerは、ユーザーがどこからでもコードを展開できるように設計されました。 この機能を許可するには、ユーザーがコードをインターネット上のリポジトリにプッシュし、そこからDeployerが本番サーバーにコードをコピーする必要があります。 オープンソースのバージョン管理システムであるGitを使用して、Laravelアプリケーションのソースコードを管理します。 SSHプロトコルを使用してGitサーバーに接続できます。これを安全に行うには、SSHキーを生成する必要があります。 これはパスワードベースの認証よりも安全であり、各展開の前にパスワードを入力するのを避けることができます。

*ローカルマシン*で次のコマンドを実行して、SSHキーを生成します。 `+ -f `はキーファイルのファイル名を指定し、独自のファイル名に置き換えることができることに注意してください。 `〜/ .ssh / `フォルダーにSSHキーペア( `+`と `+ .pub +`という名前)を生成します。

ssh-keygen -t rsa -b 4096 -f  ~/.ssh/

ローカルマシンにもっと多くのSSHキーがある可能性があるため、Gitサーバーに接続するときに使用するSSH秘密キーを知るようにSSHクライアントを構成します。

ローカルマシン上にSSH構成ファイルを作成します*:

touch ~/.ssh/config

ファイルを開き、Gitサーバーへのショートカットを追加します。 これには、 `+ HostName `ディレクティブ(Gitサーバーのホスト名を指す)と ` IdentityFile +`ディレクティブ(作成したSSHキーのファイルパスを指す)が含まれている必要があります。

〜/ .ssh / config

Host
   HostName
   IdentityFile ~/.ssh/

ファイルを保存して閉じ、アクセス許可を制限します。

chmod 600 ~/.ssh/config

これで、SSHクライアントはGitサーバーへの接続に使用する秘密鍵を認識します。

次のコマンドを使用して、公開鍵ファイルのコンテンツを表示します。

cat ~/.ssh/.pub

出力をコピーし、公開キーをGitサーバーに追加します。

Gitホスティングサービスを使用している場合は、アカウントにSSHキーを追加する方法に関するドキュメントを参照してください。

これで、ローカルマシンを使用してGitサーバーに接続できるようになります。 次のコマンドで接続をテストします。

ssh -T

このコマンドでエラーが発生した場合は、Gitホスティングサービスのドキュメントを参照してSSHキーを正しく追加したことを確認し、接続を再試行してください。

アプリケーションをリモートGitリポジトリにプッシュしてデプロイする前に、最初に運用サーバーを構成しましょう。

ステップ3-Deployerユーザーの構成

DeployerはSSHプロトコルを使用して、サーバー上でコマンドを安全に実行します。 このため、実稼働サーバーを構成するための最初のステップは、DeployerがSSH経由でサーバーにログインしてコマンドを実行するために使用できるユーザーを作成することです。

sudoの非rootユーザーでLEMPサーバーにログインし、次のコマンドで「* deployer *」という新しいユーザーを作成します。

sudo adduser deployer

Laravelは、キャッシュされたファイルとアップロードを保存するために書き込み可能なディレクトリを必要とするため、* deployer ユーザーによって作成されたディレクトリはNginx Webサーバーによって書き込み可能でなければなりません。 これを行うには、ユーザーを www-data *グループに追加します。

sudo usermod -aG www-data deployer
  • deployer ユーザーが作成したファイルのデフォルトのパーミッションは、ファイルの場合は + 644 +、ディレクトリの場合は `+ 755 +`である必要があります。 これにより、 deployer *ユーザーはファイルの読み取りと書き込みが可能になり、グループと他のユーザーはそれらのファイルを読み取ることができます。

これを行うには、* deployer *のデフォルトのumaskを `+ 022 +`に設定します。

sudo chfn -o umask=022 deployer

アプリケーションを `+ / var / www / html / +`ディレクトリに保存するため、ディレクトリの所有権を* deployer ユーザーと www-data *グループに変更します。

sudo chown deployer:www-data /var/www/html
  • deployer ユーザーは、 `+ / var / www / html `ディレクトリ内のファイルとフォルダーを変更できる必要があります。 そのため、 ` / var / www / html`ディレクトリ内に作成されるすべての新しいファイルとサブディレクトリは、フォルダのグループID( www-data *)を継承する必要があります。 これを実現するには、次のコマンドを使用してこのディレクトリにグループIDを設定します。

sudo chmod g+s /var/www/html

DeployerはSSHを使用してGitリポジトリを運用サーバーに複製するため、LEMPサーバーとGitサーバー間の接続が安全であることを確認する必要があります。 ローカルマシンで使用したのと同じアプローチを使用し、* deployer *ユーザーのSSHキーを生成します。

サーバー上の* deployer *ユーザーに切り替えます。

su - deployer

次に、* deployer *ユーザーとしてSSHキーペアを生成します。 今回は、SSHキーのデフォルトのファイル名を受け入れることができます。

ssh-keygen -t rsa -b 4096

公開鍵を表示します:

cat ~/.ssh/id_rsa.pub

前の手順で行ったように、公開キーをコピーしてGitサーバーに追加します。

ローカルマシンもSSHを使用してサーバーと通信するため、ローカルマシンで* deployer *ユーザーのSSHキーを生成し、サーバーに公開キーを追加する必要があります。

*ローカルマシン*で次のコマンドを実行します。 任意のファイル名に置き換えてください:

ssh-keygen -t rsa -b 4096 -f  ~/.ssh/

公開キーを含む次のコマンドの出力をコピーします。

cat ~/.ssh/.pub
  • deployer *ユーザーとしての*サーバー*で次を実行します。

nano ~/.ssh/authorized_keys

公開キーをエディターに貼り付け、「+ CTRL-X 」、「 Y 」、次に「 ENTER +」を押して保存して終了します。

ファイルの許可を制限します。

chmod 600 ~/.ssh/authorized_keys

次に、sudoユーザーに戻ります。

exit

これで、サーバーはGitサーバーに接続でき、ローカルマシンの* deployer *ユーザーでサーバーにログインできます。

接続をテストするには、* deployer *ユーザーとしてローカルマシンからサーバーにログインします。

ssh deployer@  -i ~/.ssh/
  • deployer *としてログインした後、サーバーとGitサーバー間の接続もテストします。

ssh -T

最後に、サーバーを終了します。

exit

ここから、WebサーバーでのNginxとMySQLの構成に進むことができます。

ステップ4-Nginxの構成

これで、アプリケーションを提供するWebサーバーを構成する準備が整いました。 これには、Laravelファイルを保持するために使用するドキュメントルートとディレクトリ構造の構成が含まれます。 `+ / var / www / laravel +`ディレクトリからファイルを提供するようにNginxをセットアップします。

まず、https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtual-hosts-on-ubuntu-16-04 [サーバーブロック構成を作成する必要がありますファイル]新しいサイト。

sudoユーザーとしてサーバーにログインし、新しい構成ファイルを作成します。 独自のドメイン名に置き換えることを忘れないでください:

sudo nano /etc/nginx/sites-available/

設定ファイルの先頭に `+ server +`ブロックを追加します:

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;
}

上部の2つの `+ listen `ディレクティブは、どのポートをリッスンするかをNginxに指示し、 ` root `ディレクティブはLaravelがインストールされるドキュメントルートを定義します。 ルートディレクトリのパスにある ` current / public `は、アプリケーションの最新リリースを指すシンボリックリンクです。 ` index `ディレクティブを追加することで、ディレクトリの場所をリクエストするときにHTMLの対応するものを探す前に、 ` index.php `ファイルを最初に提供するようにNginxに指示しています。 ` server_name +`ディレクティブの後には、ドメインとそのエイリアスが必要です。

また、Nginxがリクエストを処理する方法を変更する必要があります。 これは、 `+ try_files `ディレクティブを介して行われます。 最初に要求をファイルとして提供しようとし、正しい名前のファイルが見つからない場合は、要求に一致するディレクトリのデフォルトのインデックスファイルを提供しようとします。 これに失敗すると、リクエストをクエリパラメータとして ` index.php +`ファイルに渡す必要があります。

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;

       location / {
               try_files $uri $uri/ /index.php?$query_string;
       }

次に、PHPファイルの実際の実行を処理するブロックを作成する必要があります。 これは、.phpで終わるすべてのファイルに適用されます。 ファイル自体を試し、それをパラメーターとして `+ index.php +`ファイルに渡そうとします。

`+ fastcgi `ディレクティブを設定して、シンボリックリンクの代わりに、アプリケーションの実際のパス(シンボリックリンクをたどった後に解決される)を使用するようにNginxに指示します。 これらの行を構成に追加しない場合、シンボリックリンクポイントがキャッシュされるパスは、展開後にアプリケーションの古いバージョンが読み込まれることを意味します。 これらのディレクティブがないと、各デプロイメントとアプリケーションへのリクエストが失敗する可能性がある場合に、手動でキャッシュをクリアする必要があります。 さらに、 ` fastcgi_pass `ディレクティブは、nginxがphp7-fpmが通信に使用しているソケットを使用し、 ` index.php +`ファイルがこれらの操作のインデックスとして使用されることを確認します。

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;

       location / {
               try_files $uri $uri/ /index.php?$query_string;
       }


       location ~ \.php$ {







       }

最後に、Nginxが非表示の `+ .htaccess `ファイルへのアクセスを許可しないようにします。 これを行うには、「 location〜/\.ht+」というロケーションブロックをもう1つ追加し、そのブロック内に「+ deny all; +」を指定するディレクティブを追加します。

この最後のロケーションブロックを追加すると、構成ファイルは次のようになります。

example.com ’> / etc / nginx / sites-available /

server {
       listen 80;
       listen [::]:80;

       root /var/www/html//current/public;
       index index.php index.html index.htm index.nginx-debian.html;

       server_name  www.;

       location / {
               try_files $uri $uri/ /index.php?$query_string;
       }


       location ~ \.php$ {
               include snippets/fastcgi-php.conf;

               fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
               fastcgi_param DOCUMENT_ROOT $realpath_root;

               fastcgi_pass unix:/run/php/php7.0-fpm.sock;

       }

       location ~ /\.ht {
               deny all;
       }

}

ファイルを保存して閉じ( + CTRL-X ++ Y +、次に + ENTER +)、 `+ sites-enabled +`ディレクトリへのシンボリックリンクを作成して新しいサーバーブロックを有効にします。

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

構成ファイルの構文エラーをテストします。

sudo nginx -t

エラーが表示された場合は、続行する前に戻ってファイルを再確認してください。

Nginxを再起動して、必要な変更をプッシュします。

sudo systemctl restart nginx

Nginxサーバーが構成されました。 次に、アプリケーションのMySQLデータベースを構成します。

ステップ5-MySQLの構成

インストール後、MySQLはデフォルトで* root ユーザーを作成します。 ただし、このユーザーには無制限の権限があります。そのため、アプリケーションのデータベースに root *ユーザーを使用するのはセキュリティ上悪い習慣です。 代わりに、専用ユーザーでアプリケーションのデータベースを作成します。

MySQLコンソールに* root *としてログインします。

mysql -u root -p

これにより、* root *パスワードの入力が求められます。

次に、アプリケーションの新しいデータベースを作成します。

CREATE DATABASE  DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

次に、新しいデータベースユーザーを作成します。 このチュートリアルでは、このユーザーをパスワード「」で「」と呼びますが、パスワードを選択した強力なパスワードに置き換える必要があります。

CREATE USER ''@'localhost' IDENTIFIED BY '';

データベースに対する権限をユーザーに付与します。

GRANT ALL ON .* TO ''@'localhost';

次に、特権をリロードします。

FLUSH PRIVILEGES;

最後に、MySQLコンソールを終了します。

EXIT;

これで、アプリケーションのデータベースとユーザーが構成され、最初の展開を実行する準備がほぼ整いました。

ステップ6-アプリケーションのデプロイ

これまで、Deployerが機能するために必要なすべてのツールとプログラムを構成しました。 最初の展開を実行する前に行うことは、LaravelアプリとDeployer自体の構成を完了し、アプリを初期化してリモートGitリポジトリにプッシュすることだけです。

*ローカルマシン*でターミナルを開き、次のコマンドで作業ディレクトリをアプリケーションのフォルダーに変更します。

cd

このディレクトリから、次のコマンドを実行して、 `+`フォルダー内に ` deploy.php +`というファイルを作成します。このファイルには、構成情報とデプロイメントのタスクが含まれます。

dep init -t Laravel

次に、好みのテキストエディターまたはIDEで `+ deploy.php +`ファイルを開きます。 3行目には、Laravelアプリケーションをデプロイするために必要なタスクと構成を含むPHPスクリプトが含まれています。

deploy.php

<?php
namespace Deployer;

require 'recipe/laravel.php';

. . .

この下には、構成に合わせて編集する必要があるいくつかのフィールドがあります。

  • `+ // Project Name +`で、Laravelプロジェクトの名前を追加します。

  • `+ // Project Repository +`で、Gitリポジトリへのリンクを追加します。

  • `+ // Hosts `セクションで、サーバーのIPアドレスまたはドメイン名を ` host()`ディレクティブに追加し、Deployerユーザーの名前(この例では* deployer *)を ` user()に追加します+ `ディレクティブ。 また、ステップ3で作成したSSHキーを `+ identifyFile()+`ディレクティブに追加する必要があります。 最後に、アプリケーションを含むフォルダーのファイルパスを追加する必要があります。

これらのフィールドの編集が完了すると、次のようになります。

deploy.php

...
// Project name
set('application', '');

// Project repository
set('repository', '');

. . .

// Hosts

host('')

   ->identityFile('~/.ssh/')
   ->set('deploy_path', '/var/www/html/');

次に、ファイルの最後の行である `+ before( 'deploy:symlink'、 'artisan:migrate'); +`をコメント化します。 この行は、Deployerにデータベース移行を自動的に実行するように指示し、コメントアウトすることで無効にします。 コメントアウトしないと、この行にはサーバー上に適切なデータベース資格情報が必要であり、最初の展開時に生成されるファイルを使用してのみ追加できるため、展開は失敗します。

deploy.php

...
// Migrate database before symlink new release.

//before('deploy:symlink', 'artisan:migrate');

プロジェクトをデプロイする前に、まずリモートGitリポジトリにプッシュする必要があります。

*ローカルマシン*で、作業ディレクトリをアプリケーションのフォルダーに変更します。

cd

`++`ディレクトリで次のコマンドを実行して、プロジェクトフォルダーのGitリポジトリを初期化します。

git init

次に、すべてのプロジェクトファイルをリポジトリに追加します。

git add .

変更をコミットします。

git commit -m ''

次のコマンドを使用して、Gitサーバーをローカルリポジトリに追加します。 強調表示されたテキストは、必ず独自のリモートリポジトリのURLに置き換えてください。

git remote add origin

変更をリモートGitリポジトリにプッシュします。

git push origin master

最後に、 `+ dep +`コマンドを使用して最初のデプロイメントを実行します:

dep deploy

すべてがうまくいけば、最後に `+ Successfully deploy!+`のような出力が表示されます:

Deployer's output✈︎ Deploying master on
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
➤ Executing task deploy:update_code
✔ Ok
✔ Executing task deploy:shared
✔ Executing task deploy:vendors
✔ Executing task deploy:writable
✔ Executing task artisan:storage:link
✔ Executing task artisan:view:clear
✔ Executing task artisan:cache:clear
✔ Executing task artisan:config:cache
✔ Executing task artisan:optimize
✔ Executing task deploy:symlink
✔ Executing task deploy:unlock
✔ Executing task cleanup
Successfully deployed!

サーバーの `+ / var / www / html / +`ディレクトリ内に次の構造が作成されます。

├── .dep
├── current -> releases/1
├── releases
│   └── 1
└── shared
   ├── .env
   └── storage

サーバー上で次のコマンドを実行してこれを確認します。このコマンドは、フォルダー内のファイルとディレクトリを一覧表示します。

ls /var/www/html/
Outputcurrent  .dep  releases  shared

これらの各ファイルとディレクトリの内容は次のとおりです。

  • `+ releases +`ディレクトリにはLaravelアプリケーションのデプロイリリースが含まれています。

  • `+ current +`は最後のリリースへのシンボリックリンクです。

  • `+ .dep +`ディレクトリには、Deployerの特別なメタデータが含まれています。

  • `+ shared `ディレクトリには、 ` .env `設定ファイルと、各リリースにシンボリックリンクされる ` storage +`ディレクトリが含まれています。

ただし、 `+ .env `ファイルが空のため、アプリケーションはまだ動作しません。 このファイルは、アプリケーションキー(暗号化に使用されるランダムな文字列)などの重要な構成を保持するために使用されます。 設定されていない場合、ユーザーセッションやその他の暗号化されたデータは安全ではありません。 このアプリには* local machine *に ` .env `ファイルがありますが、Laravelの ` .gitignore `ファイルはGitリポジトリにパスワードを除外します。これは、Gitリポジトリにパスワードなどの機密データを保存することは良い考えではなく、アプリケーションはサーバー上で異なる設定を必要とします。 ` .env +`ファイルにはデータベース接続設定も含まれているため、最初のデプロイメントでデータベースの移行を無効にしました。

サーバーでアプリケーションを構成しましょう。

  • deployer *ユーザーとしてサーバーにログインします。

ssh deployer@  -i ~/.ssh/

サーバー上で次のコマンドを実行し、ローカルの `+ .env +`ファイルをコピーしてエディターに貼り付けます。

nano /var/www/html//shared/.env

保存する前に、いくつかの変更を行う必要があります。 「+ APP_ENV 」を「 production」、「+ APP_DEBUG」を「+ false」、「+ APP_LOG_LEVEL」を「+ error 」に設定し、データベース、データベースユーザー、およびパスワードを自分のものに置き換えることを忘れないでください。 同様に、 `+`を独自のドメインに置き換える必要があります。

/var/www/html/laravel-app/shared/.env

APP_NAME=Laravel
APP_ENV=
APP_KEY=base64:cA1hATAgR4BjdHJqI8aOj8jEjaaOM8gMNHXIP8d5IQg=
APP_DEBUG=
APP_LOG_LEVEL=
APP_URL=http://

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

ファイルを保存し、エディターを閉じます。

ローカルマシンの `+ deploy.php +`ファイルの最後の行のコメントを外します:

deploy.php

...
// Migrate database before symlink new release.

before('deploy:symlink', 'artisan:migrate');

この構成が機能していることを確認するには、アプリケーションをもう一度デプロイします。 ローカルマシンで次のコマンドを実行します*:

dep deploy

これで、アプリケーションは正常に動作します。 サーバーのドメイン名()にアクセスすると、次のランディングページが表示されます。

image:https://assets.digitalocean.com/laraveldeployer/deployerimg.png [Laravelのランディングページ]

すべてのデプロイの前に、サーバー上の `+ .env +`ファイルを編集する必要はありません。 通常の展開は最初の展開ほど複雑ではなく、わずかなコマンドで実行されます。

手順7-典型的な展開の実行

最後のステップとして、このセクションでは、日常的に使用できる簡単な展開プロセスについて説明します。

再度デプロイする前に、アプリケーションを変更することから始めます。 たとえば、 `+ routes / web.php +`ファイルに新しいルートを追加できます:

/routes/web.php

<?php

. . .

Route::get('/', function () {
   return view('welcome');
});

これらの変更をコミットします。

git commit -am 'Your commit message.'

変更をリモートGitリポジトリにプッシュします。

git push origin master

そして最後に、アプリケーションをデプロイします。

dep deploy

アプリケーションがサーバーに正常にデプロイされました。

結論

Laravelアプリケーションをダウンタイムなしで簡単に展開できるように、ローカルコンピューターとサーバーを構成しました。 この記事では、Deployerの基本のみを取り上げており、多くの便利な機能を備えています。 一度に複数のサーバーにデプロイしてタスクを作成できます。たとえば、移行前にデータベースをバックアップするタスクを指定できます。 Deployerの機能の詳細については、https://deployer.org/docs/tasks [Deployer documentation]で詳細をご覧ください。

Related