nodebrew + npm + NestJS + Docker + PostgreSQLの開発環境構築


新しい技術を利用している環境にジョインするため、事前に技術スタックを聞いて触っておいた時のメモ。

## 0. 前提条件

1. 利用PC
    ```sh
    macOS Monterey
    バージョン 12.5.1

    MacBook Pro（14インチ、2021）
    チップ　Apple M1 Pro
    メモリ　16GB
    起動ディスク　Macintosh HD
    ストレージ　500GB
    ```

## 1.1. Homebrewのインストール

1. homebrewのインストール
    ```sh
    % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    ・・・
    Press RETURN/ENTER to continue or any other key to abort: ←ENTERを押す
    。。。
    ==> Installation successful!
    ```
2. インストールできているか確認
    ```sh
    % brew -v
    Homebrew 3.6.1
    Homebrew/homebrew-core (git revision c170d14e690; last commit 2022-09-18)
    ```

## 1.2. nodebrewのインストール

1. 既にnodeがインストールされているか確認
    ```sh
    % brew ls | grep node
    ```
2. (既にnodeがインストールされていたら)nodeのアンインストール
    ```sh
    % brew uninstall --force node
    ```
3. nodebrewのインストール
    ```sh
    % brew install nodebrew
    ```
4. nodebrewがインストールできているか確認
    ```sh
    % nodebrew -v
    nodebrew 1.2.0
    ```
5. nodebrewのセットアップ
    ```sh
    % nodebrew setup
    ```
    1. nodebrewのパスを環境変数として追加
        ```sh
        # 利用しているshの確認
        % echo $SHELL

        # bashを利用している場合
        % echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
        % source ~/.bash_profile

        # zshを利用している場合
        % echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zshrc
        % source ~/.zshrc
        ```

## 1.3. nodeのインストール

1. nodebrewでインストールしたいバージョンを確認してnodeをインストール
    1. インストールしたいバージョンを確認
        ```sh
        % nodebrew ls-remote
        ```
    2. nodeのインストール
        ```sh
        % nodebrew install-binary stable # ←安定版をインストール
        % nodebrew install-binary latest # ←最新版をインストール
        % nodebrew install-binary <version> # ←バージョン指定でインストール
        
        (例)
        % nodebrew install-binary stable
        ・・・
        Installed successfully
        ```
    3. nodeがインストールされたか確認
        ```sh
        % nodebrew ls

        (例)
        % nodebrew ls
        v18.9.0 # ←インストールされているバージョンが表示される

        current: none
        ```
    4. 利用するnodeのバージョンを指定
        ```sh
        % nodebrew use <version>

        (例)
        % nodebrew use v18.9.0
        use v18.9.0
        ```
    5. 指定したバージョンのnodeが指定されているか確認
        ```sh
        % nodebrew ls

        (例)
        % nodebrew ls
        v18.9.0 # ←インストールされているバージョンが表示される

        current: v18.9.0
        ```

## 1.4. nestjsのプロジェクトを作成

1. npmでnestjsのCLIをインストール
    ```sh
    % npm i -g @nestjs/cli

    added 255 packages, and audited 256 packages in 27s

    39 packages are looking for funding
    run `npm fund` for details

    found 0 vulnerabilities
    npm notice 
    npm notice New patch version of npm available! 8.19.1 -> 8.19.2
    npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.19.2
    npm notice Run npm install -g npm@8.19.2 to update!
    npm notice 
    ```
1. npmでnestjsのプロジェクトを作成
    ```sh
    % nest new <project_name> # ←プロジェクトの名前を入れる
    ・・・
    ? Which package manager would you ❤️  to use? npm # ←npmを選択
    ・・・
    🚀  Successfully created project nestjs_app
    👉  Get started with the following commands:

    $ cd <project_name>
    $ npm run start

                                            
                            Thanks for installing Nest 🙏
                    Please consider donating to our open collective
                            to help us maintain this package.
                                            
                                            
                🍷  Donate: https://opencollective.com/nest
    ```

## 1.5. サーバーの起動

1. プロジェクトのディレクトリに移動
    ```sh
    % cd <project_name>
2. サーバーを起動する
    ```sh
    % npm run start
    ```
3. ブラウザで確認
    * ブラウザで "http://localhost:3000/" にアクセスして "Hello World!" が表示されていることを確認する

## 1.6. postgresを利用してdocker化する

1. docker-desktopのインストール
    * https://www.docker.com/products/docker-desktop/ よりインストール
1. dockerがインストールされたか確認
    ```sh
    # dockerのバージョン確認
    % docker -v
    Docker version 20.10.14, build a224086
    
    # docker composeのバージョン確認
    % docker compose version
    Docker Compose version v2.5.1
    ```
2. プロジェクトにDockerfileとdocker-compose.ymlを作成する
    ```sh
    % touch Dockerfile
    ```
    ```sh
    % touch docker-compose.yml
    ```
3. Dockerfileを編集する
    ```sh
    % vim Dockerfile
    ```
    ```docker
    # Dockerfileの内容
    FROM node:latest

    WORKDIR /app

    COPY package*.json ./

    RUN npm ci
    RUN npm i @nestjs/cli

    COPY . .

    EXPOSE 3001

    CMD ["npm", "run", "start:dev"]
    ```
4. docker-compose.ymlを編集する
    ```sh
    % vi docker-compose.yml
    ```
    ```docker
    # docker-compose.ymlの内容
    version: '3'

    services:
      service:
        build:
          context: .
          dockerfile: Dockerfile
        ports:
          - 3000:3000
        restart: always
        volumes:
          - ./src:/app/src
      postgres:
        image: postgres:latest
        environment:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: password
          POSTGRES_DB: postgres
          TZ: 'Asia/Tokyo'
        ports:
          - 5432:5432
        volumes:
          - ./postgres/data:/var/lib/postgresql/data
    ```
5. dockerを起動する
    ```sh
    % docker compose up --build
    ```
    ※既にサーバーを起動していた場合はそちらをさっきに落としておく