フルスクラッチ開発した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で書かれたデプロイライブラリです。
昔々からあるライブラリなので、今はもっと簡単にできるものがあるかもしれないですが、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
コメントを残す