postgres について
セキュリティ分離と本番向け設定を考慮し、DigitalOcean Managed Postgresを構成するスキルです。アプリ開発者向けに、バインド変数とスキーマ分離の手順をスクリプトや運用資料とともに示します。
主な機能
- 01データベースのバインド変数
- 02スキーマ単位のテナント分離
- 03セットアップスクリプト
- 04スキーマとユーザーの監査
- 05ORMとマイグレーションのガイド
活用シーン
- 01単一アプリ用データベースの構成
- 02共有クラスターでのテナント分離
- 03データベース権限の付与
- 04接続文字列の生成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ digitalocean-labs/ do-app-platform-skills --skill postgresインストール後、Claude Code で/postgresを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdreference/bundled-scripts.mddatabase-migrations.mddoctl-reference.mdorm-configurations.mdpath-a-bindable-vars.mdpath-b-schema-isolation.mdtroubleshooting.mdscripts/add_client.pycleanup_client.pycreate_schema_user.pygenerate_connection_string.pyget_admin_conn.shlist_schemas_users.pysecure_setup.pysecure_setup.shtemplates/migrations/alembic.template.pytemplates/orm/drizzle.template.tsprisma.template.prismasqlalchemy.template.py詳細
Postgres スキル
DigitalOcean Managed Postgres データベースを、適切なセキュリティ分離と本番環境に対応したデフォルト設定で構成します。
すぐに決める
Need multiple isolated schemas in one database?
├── YES → Path B (Schema Isolation)
└── NO → Path A (Bindable Variables) ✅ RECOMMENDED
パス A:バインド可能な変数(推奨)
使用するケース:データベースごとに単一のアプリがあり、標準的な CRUD アプリケーションを使用する場合。
クイックスタート
# 1. Create cluster + user via doctl (DO stores password internally)
doctl databases create my-app-db --engine pg --region nyc3 --size db-s-1vcpu-2gb
CLUSTER_ID=$(doctl databases list --format ID,Name --no-header | grep my-app-db | awk '{print $1}')
doctl databases db create $CLUSTER_ID myappdb
doctl databases user create $CLUSTER_ID myappuser
# 2. Grant permissions (REQUIRED - users have no access by default!)
# Run: scripts/grant_permissions.sql as doadmin
# 3. Reference in app spec
# .do/app.yaml
databases:
- name: db
engine: PG
production: true
cluster_name: my-app-db
db_name: myappdb
db_user: myappuser
services:
- name: api
envs:
- key: DATABASE_URL
scope: RUN_TIME
value: ${db.DATABASE_URL}
完全なガイド:path-a-bindable-vars.mdを参照してください。
パス B:スキーマ分離
使用するケース:マルチテナント SaaS、1 つのクラスターを複数のアプリで共有する場合、またはスキーマレベルの分離が必要な場合。
クイックスタート
# Hands-free setup (requires gh CLI)
./scripts/secure_setup.sh \
--admin-url "$ADMIN_URL" \
--app-name myapp \
--schema myapp \
--repo owner/repo
パスワードは GitHub Secrets に直接送信され、画面には表示されません。
完全なガイド:path-b-schema-isolation.mdを参照してください。
利用可能なバインド可能変数
| 変数 | 例 |
|---|---|
${db.DATABASE_URL} | postgresql://user:pass@host:25060/db?sslmode=require |
${db.HOSTNAME} | my-db-do-user-123.db.ondigitalocean.com |
${db.PORT} | 25060 |
${db.USERNAME} | myappuser |
${db.PASSWORD} | (自動入力) |
${db.DATABASE} | myappdb |
${db.CA_CERT} | (証明書の内容) |
スクリプト
| スクリプト | 用途 |
|---|---|
scripts/secure_setup.sh | GitHub Secrets を使った、手動操作不要のパス B セットアップ |
scripts/create_schema_user.py | 分離されたスキーマとユーザーを作成 |
scripts/list_schemas_users.py | 既存のスキーマとユーザーを監査 |
scripts/generate_connection_string.py | 接続文字列を生成 |
参考ファイル
- path-a-bindable-vars.md — パス A の完全なワークフロー、接続プール、複数アプリのセットアップ
- path-b-schema-isolation.md — パス B の完全なワークフロー、マルチテナントのパターン
- orm-configurations.md — Prisma、SQLAlchemy、Drizzle、TypeORM の設定
- database-migrations.md — Alembic、Prisma Migrate、Drizzle Migrate
- doctl-reference.md —
doctl databasesの全コマンド - troubleshooting.md — よくあるエラーと解決方法
- bundled-scripts.md — スクリプトの使用方法
よくある問題(簡単な解決方法)
| エラー | 解決方法 |
|---|---|
| "permission denied for schema" | doadmin として権限付与用 SQL を実行します |
| "relation does not exist" | search_path を確認するか、スキーマ修飾名を使用します |
| "too many connections" | doctl で接続プールを作成します |
| "SSL connection required" | 接続文字列に ?sslmode=require を追加します |
| バインド可能変数が入力されない | production: true を確認し、名前が完全に一致していることを確認します |
トラブルシューティングの詳細:troubleshooting.mdを参照してください。
他のスキルとの連携
- → designer:アプリ仕様にデータベースブロックを追加
- → deployment:DATABASE_URL シークレットを使った GitHub Actions ワークフロー
- → devcontainers:本番環境と同等のローカル Postgres
- → troubleshooting:接続テスト用のデバッグコンテナー
コメント
Markdown 対応