Fendo181 / laravel_practice

Laravel関連のrepositoryです
0 stars 0 forks source link

Deployerを使ってLaravelのプロジェクトをマネクラにデプロイする #4

Open Fendo181 opened 5 years ago

Fendo181 commented 5 years ago

困っていること

マネージドクラウドがせっかく無料で使えるという事で、Laravelのアプリケーションをdeployerを使ってデプロイしていく。

公式にLaravelのデプロイに特化した設定が自動で出力される記事があった。

Deployer — How to deploy Laravel application

参考にした設定資料

ゴール

(課題に対して、理想ではどうなっているべきか、どうあって欲しいかを書きます。このゴールが達成された時に issue を close します)

相談したいこと

(ゴールにいたるために、悩んでいること、決めて欲しいこと、助言してもらいたいことを書きます。)

関係者

(相談したい人にメンションします。)

Fendo181 commented 5 years ago

こんな感じに設定を追加した。

<?php
namespace Deployer;

require 'recipe/laravel.php';

// アプリの名前
set('application', 'laravel-first-endu-app');

// リポジトリ
set('repository', 'git@github.com:Fendo181/laravel_repos.git');

// [Optional] Allocate tty for git clone. Default value is false.
set('git_tty', false);

// ブランチ
set('branch', 'master');

// Shared files/dirs between deploys
add('shared_files', ['.env']);
add('shared_dirs', []);

// Writable dirs by web server
add('writable_dirs', ['bootstrap/cache', 'storage']);

// Hosts
host('{app_name}')
    ->stage('production')
    ->user('{user_name}')
    ->port('{port_number}')
    ->identityFile('{id_rsa.pub}')
    ->set('deploy_path', '/var/www/');

// Tasks
task('build', function () {
    run('cd {{release_path}} && build');
});

// サブディレクトリでコマンドを実行するようにする
task('change_cwd', function () {
    $subdir = get('release_path') . DIRECTORY_SEPARATOR . 'myApp';
    set('release_path', $subdir);
    run('cd {{release_path}}');
});

after('deploy:update_code', 'change_cwd');

// [Optional] if deploy fails automatically unlock.
after('deploy:failed', 'deploy:unlock');

// Migrate database before symlink new release.
before('deploy:symlink', 'artisan:migrate');

デプロイを実行

火 18 :myApp [endu]# php vendor/bin/dep deploy staging
✈︎ Deploying add-deployer on ssh-1.mc.lolipop.jp
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
✔ Executing task deploy:release
➤ Executing task deploy:update_code
.
.(個人情報が記載されている為省略)
.
Permission denied (publickey).
fatal: Could not read from remote repository.

権限周りで怒られた 🤔

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Fendo181 commented 5 years ago

これはマネクラに原因があるわけではなく、単純にgitのリモートリポジトリをsshgit cloneしようとしたけど、公開鍵認証の際の公開鍵を登録してないので、怒られているだけだった。

なのでマネクラ→githubで認証する為の鍵を生成する。

step1公開鍵 秘密鍵を生成する

# ディレクトリに移動する
$ cd ~/.ssh

# 鍵を作成する。 (メールアドレスはgitアカウントのメールアドレスです)
$ ssh-keygen -t rsa -b 4096 -C "YOUR@EMAIL.com"

# 鍵を確認する
$ ls
id_rsa  id_rsa.pub  known_hosts

step2 公開鍵をGithubに登録する

さきほど生成した公開鍵をGithubに登録します。

cat ~/.ssh/id_rsa.pub

ここから追加してください。

Githunに正常に登録されたかを確認するには以下のコマンドを実行してください。

sh -T git@github.com

上手く行けば、こんな感じにレスポンスが返ってくる。

Hi Fendo181! You've successfully authenticated, butGitHub does not provide shell access.
odd-yoron-5564@ssh-laravel-first-endu-app:/var/www/

ref: Install Ruby On Rails on Ubuntu 16.04 Xenial Xerus | GoRails

Fendo181 commented 5 years ago

ブランチ指定しないと今の作業ブランチを指定するのか... 🤔

  ================
  fatal: Remote branch add-deployer not found in u
  pstream origin

これでデプロイするブランチを指定できそう

set('branch', 'master');

ref: Deployer — Hosts

Fendo181 commented 5 years ago

