claude-skills-railway-turso-management-skill-md
skillRailway Database管理スキル。Railway環境グループ、Variables vs Secrets、 Turso integration、Railway CLI統合、一時ファイルセキュリティを提供します。 📚 リソース参照: このスキルには以下のリソースが含まれています。 必要に応じて該当するリソースを参照してください: - `.claude/skills/railway-turso-management/resources/railway-turso-guide.md`: Railway Turso 詳細ガイド 使用タイミング: - RailwayプロジェクトのSecret管理を設計する時 - Railway環境グループを設定する時 - Turso integrationを設定する時 - Railway CLI経由のローカル開発を設定する時 - Railway Logsセキュリティを確保する時 Use when configuring Railway database, setting up environment groups, integrating Turso, or securing Railway deployments.
apm::install
apm install @mattnigh/claude-skills-railway-turso-management-skill-mdapm::skill.md
---
name: .claude/skills/railway-turso-management/SKILL.md
description: |
Railway Database管理スキル。Railway環境グループ、Variables vs Secrets、
Turso integration、Railway CLI統合、一時ファイルセキュリティを提供します。
📚 リソース参照:
このスキルには以下のリソースが含まれています。
必要に応じて該当するリソースを参照してください:
- `.claude/skills/railway-turso-management/resources/railway-turso-guide.md`: Railway Turso 詳細ガイド
使用タイミング:
- RailwayプロジェクトのSecret管理を設計する時
- Railway環境グループを設定する時
- Turso integrationを設定する時
- Railway CLI経由のローカル開発を設定する時
- Railway Logsセキュリティを確保する時
Use when configuring Railway database, setting up environment groups,
integrating Turso, or securing Railway deployments.
version: 1.0.0
---
# Railway Turso Database Management
## 概要
Railway は、環境変数を暗号化して保存し、デプロイ時にアプリケーションに注入する
Secrets 管理機能を提供します。このスキルは、Railway 固有の機能を最大限活用した
セキュアな Turso データベース管理を実現します。
## Railway Secrets vs Variables
### Secrets(機密情報)
**特徴**:
- 暗号化保存
- UI 上でマスク表示(\*\*\*)
- 監査ログ記録
- アクセス制限可能
**用途**:
- API キー(OPENAI_API_KEY、STRIPE_SECRET_KEY)
- データベース認証(TURSO_DATABASE_URL、TURSO_AUTH_TOKEN)
- 暗号化キー(NEXTAUTH_SECRET)
- OAuth Client Secret
- Webhook URL(DISCORD_WEBHOOK_URL)
**設定方法**:
\`\`\`
Railway Dashboard
→ Project
→ Environment (development/staging/production)
→ Variables
→ + New Variable
→ Variable name: OPENAI_API_KEY
→ Value: sk-proj-...
→ 🔒 Mark as secret(✅ チェック)
→ Add
\`\`\`
### Variables(非機密設定)
**特徴**:
- 平文保存
- UI 上で表示可能
- 監査ログなし
**用途**:
- アプリケーション名(APP_NAME)
- ログレベル(LOG_LEVEL)
- 機能フラグ(ENABLE_FEATURE_X)
- 公開 URL(API_BASE_URL)
- ポート番号(PORT)
**重要**: 機密情報は必ず「Mark as secret」をチェック
## Railway 環境グループ管理
### 環境の作成
\`\`\`
Railway Dashboard
→ Project
→ Environments
→ + New Environment
→ Name: staging
→ Create
\`\`\`
### 環境別変数設定の推奨構成
\`\`\`
Project: MyApp
│
├── 🏗️ Environment: development
│ ├── Service: web
│ └── Variables:
│ Secrets:
│ - OPENAI_API_KEY=sk-proj-dev-...
│ - NEXTAUTH_SECRET=<dev-secret>
│ - TURSO_DATABASE_URL=libsql://dev-db.turso.io
│ - TURSO_AUTH_TOKEN=<dev-token>
│ Variables:
│ - NODE_ENV=development
│ - LOG_LEVEL=debug
│
├── 🧪 Environment: staging
│ ├── Service: web
│ └── Variables:
│ Secrets:
│ - OPENAI_API_KEY=sk-proj-staging-...
│ - NEXTAUTH_SECRET=<staging-secret>
│ - TURSO_DATABASE_URL=libsql://staging-db.turso.io
│ - TURSO_AUTH_TOKEN=<staging-token>
│ Variables:
│ - NODE_ENV=staging
│ - LOG_LEVEL=info
│
└── 🚀 Environment: production
├── Service: web
└── Variables:
Secrets: - OPENAI_API_KEY=sk-proj-prod-... - NEXTAUTH_SECRET=<prod-secret-high-entropy> - TURSO_DATABASE_URL=libsql://prod-db.turso.io - TURSO_AUTH_TOKEN=<prod-token> - DISCORD_WEBHOOK_URL=https://discord.com/...
Variables: - NODE_ENV=production - LOG_LEVEL=warn
\`\`\`
### Railway CLI での環境変数管理
\`\`\`bash
# 環境選択
railway environment
# → development, staging, production から選択
# 変数一覧表示
railway variables
# 変数設定(現在の環境)
railway variables set API_KEY=sk-proj-key
# 変数削除
railway variables delete API_KEY
# JSON形式でエクスポート(⚠️ 非推奨)
railway variables --json > vars.json
# → 即座に削除すること: rm vars.json
\`\`\`
## Turso Database Integration
### セットアップ
Turso は Railway のネイティブプラグインではないため、手動で環境変数を設定します。
**手順**:
1. Turso CLI で データベースを作成
2. 環境別のデータベースを作成(dev/staging/prod)
3. 認証トークンを生成
4. Railway に環境変数を設定
### Turso CLI でのデータベース作成
\`\`\`bash
# Turso CLIインストール
curl -sSfL https://get.tur.so/install.sh | bash
# ログイン
turso auth login
# 開発用データベース作成
turso db create myapp-dev
# ステージング用データベース作成
turso db create myapp-staging
# 本番用データベース作成
turso db create myapp-prod
# データベースURL取得
turso db show myapp-dev --url
# 出力例: libsql://myapp-dev-[org].turso.io
# 認証トークン生成
turso db tokens create myapp-dev
# 出力例: eyJhbGc...
\`\`\`
### Railway への環境変数設定
**Development 環境**:
\`\`\`
Railway Dashboard
→ Project
→ Environment: development
→ Variables
→ + New Variable
→ Variable name: TURSO_DATABASE_URL
→ Value: libsql://myapp-dev-[org].turso.io
→ 🔒 Mark as secret(✅ チェック)
→ Add
→ + New Variable
→ Variable name: TURSO_AUTH_TOKEN
→ Value: eyJhbGc...
→ 🔒 Mark as secret(✅ チェック)
→ Add
\`\`\`
**Staging/Production 環境**: 同様の手順で各環境のデータベース URL とトークンを設定
**メリット**:
- 環境毎に自動分離(dev/staging/prod で別 DB インスタンス)
- Edge ロケーションでの低レイテンシ
- 組み込み レプリケーション機能
- SQLite 互換で高速
**.env.example への記載**:
\`\`\`bash
# Database(Turso)
# ローカル開発: railway run pnpm run dev で自動注入
# または ローカル SQLite ファイル使用
TURSO_DATABASE_URL=libsql://[database]-[org].turso.io
TURSO_AUTH_TOKEN=your-auth-token-here
# ローカル開発用(オプション)
# TURSO_DATABASE_URL=file:./local.db
\`\`\`
## Railway CLI 統合
### ローカル開発フロー
**方法 1: railway run(推奨)**
\`\`\`bash
# Railwayから環境変数を注入して実行
railway run pnpm run dev
# メリット:
# - ファイルに保存しない(メモリ内注入)
# - Git誤コミットリスクなし
# - 環境選択が明示的
\`\`\`
**方法 2: ローカル.env(非推奨)**
\`\`\`bash
# Railway Secretsをローカルファイルにダウンロード
railway variables --json | jq -r 'to_entries | .[] | "\(.key)=\(.value)"' > .env.local
# ⚠️ 警告:
# 1. .env.localを必ず.gitignoreに追加
# 2. 作業終了後は即座に削除
# 3. 本番環境のSecretは絶対にダウンロードしない
# 使用後は即座に削除
rm .env.local
\`\`\`
**方法 3: ローカル SQLite(開発専用)**
\`\`\`bash
# .env.development.local
TURSO_DATABASE_URL=file:./local.db
# TURSO_AUTH_TOKEN は不要(ローカルファイルの場合)
\`\`\`
### Railway Token セキュリティ
**Token 取得**:
\`\`\`
Railway Dashboard
→ Account Settings
→ Tokens
→ Create Token
→ Name: "GitHub Actions Deploy"
→ Scope: Project単位(推奨)
→ Permissions: "Deploy only"
→ Expiration: 90日後
→ Create
\`\`\`
**Token 保存**(GitHub Secrets):
\`\`\`
GitHub Repo
→ Settings
→ Secrets and variables → Actions
→ New repository secret
→ Name: RAILWAY_TOKEN
→ Value: <Railwayで生成したToken>
→ Add secret
\`\`\`
**Rotation(90 日毎)**:
\`\`\`bash
# 1. Railway Dashboardで新Token生成
# 2. GitHub SecretsのRAILWAY_TOKENを更新
# 3. Railway Dashboardで旧Tokenを Revoke
# 4. GitHub Actionsでデプロイテスト実行
\`\`\`
## Railway Logs セキュリティ
### ログへの Secret 露出防止
\`\`\`typescript
// ❌ 危険: SecretをログにNO出力
console.log("Database URL:", process.env.TURSO_DATABASE_URL);
// Railway Logs に露出!
// ✅ 安全: Secretをマスク
console.log("Database URL: \*\*\*");
// ✅ 安全: 構造化ログでSecretを除外
logger.info({
event: "db_connection",
status: "connected",
// database_url や auth_token は含めない
timestamp: new Date(),
});
\`\`\`
### Railway Logs での事後確認
\`\`\`
Railway Dashboard
→ Project
→ Deployments
→ View Logs
→ Search機能で検索:
- "libsql://"(Turso URL)
- "eyJhbGc"(JWT token prefix)
- "sk-proj-"(OpenAI Key)
- "sk*live*"(Stripe Key)
- "password"
- "secret"
→ 検出された場合:
1. 即座にそのSecretをRotation
2. ログ出力箇所を修正
3. 再デプロイ
\`\`\`
## 一時ファイルとセキュリティ
### /tmp ディレクトリの揮発性
**Railway の仕様**:
- \`/tmp\`ディレクトリは**再デプロイ時に完全削除**される
- 永続化が必要なデータは外部ストレージ使用(S3、Cloudinary 等)
**Secret の一時保存禁止**:
\`\`\`typescript
// ❌ 危険: Secretをファイルに保存
import fs from "fs";
fs.writeFileSync("/tmp/auth-token.txt", process.env.TURSO_AUTH_TOKEN);
// ✅ 安全: Secretはメモリ内のみ
const authToken = process.env.TURSO_AUTH_TOKEN;
// メモリ内変数として使用
\`\`\`
### アップロードファイルのスキャン
\`\`\`typescript
import { Readable } from "stream";
class UploadSecurityScanner {
private secretPatterns = [
/sk-proj-[a-zA-Z0-9]{48}/, // OpenAI
/sk*live*[0-9a-zA-Z]{24,}/, // Stripe
/-----BEGIN ._ PRIVATE KEY-----/, // Private Key
/AKIA[0-9A-Z]{16}/, // AWS Access Key
/eyJhbGc[a-zA-Z0-9_-]_\.[a-zA-Z0-9_-]_\.[a-zA-Z0-9_-]\_/, // JWT tokens
/libsql:\/\/[a-zA-Z0-9-]+\.turso\.io/, // Turso URL
];
async scanFile(file: File): Promise<void> {
const content = await file.text();
for (const pattern of this.secretPatterns) {
if (pattern.test(content)) {
throw new Error(
"Uploaded file contains potential secret - upload rejected"
);
}
}
}
}
// Uploadエンドポイントで使用
app.post("/api/upload", async (req, res) => {
const file = req.file;
// Secret スキャン
await scanner.scanFile(file);
// スキャン通過後のみ処理
await processUpload(file);
});
\`\`\`
## デプロイ戦略
### Blue-Green Deployment
\`\`\`
Railway環境設定:
production-blue(現行)
- TURSO_DATABASE_URL=libsql://prod-db.turso.io
- TURSO_AUTH_TOKEN=<Current Token>
- API_KEY=<Current Key>
- Status: Primary
production-green(新バージョン)
- TURSO_DATABASE_URL=libsql://prod-db.turso.io(同じDB)
- TURSO_AUTH_TOKEN=<Current Token>(同じToken)
- API_KEY=<New Key>(Rotation時)
- Status: Inactive
切り替え手順:
1. production-greenにデプロイ
2. ヘルスチェック実行
3. Railway Dashboard → Set as primary
4. トラフィック切り替え
5. production-blueを監視期間保持
\`\`\`
### ローリングアップデート(Secret Rotation 時)
\`\`\`bash
# Phase 1: 新Secretを追加
railway variables set API_KEY_NEW=sk-proj-new-key
# Phase 2: アプリケーションコードを更新(新旧両方試行)
git push origin main
# Phase 3: 新Secretに完全移行確認
railway logs --tail
# Phase 4: 旧Secretを削除
railway variables delete API_KEY_OLD
\`\`\`
## 実装チェックリスト
### Railway 設定
- [ ] すべての機密情報が「Mark as secret」されているか?
- [ ] 環境グループが 3 つ設定されているか?(dev/staging/prod)
- [ ] Turso データベースが各環境に設定されているか?
- [ ] TURSO_DATABASE_URL と TURSO_AUTH_TOKEN が設定されているか?
- [ ] Variables(非機密)と Secrets(機密)が適切に分類されているか?
### Railway CLI
- [ ] Railway Token が安全に保管されているか?(GitHub Secrets)
- [ ] Token 権限が最小化されているか?(Deploy only)
- [ ] Token の Rotation スケジュールがあるか?(90 日)
- [ ] \`railway variables\`でダウンロードしたファイルが即座に削除されるか?
### ログセキュリティ
- [ ] ログ出力に Secret が含まれないか?
- [ ] Railway Logs で定期的に Secret 露出をチェックしているか?
- [ ] 構造化ログで Secret フィールドが除外されているか?
### 一時ファイル
- [ ] /tmp ディレクトリへの Secret 保存を避けているか?
- [ ] アップロードファイルがスキャンされているか?
- [ ] 永続化が必要なデータは外部ストレージ使用か?
### Turso 固有
- [ ] 環境別にデータベースが分離されているか?
- [ ] 認証トークンが定期的にローテーションされているか?
- [ ] ローカル開発用の SQLite フォールバックが設定されているか?
## 関連スキル
- \`.claude/skills/github-actions-security/SKILL.md\` - GitHub Actions 統合
- \`.claude/skills/environment-isolation/SKILL.md\` - 環境分離戦略
- \`.claude/skills/secret-management-architecture/SKILL.md\` - Secret 管理アーキテクチャ
## リソースファイル
- \`resources/railway-turso-guide.md\` - Railway Turso 詳細ガイド