Node.js: はじめに

Stackhero で Node.js サービスを迅速かつ安全にデプロイする方法

👋 Stackheroのドキュメントへようこそ!

Stackheroは、数多くの利点を提供するNode.jsクラウドソリューションを提供しています。主な利点は以下の通りです:

  • シンプルなgit push数秒でアプリケーションをデプロイ
  • 独自のドメイン名を使用し、HTTPS証明書の自動設定による強化されたセキュリティを享受。
  • 自動バックアップワンクリックアップデート、そしてシンプルで透明性があり、予測可能な価格設定で安心を提供。
  • プライベートで専用のVMによる最適なパフォーマンスと強固なセキュリティを実現。

時間を節約し、生活を簡素化:StackheroのNode.jsクラウドホスティングソリューションを試すのに5分しかかかりません

Stackhero で Node.js サービスをデプロイするのは、迅速・効率的・信頼性を重視して設計されています。このガイドでは、アプリケーションを数分で稼働させるための基本的な手順を、セキュリティとパフォーマンスを考慮しながらご案内します。

まずは Stackhero 上で Node.js サービスを作成しましょう。これがアプリケーションデプロイの基盤となり、Stackhero のクラウドホスティングのすべてのメリットを利用できるようになります。

作業を始める前に、以下のツールをご用意ください:

  1. Githttps://git-scm.com/downloads からダウンロードできます。
  2. 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

このコマンドをコピーしてターミナルに貼り付け、リモートを設定してください。

デプロイは、以下のコマンドでコードを 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

もし次のようなエラーが表示された場合:

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

プッシュ時に次のエラーが表示された場合:

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

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 以外のブランチ(例: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 キーチェーンに保存できます:

/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/ フォルダ内に保存してください。

このフォルダ以外に保存したデータは、インスタンスの再起動やコードのプッシュ時に失われる可能性があります。

新しいバージョンをデプロイする際、前のバージョンには終了シグナルが送信され、シャットダウン前にデータベース接続や他サービスを安全にクローズする時間が与えられます。

終了シグナル SIGTERM はアプリケーションに送信されます。次のようにコードでハンドリングできます:

process.on('SIGTERM', () => {
  // このログは Stackhero ダッシュボードの「logs」タブに表示されます
  console.info('SIGTERM signal received.');

  // ここでデータベース接続や他サービスをクローズしてください
  // ...
});

デフォルトでは、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`);
}