次に進んだがエラーが出た。くそー しかし、ここら辺はインフラ研修で鍛えられたので、ガンガン解決して進んでいく気持ち。

  The command "cd /var/www//releases/1 && /usr/lo
  cal/bin/php /var/www//releases/1/composer.phar
  install --verbose --prefer-dist --no-progress -
  -no-interaction --no-dev --optimize-autoloader"
   failed.

  Exit Code: 1 (General error)

  Host Name: ssh-1.mc.lolipop.jp

  ================
  Composer could not find a composer.json file in
   /var/www/releases/1
  To initialize a project, please create a compos
  er.json file as described in the https://getcom
  poser.org/ "Getting Started" section

これ単純にComposer could not findって言っているから、実行しようとしたディレクトリを間違えているのでは? 💭

Fendo181 commented 5 years ago

release_pathにサブディレクトリ先のPATHに設定する事で上記の問題は解決した 🎉

// サブディレクトリでコマンドを実行するようにする
task('change_cwd', function () {
    $subdir = get('release_path') . DIRECTORY_SEPARATOR . 'myApp';
    set('release_path', $subdir);
    run('cd {{release_path}}');
});

マネクラのサーバを見た所、正常にmyAppディレクトリ内でcomposer installが実行されている事を確認した。

odd-yoron-5564@ssh-laravel-first-endu-app:/var/www/release/myApp$ php artisan -V
Laravel Framework 5.7.15

が今度は別の問題がでた(?)

In writable.php line 30:

Can't detect http user name.
Please setup `http_user` config parameter.

http_userを設定してないと怒られた。

ref: Deployerでサブディレクトリをデプロイする - Qiita

Fendo181 commented 5 years ago

ln -sコマンドで、シンボリックリンクを貼る。 こうする事で、

public以下のファイルをhtmlディレクトリ以下から、リンクで辿れるようにした。

