Zeabur で実現するブラウザ完結 API 開発(第2回)— PostgreSQL と CRUD API の実装
著者: Shotaro Suzuki
執筆日: 2026-01-20
はじめに
前回の記事では、GitHub Codespaces と Zeabur を使って、ブラウザだけで .NET 9 Web API を本番環境にデプロイしました。
しかし、`/weatherforecast` エンドポイントだけでは実用的なアプリケーションとは言えません。
この記事では、PostgreSQL データベースを追加し、商品管理 CRUD API を実装します。すべてブラウザ上で完結します。
この記事で実現すること
PostgreSQL データベースの追加(Zeabur Dashboard から1クリック)
Product モデルの作成(商品データの定義)
Entity Framework Core の設定
CRUD API の実装(作成・取得・更新・削除)
Swagger UI でのテスト
実際のデータ投入と確認
ステップ1: PostgreSQL データベースを追加する
まず、Zeabur Dashboard でデータベースを追加します。
1-1. Zeabur Dashboard を開く
ブラウザで Zeabur Dashboard にアクセスしてください。
前回デプロイした `MobileShop.Api` プロジェクトを選択します。
1-2. PostgreSQL を追加する
Zeabur Dashboard で前回デプロイした MobileShop.Api があるプロジェクトを開き、プロジェクト画面内の「+ Add Service」ボタンをクリックしてください。そうすると サービス選択のダイアログ(モーダル)が開くので、サービスを追加→データベース→PostgreSQL を選択します
数秒で PostgreSQL インスタンスが作成され、以下の環境変数が自動的に `MobileShop.Api` サービスに注入されます:
`DATABASE_URL`: PostgreSQL 接続文字列
`POSTGRES_HOST`: ホスト名
`POSTGRES_PORT`: ポート番号
`POSTGRES_USER`: ユーザー名
`POSTGRES_PASSWORD`: パスワード
`POSTGRES_DATABASE`: データベース名

これで、データベースの準備は完了です。パブリッククラウドサービスのように接続文字列を手動でコピーする必要はありません。
ステップ2: GitHub Codespaces を開く
前回使用した GitHub Codespaces を開いてください。
もし閉じてしまった場合は、GitHub リポジトリ(`MobileShop.Api`)のページから「Code」→「Codespaces」→「Open in browser」で再度開けます。
ステップ3: GitHub Copilot でコードを自動生成する(所要時間: 約3分)
ここからが、この記事の最大のポイントです。手動でコードを書く必要はありません。
3-1. 必要なパッケージを追加する
まず、ターミナルで以下のコマンドを実行してください:
# MobileShop.Api ディレクトリに移動
cd MobileShop.Api
# Entity Framework Core のデザインツール
dotnet add package Microsoft.EntityFrameworkCore.Design
# PostgreSQL 用のプロバイダー
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL3-2. Copilot Chat を開く
キーボードショートカット「Ctrl+Shift+I」(Mac では Cmd+Shift+I)で Copilot Chat を開いてください。
または、コマンドパレット(Ctrl+Shift+P / Cmd+Shift+P)を開き、「GitHub Copilot: Open Chat」と入力して選択してください。
3-3. プロンプトを入力する
以下のプロンプトをコピーして、Copilot Chat に貼り付けてください:
以下のプロンプトを Copilot Chat に貼り付けてください:
ASP.NET Core 9 で商品管理 CRUD API を作成してください。
要件:
- Product モデル: Id, Name, Price, Description, ImageUrl, CreatedAt
- Entity Framework Core + PostgreSQL
- ApplicationDbContext を使用
- CRUD エンドポイント(GET, POST, PUT, DELETE)
- 環境変数 DATABASE_URL から接続文字列を取得
- Migration 自動実行
- Program.cs で PORT 環境変数を読み取る
生成するファイル:
- Models/Product.cs
- Data/ApplicationDbContext.cs
- Controllers/ProductsController.cs
- Program.cs(既存ファイルを更新)3-4. コードを確認して適用する
Copilot が以下の4つのファイルのコードを生成します:
Models/Product.cs - 商品モデル
Data/ApplicationDbContext.cs** - データベースコンテキスト
Controllers/ProductsController.cs - CRUD API コントローラー
Program.cs - アプリケーションの設定
各ファイルの内容を確認し、問題なければ「Apply」または「Insert at cursor」をクリックしてコードを適用してください。
重要なポイント
Copilot が自動生成してくれる
手動でコードをコピペする必要はありません。プロンプトを入力するだけです。PORT 環境変数の読み取り
Zeabur は動的にポートを割り当てるため、`PORT` 環境変数を読み取る必要があります。DATABASE_URL の読み取り
Zeabur が自動注入する `DATABASE_URL` を使って PostgreSQL に接続します。自動マイグレーション
アプリ起動時に `dbContext.Database.Migrate()` を実行することで、テーブルが自動作成されます。
ステップ4: マイグレーションを作成する
データベーススキーマを定義するマイグレーションファイルを作成します。
ターミナルで以下のコマンドを実行してください:
# Entity Framework Core Tools をインストール(初回のみ)
dotnet tool install --global dotnet-ef
# マイグレーションを作成
dotnet ef migrations add InitialCreate`Migrations` フォルダに `*_InitialCreate.cs` というファイルが生成されます。
ステップ5: Git でコミット・プッシュする
すべてのコードが完成したので、GitHub にプッシュします。
# すべてのファイルをステージング
git add .
# コミット
git commit -m "Add Product CRUD API with PostgreSQL"
# GitHub へプッシュ
git push origin mainステップ6: Zeabur で自動デプロイされるのを確認する
GitHub に push すると、Zeabur が自動的に新しいコードを検知してデプロイを開始します。
6-1. Zeabur Dashboard を開く
Zeabur Dashboard で `MobileShop.Api` プロジェクトを開いてください。
6-2. デプロイログを確認する
画面右側のログで、ビルドの進行状況を確認できます。
約1〜2分で「Deploy successful」と表示されれば、デプロイ完了です。
ステップ7: Swagger UI でテストする
API が正常に動作しているか、Swagger UI で確認しましょう。
7-1. Swagger UI を開く
ブラウザで以下の URL にアクセスしてください:
https://mobileshop-api.zeabur.app/swaggerSwagger UI が表示され、新しく追加した `/api/products` エンドポイントが表示されているはずです。

