0
0

ローカルの設定

pm2をグローバルにインストールします。

yarn global add pm2

ecosystem.config.jsという設定ファイルを作る。
これは、本番サーバーの設定情報を書くので、
基本、.gitignoreするべきかと思ったが、
そうすると、後のコマンドでecosystem.config.jsファイルがないって
怒られるので、環境変数化したい

ecosystem.config.js
module.exports = {
  apps : [
    {
      name: 'my-nuxt-app',
      exec_mode: 'cluster',
      instances: 'max', // またはアプリケーションを実行したいインスタンスの数
      script: './src/.output/server/index.mjs',
      args: 'start'
    }
  ],
  deploy : {
    production : {
      user : 'EC2インスタンスのユーザー名',
      host : 'EC2インスタンスのIPアドレス',
      key  : 'あなたのSSHキーへのパス',
      ref  : 'origin/main',
      repo : 'あなたのGitリポジトリURL',
      path : 'EC2インスタンス上のアプリケーションのパス',
      'post-deploy' : 'npm install && npm run build && pm2 reload ecosystem.config.js --env production'
    }
  }
};

環境変数は、

ecosystem.config.js
deploy : {
    production : {
      user : process.env.SERVER_USER,
      host : process.env.SERVER_IP,
    }
}

みたいにすれば良い。

ローカルの.zshrcとかに、
export SERVER_IP="ec2のパブリックIP"みたいに記載しておけばOK

本番(EC2)の設定

まずEC2インスタンスを作成します。
ここではAmazon Linux2023の
t2.nanoにします。

作成して、実行したら、サーバーに入ります

 ssh -i 作成したキーペアのパス ec2-user@パブリックipアドレス    

サーバーに入ったら、
node.jsをインストールします

[ec2-user@パブリックipアドレス ~]$ sudo yum update
[ec2-user@パブリックipアドレス ~]$ sudo yum install -y nodejs git

とかでインストールしてもいいですし、nvmとかでインストールしても良い。
私はnvmでやりました

ちなみに、

curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -

みたいなやり方もあるようですが、
これを実行すると、
非推奨的な警告が出て、
アップデートされたやり方でやってくださいと出るので、
現在ではそちらでやる必要はありそうです。

node.jsをインストールしたら、
本番にも

npm install pm2 -g

をしておきます。

デプロイ

まずは、

pm2 deploy ecosystem.config.js production setup

を実行します。

私はこれで死ぬほどハマりました。
先程の、ecosystem.config.jsは、

deploy : {
    production : {
      user : 'ec2-user',
      host : 'EC2インスタンスのパブリックIPアドレス',
      key  : 'EC2インスタンスに接続するためのkey-pair',
      ref  : 'origin/main',
      repo : 'git@github.com:user/sample.git',
      path : '/home/ec2-user/デプロイしたいディレクトリ', //絶対パス
      'post-deploy' : 'npm install && npm run build && pm2 reload ecosystem.config.js --env production'
    }
  }

ここのkeyですが、
ec2に接続するためのkey-pairです。
git cloneするときに使う、
githubに登録されているkeyではありません。

~/.ssh/id_rsaとかではないです。

でも、これだとどうやってgit cloneするのか疑問で、
これだけだと、

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

的なエラーに悩まされました。

これはローカルで、ssh-agentの設定をしなければならず、
どうもPM2のデプロイがそのような設定になっているっぽいです。

ec2では、ssh -T git@github.comを実行しても、
上手く行くし、git cloneも通るのに、
pm2 deployコマンド経由でcloneすると、
毎回引っかかるのはおそらくここが絡んでいるかと。

ローカルのsshファイルで

~/.ssh/config
Host ec2のパブリックIPアドレス
  ForwardAgent yes

と設定し、

ssh-add ローカルの秘密鍵の場所(.ssh/id_rsaみたいな)

これをやってからもう一度やると、
通りました。

ssh-agentの確認は、

ssh-add -L

でできます。

いやー、この辺ドキュメントに全く書かれていないので、
半ばあきらめていたのですが、よかったです。

最後に、

pm2 deploy ecosystem.config.js production

を実行します。

http:ec2のパブリックIP:3000で画面が見られればOKです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0