mcpField
N
nuxthub

nuxthub

github.com/onmaxクラウド・DevOps7232.2k 回インストール今日更新
リポジトリ

nuxthub について

nuxthubは、データベース、KV、Blob、キャッシュを使うフルスタックNuxt開発向けのスキルです。設定やマイグレーションに加え、複数のクラウドへのデプロイ方法も扱います。

主な機能

  1. 01Drizzle ORMによるデータベース
  2. 02KV・Blobストレージ
  3. 03レスポンス・関数キャッシュ
  4. 04データベースマイグレーション管理
  5. 05マルチクラウドのデプロイ設定

活用シーン

  1. 01Nuxtサーバーへのデータベース追加
  2. 02KV・ファイルストレージの設定
  3. 03ルートや関数のキャッシュ
  4. 04複数クラウドへのデプロイ

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/onmax/nuxt-skills --skill nuxthub

インストール後、Claude Code で/nuxthubを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

agents/
openai.yaml
references/
providers.md
wrangler-templates.md

詳細

NuxtHub v0.10.8

データベース、KV、Blob、キャッシュを備えたフルスタック Nuxt フレームワークです。マルチクラウドに対応しています(Cloudflare、Vercel、Deno、Netlify)。

Nuxt のサーバーパターンについては: nuxt スキル(server.md)を使用してください データベースを使うコンテンツについては: nuxt-content スキルを使用してください

ファイルの読み込み

タスクに応じて、以下のリファレンスファイルを読み込むことを検討してください:

  • references/wrangler-templates.md - Cloudflare デプロイ用に wrangler.jsonc を手動で設定する場合
  • references/providers.md - Vercel、Netlify、Deno、AWS へのデプロイ、または外部データベース/ストレージプロバイダーの設定を行う場合

すべてのファイルを一度に読み込まないでください。 現在のタスクに関連するものだけを読み込んでください。

インストール

npx nuxi module add hub

設定

// nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxthub/core'],
  hub: {
    db: 'sqlite', // 'sqlite' | 'postgresql' | 'mysql'
    kv: true,
    blob: true,
    cache: true,
    dir: '.data', // local storage directory
    remote: false // use production bindings in dev (v0.10+)
  }
})
高度な設定
hub: {
  db: {
    dialect: 'postgresql',
    driver: 'postgres-js', // Optional: auto-detected
    casing: 'snake_case',  // camelCase JS -> snake_case DB (v0.10.3+)
    migrationsDirs: ['server/db/custom-migrations/'],
    applyMigrationsDuringBuild: true, // default
    applyMigrationsDuringDev: true, // apply migrations in dev (v0.10.7+)
    replica: { // Read replica support (v0.10.6+)
      connection: { connectionString: process.env.DATABASE_REPLICA_URL }
    }
  },
  remote: true // Use production Cloudflare bindings in dev (v0.10+)
}

リモートモード: 有効にすると、ローカル開発時にローカルエミュレーションの代わりに本番環境の D1/KV/R2 に接続します。本番データを使ったテストに便利です。

データベースレプリカ(v0.10.6+): 読み取りレプリカを設定してデータベースの負荷を分散できます。クエリは自動的にレプリカを使用し、書き込みはプライマリに送信されます。

データベース

Drizzle ORM を介した型安全な SQL を提供します。db と schema はサーバーサイドで自動インポートされます。

スキーマ定義