7-2. 商品を作成する(POST)
「POST /api/products」をクリック
「Try it out」をクリック
Request body に以下の JSON を入力:
{
"name": "iPhone 15 Pro",
"price": 159800,
"description": "最新の iPhone",
"imageUrl": "https://example.com/iphone15pro.jpg"
}「Execute」をクリック
成功すると、Response body に作成された商品データが返ってきます:
{
"id": 1,
"name": "iPhone 15 Pro",
"price": 159800,
"description": "最新の iPhone",
"imageUrl": "https://example.com/iphone15pro.jpg",
"createdAt": "2026-01-13T10:30:00Z"
}7-3. 商品一覧を取得する(GET)
「GET /api/products」をクリック
「Try it out」をクリック
「Execute」をクリック
先ほど作成した商品データが配列で返ってきます:
[
{
"id": 1,
"name": "iPhone 15 Pro",
"price": 159800,
"description": "最新の iPhone",
"imageUrl": "https://example.com/iphone15pro.jpg",
"createdAt": "2026-01-13T10:30:00Z"
}
]
7-4. さらに商品を追加する
同じ手順で、さらに商品を追加してみましょう:(Swaggerでも1つのJSONオブジェクトのみを入力してください。複数の商品を一度に登録したい場合は、一括登録用のエンドポイントを作成する必要があります。)
{
"name": "iPad Pro 13インチ",
"price": 128800,
"description": "M2チップ搭載",
"imageUrl": "https://example.com/ipadpro.jpg"
}{
"name": "AirPods Pro",
"price": 39800,
"description": "ノイズキャンセリング対応",
"imageUrl": "https://example.com/airpodspro.jpg"
}再度 `GET /api/products` を実行すると、3件の商品が返ってくるはずです。

7-5. 特定の商品を取得する(GET)
「GET /api/products/{id}」をクリック
「Try it out」をクリック
`id` に `1` を入力
「Execute」をクリック
ID が 1 の商品(iPhone 15 Pro)だけが返ってきます。
7-6. 商品を更新する(PUT)
「PUT /api/products/{id}」をクリック
「Try it out」をクリック
`id` に `1` を入力
Request body に以下を入力(価格を変更):
{
"name": "iPhone 15 Pro",
"price": 149800,
"description": "最新の iPhone(値下げ)",
"imageUrl": "https://example.com/iphone15pro.jpg"
}「Execute」をクリック
成功すると `204 No Content` が返ってきます。

再度 `GET /api/products/1` を実行すると、価格が更新されていることが確認できます。

7-7. 商品を削除する(DELETE)
「DELETE /api/products/{id}」をクリック
「Try it out」をクリック
`id` に `3` を入力(AirPods Pro を削除)
「Execute」をクリック
成功すると `204 No Content` が返ってきます。

再度 `GET /api/products` を実行すると、AirPods Pro が削除されて2件だけが返ってくるはずです。

curl コマンドでのテスト(上級者向け)
Swagger UI の代わりに、ターミナルから `curl` コマンドでテストすることもできます。
商品一覧を取得
curl https://mobileshop-api.zeabur.app/api/products商品を作成
curl -X POST https://mobileshop-api.zeabur.app/api/products \
-H "Content-Type: application/json" \
-d '{
"name": "MacBook Pro 14インチ",
"price": 248800,
"description": "M3 Pro チップ搭載",
"imageUrl": "https://example.com/macbookpro.jpg"
}'特定の商品を取得
curl https://mobileshop-api.zeabur.app/api/products/1商品を更新
curl -X PUT https://mobileshop-api.zeabur.app/api/products/1 \
-H "Content-Type: application/json" \
-d '{
"name": "iPhone 15 Pro",
"price": 139800,
"description": "最新の iPhone(さらに値下げ)",
"imageUrl": "https://example.com/iphone15pro.jpg",
}'商品を削除
curl -X DELETE https://mobileshop-api.zeabur.app/api/products/2まとめ
この記事では、前回デプロイした Web API に PostgreSQL データベースを追加し、完全な CRUD API を実装しました。
実現できたこと
✅ PostgreSQL データベースをワンクリックで追加
✅ GitHub Copilot でコードを自動生成
✅ Entity Framework Core を使ったデータベース連携
✅ 商品の作成・取得・更新・削除 API
✅ Swagger UI でのテスト
✅ 自動デプロイ(Git push するだけで本番環境に反映)
Zeabur の素晴らしい点
データベース追加が1クリック
Azure のように接続文字列をコピーする必要がありません。環境変数が自動注入
`DATABASE_URL` が自動的にアプリに渡されます。マイグレーションが自動実行
`dbContext.Database.Migrate()` を書くだけで、テーブルが自動作成されます。すべてブラウザで完結
.NET SDK、PostgreSQL、VS Code のインストールは一切不要です。
次回予告
次回(第3回)では、この API を、実際の iOS アプリ(Swift) と Android アプリ(Kotlin) から呼び出す方法を解説します。
モバイルアプリ側のコード例と、CORS 設定、認証の追加方法も紹介する予定です。
参考リンク
最後まで読んでいただき、ありがとうございました!