:/var/www/release/myApp$ ln -s public/* ~/html/

が画面を見ると403 Forbidden になっている... 🤔

image

権限周りを確認する

odd-yoron-5564@ssh-laravel-first-endu-app:/var/www/html$ ls -lltotal 8
lrwxrwxrwx 1 odd-yoron-5564 www-data   10 Dec 17 18:25 css -> public/css
lrwxrwxrwx 1 odd-yoron-5564 www-data   18 Dec 17 18:25 favicon.ico -> public/favicon.ico
drwxrwxr-x 2 odd-yoron-5564 www-data 4096 Nov 29  2017 img
-rw-rw-r-- 1 odd-yoron-5564 www-data 1783 Aug  1  2017 index.html
lrwxrwxrwx 1 odd-yoron-5564 www-data   16 Dec 17 18:25 index.php -> public/index.php
lrwxrwxrwx 1 odd-yoron-5564 www-data    9 Dec 17 18:25 js -> public/js
lrwxrwxrwx 1 odd-yoron-5564 www-data   17 Dec 17 18:25 robots.txt -> public/robots.txt
lrwxrwxrwx 1 odd-yoron-5564 www-data   17 Dec 17 18:25 web.config -> public/web.config

問題なさそうに見えるなぁ

参考にした資料 ref: lnコマンドについて詳しくまとめました 【Linuxコマンド集】

Fendo181 commented 5 years ago

Apatch2.4の設定を変えてみる

まずは設定ファイルを確認する。

$ cd /etc/apache2/

$ ls
apache2.conf    envvars         mods-enabled     sites-enabled
conf-available  magic           ports.conf
conf-enabled    mods-available  sites-available

apache2.confが設定ファイルなので、覗いてみる。

<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

設定としては、Require all grantedにしているので、問題なさそう。 Options Indexes FollowSymLinksにもしているので、ちゃんとシンボリックリンクも追うようになっている。 そうなると、ディレクトリーの権限周りが怪しそう。。。

apacheでシンボリックリンクがForbiddenになる時は「SymLinksIfOwnerMatch」を疑おう – DACELO SPACE

Fendo181 commented 5 years ago

ドキュメントルートは固定だから、/www/html以下にデプロイしないといけない事がわかった 😫 (これに気付くまで何時間も溶かしてしまった....)

/var/www/html がドキュメントルートとして設定されている 現状、ドキュメントルートが /var/www/html 固定だが、これを変更可能にすることはできるだろうか?

ref:マネージドクラウドを使ってみる (PHP編) - Qiita

変更可能にしてほしい... 🙏 (この想いが福岡のりょうさんに届きますように)

image

なので、一旦は/var/www/ディレクトリ以下にデプロイするようにしてみる

Fendo181 commented 5 years ago

/var/www/html以下にデプロイすれば良い事がわかった。 が、シンボリックリンクを貼っての表示ができている事例があるので、なぜ自分の環境では出来てないのか疑問があるので、聴いてみる事にしよう... 🤔

Fendo181 commented 5 years ago

正しく絶対パスにして、シンボリックリンクのコマンドを指定したら、ちゃんとプロジェクトの中のアプリケーションを見るようになった! 🎉

ln -s /var/www/release/myApp/public/ /var/www/html/

が、アプリケーション画面を見ると500 InternalServerErrorが発生している...

image

Fendo181 commented 5 years ago

/var/www/shared/storage/logsにlaravelのエラーログが吐き出さられている。

見ると、いつも見るapplication encryption keyが無い事で怒られていた! よしっ!こいつはすぐに解決できそう!!

[2018-12-18 05:17:34] laravel.ERROR: No application encryption key has been specified. {"exception":"[object] (RuntimeException(code: 0): No application encryption key has been specified. at /var/www/releases/1/myApp/vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php:44)

以下のコマンドを叩いて、アプリケーションキーを生成する。

php artisan key:generate

ref:インストール 5.7 Laravel

Fendo181 commented 5 years ago

だめだった... /(^o^)\

$ php artisan key:generate
Application key set successfully.

キーは作られたが、だめだった... 見ると別のエラーが出ていた。

[2018-12-18 05:17:34] laravel.EMERGENCY: Unable to create configured logger. Using emergency logger. {"exception":"[object] (InvalidArgumentException(code: 0): Log [] is not defined. at /var/www/releases/1/myApp/vendor/laravel/framework/src/Illuminate/Log/LogManager.php:167)
Fendo181 commented 5 years ago

どうやら、Laravel5.5から5.6にアップグレードする際に、logging.phpを追加してなかったのが原因だった。

ref: laravel.EMERGENCY: Unable to create configured logger. Using emergency logger. - Qiita

追加したら、エラーが消えた。

が以前として、application encryption keyが無いと怒られている... 🤔

[2018-12-18 05:17:34] laravel.ERROR: No application encryption key has been specified. {"exception":"[object] (RuntimeException(code: 0): No application encryption key has been specified. at /var/www/releases/1/myApp/vendor/laravel/framework/src/Illuminate/Encryption/EncryptionServiceProvider.php:44)

本番サーバに入って.envを見ると何も書かれてなかった.... なぜだろう...

Fendo181 commented 5 years ago

.envは手動でvimを使って記述をした。

その後、アクセスした所確認できた!!!!!

image

やったぁーーー!!

Fendo181 commented 5 years ago

.envが空のまま作られてしまうのは、deployer側の仕様だった。

ただし、はじめからプロジェクト内に.envファイルが存在しない場合、空の.envファイルが生成され、それがリンクされます このため、sharedディレクトリにファイルがコピーされる前に環境にあわせた.envをファイルをプロジェクトディレクトリに生成しておく必要があります。

ref: Deployerを使ってLaravelのenvファイルをデプロイする - Qiita

ΩΩΩ<なっ..なっ...なんだってぇ〜!

普通に困るなので、deployerに設定を追加する。

// sharedディレクトリにファイルがコピーされる前に、copy:envを実行して`.env`ファイルをコピーしておく
before('deploy:shared','upload:env');

/**
 * .envを本番サーバにアップロードする
 */
task('upload:env', function () {
    upload('.env', '{{deploy_path}}/shared/.env');
})->desc('.envをアップロード');

この状態でちゃんと、本番環境に.envがデプロイされたか確認する。

odd-yoron-5564@ssh-laravel-first-endu-app:/var/www/shared$ pwd
/var/www/shared
odd-yoron-5564@ssh-laravel-first-endu-app:/var/www/shared$ cat .env 
APP_NAME=Laravel
APP_ENV=local

出来た〜! 🎉 これで.env問題も解決した。

Fendo181 commented 5 years ago

正しいパスを指定してシンボリックリンクを貼る

