レンタルサーバーにLaravelをデプロイするDeployerの使い方

by

in

フルスクラッチ開発したLaravelアプリケーションをデプロイする方法です。

モダンなアプリケーションだとDockerで固めて差し替えれば良いんですが、ことレンタルサーバーではDockerは動かないですし、HerokuのようにGitリポジトリにPushすれば設定ファイルの通りに自動でデプロイしてくれる機能もありません。

レンタルサーバーにフルスクラッチ開発したアプリケーション(今回はLaravelを前提にしていますが、他のアプリケーションでも可)をデプロイするのは3パターンあるかなと思います

  • ftpでアップロード
  • SSHログインしてgitのpull
  • Deployer などのデプロイ専用ライブラリを使用

ftpでアップロードする方法はデザイナーさんなどプログラマー以外でも反映できるのですが、フルスクラッチ開発だと変更が必要なファイルが多岐に渡り「どれをアップロードしないといけないんだっけ?」「変更していたファイルが巻き戻っているんだけど」の問題が出てくるのでお勧めしません。

SSHログインしてgitのpull、こちらはお手軽で良いと思います。今時レンタルサーバーでもgitコマンドはどこにもあるでしょうし、前述のftpでプログラマー以外が変更した場合でも変更箇所がすぐに解ります。ですがフルスクラッチ開発だと反映時のキャッシュクリアなど必要な処理を毎回実行する必要があります。

Deployer などのデプロイ専用ライブラリを使用、gitのpullよりも一歩進んだ方法かと思います。反映時に必要な処理がソースコードで管理できますし、デプロイ方法がアプリケーション内でバージョン管理もしやすいので、今回の記事はこの方法をお勧めします。

レンタルサーバーにDeployerでデプロイ

そもそもDeployerとはPHPで書かれたデプロイライブラリです。

https://deployer.org

昔々からあるライブラリなので、今はもっと簡単にできるものがあるかもしれないですが、Docker全盛期の今でわざわざデプロイライブラリを作ろうと思う人は少ないと思うので Deployerでいいと思います。

インストール方法はDeployerのドキュメント通りに設定します。

composer require --dev deployer/deployer
vendor/bin/dep init

設定方法を聞かれるので、設定ファイルがPHP、Laravelレシピを選択して他は空エンターで問題ないです。

Deployerのデプロイ方法だとキャッシュクリアが必要になるため別途ライブラリも追加します。

https://github.com/appstract/laravel-opcache

laravel-opcacheについてはPHPアプリケーションの高速化のためにOPcacheを導入しているレンタルサーバーが対象になります。Deployerのようにシンボリックリンクで差し替えるタイプとは相性が悪いのでキャッシュを削除する必要があります。以下参考リンク

古いソースコードで実行され続けるのでキャッシュクリアするためにライブラリを導入します。

composer require appstract/laravel-opcache

