Neon Localでコンテナ作成時にブランチを作成する挙動を試してみたメモ

# 概要
[前回](https://qiita.com/hibohiboo/items/1827c41ce162431fda3e)は[Local Development with Neon](https://neon.tech/guides/local-development-with-neon)によるローカル環境でdockerのpostgresqlを使う方法を試した。
今回は[Neon Local](https://neon.tech/docs/local/neon-local)を使ってコンテナを立ち上げるとブランチが作成され、コンテナ停止時にはブランチが削除される動作を確認する。

[この時点のソース](https://github.com/hibohiboo/odyssage/blob/92a1a3856e4473fefbc2d5c0692d9e9f9ea51a5e/infra/local/neon_local/docker-compose.yml)


# ProjectIDの取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/fe589004-b29e-41ce-bb9e-a26245c8e492.png)

# API Keyの取得
[Neon API Key](https://neon.tech/docs/manage/api-keys)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/28d17a05-d4a1-4bef-b06b-18a6791dad75.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/4bc6e189-c736-46c0-a60f-2901cc62646b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/1089c95b-36fc-479a-aa2d-ca3baf7ded84.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/7ef8817c-3ace-42a1-ad98-ee8ca1976f1d.png)

# ソースコード

```yml:infra/local/neon_local/docker-compose.yml
services:
  neon-local:
    image: neondatabase/neon_local:latest
    ports:
      - '5432:5432'
    environment:
      NEON_API_KEY: ${NEON_API_KEY}
      NEON_PROJECT_ID: ${NEON_PROJECT_ID}
      DRIVER: serverless
      DELETE_BRANCH: true
    profiles:
      - dev

```

```properties:infra/local/neon_local/.env
NEON_API_KEY=your_api_key
NEON_PROJECT_ID=your_project_id
```

```bash:infra/local/neon_local/bin/up.sh
#!/bin/bash

bin_dir=$(cd $(dirname $0) && pwd)
docker_dir=$(cd $bin_dir/.. && pwd)

# up.sh docker-compose.camp.yml
composeFile=${1:-"docker-compose.yml"}


# docker-composeの起動
cd $docker_dir && docker-compose --profile dev --env-file .env -f $composeFile up

```


# 起動してみたときのエラー対応

環境変数に`PARENT_BRANCH_ID: main`を設定したら
`404 Client Error: Not Found for url: https://console.neon.tech/api/v2/projects/your_project_id/branches`のエラーが発生。

環境変数を削除したら` requests.exceptions.HTTPError: 412 Client Error: Precondition Failed for url: https://console.neon.tech/api/v2/projects/your_project_id/branches/hogehoge/roles/user_role/reveal_password`のエラーが発生。

直接たたいてみると下記のメッセージが返ってきた。

```
storing passwords is not enabled for the project
```


エラーは発生したが、ブランチは増えている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/87d8aaa9-0ad8-4f7a-a28e-2af7ea806f3e.png)


## 412が発生しているAPIについて

[getprojectbranchrolepassword](https://api-docs.neon.tech/reference/getprojectbranchrolepassword) データベースのパスワードを取得するAPI？

## Projectを新規作成してみる。
これでエラーが起きなくなった。Postgresqlのバージョンは同じ14。
コンテナを立ち上げるとブランチが増え、止めると消える。

新プロジェクトでは初期状態のブランチがproductとdevelopがあり、仕様が異なりそうので、昔に作ったプロジェクトには対応していないのかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/8917acf1-a587-4a8e-a0e9-33c0f413dad7.png)


# 新Projectでマイグレーション
[サーバレスDB(Postgresql : NeonDB ) の無料版にCloudflare Workers ( Node.js) から繋いだメモ](https://qiita.com/hibohiboo/items/e4809d6b63877010db4e)でやったのと同じように接続する。

## 接続文字列の取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/e04156af-c0e3-401a-a07d-9c59496cac5d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/14ab11f1-f311-415a-ae29-5526f90a268a.png)

## マイグレーション
`drizzle-kit migrate`でマイグレーション

## 結果確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/08877c70-a136-4f85-8cd6-e31e59f7b712.png)

## マイグレーションしたDBからブランチを切ってみる

```diff:infra/local/neon_local/docker-compose.yml
services:
  neon-local:
    image: neondatabase/neon_local:latest
    ports:
      - '5432:5432'
    environment:
      NEON_API_KEY: ${NEON_API_KEY}
      NEON_PROJECT_ID: ${NEON_PROJECT_ID}
      DRIVER: serverless
      DELETE_BRANCH: true
+      PARENT_BRANCH_ID: ${PARENT_BRANCH_ID}
    profiles:
      - dev

```

```diff:infra/local/neon_local/.env
NEON_API_KEY=your_api_key
NEON_PROJECT_ID=your_project_id
+ PARENT_BRANCH_ID=xx-xxxx-xxxx-xxxxxxx
```

ブランチのIDはコンソールから取得可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/753ec6ff-69d3-4554-81dc-d045cf761d43.png)

## Dockerの起動後にブランチができていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/22e0f1dd-2cfa-4bb9-b63d-c85a90cea860.png)

## ブランチにマイグレーション内容が入っていることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/39b1c49f-66af-426f-b621-88d74a7d4d9c.png)




# 参考

[Make Yourself at Home with Neon Local](https://neon.tech/blog/make-yourself-at-home-with-neon-local)
[How to set up Neon Local with Docker Compose and JavaScript Postgres clients](https://neon.tech/guides/neon-local-docker-compose-javascript)
[Neon Local](https://neon.tech/docs/local/neon-local)
[GitHub - neon_local](https://github.com/neondatabase-labs/neon_local)
[DockerHub - neon_local](https://hub.docker.com/r/neondatabase/neon_local/tags)

[Docker Compose Env](https://docs.docker.jp/compose/environment-variables.html)

[Neon(Postgres)のDockerをローカルで稼働させ、Drizzleを使ったマイグレーションとCloudflare Workersのローカル実行からの接続を行ったメモ](https://qiita.com/hibohiboo/items/1827c41ce162431fda3e)
[サーバレスDB(Postgresql : NeonDB ) の無料版にCloudflare Workers ( Node.js) から繋いだメモ](https://qiita.com/hibohiboo/items/e4809d6b63877010db4e)
[サーバレスDBのNeonからDBファーストでPrismaを使ってスキーマを作りzodを連携して型解決をしたlambda(Node.js)を作成したメモ](https://qiita.com/hibohiboo/items/ed08b21799dd92bedc3e)