DeployerでLaravelをrsyncデプロイ – Xserverへの効率的な公開設定

by

in

Laravelプロジェクトを本番環境へ安全かつ効率よくデプロイするために、PHP製のデプロイツール「Deployer」を使っています。この記事では、特に rsync を活用したローカルビルド→サーバー転送の構成を紹介します。

現在地点

以前に、以下の記事を書きました。

こちらの記事ではDeployerを使用したシンプルなデプロイ方法を紹介しています。

記事内では「レンタルサーバー環境でnodeのビルドを行いましょう」と紹介していますが、なにぶん古い記事なため、node.jsの必要バージョンがv20系と新しい物にしないとビルドが出来ないのですが、v20系のnodeが動かないという問題が発生していました。

今まではv16系で対処していたのですが、重い腰をあげて対応したのが今回の記事につながりました。レンタルサーバー内でnodeのビルドはせずに、ビルド結果のjsファイルをまとめてrsyncでデプロイする事にしました。

rsyncでデプロイする利点としては

  • GitHubなどからソースファイルを取得するための秘密ファイルをレンタルサーバー内に置かないで済む
  • nodeのソースインストールなど、レンタルサーバーでの事前準備が不要になる

というメリットがあります。rsyncでのデプロイに興味がある方は是非参考にしてみてください。

Deployerとは?

Deployer はPHPアプリケーション向けのデプロイツールで、SSH経由でサーバーへのコード転送や、キャッシュクリア、ロールバックなどを自動化できます。

Laravelとの親和性も高く、recipe/laravel.phpを利用することで簡単に導入できます。

今回の構成

  • デプロイ先のサーバー:Xserver(SSH接続可)
  • PHPバージョン:8.2
  • Laravelアプリケーション
  • デプロイ方式:ローカルでnpmビルド → rsync転送
  • 環境:本番(prod)とステージング(stg)の2つ
  • バージョン:”deployer/deployer”: “^7.5”,

実際の設定ファイル

deploy.php ファイルの中身は以下のとおりです。

<?php

namespace Deployer;

require 'recipe/laravel.php';
require 'contrib/rsync.php';

基本設定

add('shared_files', ['public/.htaccess']);
set('keep_releases', 3);
set('bin/php', '/usr/bin/php8.2');
set('bin/composer', '/usr/bin/php8.2 ~/bin/composer.phar');

rsync 設定

set('rsync_src', __DIR__);
set('rsync_dest', '{{release_path}}');
set('rsync', [
    'exclude' => [
        '.git',
        'deploy.php',
        'node_modules',
        'tests',
        'vendor',
        'storage',
        'public/storage',
        'bootstrap/cache',
        '.env*',
        '.phpunit.result.cache',
        '.styleci.yml',
        '.DS_Store',
        'herd.yml',
        'jsconfig.json',
        'phpunit.xml',
        'README.md',
    ],
    'flags' => 'rz',
    'options' => ['delete'],
    'timeout' => 60,
]);

.envnode_modulesvendor は除外し、rsyncで必要なファイルだけを転送する構成です。

ホスト定義(Xserver)

本番(prod)

host('prod')
    ->set('hostname', '*****.xserver.jp')
    ->set('remote_user', 'productionuser')
    ->set('identity_file', '~/.ssh/production_xserver')
    ->set('deploy_path', '/home/productionuser/production.example.com/script/sample-laravel')
    ->set('port', 10022)
    ->set('http_user', 'productionuser');

ステージング(stg)

host('stg')
    ->set('hostname', '*****.xserver.jp')
    ->set('remote_user', 'staginguser')
    ->set('identity_file', '~/.ssh/staging_xserver')
    ->set('deploy_path', '/home/staginguser/staging.example.com/script/sample-laravel')
    ->set('port', 10022)
    ->set('http_user', 'staginguser');

このホスト定義を分けることで、コマンド引数を指定することで本番環境なのか、ステージング環境なのか、切り分けが容易になります。

# ステージング環境へのデプロイ
./vendor/bin/dep deploy stg

# 本番環境へのデプロイ
./vendor/bin/dep deploy prod

他にも Selector の機能を使う事でラベルを指定、複数のアプリケーションサーバーやバッチサーバーなども切り分けられるので必要に応じて設定してみてください。

カスタムタスク

npm ビルドとrsync実行

task('npm:build', function () {
    runLocally('npm run build');
});
task('local:sync', [
    'npm:build',
    'rsync',
]);

ローカル環境、デプロイを実行している環境で必要な処理として npm build があります。開発時のjsビルドではなく、適切に本番環境向けのビルドを実行してからrsyncを行う local:sync タスクを定義します。

キャッシュクリア用タスク

XserverにはOPcacheが導入されており、これはDeployerのようなシンボリックリンクを貼り替えるデプロイ方式とは相性が悪いのでキャッシュ削除をする必要があります。以下参考情報

そのため、キャッシュ削除する処理を作成し、Apache経由でキャッシュ削除するURLにアクセスすることでキャッシュクリアを行います。

task('cache:clear', function () {
    fetch('{{cache_clear_url}}');
});

cache_clear_url にキャッシュクリア用のURLを設定しておきます。

host('prod')
~~~~~~~~~~~~~
    ->set('cache_clear_url', 'https://production.example.com/clear.php')

clear.php は以下の設定で作成しておきます。

// public/clear.php
<?php

opcache_reset();

デプロイフックの設定

task('deploy:update_code')->disable();

after('deploy:release', 'local:sync');
after('deploy:cleanup', 'cache:clear');
after('deploy:failed', 'deploy:unlock');

deploy:update_code で git からのソースを取得しているので、実行をさせないようにしつつ、作成した task が実行されるようにフック登録します。

デプロイ手順

  1. .env はサーバーに既に用意しておきます。(もしくは最初の数回は失敗させながら、実ファイルが作成されたら本番用に設定をするなど)
  2. ./vendor/bin/dep deploy stg でデプロイの実行
  3. デプロイがされたら /public のパスを公開ディレクトリにシンボリックリンクを設定

コマンドを実行したら以下の流れになります。

% ./vendor/bin/dep tree deploy
The task-tree for deploy:
└── deploy
    ├── deploy:prepare
    │   ├── deploy:info
    │   ├── deploy:setup
    │   ├── deploy:lock
    │   ├── deploy:release
    │   ├── local:sync  // after deploy:release
    │   │   ├── npm:build
    │   │   └── rsync
    │   ├── deploy:update_code  // disabled
    │   ├── deploy:env
    │   ├── deploy:shared
    │   └── deploy:writable
    ├── deploy:vendors
    ├── artisan:storage:link
    ├── artisan:config:cache
    ├── artisan:route:cache
    ├── artisan:view:cache
    ├── artisan:event:cache
    ├── artisan:migrate
    └── deploy:publish
        ├── deploy:symlink
        ├── deploy:unlock
        ├── deploy:cleanup
        ├── cache:clear  // after deploy:cleanup
        └── deploy:success

まとめ

Deployer + rsync によるLaravelアプリの公開は、ビルドをローカルで完結できるため、サーバーにNode.jsやnpmを導入する必要がなく、セキュリティや負荷の観点でも非常にスマートです。

Xserverのように、GLIBCのバージョンが低いために必要なNode.jsのバージョンを導入する手間がある環境でもこの方法なら対応可能です。これからLaravelを本番公開する方は、ぜひこの方法を参考にしてみてください!

レンタルサーバーを最大限使いこなすための方法

Laravelの記事を厳選して紹介

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA