【Light sail】AWSのLight SailでPostgresSQLを使用してStrapiを構築する【Strapi】



## linuxのアップデート
先ずはlight sailのlinuxのパッケージのアップデートを行います

### ① apt-get update
linuxの内部にあるパッケージのリストを更新する。
実際にインストールするわけでなく、あくまで”リストを更新する”だけです。


### ② apt-get upgrade
インストール済みのパッケージを先ほど更新したリストに基づいて実際に更新します。
パッケージを最新にすることにより、セキュリティの強化やパフォーマンスの改善が期待できます。

```shell:linux
--パッケージリストの更新
$ apt-get update

--パッケージの更新
$ apt-get upgrade
```

※上記コマンドは権限の関係で permission deniedになる場合があるので、その際はsudoなどで適宜対応してください。

## PostgresSQLのインストール

ここから実際にpostgresSQLのインストールを行います。

```shell:linux
--postgresのインストール
$ sudo apt install postgresql

--psqlコマンドが使えるようにする
$ sudo apt install postgresql-client

--アプリケーションからpostgresに接続できるようにする
$ sudo apt install libpq-dev

--postgresが正常に動いているかどうか確認
$ sudo systemctl status postgresql
```

## Strapiに使用するデータベースの作成
ユーザー名：postgresにパスワードを付与

```shell
$ sudo passwd postgres
```

postgresユーザーに切り替えます。
```shell
$ su postgres
Password:"設定したパスワード"
```
psqlを起動する
```
$ psql
psql (15.8 (Debian 15.8-0+deb12u1))
Type "help" for help.
postgres=# 
```

Strapi用のデータベースを作成する

```shell:
$ CREATE DATABASE dbname;
CREATE DATABASE
```

postgresから出る
```sql:postgres
postgres=# quit
```

## Strapiのセットアップ

### インストール
```shell
--プロジェクト作成フォルダに移動
$ cd /opt/bitnami/apache2/htdocs/

--Strapiのインストール
$ npx create-strapi@latest

Need to install the following packages:
create-strapi@5.1.1
Ok to proceed? (y) 

y

Strapi   v5.1.1  Let's create your new project

? What is the name of your project? (my-strapi-project) 

"任意のプロジェクト名"

We can't find any auth credentials in your Strapi config.

Create a free account on Strapi Cloud and benefit from:

- ✦ Blazing-fast ✦ deployment for your projects
- ✦ Exclusive ✦ access to resources to make your project successful
- An ✦ Awesome ✦ community and full enjoyment of Strapi's ecosystem

Start your 14-day free trial now!


? Please log in or sign up. (Use arrow keys)
❯ Login/Sign up 
  Skip 

Skipを選択

? Do you want to use the default database (sqlite) ? (Y/n)
--postgreを今回使用するので、nを選択

n

? Choose your default database client (Use arrow keys)
❯ sqlite 
  postgres 
  mysql 

--postgresを使用するので、postgresを選択

? Database name: 
--作成したDBの名前を入力

? Host: (127.0.0.1)
--デフォルトでOKなのでEnter

? Port: (5432)
--こちらも同様にEnter

? Username:
--任意のユーザー名（今回はpostgres)

? Password: 
--設定したパスワード

? Enable SSL connection: (y/N) 
--特段設定していないので、今回はN

N

? Start with an example structure & data? (y/N) 

N

? Start with Typescript? (Y/n) 
--Typescriptを使いたい人はY

Y

? Install dependencies with npm? (Y/n) 

Y

? Initialize a git repository? (Y/n) 
--gitの設定を行っていないとエラーになるので、今回は設定しません
n

```

上記完了しましたらStrapiが依存関係と合わせてインストールされます。




## ProxyPassを設定する

```conf:/opt/bitnami/apache2/conf/httpd.conf
--末尾に以下を追加します
ProxyPass / http://localhost:1337/
ProxyPassReverse / http://localhost:1337/
```
apacheを再起動します

```shell:
$ sudo /opt/bitnami/ctlscript.sh restart apache
Restarted apache
````

## pm2のインストール
strapiを動かすにあたり、プロセスマネージャーであるpm2を入れます。

```shell
$ sudo npm install pm2 -g
```

```
--起動中のプロセスを確認するには
$ pm2 list

--プロセスを停止するには
$ pm2 stop ID等

--ログを見るには
$ pm2 log
```

## 開発サーバーの起動
strapiはbuildする一部機能が制限されるため、内部のコンテンツデータ作成等のため、一時的に開発モードで起動します。
```shell
$ pm2 start npm --name "任意の名前" -- run develop
```

## DB接続が失敗した場合
以下は実際に私がハマったエラーになります

```shell:エラー文
ror: password authentication failed for user "ユーザー名"
以下省略
```

こちらが実際に今回出たエラー文です。
ユーザー名に対するパスワードの認証エラーとなっています。

## 原因
私の場合は以下の二でした

### ①postgresの認証設定によるエラー
postgresではユーザー認証の方法をpg_hba.confというファイルで行っています。
認証方法としては

◆ peer方式
カーネルからクライアント上（light sailのデフォルトではbitnami)のシステムユーザー名を取得しpostgresのデータベースユーザーと一致する場合のみ接続が可能になる

◆ md5方式
MD-5ハッシュ化されたパスワードがクライアントから送信されるパスワードベースの認証方法

◆ scram-sha-256方式
md5よりも安全と言われているため、基本的にはこちらが使われている

◆ trust
サーバーに接続できる全ての人がアクセス可能※非推奨

初期設定ではpeer方式だった以下の部分をscram-sha-256に書き換えました

```conf:/etc/postgresql/15/main/pg_hba.conf
#変更前
# Database administrative login by Unix domain socket
local   all             postgres                                peer

#変更後
# Database administrative login by Unix domain socket
local   all             postgres                                scram-sha-256
```

### ②postgresへのユーザー認証パスワードが違う
以下の二つのコマンドで使用するパスワードは別だということを認識しておらず上のパスワードを使用していたため、認証できていませんでした。
```shell
$ su "ユーザー名"
$ psql -U "ユーザー名" -d "データベース名"
```

必要なパスワードは下の方のパスワードですが、思いつくものが無かったので一旦リセットして作成し直すことにしました

```conf:/etc/postgresql/15/main/pg_hba.conf
#パスワード無しでログインできるように変更
local   all             postgres                                trust
```

postgresを再起動します
```shell:
$ sudo service postgresql restart
```
次にpostgresにログインし、下記のコマンドを実行
```sql
ALTER ROLE 'ユーザー名' WITH PASSWORD '新しいパスワード';
```

これで設定完了です。

## 結果
postgresの問題も解決して無事にpm2でStrapiの起動、ログインもできました！

postgresのパスワードだけはハマってしまいましたが、他は参考記事の通りに進めたら問題なくいけたので、今後同じ作業も問題なくできそうです！


## 最後に
この記事を作成するにあたり、下記を参考にさせていただきました。
ありがとうございました。


https://zenn.dev/nakamura196/articles/8620bce8ebe340

https://qiita.com/ekzemplaro/items/30e74302ae1954aec13e

https://torajirousan.hatenadiary.jp/entry/2019/06/23/234700