ln -s /var/www/release/myApp/public/* /var/www/html/

https://laravel-first-endu-app.lolipop.io/

最高だ〜〜〜!!!

image

Fendo181 commented 5 years ago

こちらで試した所再度エラーがでた。 composer installはできてそう

【WIP】LaravelとVue.jsを使ったSPAアプリケーションの作成 by Fendo181 · Pull Request #7 · Fendo181/laravel_repos

 Loading composer repositories with package information                                                                                                                                                                                                             
  Installing dependencies from lock file                                                                                                                                                                                                                             
  Dependency resolution completed in 0.000 seconds                                                                                                                                                                                                                   
  Analyzed 107 packages to resolve dependencies                                                                                                                                                                                                                      
  Analyzed 226 rules to resolve dependencies                                                                                                                                                                                                                         
  Package operations: 45 installs, 0 updates, 0 removals                                                                                                                                                                                                             
  Installs: symfony/polyfill-ctype:v1.10.0, symfony/yaml:v4.2.4, symfony/process:v4.2.4, symfony/polyfill-mbstring:v1.10.0, symfony/contracts:v1.0.2, symfony/console:v4.2.4, psr/container:1.0.0, pimple/pimple:v3.2.3, deployer/phar-update:v2.1.0, deployer/depl  
  oyer:v6.4.3, doctrine/inflector:v1.3.0, doctrine/lexer:v1.0.1, dragonmantank/cron-expression:v2.2.0, erusev/parsedown:1.7.1, phpoption/phpoption:1.5.0, vlucas/phpdotenv:v3.3.2, symfony/css-selector:v4.2.4, tijsverkoyen/css-to-inline-styles:2.2.1, symfony/po  
  lyfill-php72:v1.10.0, symfony/var-dumper:v4.2.4, symfony/routing:v4.2.4, symfony/http-foundation:v4.2.4, symfony/event-dispatcher:v4.2.4, psr/log:1.1.0, symfony/debug:v4.2.4, symfony/http-kernel:v4.2.4, symfony/finder:v4.2.4, egulias/email-validator:2.1.7,   
  swiftmailer/swiftmailer:v6.1.3, paragonie/random_compat:v9.99.99, ramsey/uuid:3.8.0, psr/simple-cache:1.0.1, opis/closure:3.1.6, symfony/translation:v4.2.4, nesbot/carbon:2.14.2, monolog/monolog:1.24.0, league/flysystem:1.0.50, laravel/framework:v5.8.3, fid  
  eloper/proxy:4.1.0, jakub-onderka/php-console-color:v0.2, nikic/php-parser:v4.2.1, jakub-onderka/php-console-highlighter:v0.4, dnoegel/php-xdg-base-dir:0.1, psy/psysh:v0.9.9, laravel/tinker:v1.0.8                                                               
    - Installing symfony/polyfill-ctype (v1.10.0): Loading from cache                                                                                                                                                                                                
   Extracting archive  - Installing symfony/yaml (v4.2.4): Loading from cache                                                                                                                                                                                        
   Extracting archive  - Installing symfony/process (v4.2.4): Loading from cache                                                                                                                                                                                     
   Extracting archive  - Installing symfony/polyfill-mbstring (v1.10.0): Loading from cache                                                                                                                                                                          
   Extracting archive  - Installing symfony/contracts (v1.0.2): Loading from cache                                                                                                                                                                                   
   Extracting archive  - Installing symfony/console (v4.2.4): Loading from cache                                                                                                                                                                                     
   Extracting archive  - Installing psr/container (1.0.0): Loading from cache                                                                                                                                                                                        
   Extracting archive  - Installing pimple/pimple (v3.2.3): Loading from cache                                                                                                                                                                                       
   Extracting archive  - Installing deployer/phar-update (v2.1.0): Loading from cache                                                                                                                                                                                
   Extracting archive  - Installing deployer/deployer (v6.4.3): Loading from cache                                                                                                                                                                                   
   Extracting archive  - Installing doctrine/inflector (v1.3.0): Loading from cache                                                                                                                                                                                  
   Extracting archive  - Installing doctrine/lexer (v1.0.1): Loading from cache                                                                                                                                                                                      
   Extracting archive  - Installing dragonmantank/cron-expression (v2.2.0): Loading from cache                                                                                                                                                                       
   Extracting archive  - Installing erusev/parsedown (1.7.1): Loading from cache                                                                                                                                                                                     
   Extracting archive  - Installing phpoption/phpoption (1.5.0): Loading from cache                                                                                                                                                                                  
   Extracting archive  - Installing vlucas/phpdotenv (v3.3.2): Loading from cache                                                                                                                                                                                    
   Extracting archive  - Installing symfony/css-selector (v4.2.4): Loading from cache                                                                                                                                                                                
   Extracting archive  - Installing tijsverkoyen/css-to-inline-styles (2.2.1): Loading from cache                                                                                                                                                                    
   Extracting archive  - Installing symfony/polyfill-php72 (v1.10.0): Loading from cache                                                                                                                                                                             
   Extracting archive  - Installing symfony/var-dumper (v4.2.4): Loading from cache                                                                                                                                                                                  
   Extracting archive  - Installing symfony/routing (v4.2.4): Loading from cache                                                                                                                                                                                     
   Extracting archive  - Installing symfony/http-foundation (v4.2.4): Loading from cache                                                                                                                                                                             
   Extracting archive  - Installing symfony/event-dispatcher (v4.2.4): Loading from cache                                                                                                                                                                            
   Extracting archive  - Installing psr/log (1.1.0): Loading from cache                                                                                                                                                                                              
   Extracting archive  - Installing symfony/debug (v4.2.4): Loading from cache                                                                                                                                                                                       
   Extracting archive  - Installing symfony/http-kernel (v4.2.4): Loading from cache                                                                                                                                                                                 
   Extracting archive  - Installing symfony/finder (v4.2.4): Loading from cache                                                                                                                                                                                      
   Extracting archive  - Installing egulias/email-validator (2.1.7): Loading from cache                                                                                                                                                                              
   Extracting archive  - Installing swiftmailer/swiftmailer (v6.1.3): Loading from cache                                                                                                                                                                             
   Extracting archive  - Installing paragonie/random_compat (v9.99.99): Loading from cache                                                                                                                                                                           
   Extracting archive  - Installing ramsey/uuid (3.8.0): Loading from cache                                                                                                                                                                                          
   Extracting archive  - Installing psr/simple-cache (1.0.1): Loading from cache                                                                                                                                                                                     
   Extracting archive  - Installing opis/closure (3.1.6): Loading from cache                                                                                                                                                                                         
   Extracting archive  - Installing symfony/translation (v4.2.4): Loading from cache                                                                                                                                                                                 
   Extracting archive  - Installing nesbot/carbon (2.14.2): Loading from cache                                                                                                                                                                                       
   Extracting archive  - Installing monolog/monolog (1.24.0): Loading from cache                                                                                                                                                                                     
   Extracting archive  - Installing league/flysystem (1.0.50): Loading from cache                                                                                                                                                                                    
   Extracting archive  - Installing laravel/framework (v5.8.3): Loading from cache                                                                                                                                                                                   
   Extracting archive  - Installing fideloper/proxy (4.1.0): Loading from cache                                                                                                                                                                                      
   Extracting archive  - Installing jakub-onderka/php-console-color (v0.2): Loading from cache                                                                                                                                                                       
   Extracting archive  - Installing nikic/php-parser (v4.2.1): Loading from cache                                                                                                                                                                                    
   Extracting archive  - Installing jakub-onderka/php-console-highlighter (v0.4): Loading from cache                                                                                                                                                                 
   Extracting archive  - Installing dnoegel/php-xdg-base-dir (0.1): Loading from cache                                                                                                                                                                               
   Extracting archive  - Installing psy/psysh (v0.9.9): Loading from cache                                                                                                                                                                                           
   Extracting archive  - Installing laravel/tinker (v1.0.8): Loading from cache                                                                                                                                                                                      
   Extracting archiveGenerating optimized autoload files                                                                                                                                                                                                             
  > post-autoload-dump: Illuminate\Foundation\ComposerScripts::postAutoloadDump                                                                                                                                                                                      
  > post-autoload-dump: @php artisan package:discover                                                                                                                                                                                                                
  Script @php artisan package:discover handling the post-autoload-dump event returned with error code 1                                                                                                                                                              
Fendo181 commented 5 years ago

↑の問題は解決した。

結論から先に書くとphp artisan package:discover実行時に以下のクラスのファイルがないと怒られていたのが原因だった。 ideHelperServiceProviderphp artisan ide-helper:generateを実行しないと生成されないファイルで、このファイルがなくエラーがでていた。

なので、コマンドを実行すれば問題なかったが、なくても特に問題ないので削除した。

【WIP】LaravelとVue.jsを使ったSPAアプリケーションの作成 by Fendo181 · Pull Request #7 · Fendo181/laravel_repos

$this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);