Lesson 13

デプロイ

Lesson 13 Chapter 1
環境変数について

最後のLesson13では、作成したアプリケーションを開発環境から、本番の環境へと移行していく「デプロイ」という作業についての説明となります。

現在は CakePHP の機能であるビルトインサーバーを使用してアプリケーションを動かしていますが、インターネット上に公開するにあたり、実際のWEBサーバーへとアプリケーションを移行する必要が出てきます。その際、作成した機能やページのコードなど、そのほとんどはそのままデータを移すだけで良いのですが、各環境に合わせて設定する必要のある値があり、それらを持つ変数を「環境変数」と呼びます。

また、環境変数はパスワードや、ソルト値などセキュリティの面から公開しないようにするべき値を保持するためにも使われます。

現在の開発環境では、デバッグの有無やデータベースとの接続情報など、環境変数を使用する部分の多くが config/app_local.php で直接記述されている状態なのですが、app_local.php は各個人の開発者が自分の開発環境でのみ使用するもので、本番環境では基本的に config/app.php と .env ファイルという環境変数を保管・管理するファイルを使用します。

debugの設定

ここからは、実際にデプロイをする際に気をつけるべき環境変数を見ていくため、config/App.php を開いて内容を確認してみましょう。すぐに以下の debug についての記述が見つかると思います。

config/App.php
'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),

本番環境ではセキュリティやユーザビリティの面から、エラーの内容や、デバッグによるコードの表示などを防ぐ必要があるため、debug は false とするのが基本となります。

上記の debug についての処理内容を見てみると、filter_var()の中で、env()メソッドを使って 'DEBUG'という環境変数を読み込んでいます。第二引数に false を取っていますが、これは DEBUG の値に false を設定しているわけではなく、DEBUG 変数が取得できなかった場合などにデフォルトとして false が使われることを意味します。

ただ、現状は .env ファイルを使用する設定がされていないため、結果として第二引数の値が DEBUG に代入される値となっています。

今回は .env ファイルを使用した環境変数の設定方法を確認していきたいため、まずは .env ファイルを使用するように設定を変更していきます。

最初に config/ 配下にある .env.example というファイルを見つけ、ファイルごとコピー&ペーストなどを行って複製を生成し、ファイル名を .env に変更します。

13_1_1.png

次に、config/bootstrap.php を開き、以下の記述を見つけます。デフォルトではコメントアウトされているため、全て解除します。

bootstrap.php
if (!env('APP_NAME') && file_exists(CONFIG . '.env')) {
    $dotenv = new \josegonzalez\Dotenv\Loader([CONFIG . '.env']);
   $dotenv->parse()
        ->putenv()
        ->toEnv()
        ->toServer();
}

これで、config/.env 内で設定されている環境変数を使用できるようになりました。早速、.env ファイルを開き、以下のように DEBUG の値に false を入れるようにしましょう。

.env
export DEBUG="false"

次に、アプリケーション内のどこでもいいので、debug() や pr() などのデバッグメソッドを使用してみましょう。false でデバッグ内容が表示されず、true で表示されていれば正常に .env ファイルを参照できていることになります。

データベース接続の設定

次に、本番環境にデプロイした際のデータベース接続設定についてです。

config/app_local.php では、以下のように default というキーの値として、データベース接続に必要な情報をそのまま記述していました。

