このプロジェクトについて

# Attic Atticは、個人や家庭向けのオープンソースでセルフホスト可能な家庭内インベントリアプリです。家電、工具、電子機器、本、ゲーム、家具など、所有するすべてのものを登録し、保管場所、状態、購入情報、保証、写真、レシート、マニュアルをまとめて管理できます。 部屋、棚、戸棚、箱といった入れ子構造の場所で、家庭内の収納をそのまま再現します。カテゴリとカスタム項目でアイテムの種類ごとに詳細を記録でき、コレクションを使えば保管場所を変えずに関連アイテムをまとめられます。特定のコレクションの管理にも、家中の全アイテムの管理にも対応します。 ## 主な機能 **家庭内インベントリ** - カテゴリごとのカスタム属性(文字列、数値、真偽値、日付、ドロップダウン)を備えた完全なCRUD - 階層化されたカテゴリと場所。子カテゴリは祖先のカスタム項目を継承 - 状態の管理(新品、中古、破損、またはカスタム) - ダッシュボードでの保証期限の監視 - 請求書、マニュアル、写真のファイル添付 - 世帯で共有するコレクション(例:PS5のゲーム、本、家具)。アセットを複数のコレクションに割り当て、コレクションで絞り込み可能。コレクションを削除してもアセットは保持 - 購入日、価格、メモとダッシュボードでの資産価値の集計 **検索と発見** - アセット名と説明を対象にした全文検索 - カテゴリ、場所、状態による絞り込み。カテゴリフィルタには子孫カテゴリも含まれる - ドロップダウンのラベルを含む、大文字小文字を区別しない部分一致での属性値検索 - 型付き属性の比較とコレクション所属を組み合わせた、入れ子構造の「すべてに一致(AND)」/「いずれかに一致(OR)」フィルタの構築 - 名前付きフィルタを非公開で保存。最大5つをサイドバーのショートカットに固定可能。管理者も他のユーザーの保存済みフィルタにはアクセス不可 **スマート連携** - Google Books、TMDB(映画・テレビ)、BoardGameGeek、IGDB(ビデオゲーム)からの自動インポート - メタデータとカバー画像が自動で設定 - 新しいインポート元を追加できるプラグインシステム Google Booksは認証情報なしでも動作しますが、共有クォータが低い場合があります。確実にインポートするには `ATTIC_GOOGLE_BOOKS_API_KEY` を設定してください。IGDBにはTwitchアプリケーションから取得した `ATTIC_IGDB_CLIENT_ID` と `ATTIC_IGDB_CLIENT_SECRET` が必要です。トークンはメモリ上にのみ保持されます。 **セルフホストとセキュリティ** - Dockerベースのデプロイ、データの完全な所有 - ローカルパスワード認証とOIDC/SSO(Keycloak互換) - Swaggerドキュメント付きREST API - 添付ファイル用のローカルまたはS3互換ストレージ - ダークモード、モバイル対応UI ## アセットフィルタ 1つの語句で検索するには **属性値の検索** を、ルールや入れ子グループを組み合わせるには **詳細フィルタ** を使用します。テキストは等しい/含むに対応。数値と日付は比較と範囲に対応。真偽値はtrue/false。ドロップダウンは任意の選択肢。複数選択とコレクションはすべてに対応。すべての属性で空/非空のチェックが可能です(null、空文字列、空配列は空とみなされ、ゼロとfalseは空ではありません)。 クイック検索は値とドロップダウンのラベルに一致し、属性名や内部IDには一致しません。`%`、`_`、バックスラッシュはリテラルとして扱われます。有効で表示可能な属性のみが対象になります。クイック検索、ページフィルタ、詳細ルールはANDで組み合わされます。下書きを適用したり、新しい名前付きフィルタとして保存したり、既存のフィルタを更新したりできます。保存された条件にはページネーションは含まれません。参照先が削除された場合や互換性のない変更があった場合はルールの修復が必要です。名前を変更しても安定したIDによって参照は維持されます。 API: `GET /api/assets?attribute_q=Commodore`、構造化検索は `POST /api/assets/search`、個人用CRUDは `/api/saved-filters` 配下です。リクエストボディの例: ```json { "criteria": { "version": 1, "expression": { "kind": "group", "match": "all", "children": [ { "kind": "rule", "field": "attribute_q", "operator": "contains", "value": "Commodore" }, { "kind": "rule", "field": "q", "operator": "search", "value": "computer" } ] } }, "limit": 20, "offset": 0 } ``` 保存済みフィルタは `{"name":"Retro computers","criteria":{...}}` で作成し、`PUT /api/saved-filters/{id}` で更新します。`criteria` を省略すると名前の変更のみ行われます。GET/一覧のレスポンスには、不正な定義に対する `issues` が含まれます。式はグループ5階層、ルール50個、所属ルールあたり100個の値まで。JSONボディは64 KiBまでに制限されています。完全なワイヤ形式は `/api/docs` を参照してください。 ## クイックスタート ### 前提条件 - DockerとDocker Compose、Go 1.27以上、Bun 1.1以上、Make ### 開発環境のセットアップ 1. クローンしてインフラを起動: `git clone [email protected]:lmmendes/attic.git && cd attic && docker compose up -d` 2. マイグレーションを実行: `make migrate-up` 3. バックエンドを起動: `cd backend && go run ./cmd/server` 4. フロントエンドを起動(別ターミナル): `cd frontend && bun install && bun run dev` 5. アプリを開く: - フロントエンド: http://localhost:3000 - バックエンドAPI: http://localhost:8080 - APIドキュメント: http://localhost:8080/api/docs - Keycloak: http://localhost:8180 - デフォルトのテスト認証情報: `testuser` / `testpassword` ### ブラウザ統合テスト Playwrightスイートは実際のブラウザ操作(ログイン、カテゴリ/属性の引き継ぎ、機能設定)をテストします。 ```bash cd frontend bunx playwright install chromium bun run test:e2e ``` Nuxt開発サーバー(`http://127.0.0.1:3000`)を対象とします。別のインスタンスを対象にする場合は `E2E_BASE_URL` を設定してください。GitHub ActionsではすべてのPRで同じスイートが実行されます。 ### 本番デプロイ ```bash cp .env.example .env # .envを編集 docker compose -f docker-compose.prod.yml up -d --build docker compose -f docker-compose.prod.yml exec backend \ /app/migrate -path /migrations -database "$DATABASE_URL" up ``` 詳細は [getattic.dev](https://getattic.dev) をご覧ください。 ## 技術スタック | コンポーネント | 技術 | |-----------|------------| | バックエンド | Go 1.27、Chiルーター、PostgreSQL | | フロントエンド | Nuxt 4、Nuxt UI 4、Tailwind CSS | | 認証 | ローカルパスワードまたはOIDC/SSO | | ストレージ | S3互換(AWS S3、MinIO、LocalStack) | ## ライセンス MIT