RenderでWEB SERVICEとPostgreSQLのpgvector拡張機能をセットアップ

# 本記事の内容
本記事ではRenderでWeb ServiceとPostgreSQLをセットアップするところを解説するものです。
# Renderへのサインアップ
Renderにサインインします。
アカウントのない場合はまずサインアップしてください。
GitHubやGoogleアカウントでのSSOが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/224ecdf5-39b0-d687-140d-325e2003e990.png)

# WEB SERVICEの作成
WEB SERVICEを作成します。
ソースコードはGitのレポジトリやDckerのイメージから持ってこれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/fdedac01-3c48-5b41-0498-d930bb9635a8.png)
ソースコードの設定をしたら、その他の設定を行ないます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/1e2ef4b9-4864-eddd-fa98-52905b3176be.png)
Regionですが、Japanは存在しないので、地理的にいちばん近いSingaporeを私は選びました。
Build Commandなどは好きなように設定してください。
よくわからなければそのままでいいです。
次にインスタンスタイプを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/a90b71a5-29d8-9c9f-d15e-e23ce23eda29.png)
この記事を読んでいるような人の99%はひとまずFreeを選びたいはずです。
注意書きにはFreeの場合は一部無効化されている機能がある旨、リクエストが一定時間無いとSpin Downする旨が書かれています。
Spin Downしているとリクエストを送った際に50秒くらい待つことになります。
無料で使わせてもらっているのでしょうがないですね。
最後に環境変数を登録できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/4dc0c46e-0f50-5d95-2293-c712fdc0a501.png)
これらの設定は作成時ではなく後から設定することも可能です。
作成されると、さっそくDeployが始まります。
今回は言語にPythonを選んで［Build Command］に``$ pip install -r requirements.txt``を指定したにも関わらず、カレントディレクトリにrequirements.txtが無いと怒られていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/91f23a9a-89e3-590c-ad28-76a3e82d6bb2.png)
### Environment
一例ですが、私はこのように環境変数を設定しました。
DB周りの変数は実際にはDBを作ってから値を指定します。
ここで環境変数を設定しておくことで、コード中にAPI KEYなどを直書きする必要がなくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/48ce33db-0846-cc28-df80-4fcbe96e4b4e.png)

# PostgreSQLの作成
DB（PostgreSQL）を作成します。
インスタンス名、DB名、Regionやバージョンを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/18dfd55a-c791-3e41-f648-bdb9a960585b.png)
最後にインスタンスタイプを選択して作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/0389c87b-314a-ec7c-c62a-25c7acd397a7.png)
Freeでは作成30日後になるとexpireし、さらにFreeのDBは1アカウントや1チームにつき1つしか作成できないことが注意書きに書かれています。
作成するとinfo画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/03dfed62-7651-7dc9-3dc5-5a44cdbd6662.png)
接続設定はこの画面下部にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/8c3e344d-98ef-8ee0-6560-28bd79ade035.png)
また、Access Controlの設定も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/6171e0f9-7970-af79-6e15-7bc725201b04.png)
書かれているとおり、自分のRenderアカウントの範囲外からのアクセスを行なう場合、接続元IPアドレスの設定が必要です。デフォルトでは「0.0.0.0/0」でIPアドレスの限定無いのでどこからでもアクセス可能になっています。
必要に応じて設定変更してください。
``Use My IP address``を選ぶと自分が現在使用しているグローバルIPアドレスをクイックに設定できます。
### pgAdminでの接続
DBがCreateされたらpgAdminで接続しましょう。
［Servers］－［Register］－［Server…］でサーバーを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/1c49c1df-3460-40f8-14ff-587614fbb08d.png)
名称は適当に付けた後Connectionタブで接続設定を行ないます。
pgAdminの設定とRenderの接続情報の対応は以下のとおりです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/a92796b3-7e24-8556-a8af-0bce842cf553.png)
pgAdminの［Host name/address］ですが、RenderのExternal Database URLをそのまま貼り付けるのではなく、ホスト名を指定する部分だけ抜き出して使います。
具体的には、PostgreSQLの接続URIは
``postgresql://<User>:<Password>@<hostname>/<DB名>``
ですので、この\<hostname\>の部分だけを使います。
### pgvectorの有効化
あとはpgvectorを有効化して準備は終わりです。

https://github.com/pgvector/pgvector

Query Toolで以下を実行するだけです。
```sql
CREATE EXTENSION vector;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/914130/cb5d46f2-948a-c61c-661c-c704b25ef36b.png)

これで、テーブルを作成する際にColumnのTypeでvectorが選べるようになります。
```sql
CREATE TABLE items (id bigserial PRIMARY KEY, embedding vector(3));
```
precisionにはベクトルの数、つまり次元数を設定してください。この例では3次元ですね。
vectorカラムには配列を挿入すると自動的にベクトル列と解釈されて格納されます。
```sql
INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]');
```