| 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(非機密設定)
特徴:
用途:
- アプリケーション名(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=
│ - TURSO_DATABASE_URL=libsql://dev-db.turso.io
│ - TURSO_AUTH_TOKEN=
│ Variables:
│ - NODE_ENV=development
│ - LOG_LEVEL=debug
│
├── 🧪 Environment: staging
│ ├── Service: web
│ └── Variables:
│ Secrets:
│ - OPENAI_API_KEY=sk-proj-staging-...
│ - NEXTAUTH_SECRET=
│ - TURSO_DATABASE_URL=libsql://staging-db.turso.io
│ - TURSO_AUTH_TOKEN=
│ Variables:
│ - NODE_ENV=staging
│ - LOG_LEVEL=info
│
└── 🚀 Environment: production
├── Service: web
└── Variables:
Secrets: - OPENAI_API_KEY=sk-proj-prod-... - NEXTAUTH_SECRET= - TURSO_DATABASE_URL=libsql://prod-db.turso.io - TURSO_AUTH_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 のネイティブプラグインではないため、手動で環境変数を設定します。
手順:
- 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 {
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=
- 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 設定
Railway CLI
ログセキュリティ
一時ファイル
Turso 固有
関連スキル
- `.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 詳細ガイド