| 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=
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 のネイティブプラグインではないため、手動で環境変数を設定します。
手順:
- Turso CLI で データベースを作成
- 環境別のデータベースを作成(dev/staging/prod)
- 認証トークンを生成
- 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)
- "sklive"(Stripe Key)
- "password"
- "secret"
→ 検出された場合:
- 即座にそのSecretをRotation
- ログ出力箇所を修正
- 再デプロイ ```
一時ファイルとセキュリティ
/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 /sklive[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
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=
- API_KEY=
- Status: Primary
production-green(新バージョン)
- TURSO_DATABASE_URL=libsql://prod-db.turso.io(同じDB)
- TURSO_AUTH_TOKEN=
(同じToken) - API_KEY=
(Rotation時) - Status: Inactive
切り替え手順:
- production-greenにデプロイ
- ヘルスチェック実行
- Railway Dashboard → Set as primary
- トラフィック切り替え
- 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 詳細ガイド