今回導入されたバージョンはこちら

    "require": {
        "php": "^8.2",
        "appstract/laravel-opcache": "^4.0",
~~~~
    "require-dev": {
        "deployer/deployer": "^7.4",

設定ファイルである deploy.php を設定変更していきます。

<?php
namespace Deployer;

require 'recipe/laravel.php';

// Config

set('repository', '<リポジトリのパス>');

add('shared_files', [
    'public/.htaccess',
]);
add('shared_dirs', []);
add('writable_dirs', []);

set('bin/php', '/usr/bin/php8.2');
set('bin/composer', '/usr/bin/php8.2 /home/<ユーザー名>/bin/composer.phar');

// Hosts
host('<サーバーホスト名>')
    ->set('hostname', '<サーバーホスト名>')
    ->set('remote_user', '<ユーザー名>')
    ->set('identity_file', '~/.ssh/<SSH秘密鍵>')
    ->set('deploy_path', '/home/<デプロイパス>')
    ->set('port', 10022);

task('npm:install', function () {
    run('cd {{release_path}} && npm install');
});
task('npm:build', function () {
    run('cd {{release_path}} && npm run build');
});
after('deploy:vendors', 'npm:install');
after('npm:install', 'npm:build');

after('deploy:failed', 'deploy:unlock');

task('artisan:opcache:status', function () {
    $code = run('{{bin/php}} {{release_or_current_path}}/artisan opcache:status');
    info($code);
});

task('artisan:opcache:clear', function () {
    $code = run('{{bin/php}} {{release_or_current_path}}/artisan opcache:clear');
    info($code);
});
after('deploy:cleanup', 'artisan:opcache:clear');

大まかの設定は記載した物で稼働させる事ができますが、プロジェクトによっては別途設定が必要になるかもしれません。今回はphp8.2で稼働するアプリケーション設定になります。

エックスサーバーでデフォルトで用意されているcomposerのバージョンは割り当てられたサーバーによっては古い物になっているので、別途導入しておく必要があります。

# レンタルサーバー側で設定
cd $HOME
mkdir bin
cd bin
wget https://getcomposer.org/download/2.7.6/composer.phar

紹介しているLaravelの11系では nodeによるviteのビルドが必須となっているため、デプロイ先のサーバーでnodeを入れておきましょう。以下の記事を参照してnodeを導入しておいてください。

あとは、以下のコマンド実行でデプロイができます。

./vendor/bin/dep deploy
# 初回はopcacheのclearで失敗する

最初のデプロイではopcacheのclearで失敗するので、コメントアウトしてソースだけ先に反映させましょう。

# deploy.php でコメントアウトしてからデプロイの再実行
// after('deploy:cleanup', 'artisan:opcache:clear');
% ./vendor/bin/dep deploy
task deploy:info
[*****.xserver.jp] info deploying HEAD (release 2)
task deploy:setup
task deploy:lock
task deploy:release
task deploy:update_code
task deploy:shared
task deploy:writable
task deploy:vendors
task artisan:storage:link
task artisan:config:cache
task artisan:route:cache
task artisan:view:cache
task artisan:event:cache
task artisan:migrate
[*****.xserver.jp] warning Your .env file is empty! Skipping...
task deploy:symlink
task deploy:unlock
task deploy:cleanup
task deploy:success
[*****.xserver.jp] info successfully deployed!

これでソースファイルはデプロイできました。

あとは公開ディレクトリにデプロイしたLaravelのpublicフォルダをシムリンク、.envの作成をしてデータベース等を指定すれば完了です。

# デプロイ先のレンタルサーバーで設定
rm -rf <公開したいドメインのパス> # エックスサーバーの場合は 〇〇.com/public_html
ln -s <デプロイパス>/current/public <公開したいドメインのパス>

# データベースの設定など、開発の設定をコピペして本番用に書き換えるのがオススメ
vi <デプロイパス>/shared/.env
# APP_KEY を再作成 (.envを編集してあらかじめ削除しておく)
cd <デプロイパス>/current
/usr/bin/php8.2 artisan key:generate

設定が完了したらコメントアウトを外してデプロイを再実行します。

# deploy.php でコメントアウトを外してからデプロイの再実行
after('deploy:cleanup', 'artisan:opcache:clear');
./vendor/bin/dep deploy

これでデプロイが完了したかと思います。

デプロイした後に問題が発覚した場合、素早く差し戻すこともできます。

% ./vendor/bin/dep rollback
task rollback
[******.xserver.jp] Current release is 4.
[******.xserver.jp] Rolling back to 3 release.
[******.xserver.jp] rollback to release 3 was successful

cronが用意されているレンタルサーバーも多くあるため、スケジュールの実行なども可能です。

crontab -e

# crontabの設定は以下
* * * * * cd /path/to/project/current && /usr/bin/php8.2 artisan schedule:run -q

job/queueもスケジュールを活用することで実行できます。

終わりに

ポイントとしては

  • あらかじめレンタルサーバーにSSH接続が出来るようにしておく
  • ./public ディレクトリを ln -s で公開したいドメインのDocumentRootにシムリンクを貼る
  • gitでソース管理する
  • gitからpull出来るように権限設定しておく
    • githubであればSSH鍵の登録などを行います
  • laravel-opcache をあらかじめ設定しておく
    • デプロイ後にOPcacheのクリアをしてくれる
  • .env での設定を整える

かと思います。

これを設定しておけばデプロイも簡単に行えますし、万が一の巻き戻しもすぐに対応できます。Deployerコマンドで使える事としては以下があります。

% ./vendor/bin/dep 
Deployer 7.4.0

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display help for the given command. When no command is given display help for the list command
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi|--no-ansi  Force (or disable --no-ansi) ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -f, --file=FILE       Recipe file path
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  blackjack                  Play blackjack
  completion                 Dump the shell completion script
  config                     Get all configuration options for hosts
  deploy                     Deploys your project
  help                       Display help for a command
  init                       Initialize deployer in your project
  list                       List commands
  provision                  Provision the server
  push                       Pushes local changes to remote host
  releases                   Shows releases list
  rollback                   Rollbacks to the previous release
  run                        Run any arbitrary command on hosts
  self-update                Updates deployer.phar to the latest version
  ssh                        Connect to host through ssh
  tree                       Display the task-tree for a given task
 artisan
  artisan:cache:clear        Flushes the application cache
  artisan:config:cache       Creates a cache file for faster configuration loading
  artisan:config:clear       Removes the configuration cache file
  artisan:db:seed            Seeds the database with records
  artisan:down               Puts the application into maintenance / demo mode
  artisan:event:cache        Discovers and cache the application's events and listeners
  artisan:event:clear        Clears all cached events and listeners
  artisan:event:list         Lists the application's events and listeners
  artisan:horizon            Starts a master supervisor in the foreground
  artisan:horizon:clear      Deletes all of the jobs from the specified queue
  artisan:horizon:continue   Instructs the master supervisor to continue processing jobs
  artisan:horizon:list       Lists all of the deployed machines
  artisan:horizon:pause      Pauses the master supervisor
  artisan:horizon:publish    Publish all of the Horizon resources
  artisan:horizon:purge      Terminates any rogue Horizon processes
  artisan:horizon:status     Gets the current status of Horizon
  artisan:horizon:terminate  Terminates the master supervisor so it can be restarted
  artisan:key:generate       Sets the application key
  artisan:migrate            Runs the database migrations
  artisan:migrate:fresh      Drops all tables and re-run all migrations
  artisan:migrate:rollback   Rollbacks the last database migration
  artisan:migrate:status     Shows the status of each migration
  artisan:nova:publish       Publish all of the Laravel Nova resources
  artisan:octane             Starts the octane server
  artisan:octane:reload      Reloads the octane server
  artisan:octane:status      Check the status of the octane server
  artisan:octane:stop        Stops the octane server
  artisan:opcache:clear      
  artisan:opcache:status     
  artisan:optimize           Cache the framework bootstrap files
  artisan:optimize:clear     Removes the cached bootstrap files
  artisan:passport:keys      Creates the encryption keys for API authentication
  artisan:pulse:check        Starts the Pulse server
  artisan:pulse:purge        Purges all Pulse data from storage
  artisan:pulse:restart      Restarts the Pulse server
  artisan:pulse:work         Process incoming Pulse data from the ingest stream
  artisan:queue:failed       Lists all of the failed queue jobs
  artisan:queue:flush        Flushes all of the failed queue jobs
  artisan:queue:restart      Restarts queue worker daemons after their current job
  artisan:route:cache        Creates a route cache file for faster route registration
  artisan:route:clear        Removes the route cache file
  artisan:route:list         Lists all registered routes
  artisan:storage:link       Creates the symbolic links configured for the application
  artisan:telescope:clear    Clears all entries from Telescope
  artisan:telescope:prune    Prunes stale entries from the Telescope database
  artisan:up                 Brings the application out of maintenance mode
  artisan:view:cache         Compiles all of the application's Blade templates
  artisan:view:clear         Clears all compiled view files
 deploy
  deploy:check_remote        Checks remote head
  deploy:cleanup             Cleanup old releases
  deploy:clear_paths         Cleanup files and/or directories
  deploy:copy_dirs           Copies directories
  deploy:info                Displays info about deployment
  deploy:is_locked           Checks if deploy is locked
  deploy:lock                Locks deploy
  deploy:prepare             Prepares a new release
  deploy:publish             Publishes the release
  deploy:release             Prepares release
  deploy:setup               Prepares host for deploy
  deploy:shared              Creates symlinks for shared files and dirs
  deploy:symlink             Creates symlink to release
  deploy:unlock              Unlocks deploy
  deploy:update_code         Updates code
  deploy:vendors             Installs vendors
  deploy:writable            Makes writable dirs
 logs
  logs:app                   Shows application logs
  logs:caddy                 Shows caddy logs
  logs:caddy:syslog          Shows caddy syslog
  logs:php-fpm               Shows php-fpm logs
 provision
  provision:check            Checks pre-required state
  provision:composer         Installs Composer
  provision:configure        Collects required params
  provision:databases        Provision databases
  provision:deployer         Setups a deployer user
  provision:firewall         Setups a firewall
  provision:install          Installs packages
  provision:mariadb          Provision MariaDB
  provision:mysql            Provision MySQL
  provision:npm              Installs npm packages
  provision:php              Installs PHP packages
  provision:postgresql       Provision PostgreSQL
  provision:server           Configures a server
  provision:ssh              Configures the ssh
  provision:update           Adds repositories and update
  provision:upgrade          Upgrades all packages
  provision:verify           Verifies what provision was successful
  provision:website          Provision website

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

Laravelの記事を厳選して紹介

投稿者


Comments

コメントを残す

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

CAPTCHA