開発環境と本番環境の区別とその設定方法(NestJS + MySQL + TypeScript)

前回の記事(https://jp.blog.jasonzk.com/nestjs/nesttsmysql/)では、NestJS + MySQL + TypeScript環境の構築方法について詳細に説明しました。本文では、開発環境と本番環境の区別、異なる設定の読み込み、そしてPM2を使用した本番環境でのNestJSプロジェクトのデプロイ方法について詳しく説明します。

環境変数を使用して環境を区別する

まず、プロジェクトのルートディレクトリに、開発環境用の.env.developmentと本番環境用の.env.productionの2つの環境変数ファイルを作成し、dotenvをインストールします。

.env.development

Terminal window
1
NODE_ENV=development
2
DB_HOST=localhost
3
DB_PORT=3306
4
DB_USERNAME=root
5
DB_PASSWORD=password
6
DB_DATABASE=test

.env.production

Terminal window
1
NODE_ENV=production
2
DB_HOST=your-production-host
3
DB_PORT=3306
4
DB_USERNAME=your-production-username
5
DB_PASSWORD=your-production-password
6
DB_DATABASE=your-production-database

dotenvのインストール

Terminal window
1
npm install dotenv

srcディレクトリにconfigディレクトリを作成し、その中に環境変数を読み込むためのconfiguration.tsファイルを作成します:

1
import * as dotenv from "dotenv";
2
3
const env = process.env.NODE_ENV || "development";
4
5
dotenv.config({ path: `.env.${env}` });
6
7
export default () => ({
8
environment: env,
9
database: {
10
host: process.env.DB_HOST,
11
port: parseInt(process.env.DB_PORT, 10) || 3306,
12
username: process.env.DB_USERNAME,
13
password: process.env.DB_PASSWORD,
14
database: process.env.DB_DATABASE,
15
},
16
});

異なるデータベース接続の設定

次に、src/app.module.tsで、ConfigModuleTypeOrmModuleを使用してデータベースの設定を読み込みます:

1
import { Module } from "@nestjs/common";
2
import { ConfigModule, ConfigService } from "@nestjs/config";
3
import { TypeOrmModule } from "@nestjs/typeorm";
4
import configuration from "./config/configuration";
5
import { UsersModule } from "./users/users.module";
6
import { User } from "./users/user.entity";
7
import { AppController } from "./app.controller";
8
import { AppService } from "./app.service";
9
10
@Module({
11
imports: [
12
ConfigModule.forRoot({
13
isGlobal: true,
14
load: [configuration],
15
}),
16
TypeOrmModule.forRootAsync({
17
imports: [ConfigModule],
18
useFactory: (configService: ConfigService) => ({
19
type: "mysql",
20
host: configService.get("database.host"),
21
port: configService.get("database.port"),
22
username: configService.get("database.username"),
23
password: configService.get("database.password"),
24
database: configService.get("database.database"),
25
entities: [User],
26
synchronize: true,
27
}),
28
inject: [ConfigService],
29
}),
30
UsersModule,
31
],
32
controllers: [AppController],
33
providers: [AppService],
34
})
35
export class AppModule {}

異なる設定ファイルの読み込み

設定ファイルの読み込みを確実に行うために、ConfigModuleforRootメソッドでisGloballoadオプションを正しく設定し、TypeOrmModuleforRootAsyncメソッドを使用して非同期に設定を読み込み、ConfigServiceを使ってデータベース接続情報を取得します。

開発環境でのプロジェクト起動

開発環境では、Nest CLIのstartコマンドを使用してプロジェクトを起動します:

Terminal window
1
npm run start

本番環境でのプロジェクトのデプロイ

本番環境では、PM2を使用してNestJSプロジェクトを管理および実行することをお勧めします。

PM2のインストール

まず、PM2をグローバルにインストールします:

Terminal window
1
npm install -g pm2

PM2の設定

プロジェクトのルートディレクトリにecosystem.config.jsファイルを作成し、PM2の設定を行います:

1
module.exports = {
2
apps: [
3
{
4
name: "my-nestjs-project",
5
script: "dist/main.js",
6
env: {
7
NODE_ENV: "development",
8
},
9
env_production: {
10
NODE_ENV: "production",
11
},
12
},
13
],
14
};

プロジェクトのビルド

プロジェクトを起動する前に、プロジェクトをビルドする必要があります:

Terminal window
1
npm run build

PM2を使用したプロジェクトの起動

以下のコマンドを使用してプロジェクトを起動します:

Terminal window
1
pm2 start ecosystem.config.js --env production

このコマンドは、ecosystem.config.jsの設定に基づいて、NestJSプロジェクトを本番環境で起動します。

まとめ

本文では、開発環境と本番環境の区別とその設定方法について、環境変数の使用、異なるデータベース接続の設定、異なる設定ファイルの読み込み、およびPM2を使用した本番環境でのNestJSプロジェクトのデプロイ方法を詳細に紹介しました。適切に環境を区別し設定することで、プロジェクトの管理と保守がより容易になり、開発およびデプロイの効率が向上します。