LaravelをDeployerでデプロイする流れ

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
<?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
```
２回目以降、.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日ほどかかった。。。

あとは、データベースとの連携が。。。