Elixir に続いて、PostgreSQL と Phoenix をWindows11のwsl2にセットアップする手順（覚え書き）

前回、Erlang ＆ ElixirをWindows11のwsl2にセットアップする手順の記事を投稿させていただきました。

[Elixir をWindows11のwsl2にセットアップする手順（覚え書き）](https://qiita.com/hattun_geh01713/items/c60290638a93c2d990ce)

今回投稿させていただいた記事は、Elixir に続いて、PostgreSQL と Phoenix をセットアップする手順をまとめたものです。

今回も、以下の記事を始め先駆者の方々が投稿された記事を参考とさせていただきました。ありがとうございます。
[WSL2＋Ubuntu 18.04でDB付きElixir／Phoenix／Nxを使う最短手順](https://qiita.com/piacerex/items/6b64dfe70f48c89d8385)

[Ubuntu 20.04でElixirの最短手順（Nx＋EXLA／Phoenix＋PostgreSQLのインストール、Elixir最新版へのアップグレード、WSL2対応のオマケ付き）](https://qiita.com/piacerex/items/01e89435af0f7a454ad2)
　
では、早速始めます。

# 5 PostgreSQLのインストール

### 5.1 PostgreSQLインストール方法の確認

[PostgreSQL公式サイト](https://www.postgresql.org/download/linux/ubuntu/)の、Linux downloads (Ubuntu)のページを参照してインストールします。

このページによると、UbuntuにはデフォルトでPostgreSQLが含まれているそうなので、そのことが確認できたらインストールは不要になります。

### 5.2 PostgreSQLインストール状態を確認する

apt list --installed

を実行して、インストールされたパッケージのリストを確認します。
    →　Postgres関連のパッケージは見つけられませんでした。
　　wsl版のUbintu24.04 LTSにはPostgreSQLはインストールされていないようです。

### 5.3 PostgreSQLをインストールする 

[PostgreSQL公式サイト](https://www.postgresql.org/download/linux/ubuntu/)のUbuntu用のページ中ほどの PostgreSQL Apt Repository に記載されているセットアップ方法を確認し、実行します。

~~~
sudo apt install curl ca-certificates
sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc --fail https://www.postgresql.org/media/keys/ACCC4CF8.asc
sudo sh -c 'echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
sudo apt -y install postgresql
~~~

# 6 Phoenixのインストール

### 6.1 Phoenixインストール方法を確認する

[Phoenix公式サイト](https://hexdocs.pm/phoenix/installation.html)の、GUIDES → Installationのページを参照してインストールします。

### 6.2 Phoenixをインストールする

~~~
mix local.hex
mix archive.install hex phx_new
~~~

### 6.3 inotify-tools をインストールする

[inotify-tools 公式サイト](https://github.com/inotify-tools/inotify-tools/wiki)の → wiki → Getting inotify-tools → Debian/Ubuntuのところを参照してインストールします。

~~~
sudo apt -y install inotify-tools
~~~

# ７ 動作確認

早速、動作確認してみましょう。

wslのUbuntu24.02コンソールを起動して、ポスグレのサービス開始コマンドを入力します。

~~~
sudo service postgresql start
~~~

つづいて、Phoenixの初期 webページを作成します。

~~~
mix phx.new test1
~~~

さらに画面表示にしたがって、ectoの初期環境を作成します。

~~~
cd test1
mix ecto.create
~~~

ここでエラーが出てしまいました。エラーメッセージの冒頭はこんな感じです。

[error] Postgrex.Protocol (#PID<0.337.0>) failed to connect: ** (Postgrex.Error) FATAL 28P01 (invalid_password) password authentication failed for user "postgres"

何やら、passwordの認証が失敗しているようです。

### 7.1 Ectoのユーザ設定を確認する

とりあえずEctoの関連ページをネットで検索してみます。

[hexdoc.pmのEcto関連ページ](https://hexdocs.pm/ecto/Ecto.html)

[Ecto Github](https://github.com/elixir-ecto/ecto/blob/master/guides/introduction/Getting%20Started.md)

Ecto GithubのGetteing Startedページの中ほどに次の注釈があり、

NOTE: Your PostgreSQL database may be setup to
* not require a username and password. If the above configuration doesn't work, try removing the username and password fields, or setting them both to "postgres".
* be running on a non-standard port. The default port is 5432. You can specify your specific port by adding it to the config: e.g. port: 15432.

 その途中に、「try setting the username and password」とあります。

 どんなユーザIDとパスワードが使われているかEctoの設定ファイルを確認してみます。

Ectoの設定ファイルは、mix phx.newで作ったフォルダ（上記の例ではtest1）直下のConfigフォルダに格納されています。
４つほどある拡張子exsのファイルを見るとユーザIDはポスグレデフォルトのpostgresでした。

### 7.2 PostgreSQLのユーザ設定を確認する

次にPostgreSQLの設定も念のため確認してみます。
PostgreSQLのユーザ認証関係の設定ファイルはpg_hba.confです。

このファイルがどこにあるか分からない場合、findで検索します。

~~~
find / -name pg_hba.conf 2> /dev/null
~~~

自分の環境では、
/etc/postgresql/16/main/pg_hba.conf
でした。

pg_hba.conf の設定内容は以下のとおり。

'# Database administrative login by Unix domain socket
local all postgres peer
'# TYPE DATABASE USER ADDRESS METHOD
'# "local" is for Unix domain socket connections only
local all all peer

localの認証メソッドが「peer」に設定されています。

[日本PostgreSQLユーザ会](https://www.postgresql.jp/docs/9.4/auth-pg-hba-conf.html)のwebサイトを検索すると、peerメソッドは、
「クライアントのオペレーティングシステムにおけるユーザ名をオペレーティングシステムから取得し、ユーザ名が要求されたデータベースユーザ名と一致するか検査します。 これはローカル接続の時にのみ使用可能です。」
と、あります。

### 7.3 Ectoが使用するユーザIDのパスワードを再設定してみる

Linuxのユーザを確認してみると、postgresというユーザは作成済みでした。
では、パスワードをectoが想定しているものに変更してみます。（これでうごくかどうか）

Linux の、パスワード変更コマンドは以下のとおり。
passwd [オプション] [ユーザー名]

→　mix ecto.createを実行。　→ ダメでした。認証エラー（FATAL 28P01 (invalid_password) password authentication failed for user "postgres"）となってしまいました。

次にpsqlを立ち上げて、ポスグレ側のpostgresユーザのパスワード変更を試してみます。

sudo su - postgres -c psql
postgres=# \password postgres
プロンプトに従って新パスワードと確認用パスワードを入力。

→　再度、mix ecto.createを実行。　→　正常に終了！

結果的には、私が作成した環境ではlinuxとPostgreSQLの両方でpostgresユーザのパスワードを再設定する必要があったようです。

# 8 ロケールプロバイダの設定

セットアップ途中で、localeをja-jp.UTF8に設定するという文字がスクロールしていきました。

ネットで検索すると、PostgreSQL16以降では、icuロケールにも対応しているようです。
参考にさせていただいたサイトは次の２つです。

[icuロケールプロバイダとlibcロケールプロバイダの違いを確認 ｜ 株式会社インサイト](https://www.insight-ltd.co.jp/tech_blog/postgresql/749/)

[PostgreSQL16ではconfigureの–with-icuオプションがデフォルトで有効となりました。 ｜ 株式会社インサイト](https://www.insight-ltd.co.jp/tech_blog/postgresql/748/)
 
icuロケール関連で追加インストールするパッケージは libicu-devとpkgconf の２つです。

~~~
sudo apt install libicu-dev
sudo apt install pkgconf
~~~

# 最後に

ここまでで、必要最小限のセットアップは終了です。記事をご覧いただきありがとうございました。多少なりとも皆様の参考にしていただけましたら幸いです。