デプロイ　本番環境へアプリケーションを配置する

**はじめに**
は本番環境であるEC2上にアプリケーションを動かす環境を構築済みと仮定します。
RailsアプリケーションをEC2上に配置していきます。
また、動作させるためのアプリケーションの準備を行います。

開発環境であるCloud9環境と、デプロイを行うEC2の環境と２つの環境を使用します
________

### :shamrock:Railsアプリケーションをデプロイする

:star:**GitHubからアプリケーションを取得する**
Cloud9から秘密鍵をEC2サーバーに送る
``Cloud9で行います。``

EC2サーバーでgit cloneを行う時にsshでcloneするために、Cloud9環境に存在する秘密鍵を転送します。

IPアドレスの部分にはEC2サーバーのパブリックIPを指定します。

```
ec2-user:~/environment $ scp -i ~/.ssh/practice-aws.pem ~/.ssh/id_rsa ec2-user@IPアドレス:.ssh/id_rsa
```
:star:**GitHubからアプリケーションを取得する**
``EC2で行います。``
GitHubからアプリケーションを取得するには、ec2-userのホームディレクトリ **/home/ec2-user/** で行います。
以下のコマンドを入力して、GitHubからソースコードをcloneします。

もし、ホームディレクトリから移動していた場合は、clone前に**ホームディレクトリに移動**してから行います。

p-xx-xx-xx-xxの部分はパブリック IP アドレスです
```
[ec2-user@ip-xx-xx-xx-xx ~]$ cd
[ec2-user@ip-xx-xx-xx-xx ~]$ git clone GitHubのリポジトリのURL
```
**cd**
このコマンドはユーザーをホームディレクトリ（通常は /home/ec2-user）に移動させます。cd コマンドは、引数なしで使用されると、デフォルトでユーザーのホームディレクトリに移動します。

**git clone GitHubのリポジトリのURL**
このコマンドは、指定されたGitHubリポジトリのURLからリポジトリのコピーをローカルマシンにクローン（コピー）します。この操作により、GitHubリポジトリの内容が現在のディレクトリ（この場合はユーザーのホームディレクトリ）に新しいディレクトリとしてダウンロードされます。新しいディレクトリの名前は、リポジトリの名前に基づいています。

簡単に言うと、まずユーザーのホームディレクトリに移動し、次にGitHubのリポジトリをそのホームディレクトリにクローンしています。

#### :shamrock:master.keyをアップロードする

``Cloud9で行います。``

:::note warn
EC2へファイルをアップロードするには、scpコマンドを使います。scpコマンドを実行する場合、Cloud9から必ず、実行してください。
これは、scpでEC2サーバー接続に必要なキーペア（xxx.pem）が、Cloud9上にあるためです。
:::

Cloud9上でアプリケーションのルートディレクトリに移動し、以下のコマンドを実行してください。「IPアドレス」の部分には、IPv4パブリック IPが入ります。

:star:リポジトリ名は先頭大文字で入力する
例　SampleApp
```
username:~/environment/アプリケーション名 $ scp -i ~/.ssh/practice-aws.pem config/master.key ec2-user@IPアドレス:GitHubのリポジトリ名/config
```
このコマンドは、scp（secure copy）を使用して、一つのマシンから別のマシンにファイルを安全にコピーするためのものです。具体的な動作は以下の通りです：

**scp**
Secure Copyの略で、SSHを利用してネットワーク経由でのファイルコピーを行うコマンドです。

**-i ~/.ssh/practice-aws.pem**
SSH接続時に使用する秘密鍵のパスを指定します。この秘密鍵は、通常AWSのEC2インスタンスに接続する際に必要です。

**config/master.key**
ローカルマシン（開発環境）のconfigディレクトリ内にあるmaster.keyファイルを指定しています。このファイルをリモートマシンにコピーします。

**ec2-user@IPアドレス:GitHubのリポジトリ名/config**
ファイルをコピーする先のリモートマシンのアドレスとパスを指定しています。

**:ec2-user@IPアドレス：リモートマシンのユーザー名とIPアドレス**
GitHubのリポジトリ名/config：リモートマシン上のディレクトリのパス。master.keyファイルがこのパスにコピーされます。

:::note 
要約すると、このコマンドは開発環境のマシンからAWSのEC2インスタンス（本番環境）にmaster.keyファイルをコピーしています。このmaster.keyは、Railsアプリケーションの暗号化されたクレデンシャルを復号するための鍵として使用されるものです
:::
#### .envをアップロードする
``Cloud9で行います。``
.envファイルも.gitignoreに追記してGit管理下から外すようにしています。そのためEC2上にcloneしてきたアプリケーションには存在しません。
しかし、.envが存在しないとdatabase.ymlに記載している環境変数が空になってしまいデータベースとの接続ができません。
そのためGitHubを通さずに直接、EC2にアップロードします。

:snowflake:Cloud9上でアプリケーションのルートディレクトリで実行する。

:star:こちらも先頭大文字で入力
```
username:~/environment/アプリケーション名 $ scp -i ~/.ssh/practice-aws.pem .env ec2-user@IPアドレス:GitHubのリポジトリ名/
```
こちらも同様にEC2上のアプリケーションに.envがコピーされました。

### master.key,.envがアップロードできているかの確認方法
:star:sshでEC2(本番環境)にログイン
```
ssh -i ~/.ssh/practice-aws.pem ec2-user@xx-xx-xx
```
:star:**master.key確認**
cdコマンドでアプリに移動してからconfigに移動
```
cd config
```
```
ec2-user@ip-パブリックid config]$ ls -a
.  ..  database.yml  master.key  puma.rb
```
master.keyがあればOK!

:star:**.env確認**
cdコマンドでアプリケーション（先頭大文字で）へ移動
```
cd アプリケーション名
```
```
[ec2-user@ip-パブリックid アプリケーション名]$ ls -a
.  ..  .bundle  config  .env  Gemfile  Gemfile.lock  .git  .gitignore  README.md  vendor
```
.envがあればOK!
_____
#### サーバー起動前の準備を行う
以下のコマンドを順番に実行する
```
ec2-user@ip-xx-xx-xx-xx ~]$ cd GitHubのリポジトリ名
[ec2-user@ip-xx-xx-xx-xx GitHubのリポジトリ名]$ bundle install --path vendor/bundle --without test development
[ec2-user@ip-xx-xx-xx-xx GitHubのリポジトリ名]$ bundle exec rails assets:precompile RAILS_ENV=production
[ec2-user@ip-xx-xx-xx-xx GitHubのリポジトリ名]$ bundle exec rails db:create RAILS_ENV=production
[ec2-user@ip-xx-xx-xx-xx GitHubのリポジトリ名]$ bundle exec rails db:migrate RAILS_ENV=production
```
こちらのコマンド群は、Ruby on Railsのアプリケーションを本番環境（production）で動作させるための準備作業を行っています。

:sparkles:**bundle install --path vendor/bundle --without test development**
必要なgem（ライブラリやツール）をインストールします。

:sparkles:**--path vendor/bundle** はgemを**vendor/bundle**ディレクトリにインストールすることを指定します。

:sparkles:**--without test development** はテストや開発環境に関連するgemをインストールしないようにするためのオプションです。

:sparkles:**bundle exec rails assets:precompile RAILS_ENV=production**
アセット（JavaScript、CSS、画像など）をコンパイルして、本番環境で高速に動作するようにします。
**RAILS_ENV=production** はこのコマンドを本番環境用に実行することを指定しています。

:sparkles:**bundle exec rails db:create RAILS_ENV=production**
本番環境用のデータベースを作成します。

:sparkles:**bundle exec rails db:migrate RAILS_ENV=production**
データベースのマイグレーションを実行して、テーブルやカラムを作成・更新します。
要約すると、これらのコマンドはRailsのアプリケーションを本番環境で動作させるための設定や準備をしています。