開発者ドキュメント

Ubuntu16.04でDeployerを使用してLaravelアプリケーションを自動的にデプロイする方法

序章

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

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

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

前提条件

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

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

ローカルマシンからアプリケーションを作成してデプロイするので、ローカル開発環境を構成することから始めます。 Deployerは、ローカルマシンから展開プロセス全体を制御するため、最初にインストールします。

注:ローカルマシンでWindowsを使用している場合は、BASHエミュレーター(Git bashなど)を使用してすべてのローカルコマンドを実行する必要があります。

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

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

次に、短いPHPスクリプトを実行して、インストーラーがDeployer-ダウンロードページにある最新のインストーラーのSHA-1ハッシュと一致することを確認します。 強調表示された値を最新のハッシュに置き換えます。

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

Deployerをシステム全体で利用できるようにします。 ローカルマシンでWindowsまたはmacOSを実行している場合は、 /usr/local/bin/dep このコマンドを実行する前のディレクトリ:

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

実行可能にする:

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

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

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

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

ステップ2—リモートGitリポジトリに接続する

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

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

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

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

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

  1. touch ~/.ssh/config

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

〜/ .ssh / config
Host mygitserver.com
    HostName mygitserver.com
    IdentityFile ~/.ssh/gitkey

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

  1. chmod 600 ~/.ssh/config

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

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

  1. cat ~/.ssh/gitkey.pub

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

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

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

  1. ssh -T git@mygitserver.com

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

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

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

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

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

  1. sudo adduser deployer

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

  1. sudo usermod -aG www-data deployer

deployerユーザーによって作成されたファイルのデフォルトの権限は次のようになります。 644 ファイルと 755 ディレクトリ用。 このようにして、 deployer ユーザーはファイルの読み取りと書き込みを行うことができ、グループと他のユーザーはファイルを読み取ることができます。

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

  1. sudo chfn -o umask=022 deployer

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

  1. sudo chown deployer:www-data /var/www/html

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

  1. sudo chmod g+s /var/www/html

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

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

  1. su - deployer

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

  1. ssh-keygen -t rsa -b 4096

公開鍵を表示します。

  1. cat ~/.ssh/id_rsa.pub

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

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

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

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

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

  1. cat ~/.ssh/deployerkey.pub

サーバーdeployerユーザーとして、次のコマンドを実行します。

  1. nano ~/.ssh/authorized_keys

公開鍵をエディターに貼り付けて、 CTRL-X, Y、 それから ENTER 保存して終了します。

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

  1. chmod 600 ~/.ssh/authorized_keys

次に、sudoユーザーに切り替えます。

  1. exit

これで、サーバーはGitサーバーに接続でき、ローカルマシンからdeployerユーザーを使用してサーバーにログインできます。

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

  1. ssh deployer@your_server_ip -i ~/.ssh/deployerkey

deployer としてログインした後、サーバーとGitサーバー間の接続もテストします。

  1. ssh -T git@mygitserver.com

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

  1. exit

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

ステップ4—Nginxを構成する

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

まず、新しいサイトのサーバーブロック構成ファイルを作成する必要があります。

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

  1. sudo nano /etc/nginx/sites-available/example.com

追加する server 構成ファイルの先頭にブロックします。

/etc/nginx/sites-available/<^>example.com <^>
server {
        listen 80;
        listen [::]:80;

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

        server_name example.com www.example.com;
}

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

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

