カテゴリー: BackEnd

Deployerで複数の環境やサーバにデプロイするには

はじめに

Deployerを使用する場合、よくあるケースとしてプロダクション・ステージング環境があったり、プロダクション環境が冗長化されているなど、1つのソースを複数のサーバにデプロイしなければならないことがあると思います。
今回は、そのような場合にDeployerでデプロイする方法を紹介します。Deployerの初期設定が済んでいない場合は、こちらの記事を参考にセットアップしてみてください。

hosts.ymlファイルの作成

前回の記事ではdeploy.phpに hosts()関数を使用してデプロイ先を定義していましたが、今回は複数のデプロイ先を定義しやすくするため、ymlファイルに分けます。
hosts.ymlファイルを作成して、以下のように設定します。

.base: &base
  identityFile: ~/.ssh/your-key.pem
  user: your-user

prod-app01: # デプロイ先
  <<: *base
  hostname: app01.project.com
  stage: production
  deploy_path: /var/www/{{application}}

.base: &baseでは、各デプロイ先で共通の設定を記述します。prod-app01:がデプロイ先の名前で、共通の設定を継承しています。
設定内容は、一旦前回 host()関数で設定した内容を、設定しておきます。

上記のymlファイルを読み込むため、hosts.ymlに次のように追記します。

inventory('hosts.yml');

deploy.phpに host()関数を使用したデプロイ方法が実装されている場合は、削除しておきましょう。

プロダクション・ステージング環境を分ける

プロダクション・ステージング環境を分けるにはstageを使用します。

ymlファイルの記載

先ほどのymlファイルに追記する形で、ステージング環境を追加してみます。

prod-app01:
  <<: *base
  hostname: app01.project.com
  stage: production
  deploy_path: /var/www/{{application}}


#ここから追記
stg-app01:
  <<: *base
  hostname: stg-app01.project.com
  stage: staging
  deploy_path: /var/www/{{application}}

stg-app01を追加しました。stage: stagingと指定するため、先ほどのプロダクション環境と別々にデプロイできるようになりました。

デプロイコマンド

この場合のデプロイコマンドは次のようになります。

# ステージング環境にデプロイ
$ ./vendor/bin/dep deploy staging

複数台のサーバに同時リリースする

プロダクション環境では、複数のサーバで冗長構成を取っている場合が多いと思います。1回のデプロイで、複数のサーバにデプロイする設定を紹介します。

ymlファイルの記載

prod-app01:
  <<: *base
  hostname: app01.project.com
  stage: production
  deploy_path: /var/www/{{application}}

prod-app02:
  <<: *base
  hostname: app02.project.com
  stage: production
  deploy_path: /var/www/{{application}}

例として、2台のプロダクション環境を想定して、2環境分の設定をしました。同じstageを設定することで、同時にデプロイされます。

デプロイコマンド

デプロイコマンドは先ほどと同じです。

$ ./vendor/bin/dep deploy production
✈︎ Deploying master on app01.project.com
✈︎ Deploying master on app02.project.com
✔ Executing task deploy:prepare
✔ Executing task deploy:lock
:
: (省略)
:
✔ Executing task cleanup
Successfully deployed!

このように、複数サーバがデプロイされます。

デプロイ先によってタスクを変更する

特定のサーバでのみ実行したいタスクがある場合は、サーバにrole(役割)を設定することで、それぞれの専用タスクを実行することができます。
SPAサイトで、フロントエンドとバックエンドが別々のサーバで、同時にデプロイいすることを例に、紹介します。

ymlファイルの記載

次のroleをそれぞれのサーバに割り振ります。

  • web フロントエンドのサーバ。デプロイ時にJS/CSSのコンパイルを行う。
  • app バックエンドのサーバ。デプロイ時にDBマイグレーションを行う。
.base: &base
  identityFile: ~/.ssh/your-key.pem
  user: your-user
  deploy_path: /var/www/{{application}}

prod-app01:
  <<: *base
  hostname: app01.project.com
  stage: production
  role: app

prod-app02:
  <<: *base
  hostname: app02.project.com
  stage: production
  role: app

prod-web01:
  <<: *base
  hostname: www01.project.com
  stage: production
  role: web

prod-web02:
  <<: *base
  hostname: www02.project.com
  stage: production
  role: web

stg-app01:
  <<: *base
  hostname: stg-app01.project.com
  stage: staging
  role: app

stg-web01:
  <<: *base
  hostname: stg-web01.project.com
  stage: staging
  role: web

これでyamlファイルの設定は完了です。

deploy.phpの実装

定義したroleでのみ実行するタスクを定義します。

// appサーバデプロイ時は、DBマイグレーションを実行する
task('artisan:migrate', function () {
    run('{{bin/php}} {{release_path}}/artisan migrate --force');
})->onRoles('app');

// webサーバデプロイ時はnpm runを実行する
task('npm:run', function () {
    run('npm run');
})->onRoles('web');

タスクの定義に onRoles()を設定することで、hosts.ymlで定義したロールのサーバに対してのみ、タスクが実行されます。

さいごに

hosts.ymlの定義の組み合わせで、実際によくありそうなデプロイ設定をすることができるので、ぜひ試してみてください。

おすすめ書籍

カイザー

シェア
執筆者:
カイザー
タグ: laravelphp

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前