server/db/schema.ts または server/db/schema/*.ts に配置します:

// server/db/schema.ts (SQLite)
import { integer, sqliteTable, text } from 'drizzle-orm/sqlite-core'

export const users = sqliteTable('users', {
  id: integer().primaryKey({ autoIncrement: true }),
  name: text().notNull(),
  email: text().notNull().unique(),
  createdAt: integer({ mode: 'timestamp' }).notNull()
})

PostgreSQL の場合:

import { pgTable, serial, text, timestamp } from 'drizzle-orm/pg-core'

export const users = pgTable('users', {
  id: serial().primaryKey(),
  name: text().notNull(),
  email: text().notNull().unique(),
  createdAt: timestamp().notNull().defaultNow()
})
データベース API
// db and schema are auto-imported on server-side
import { db, schema } from 'hub:db'

// Select
const users = await db.select().from(schema.users)
const user = await db.query.users.findFirst({ where: eq(schema.users.id, 1) })

// Insert
const [newUser] = await db.insert(schema.users).values({ name: 'John', email: '[email protected]' }).returning()

// Update
await db.update(schema.users).set({ name: 'Jane' }).where(eq(schema.users.id, 1))

// Delete
await db.delete(schema.users).where(eq(schema.users.id, 1))
マイグレーション
npx nuxt db generate                  # Generate migrations from schema
npx nuxt db migrate                   # Apply pending migrations
npx nuxt db sql "SELECT * FROM users" # Execute raw SQL
npx nuxt db drop <TABLE>              # Drop a specific table
npx nuxt db drop-all [--force]        # Drop all tables; --force skips confirmation (v0.10.7+)
npx nuxt db squash                    # Squash migrations into one (v0.10+)
npx nuxt db mark-as-migrated [NAME]   # Mark as migrated without running

npx nuxi dev と npx nuxi build の実行時に、マイグレーションが自動適用されます。_hub_migrations テーブルで追跡されます。

データベースプロバイダー
方言ローカル本番環境
sqlite.data/db/sqlite.dbD1(Cloudflare)、Turso(TURSO_DATABASE_URL、TURSO_AUTH_TOKEN)
postgresqlPGlitepostgres-js(DATABASE_URL)、neon-http(v0.10.2+、DATABASE_URL)
mysql-mysql2(DATABASE_URL、MYSQL_URL)

KV ストレージ

キーと値のストレージです。kv はサーバーサイドで自動インポートされます。

import { kv } from 'hub:kv'

await kv.set('key', { data: 'value' })
await kv.set('key', value, { ttl: 60 }) // TTL in seconds
const value = await kv.get('key')
const exists = await kv.has('key')
await kv.del('key')
const keys = await kv.keys('prefix:')
await kv.clear('prefix:')

制約:値は最大 25 MiB、キーは最大 512 バイトです。

KV プロバイダー
プロバイダーパッケージ環境変数
Upstash@upstash/redisUPSTASH_REDIS_REST_URL、UPSTASH_REDIS_REST_TOKEN
RedisioredisREDIS_URL
Cloudflare KV-wrangler.jsonc の KV バインディング
Deno KV-Deno Deploy で自動
Vercel-KV_REST_API_URL、KV_REST_API_TOKEN

Blob ストレージ

ファイルストレージです。blob はサーバーサイドで自動インポートされます。

Blob API
import { blob } from 'hub:blob'

// Upload
const result = await blob.put('path/file.txt', body, {
  contentType: 'text/plain',
  access: 'public', // 'public' | 'private' (v0.10.2+)
  addRandomSuffix: true,
  prefix: 'uploads'
})
// Returns: { pathname, contentType, size, httpEtag, uploadedAt }

// Download
const file = await blob.get('path/file.txt') // Returns Blob or null

// List
const { blobs, cursor, hasMore, folders } = await blob.list({ prefix: 'uploads/', limit: 10, folded: true })

// Serve (with proper headers)
return blob.serve(event, 'path/file.txt')

// Delete
await blob.del('path/file.txt')
await blob.del(['file1.txt', 'file2.txt']) // Multiple

// Metadata only
const meta = await blob.head('path/file.txt')
アップロードヘルパー
// Server: Validate + upload handler
export default eventHandler(async (event) => {
  return blob.handleUpload(event, {
    formKey: 'files',
    multiple: true,
    ensure: { maxSize: '10MB', types: ['image/png', 'image/jpeg'] },
    put: { addRandomSuffix: true, prefix: 'images' }
  })
})

// Validate before manual upload
ensureBlob(file, { maxSize: '10MB', types: ['image'] })

// Multipart upload for large files (>10MB)
export default eventHandler(async (event) => {
  return blob.handleMultipartUpload(event) // Route: /api/files/multipart/[action]/[...pathname]
})
Vue コンポーザブル
// Simple upload
const upload = useUpload('/api/upload')
const result = await upload(inputElement)

// Multipart with progress
const mpu = useMultipartUpload('/api/files/multipart')
const { completed, progress, abort } = mpu(file)
Blob プロバイダー
プロバイダーパッケージ設定
Cloudflare R2-wrangler.jsonc の BLOB バインディング
Vercel Blob@vercel/blobBLOB_READ_WRITE_TOKEN
S3aws4fetchS3_ACCESS_KEY_ID、S3_SECRET_ACCESS_KEY、S3_BUCKET、S3_REGION

キャッシュ

レスポンスと関数のキャッシュです。

ルートハンドラーのキャッシュ
export default cachedEventHandler((event) => {
  return { data: 'cached', date: new Date().toISOString() }
}, {
  maxAge: 60 * 60, // 1 hour
  getKey: event => event.path
})
関数のキャッシュ
export const getStars = defineCachedFunction(
  async (event: H3Event, repo: string) => {
    const data = await $fetch(`https://api.github.com/repos/${repo}`)
    return data.stargazers_count
  },
  { maxAge: 3600, name: 'ghStars', getKey: (event, repo) => repo }
)
キャッシュの無効化
// Remove specific
await useStorage('cache').removeItem('nitro:functions:getStars:repo-name.json')

// Clear by prefix
await useStorage('cache').clear('nitro:handlers')

キャッシュキーのパターン:${group}:${name}:${getKey(...args)}.json(デフォルト:group='nitro'、name='handlers'|'functions'|'routes')

デプロイ

Cloudflare

NuxtHub は hub の設定から wrangler.json を自動生成するため、手動で wrangler.jsonc を作成する必要はありません。

// nuxt.config.ts
export default defineNuxtConfig({
  hub: {
    db: {
      dialect: 'sqlite',
      driver: 'd1',
      connection: { databaseId: '<database-id>' }
    },
    kv: {
      driver: 'cloudflare-kv-binding',
      namespaceId: '<kv-namespace-id>'
    },
    cache: {
      driver: 'cloudflare-kv-binding',
      namespaceId: '<cache-namespace-id>'
    },
    blob: {
      driver: 'cloudflare-r2',
      bucketName: '<bucket-name>'
    }
  }
})

オブザーバビリティ(推奨): 本番環境へのデプロイでロギングを有効にします。

// wrangler.jsonc (optional)
{
  "observability": {
    "logs": {
      "enabled": true,
      "head_sampling_rate": 1,
      "invocation_logs": true,
      "persist": true
    }
  }
}

Cloudflare のダッシュボードまたは CLI でリソースを作成します。

npx wrangler d1 create my-db              # Get database-id
npx wrangler kv namespace create KV       # Get kv-namespace-id
npx wrangler kv namespace create CACHE    # Get cache-namespace-id
npx wrangler r2 bucket create my-bucket   # Get bucket-name

デプロイ: Cloudflare Workers プロジェクトを作成し、Git リポジトリをリンクします。バインディングはビルド時に自動設定されます。

環境: プレビュー環境へのデプロイには CLOUDFLARE_ENV=preview を使用します。

手動での wrangler.jsonc のパターンについては references/wrangler-templates.md を、すべてのプロバイダー設定については references/providers.md をご覧ください。

その他のプロバイダー

以下の詳細なデプロイパターンについては、references/providers.md をご覧ください。

  • Vercel: Postgres、Turso、Vercel Blob、Vercel KV
  • Netlify: 外部データベース、S3、Upstash Redis
  • Deno Deploy: Deno KV
  • AWS/セルフホスト: S3、RDS、カスタム設定
HTTP 経由の D1

Cloudflare 以外のホストから D1 にクエリを実行します。

hub: {
  db: { dialect: 'sqlite', driver: 'd1-http' }
}

次の環境変数が必要です:NUXT_HUB_CLOUDFLARE_ACCOUNT_ID、NUXT_HUB_CLOUDFLARE_API_TOKEN、NUXT_HUB_CLOUDFLARE_DATABASE_ID

ビルド時フック

// Extend schema
nuxt.hook('hub:db:schema:extend', async ({ dialect, paths }) => {
  paths.push(await resolvePath(`./schema/custom.${dialect}`))
})

// Add migration directories
nuxt.hook('hub:db:migrations:dirs', (dirs) => {
  dirs.push(resolve('./db-migrations'))
})

// Post-migration queries (idempotent)
nuxt.hook('hub:db:queries:paths', (paths, dialect) => {
  paths.push(resolve(`./seed.${dialect}.sql`))
})

型の共有

// shared/types/db.ts
import type { users } from '~/server/db/schema'

export type User = typeof users.$inferSelect
export type NewUser = typeof users.$inferInsert

WebSocket/リアルタイム

実験的な WebSocket を有効にします。

// nuxt.config.ts
nitro: { experimental: { websocket: true } }
// server/routes/ws/chat.ts
export default defineWebSocketHandler({
  open(peer) {
    peer.subscribe('chat')
    peer.publish('chat', 'User joined')
  },
  message(peer, message) {
    peer.publish('chat', message.text())
  },
  close(peer) {
    peer.unsubscribe('chat')
  }
})

非推奨(v0.10)

Cloudflare 固有の機能は削除されました。

  • hubAI() → Workers AI Provider で AI SDK を使用
  • hubBrowser() → Puppeteer
  • hubVectorize() → Vectorize
  • NuxtHub Admin → 2025 年 12 月 31 日に提供終了
  • npx nuxthub deploy → wrangler deploy を使用

クイックリファレンス

機能インポートアクセス
データベースimport { db, schema } from 'hub:db'db.select()、db.insert() など
KVimport { kv } from 'hub:kv'kv.get()、kv.set() など
Blobimport { blob } from 'hub:blob'blob.put()、blob.get() など

すべてサーバーサイドで自動インポートされます。

リソース

コメント