Heroku での Node.js アプリのデプロイ
最終更新日 2023年03月06日(月)
Table of Contents
この記事では、既存の Node.js アプリを Heroku にデプロイする方法について説明します。
Heroku をはじめて使う場合は、『Heroku スターターガイド (Node.js)』のチュートリアルから始めた方がよい場合もあります。
前提条件
この記事のベストプラクティスでは、以下があることを想定しています。
- Node.js および npm がインストールされている。
- 既存の Node.js アプリ。
- 無料の Heroku アカウント。
- Heroku CLI。
概要
Heroku の Node.js サポートについての詳細は、『Heroku Node.js サポート』の記事に記載されています。
Heroku の Node.js サポートは、アプリケーションがルートディレクトリに package.json
ファイルを持つ場合にのみ適用されます。
アプリ依存関係の宣言
package.json
ファイルでは、アプリケーションと一緒にインストールする必要がある依存関係を定義します。アプリの package.json
ファイルを作成するには、アプリのルートディレクトリで npm init
コマンドを実行します。package.json
ファイルの作成が、順を追って示されます。すべてのプロンプトをブランクのままにしてスキップすることができます。
Git Bash
アプリケーションを使用して、Windows でコマンドシェルを開きます。 CLI のインストール中に、このアプリケーションのショートカットがデスクトップに追加されます。$ cd node-example
$ npm init
...
name: (node-example)
version: (1.0.0)
description: This example is so cool.
entry point: (web.js)
test command:
git repository:
keywords: example heroku
author: jane-doe
license: (ISC) MIT
...
生成された package.json
ファイルは次のようになります。
{
"name": "node-example",
"version": "1.0.0",
"description": "This example is so cool.",
"main": "web.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"example",
"heroku"
],
"author": "jane-doe",
"license": "MIT"
}
依存関係をインストールするには、npm install <pkg>
を使用します。これによってパッケージがインストールされ、package.json
ファイルに依存関係として追加されます。たとえば、express をインストールするには、npm install express
と入力します。
システムレベルのパッケージに依存していないことを確認してください。package.json
ファイル内に依存関係が存在しないと、Heroku にデプロイするときに問題が発生します。この問題をトラブルシューティングするには、ローカルコマンドラインで rm -rf node_modules; npm install --production
と入力し、アプリをローカルで実行するために heroku local web
と入力してみます。package.json
ファイルに依存関係が存在しない場合、見つからないモジュールを示すエラーが表示されます。
ノードのバージョンの指定
Heroku 上でアプリケーションを実行するために使用する Node.js のバージョンも、package.json
ファイル内で定義する必要があります。開発およびテストに使用するランタイムに一致する Node.js バージョンも常に指定する必要があります。バージョンを確認するには、node --version
と入力します。
package.json
ファイルは次のようになります。
"engines": {
"node": "18.x"
},
Node.js のバージョンスキーマでは、奇数バージョンは不安定で、偶数バージョンは安定しています。安定したブランチはバグ修正のみを取得します。
依存関係がインストールされ、使用するノードのバージョンが指定されると、package.json
ファイルは次のようになります。
{
"name": "node-example",
"version": "1.0.0",
"description": "This example is so cool.",
"main": "web.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"example",
"heroku"
],
"author": "jane-doe",
"license": "MIT",
"dependencies": {
"express": "^4.9.8"
},
"engines": {
"node": "18.x"
}
}
開発環境と本番環境は、できるだけ似た環境に保つことをお勧めします。したがって、Node.js のローカルバージョンが、package.json
ファイル内で Heroku で使用するように指示したバージョンに一致するようにしてください。ローカルで実行しているバージョンを確認するには、コマンドラインで node --version
と入力します。
開始スクリプトの指定
アプリを開始する方法を調べるために、Heroku は最初に Procfile を検索します。
Node.js アプリ用の Procfile が存在しない場合、package.json 内の
開始スクリプト を介してデフォルトの web
プロセスの開始を試行します。
Web プロセスタイプ内のコマンドは、PORT
環境変数に指定されているポート番号にバインドする必要があります。 そうしないと、dyno は起動しません。
詳細は、「Node.js 開発のためのベストプラクティス」 および「Heroku Node.js サポート」を参照してください。
アプリのビルドとローカルでの実行
ローカルアプリディレクトリで npm install
コマンドを実行して、package.json
ファイル内で宣言した依存関係をインストールします。
$ npm install
heroku local
コマンドを使ってアプリをローカルで起動します。このコマンドは、Heroku CLI の一部としてインストールされています。
$ heroku local web --port 5001
これでアプリは http://localhost:5001/ 上で実行されます。
ビルド成果物を Git の外部に保持する方法
node_modules
を Git にチェックインするとビルドキャッシュが使用されなくなるため、この方法は推奨しません。詳細は、「ビルドの動作」を参照してください。
次のような .gitignore ファイルを作成することによって、ビルド成果物がリビジョン管理の対象に入らないようにします。
/node_modules
npm-debug.log
.DS_Store
/*.env
Heroku へのアプリケーションのデプロイ
変更内容を Git にコミットしたら、アプリを Heroku にデプロイできます。
$ git add .
$ git commit -m "Added a Procfile."
$ heroku login
Enter your Heroku credentials.
...
$ heroku create
Creating arcane-lowlands-8408... done, stack is cedar
http://arcane-lowlands-8408.herokuapp.com/ | git@heroku.com:arcane-lowlands-8408.git
Git remote heroku added
$ git push heroku main
...
-----> Node.js app detected
...
-----> Launching... done
http://arcane-lowlands-8408.herokuapp.com deployed to Heroku
アプリをブラウザで開くには、heroku open
と入力します。
高度な HTTP 機能
herokuapp.com
サブドメイン上の Common Runtime のアプリで使用可能な HTTP スタックは、HTTP 1.1、長いポーリング、チャンクされた応答、およびWebSockets をサポートします。
データベースのプロビジョン
add-on marketplace には、Postgres、Redis、MongoDB、MySQL などの多数のデータストアが揃っています。
次のステップ
- 「Node.js 開発のためのベストプラクティス」を参照してください。
- Node.js カテゴリでは、Node.js アプリケーションの開発とデプロイに関する詳細を確認できます。