/etc/nginx/sites-available/<^>example.com <^>
server {
        listen 80;
        listen [::]:80;

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

        server_name example.com www.example.com;

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

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

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

/etc/nginx/sites-available/<^>example.com <^>
server {
        listen 80;
        listen [::]:80;

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

        server_name example.com www.example.com;

        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;

        }

最後に、Nginxが非表示のアクセスを許可しないようにします .htaccess ファイル。 これを行うには、ロケーションブロックをもう1つ追加します。 location ~ /\.ht そして、そのブロック内で、 deny all;.

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

/etc/nginx/sites-available/<^>example.com <^>
server {
        listen 80;
        listen [::]:80;

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

        server_name example.com www.example.com;

        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 ディレクトリ:

  1. sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

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

  1. sudo nginx -t

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

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

  1. sudo systemctl restart nginx

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

ステップ5—MySQLの設定

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

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

  1. mysql -u root -p

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

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

  1. CREATE DATABASE laravel_database DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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

  1. CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'password';

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

  1. GRANT ALL ON laravel_database.* TO 'laravel_user'@'localhost';

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

  1. FLUSH PRIVILEGES;

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

  1. EXIT;

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

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

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

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

  1. cd /path/to/laravel-app

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

  1. dep init -t Laravel

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

deploy.php
<?php
namespace Deployer;

require 'recipe/laravel.php';

. . .

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

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

deploy.php
...
// Project name
set('application', 'laravel-app');

// Project repository
set('repository', 'git@mygitserver.com:username/repository.git');

. . .

// Hosts

host('your_server_ip')
    ->user('deployer')
    ->identityFile('~/.ssh/deployerkey')
    ->set('deploy_path', '/var/www/html/laravel-app');

次に、ファイルの最後の行をコメントアウトします。 before('deploy:symlink', 'artisan:migrate');. この行は、データベースの移行を自動的に実行するようにDeployerに指示し、コメントアウトすることで無効にします。 コメントアウトしない場合、この行ではサーバー上に適切なデータベースクレデンシャルが必要であるため、デプロイメントは失敗します。これは、最初のデプロイメント中に生成されるファイルを使用してのみ追加できます。

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

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

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

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

  1. cd /path/to/laravel-app

次のコマンドをで実行します laravel-app プロジェクトフォルダ内のGitリポジトリを初期化するディレクトリ:

  1. git init

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

  1. git add .

変更をコミットします。

  1. git commit -m 'Initial commit for first deployment.'

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

  1. git remote add origin git@mygitserver.com:username/repository.git

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

  1. git push origin master

最後に、を使用して最初の展開を実行します dep 指図:

  1. dep deploy

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

Deployer's output
✈︎ Deploying master on your_server_ip ✔ 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/laravel-app ディレクトリ:

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

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

  1. ls /var/www/html/laravel-app
Output
current .dep releases shared

これらのファイルとディレクトリのそれぞれに含まれるものは次のとおりです。

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

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

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

  1. ssh deployer@your_server_ip -i ~/.ssh/deployerkey

サーバーで次のコマンドを実行し、ローカルをコピーして貼り付けます .env 編集者へのファイル:

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

保存する前に、いくつかの変更を加える必要があります。 設定 APP_ENVproduction, APP_DEBUGfalse, APP_LOG_LEVELerror また、データベース、データベースユーザー、およびパスワードを独自のものに置き換えることを忘れないでください。 交換する必要があります example.com 自分のドメインでも:

/var/www/html/laravel-app/shared/.env
APP_NAME=Laravel
APP_ENV=production
APP_KEY=base64:cA1hATAgR4BjdHJqI8aOj8jEjaaOM8gMNHXIP8d5IQg=
APP_DEBUG=false
APP_LOG_LEVEL=error
APP_URL=http://example.com

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_database
DB_USERNAME=laravel_user
DB_PASSWORD=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');

警告:これにより、データベースの移行がすべての展開で自動的に実行されます。 これにより、データベースを手動で移行する必要がなくなりますが、展開する前にデータベースをバックアップすることを忘れないでください。

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

  1. dep deploy

これで、アプリケーションは正しく機能します。 サーバーのドメイン名( http://example.com )にアクセスすると、次のランディングページが表示されます。

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

ステップ7—一般的な展開の実行

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

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

/routes/web.php
<?php

. . .

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

Route::get('/greeting', function(){
	return 'Welcome!';
});

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

  1. git commit -am 'Your commit message.'

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

  1. git push origin master

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

  1. dep deploy

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

結論

ダウンタイムなしでLaravelアプリケーションを簡単にデプロイできるようにローカルコンピューターとサーバーを構成しました。 この記事では、Deployerの基本のみを取り上げており、多くの便利な機能があります。 一度により多くのサーバーにデプロイして、タスクを作成できます。 たとえば、移行前にデータベースをバックアップするタスクを指定できます。 Deployerの機能について詳しく知りたい場合は、Deployerのドキュメントで詳細を確認できます。

モバイルバージョンを終了