Node.js: はじめに
Stackhero で Node.js サービスを迅速かつ安全にデプロイする方法
👋 Stackheroのドキュメントへようこそ!
Stackheroは、数多くの利点を提供するNode.jsクラウドソリューションを提供しています。主な利点は以下の通りです:
- シンプルな
git pushで数秒でアプリケーションをデプロイ。- 独自のドメイン名を使用し、HTTPS証明書の自動設定による強化されたセキュリティを享受。
- 自動バックアップ、ワンクリックアップデート、そしてシンプルで透明性があり、予測可能な価格設定で安心を提供。
- プライベートで専用のVMによる最適なパフォーマンスと強固なセキュリティを実現。
時間を節約し、生活を簡素化:StackheroのNode.jsクラウドホスティングソリューションを試すのに5分しかかかりません!
Stackhero で Node.js サービスをデプロイするのは、迅速・効率的・信頼性を重視して設計されています。このガイドでは、アプリケーションを数分で稼働させるための基本的な手順を、セキュリティとパフォーマンスを考慮しながらご案内します。
Node.js サービスを開始する
まずは Stackhero 上で Node.js サービスを作成しましょう。これがアプリケーションデプロイの基盤となり、Stackhero のクラウドホスティングのすべてのメリットを利用できるようになります。
前提条件
作業を始める前に、以下のツールをご用意ください:
- Git: https://git-scm.com/downloads からダウンロードできます。
- Windows ユーザーの方へ:より快適に作業するために、Microsoft Store から入手できる Windows Terminal のご利用をおすすめします。
サービスの設定
主な設定作業は、SSH 公開鍵の更新です。この鍵により、Stackhero が安全にコードリポジトリへアクセスできるようになります。
公開鍵を確認するには、ターミナルで次のいずれかのコマンドを実行してください:
cat ~/.ssh/id_rsa.pub
または
cat ~/.ssh/id_ed25519.pub
まだ SSH キーペアをお持ちでない場合は、Linux や macOS では ssh-keygen、Windows では ssh-keygen.exe を実行して生成できます。
公開鍵を取得したら、Stackhero ダッシュボードにログインし、Node.js サービスを選択して設定セクションに進み、指定されたフィールドに鍵を貼り付けてください。
Tip: SSH 公開鍵を今後作成するすべてのサービスで利用したい場合は、グローバル設定が可能です。Stackhero ダッシュボードで右上のプロフィール画像をクリックし、「Your profile」に進んで SSH 公開鍵を貼り付けてください。
サンプルのクローン
スムーズに始められるよう、Stackhero でのデプロイ方法を示す Node.js サンプルアプリケーションを用意しています。以下のコマンドでリポジトリをクローンできます:
git clone https://github.com/stackhero-io/nodejsGettingStarted.git stackhero-nodejs-getting-started
cd stackhero-nodejs-getting-started
リモートリポジトリサーバーの設定
Stackhero で Git を使ったアプリケーションのデプロイは非常に簡単です。サービスのメインページに、次のような Git リモート追加用コマンドが表示されます:
git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
このコマンドをコピーしてターミナルに貼り付け、リモートを設定してください。
Node.js アプリケーションのデプロイ
デプロイは、以下のコマンドでコードを Stackhero にプッシュするだけです:
git push stackhero main
初回プッシュ時には、鍵のフィンガープリント確認が求められます。「yes」と入力して続行してください。
数分でアプリケーションが公開されます。Stackhero ダッシュボードに表示される Web サイト URL(例:https://<XXXXXX>.stackhero-network.com)にアクセスして、稼働状況を確認できます。
これでデプロイは完了です。
変更が必要な場合は、app.js ファイルを更新し、コミットして再度プッシュしてください:
git add -A .
git commit -m "Update app.js"
git push stackhero main
既存アプリケーションのデプロイ
すでに Node.js アプリケーションをお持ちの場合も、上記と同様に Stackhero リモートを追加し、以下のコマンドでデプロイできます:
git push stackhero main
エラー「failed to push some refs to '[...]'」の対処
もし次のようなエラーが表示された場合:
error: failed to push some refs to '[...]'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
(e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
これはローカルリポジトリとリモートが同期していないことを意味します。強制プッシュするには、次のコマンドを実行してください:
git push -f stackhero main
エラー「src refspec main does not match any」の対処
プッシュ時に次のエラーが表示された場合:
error: src refspec main does not match any
error: failed to push some refs to 'ssh://<XXXXXX>.stackhero-network.com:222/project.git'
これは通常、main ブランチが存在しないことを示します。代わりに master ブランチをプッシュしてみてください:
git push stackhero master
プッシュ時に「Everything up-to-date」と表示される場合の対処
Git で「Everything up-to-date」と表示されるのに変更がデプロイされない場合、コミットを忘れている可能性があります。次のコマンドをお試しください:
git add -A .
git commit -m "Your commit message"
git push stackhero main
変更がなくてもデプロイを強制したい場合は、空のコミットを作成してプッシュできます:
git commit --allow-empty -m "Force update"
git push stackhero main
main 以外のブランチをデプロイする
main 以外のブランチ(例:production)をデプロイしたい場合は、次のコマンドを使用してください:
git push stackhero production:main
タグをデプロイする
タグを利用して特定のバージョン(例:v1.0)をデプロイしたい場合は、次のコマンドを実行します:
git push stackhero 'v1.0^{}:main'
^{} を付けることで、タグに紐づくコミットがプッシュされます。
ロールバックや特定のコミットをデプロイする
特定のコミットをデプロイしたい場合は、まず git log でコミットハッシュを確認し、次のコマンドでデプロイします:
git push -f stackhero <HASH>:main
複数環境へのデプロイ
本番環境とステージング環境を分けて運用したい場合、現在のリモート名を stackhero から stackhero-staging に変更できます:
git remote rename stackhero stackhero-staging
続いて、Stackhero ダッシュボードで新たに Node.js サービスを作成し、stackhero-production として追加します:
git remote add stackhero-production ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git
それぞれの環境へは、以下のコマンドでデプロイできます:
git push stackhero-production main
または
git push stackhero-staging main
macOS キーチェーンに SSH 秘密鍵のパスワードを保存する
macOS では、コードをプッシュするたびに SSH 鍵のパスワード入力が求められる場合があります。利便性とセキュリティのため、次のコマンドで macOS キーチェーンに保存できます:
/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_rsa
このコマンドにより、今後のデプロイ時にパスワード入力が不要になります。
シークレットの管理
ステージングや本番環境でトークンやパスワードなどのシークレットを安全に管理することは非常に重要です。リポジトリにシークレットを保存するのではなく、環境変数を利用することでより安全に運用できます。
Stackhero ダッシュボードで環境変数を追加し、Node.js コード内で利用可能です。たとえば、mySecret という変数を定義した場合、アプリ内で次のようにアクセスできます:
process.env.mySecret
他のネットワークポートを開放する
アプリケーションで HTTP 以外のプロトコルを利用する場合、追加の TCP または UDP ポートを開放できます。Stackhero ダッシュボードで、公開エントリーポート、Node.js サービス上の宛先ポート、プロトコル(TCP または UDP)を指定して設定してください。
ファイルの保存
ユーザーファイル(写真など)を保存する場合は、オブジェクトストレージソリューションの利用を推奨します。これにより、複数のサービスやインスタンス間でファイルを共有でき、コードとデータを分離できます。高速・簡単・高機能で Amazon S3 プロトコル互換の MinIO をおすすめします。
ローカルストレージを希望される場合は、Node.js インスタンスに用意されている永続ストレージ /persistent/storage/ をご利用ください。
注意: データは必ず
/persistent/storage/フォルダ内に保存してください。このフォルダ以外に保存したデータは、インスタンスの再起動やコードのプッシュ時に失われる可能性があります。
グレースフルシャットダウン(Graceful shutdown)
新しいバージョンをデプロイする際、前のバージョンには終了シグナルが送信され、シャットダウン前にデータベース接続や他サービスを安全にクローズする時間が与えられます。
終了シグナル SIGTERM はアプリケーションに送信されます。次のようにコードでハンドリングできます:
process.on('SIGTERM', () => {
// このログは Stackhero ダッシュボードの「logs」タブに表示されます
console.info('SIGTERM signal received.');
// ここでデータベース接続や他サービスをクローズしてください
// ...
});
複数 CPU コアでコードを実行する
デフォルトでは、Node.js は 1 コア・1 スレッドのみを使用します。すべての CPU コアを活用したい場合は、Node.js の cluster API をご利用ください。公式ドキュメントはこちら:https://nodejs.org/api/cluster.html
以下は、利用可能なすべての CPU で HTTP サーバーを起動するシンプルな例です:
const cluster = require('cluster');
const http = require('http');
const cpusCount = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// ワーカーをフォーク
for (let i = 0; i < cpusCount; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
// ワーカーは TCP 接続(ここでは HTTP サーバー)を共有します
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}