AI生成画像などのメディアを管理する包括的なメディア管理システム。
- 複数メディアソース対応(ローカル/SFTP/S3)
- メタデータ管理(プロンプト、タグ、キャラクター、IP)
- 検索・ソート・サムネイル生成
- リアルタイム更新 (SSE)
- AI自動タグ付け
Runtime: Bun
Framework: TanStack Start
API: oRPC
UI: Kobalte + Tailwind CSS + solid-ui
Database: PostgreSQL / PGlite
ORM: Drizzle ORM
Validation: Zod
AI/ML: dghs-imgutils-rs
Testing: Vitest / Playwright
Tooling: Vite / Biome
apps/server/: メインサーバー (TanStack Start + oRPC)。バックエンドAPIとWeb UIを統合。apps/tauri/: Tauri アプリ。src/は独立 SPA、src-tauri/は Rust 実装。apps/cli/: メディア管理・同期用CLIツール。apps/xtracter/: メディア収集用ブラウザ拡張機能。packages/core/: ドメインモデル、Zodスキーマ、contract、各種 port。packages/application/: ユースケース・アプリケーションサービス。packages/db/: Drizzle schema、DB repository 実装、transaction manager。packages/ui/: 共通UIコンポーネントライブラリ。packages/client/: oRPC client factory などの共有クライアント基盤。
bun install
cp apps/server/.env.example apps/server/.env
sudo -E docker compose --project-directory . up -d
bun --filter @solid-imager/server run db:migrate
bun run devAubeを使う場合は、依存関係のインストールとスクリプト実行を次のように置き換えられます。
aube i
aube -F @solid-imager/server run db:migrate
aube dev
# 本番ビルド済み成果物の起動: aube startAubeを使う場合も、Bunと同じく既存の bun.lock を唯一のlockfileとして使用します。依存関係を更新したときは bun install または aube i を実行し、別のlockfileを作成したり手動で同期したりしないでください。
PostgreSQLを使わずPGliteで動かす場合は、DB_HOSTを上書きしてマイグレーションを実行します。
DB_HOST=pglite bun --filter @solid-imager/server run db:migratePostgreSQL接続はBun.SQLを既定で使用します。COPY、LISTEN/NOTIFY、PostGISなどBun.SQLで未対応の機能が必要な環境では、DB_POSTGRES_DRIVER=node-postgres を設定すると従来の pg 経路へ切り替えられます。
画像処理はサムネイル変換と寸法取得を Bun.Image に寄せ、EXIF/コメント抽出と AI 用 crop は互換性のため sharp を継続利用します。
Bunランタイムの画像変換とPostgreSQL接続を個別に確認するスモークテストも用意しています。
bun run --cwd apps/server validate:bun-image
BUN_SQL_TEST_DATABASE_URL=postgres://user:password@localhost:5432/solid_imager \
bun run --cwd apps/server validate:bun-sqlAI自動タグ付けに使用する dghs-imgutils-rs は Rust の N-API アドオンです。GPU (CUDA) を有効にする場合も、アプリケーションをビルドするホスト側のランタイムを使用します。コンテナ内で Python、Rust toolchain、ONNX Runtime、アプリケーション依存関係をセットアップする必要はありません。
ORT_PREFER_DYNAMIC_LINK=1 ORT_LIB_PATH=/usr/lib bun installAubeを使う場合も同じ環境変数を付けて実行します。
ORT_PREFER_DYNAMIC_LINK=1 ORT_LIB_PATH=/usr/lib aube i要件:
/usr/lib/libonnxruntime.so.1と/usr/lib/libonnxruntime_providers_cuda.soが存在すること- NVIDIA ドライバーと CUDA ランタイムがインストールされていること
CPU のみで使用する場合は通常通り bun install してください。
本番の app コンテナは Python 3 を追加した Dockerfile.runtime をランタイムとして起動し、ホスト側でビルド済みのプロジェクトを /app にマウントします。youtube-dl-exec が同梱する yt-dlp は Python zipapp のため、Python 3 が必要です。アプリケーション依存関係の bun install はコンテナ内で実行しません。
ビルドホストで一度だけ実行します。
bun install --frozen-lockfile
bun run --cwd apps/server buildデプロイホストからその成果物が見える状態にして、APP_ARTIFACT_DIR にプロジェクトルートを指定します。
if [ -n "${APP_RUNTIME_IMAGE:-}" ]; then
APP_ARTIFACT_DIR=/srv/solid-imager \
docker compose -f compose.yml -f compose.production.yml -f compose.production.override.yml up -d --no-build
else
docker compose -f compose.yml -f compose.production.yml build app
APP_ARTIFACT_DIR=/srv/solid-imager \
docker compose -f compose.yml -f compose.production.yml -f compose.production.override.yml up -d
fiAPP_ARTIFACT_DIR には node_modules/ と apps/server/.output/ を含む、ビルドホストのプロジェクトディレクトリを指定してください。
APP_RUNTIME_IMAGE を指定した場合は、Python 3 がインストール済みの互換イメージを使用してください。この場合、app はローカルビルドせず、指定イメージをそのまま使用します。
| コマンド | 用途 |
|---|---|
bun run dev |
開発サーバー起動 |
aube dev |
Aube経由の開発サーバー起動 |
aube start |
Aube経由の本番サーバー起動 |
bun run check |
lint / format / typecheck |
bun run test |
Vitest テスト |
bun run format |
Biomeによるformat |
bun run lint |
lint |
bun --filter @solid-imager/server run db:generate |
マイグレーション生成 |
| ファイル | 用途 |
|---|---|
packages/db/src/schema.ts |
Drizzle DBスキーマ |
apps/server/drizzle.config.ts |
DB接続、マイグレーション |
biome.json |
Linter/Formatter |
vitest.config.ts |
Vitest projects |
apps/server/playwright.config.ts |
E2Eテスト |
compose.yml |
PostgreSQL (Docker) |
- API仕様: OpenAPI、Swagger UI
- Tauri SPA:
apps/tauri/src/、Rust側apps/tauri/src-tauri/ - V2移行状況: REPORT.md
- DBスキーマ:
packages/db/src/schema.ts - 本番DB移行: PostgreSQL 18 / UUIDv7移行手順
- 開発ルール: AGENTS.md