NocoBaseをAWS EC2にデプロイする（docker編)

## 目的

NocoBaseを自分のドメインで公開環境を作成する。

https://www.nocobase.com/ja/

・SSL化も行う

## EC2で適当なインスタンスを作成

今回はAmazon Linux 2023でArmのt4g.microにしました。

## 各種インストール
docker-composeの導入 [参考](https://zenn.dev/rock_penguin/articles/28875c7b0a5e30)
```sh

# dockerのインストール
sudo dnf update && sudo dnf install -y docker

# Dockerデーモン起動
sudo systemctl start docker

# sudoなしで実行できるように、ユーザーグループの追加
sudo gpasswd -a $(whoami) docker
# Adding user ec2-user to group docker

# Dockerに書き込み権限の付与
$ sudo chgrp docker /var/run/docker.sock

# Dockerデーモンの再起動
$ sudo service docker restart
# Redirecting to /bin/systemctl restart docker.service

# Dockerデーモンの自動起動設定
$ sudo systemctl enable docker
# Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

# Docker Composeのダウンロード & インストール
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# パーミッション変更
$ sudo chmod +x /usr/local/bin/docker-compose

#シンボリックリンクの作成
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

$ docker -v
# Docker version 25.0.5, build 5dc9bcc

$ docker-compose -v
# Docker Compose version v2.32.4
```

*ユーザー反映のために一旦ログアウトし再度ログインする*

## NocoBaseのdockerインストール

[チュートリアル](https://docs-jp.nocobase.com/welcome/getting-started/installation/docker-compose)通りに進めます。

```sh
# NocoBase が生成したシステムファイルを保存するために、my-project（または他の名前）という名前のフォルダーを作成します
mkdir my-project && cd my-project

# 空の docker-compose.yml ファイルを作成します
vi docker-compose.yml
```

```docker-compose.yml
version: '3'

networks:
  nocobase:
    driver: bridge

services:
  app:
    image: nocobase/nocobase:latest
    networks:
      - nocobase
    depends_on:
      - postgres
    environment:
      # アプリケーションのシークレットキー、ユーザートークンなどを生成するのに使用します
      # APP_KEY が変更されると、古いトークンも無効になります
      # 任意のランダム文字列にし、外部に漏らさないようにしてください
      - APP_KEY=your-secret-key
      # データベースタイプ、postgres、mysql、mariadb に対応
      - DB_DIALECT=postgres
      # データベースホスト、既存のデータベースサーバーの IP に置き換えることができます
      - DB_HOST=postgres
      # データベース名
      - DB_DATABASE=nocobase
      # データベースユーザー
      - DB_USER=nocobase
      # データベースパスワード
      - DB_PASSWORD=nocobase
      # タイムゾーン
      - TZ=Asia/Tokyo
      # 商用プラグインのためのサービスプラットフォームのユーザー名とパスワード
      - NOCOBASE_PKG_USERNAME=
      - NOCOBASE_PKG_PASSWORD=

    volumes:
      - ./storage:/app/nocobase/storage
    ports:
      - '13000:80'
    # init: true

  # 既存のデータベースサービスを使用する場合、postgres を起動する必要はありません
  postgres:
    image: postgres:16
    restart: always
    command: postgres -c wal_level=logical
    environment:
      POSTGRES_USER: nocobase
      POSTGRES_DB: nocobase
      POSTGRES_PASSWORD: nocobase
    volumes:
      - ./storage/db/postgres:/var/lib/postgresql/data
    networks:
      - nocobase
```

保存して終了

```
:wq
```

NocoBaseのインストールと起動
```
# 最新のイメージを取得
$ docker-compose pull
# バックグラウンドで実行
$ docker-compose up -d
# app プロセスの状態を確認
$ docker-compose logs app
```

## nginxのインストール
```
$ sudo dnf -y install nginx

# nginx を起動する
$ sudo systemctl start nginx.service
# nginx を自動起動
$ sudo systemctl enable nginx.service
```

EC2のセキュリティグループのインバウンドルールで80ポートを開放する

## ドメインへのバインディング

[公式のデプロイ手順](https://docs-jp.nocobase.com/welcome/getting-started/deployment/docker-compose)をそのまま行う

```/etc/nginx/conf.d/nocobase.conf
server {
    listen 80;
    server_name your_domain.com;  # your_domain.comをあなたのドメインに置き換えてください

    location / {
        proxy_pass http://127.0.0.1:13000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_buffering off;
    }
}
```

## Route53でAレコードにインスタンスのIPを指定する

一旦`http://mydomain.com`で確認できます。

以下のSSL導入を行う場合はAレコードは一旦削除します。(ACMやCloudFrontでエラーになる）

## SSL導入

EC2 ACM CloudFrontでSSLします。現在はCloudFrontを挟まなくても直接指定できる方法もありますが、コンソールだけで簡単に解決するので、こちらの方法にします。

### ACMで証明書発行

ACM -> 証明書をリクエスト -> 対象のドメイン`mydomain.com`を入力します。

DNS検証でRoute53でCNAMEを登録すれば証明書の発行が簡単にできます。  
Route53ではない場合はそれぞれのDNS管理画面でCNAMEを設定します。

### CloudFrontでディストリビュージョン作成

Origin domainにEC2の`パブリック IPv4 DNS`を指定します。
プロトコルはHTTPのみ。

代替ドメイン名に対象のドメインを入力`mydomain.com`
証明書はACMで発行した証明書を設定します。

## Route53でAレコードにエイリアスでCloudFrontのディストリビュージョンへのエイリアスを指定する。

レコードを作成して`https://mydomain.com`で接続できるのを確認できたら完了です。