ローカルの設定
pm2をグローバルにインストールします。
yarn global add pm2
ecosystem.config.jsという設定ファイルを作る。
これは、本番サーバーの設定情報を書くので、
基本、.gitignoreするべきかと思ったが、
そうすると、後のコマンドで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'
}
}
};
環境変数は、
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ファイルで
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です。