LaravelをDeployerでデプロイしてみた。
$ composer require deployer/deployer --dev
$ vendor/bin/dep
$ php vendor/bin/dep init
Please select your project type [Common]:
[0 ] Common
[1 ] Laravel
[2 ] Symfony
[3 ] Yii
[4 ] Yii2 Basic App
[5 ] Yii2 Advanced App
[6 ] Zend Framework
[7 ] CakePHP
[8 ] CodeIgniter
[9 ] Drupal
[10] TYPO3
今回はLaravelなので、1を選択。
すると deploy.php という設定ファイルが作成される
今回は以下のように書いた。なお、ymlファイルはステージング環境と本番環境を分けていなくて、
本番環境しかないので、作成していない。
<?php
namespace Deployer;
require 'recipe/laravel.php';
// Project name
set('application', 'my_project');
// Project repository
set('repository', 'git@github.com:nag*******ki/sns_pr*********ori.git');
// [Optional] Allocate tty for git clone. Default value is false.
set('git_tty', true);
// Shared files/dirs between deploys
add('shared_files', []);
add('shared_dirs', ['vendor']);
// Writable dirs by web server
add('writable_dirs', ['bootstrap/cache', 'storage']);
// Hosts
//公開したいEC2インスタンスと紐付けしたElasticIP
host('1*.1*8.**.***')
->port('22')
->user('ec2-user')
->stage('production')
->set('branch', 'master')
->identityFile('~/Desktop/aws-********.pem')
->set('deploy_path', '~/{{application}}');
// Tasks
task('build', function () {
run('cd {{release_path}} && build');
});
//Task追記した箇所
//option('env-update', null, InputOption::VALUE_OPTIONAL, 'update env file.');
task('copy:env', function () {
if (input()->hasOption('env-update')){
$update = input()->getOption('env-update');
if($update == 'true'){
$stage = get('stage');
$src = ".env.${stage}";
$path = get('deploy_path');
$shared_path = "${path}/shared";
run("if [ -e $(echo ${shared_path}/.env ) ]; then cp {{release_path}}/${src} ${shared_path}/.env; fi");
run("cp {{release_path}}/${src} {{release_path}}/.env");
}
}
});
/*
task('npm:run', function (): void {
run('cd {{release_path}} && chmod 707 public');
run('cd {{release_path}} && npm install');
if (input()->getArgument('stage') === 'production') {
run('cd {{release_path}} && npm run production');
} else {
run('cd {{release_path}} && npm run development');
}
});
task('php:run', function (): void {
run('cd {{release_path}} && composer dump-autoload');
run('cd {{release_path}} && php artisan htaccess:ip');
});
*/
task('deploy', [
'deploy:info',
'deploy:prepare', // サーバに接続して、ソースコードを配置するディレクトリを作成するTask
'deploy:lock', // デプロイをlockすすTask
'deploy:release', // デプロイするソースコードを配置するためのディレクトリを整備するTask
'deploy:update_code', // git cloneでソースを落とすTask
'deploy:shared', // リリースバージョンの共有ディレクトリを設置するTask
'deploy:writable',
'deploy:vendors', // composerをinstallするTask
'deploy:clear_paths',
'deploy:symlink', // シンボリックリンク差し替えるTask
'deploy:unlock', // デプロイのlockを解除するTask
'cleanup', // 前リリースバージョンを削除するTask
'success',
]);
before('deploy:shared', 'copy:env'); // deploy:sharedの前にTaskを実行
//after('deploy:shared', 'npm:run'); // deploy:sharedの後にTaskを実行
//after('deploy:vendors', 'php:run'); // deploy:vendorsの後にTaskを実行
// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');
// Migrate database before symlink new release.
//before('deploy:symlink', 'artisan:migrate');
次にデプロイコマンド(本番環境用)
はじめに
$ ./vendor/bin/dep deploy production
2回目以降、.envファイルに変更があった場合に下のコマンドを実行
$ ./vendor/bin/dep deploy production --env-update=true
次に、EC2とGitHubとの連携
EC2内で、秘密鍵と公開鍵を作成
viやcatコマンドで、github_id_rsa.pubの中身を全てコピーして
GitHubのSSHKeyのところに貼り付け。
EC2内にいて、vi ~/.sshに秘密鍵と公開鍵がある状態。
vi ~/.ssh/configでファイルを作成し、以下のように記載
[ec2-user@ip-10-0-10-11 .ssh]$ vi config
Host github
HostName github.com
IdentityFile ~/.ssh/github_id_rsa
User git
権限付与
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/config
以下のようにコマンドを打ったら、成功
$ ssh -T git@github.com
Warning: Permanently added the RSA host key for IP address '**.***2.7*.**' to the list of known hosts.
Hi nagamoridaiki! You've successfully authenticated, but GitHub does not provide shell access.
ただし、詰まったところがあり、秘密鍵は名前をid_rsaにしないと通らないようである。
そんな時は、
cp github_id_rsa id_rsa
これでgit cloneも、 deployerもうまく通った。
deployerがうまくいくと、EC2にmy_projectフォルダができ、そこにGitHubにのせた
Laravelプロジェクトがインストールされているので、
あとはApacheのDocumentルートを
DocumentRoot "~/my_project/current/public"
のように設定する。
と、ドメイン名でLaravelのアプリが表示されるようになる。
ここまでで、2日ほどかかった。。。
あとは、データベースとの連携が。。。