app_local.php
'Datasources' => [
    'default' => [
        'host' => 'localhost',
        /*
         * CakePHP will use the default DB port based on the driver selected
         * MySQL on MAMP uses port 8889, MAMP users will want to uncomment
         * the following line and set the port accordingly
         */
        //'port' => 'non_standard_port_number',

        'username' => 'root',
        'password' => 'your password',

        'database' => 'todo',

本番環境でも、app.php に上記と同じようにキーを追加で記述し、ユーザー名やパスワードを記述しても接続することはできるのですが、セキュリティ面からするとおすすめ出来ず、環境変数として .env ファイルから呼び出す方法が無難となります。

また、.env ファイルの中にデータベース接続を行うための環境変数である DATABASE_URL と、その値がデフォルトで用意されており、コメントアウトを外すことで使用可能となります。

.env
# Uncomment these to define database configuration via environment variables.
export DATABASE_URL="mysql://my_app:secret@localhost/${APP_NAME}?encoding=utf8&timezone=UTC&cacheMetadata=true&quoteIdentifiers=false&persistent=false"

上記の値を、使用するデータベースの設定に合わせて、以下のように編集を行います。

export DATABASE_URL="mysql://root:your_passward@localhost/${APP_NAME}?encoding=utf8&timezone=UTC&cacheMetadata=true&quoteIdentifiers=false&persistent=false"

編集箇所の詳細は以下のようになります。

  • my_app : ユーザー名

  • secret : パスワード

  • localhost : ホスト名

  • APP_NAME : データベース名

{APP_NAME} に関してだけは、.env ファイル内で環境変数として設定されているため、そちらの値を編集します。

.env
export APP_NAME="todo"

これで、DATABASE_URL という環境変数を使って、データベース接続を行うことが可能となりました。

再度 config/app_local.php を開き、キー default のデータベース接続設定を行なっている箇所の最後に url というキーがあります。

'Datasources' => [
    'default' => [
        'host' => 'localhost',

        ...

        'username' => 'root',
        'password' => 'Alkjhgfds24',
        'database' => 'todo',

        ...

        /*
         * You can use a DSN string to set the entire configuration
         */
        'url' => env('DATABASE_URL', null),
    ],

キー url の値を見ると、env()メソッドにて、DATABASE_URL が呼び出されていることがわかります。DATABASE_URL には接続に必要な情報が全て含まれているため、仮に キー default の値を url のみにしてもデータベースに問題なく接続することが可能です。

'Datasources' => [
                      'default' => [
                          // url のみでも接続可能
                          'url' => env('DATABASE_URL', null),
                      ],

そのため、本番環境においても .env の内容を本番用のデータベースの内容に合わせて編集した上で config/app.php にて、上記のように キー url の値として env()メソッドで DATABASE_URL を取得させれば、データベースに接続することが可能となります。

上記のデバッグとデータベース接続に関する環境変数については必ず確認しておきたいところですが、アプリケーションの機能や、使用する環境によってはほかにも様々な環境変数を設定すべき可能性が出てきます。

例えば、メール送信する場合に必要なSMTPサーバーのユーザー名やパスワード、外部のAPIと連携する際に必要なAPIキーなどが該当してきます。

いずれにしても環境変数として取り扱う値はどれも、外部に漏洩した場合にリスクとなるものがほとんどのため、適切に取り扱うことができるように配慮して設定を行いましょう。

Lesson 13 Chapter 2
デプロイの方法

サーバー環境にファイルを配置する

アプリケーションのファイル群を本番にあげる準備が整ったら、WEBサーバー側へとファイルを移していきます。

サーバー環境にファイルを配置する方法としては、FTPクライアントツールという WEBサーバーと自身のPCとのフォルダ間で送受信を行うことのできるツールを使って必要なファイルを手動で移していく方法と、githubを経由してclone/pull などのコマンドで移す方法があります。

アプリケーションの規模が小さいうちは、FTPクライアントツールでもいいかもしれませんが、基本的にはWEBサーバー側に一括でファイルを移すことのできる git と github を使用する方法をおすすめします。

というのも、CakePHP にもデフォルトで .gitignore というファイルが生成されており、特定のファイルに関しては git でバージョン管理をしないようされています。このことから、CakePHP もまた git を使用することを前提に考えられていると捉えることができます。

また、WEBサーバーにはドキュメントルートと呼ばれるフォルダが用意されており、HTML,CSS,JavaScriptファイルや、エントリーポイントとなる index.php など、公開しても問題のないファイルのみを入れるようにします。

ドキュメントルートは基本的に WEBサーバー側の設定で変更することが出来るようになっており、CakePHP においては webroot をドキュメントルートに指定する必要があります。

逆にsrc配下にあるファイルや、app.php などの外部に出す必要のないファイルはドキュメントルートの外に配置することで情報の漏洩が起こるリスクなどを抑えることができます。これらは webroot をドキュメントルートに指定することで自然と達成されるはずですが、デプロイ時には特に気をつけるようにしましょう。

サーバー環境での作業

git などで サーバーにファイルを配置できたら、環境変数の設定を改めて確認し、debug が false になっていることや データベースの接続情報などが問題ないようにします。

その後、アプリケーションの実行に必要な依存関係の問題を解決するために composer を利用します。サーバー上のコマンドラインで 以下のコマンドを実行します。

composer install

ここまで完了した段階で、アプリケーションの動作確認を行い、問題なく動作するかを確認します。

tmpフォルダ や logフォルダ などに、キャッシュやログの生成が出来ていない場合には、実行権限の見直しが必要な場合もあります。

以上、デプロイの流れと注意点の説明をもって、本教材は終了となります。お疲れ様でした。