クエリ可能なデジタルガーデンを構築:DockerでSilverBulletをセルフホストする方法

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

散らかったメモの山を超えて

多くの人は、Apple Notes(メモ)やGoogle Keepのようなシンプルなアプリでメモを取り始めます。これらは、メモが500件程度になるまでは完璧に機能します。しかし、ある日突然、半年前の特定の会議録を探すことが苦痛に感じられるようになります。次にNotionやObsidianを試すかもしれません。Notionは強力ですが、独自のクラウドにロックインされており、古いハードウェアでは動作が重く感じられることがよくあります。Obsidianは素晴らしいですが、スマートフォンと仕事用PCの間で同期するには、通常、有料サブスクリプションや技術的な回避策が必要になります。

本当の問題は「どこに書くか」ではなく、「データがどのように保存されるか」にあります。ほとんどのメモは「静的なテキスト」であり、ページ上の死んだ言葉に過ぎません。私たちが求めているのは、メモが「動的なデータ」として機能することです。メモが自動的にタスクリストやプロジェクトのダッシュボードを構築する世界を想像してみてください。これが「デジタルガーデン(Digital Garden)」の核心です。そこは単に情報を保存する場所ではなく、自動化されたクエリを通じて情報がリンクされ、浮き彫りになる空間です。

SilverBulletはこのギャップを埋める存在です。ブラウザで動作するオープンソースの拡張可能なライティングプラットフォームでありながら、データはすべてプレーンなMarkdownファイルとして保存されます。SilverBulletはメモを「オブジェクト」として扱います。つまり、SQLに似た構文を使用してコンテンツをクエリできるのです。私はこのセットアップを数ヶ月間、技術ドキュメントの管理に使用していますが、数千のファイルがあっても動作は非常に軽快です。

なぜSilverBulletを選ぶのか?

SilverBulletはメモを孤立したドキュメントとして扱いません。代わりに「スペース(Spaces)」という概念で動作します。スペースは単なるMarkdownファイルのフォルダですが、SilverBulletはバックグラウンドでそれらにインデックスを貼ります。これにより、多くのエディタでは不安定なプラグインをいくつも入れなければ実現できない機能が解放されます。

  • ライブクエリ言語: 小さなコードブロックを書くだけで、ステータスが「open」で「#bug」タグが付いたすべてのメモを検索し、きれいなテーブルに表示できます。
  • ブラウザベースかつポータブル: Dockerコンテナで動作します。仕事用のノートPC、自宅のPC、あるいは図書館のコンピュータからでも、何もインストールせずに自分のすべての保管庫にアクセスできます。
  • モバイル対応: プログレッシブウェブアプリ(PWA)として機能します。iPhoneやAndroidデバイスに「インストール」でき、ネイティブアプリのようにオフラインでも動作します。
  • 軽量なフットプリント: Dockerイメージは約150MBで、通常の使用メモリは100MB未満です。安価なVPSやRaspberry Piでの運用に最適です。

インストール:Docker Composeでのデプロイ

Dockerが利用可能なサーバーまたはホームラボのマシンが必要です。コンテナを再起動してもデータが消えないよう、永続ボリュームを設定します。

1. フォルダの整理

まず、メモ専用のディレクトリを作成します。これにより、ホストマシンを整理された状態に保てます。

mkdir -p ~/homelab/silverbullet/space
cd ~/homelab/silverbullet

2. Docker Composeの設定

docker-compose.ymlファイルを作成します。公式イメージを使用し、一般的な競合を避けるためにカスタムポートをマッピングします。

services:
  silverbullet:
    image: zefhemel/silverbullet
    container_name: silverbullet
    restart: unless-stopped
    environment:
      - SB_AUTH=admin:your_secure_password # admin:パスワード を自分のものに変更してください
    volumes:
      - ./space:/space
    ports:
      - "3005:3000"

各設定の意味は以下の通りです:

  • SB_AUTH: 基本的なログイン保護を有効にします。admin:your_secure_passwordをすぐに自分の認証情報に変更してください。
  • Volumes: ディスク上の./spaceフォルダをコンテナにリンクします。Markdownファイルはここに保存されます。
  • Ports: ポート3000は他の開発ツールで使われていることが多いため、3005を使用しています。

3. 起動

次のコマンド一つで、新しいデジタルガーデンを起動します:

docker compose up -d

ステータスを確認して、すべてが実行されているか検証します:

docker ps

設定:「思考する」ノート

http://your-ip:3005にアクセスしてログインします。ミニマルなインターフェースが表示されます。本当の魔法は、オブジェクトクエリを使い始めたときに起こります。

メタデータの追加

任意のメモの先頭にYAMLフロントマターを追加します。これにより、プレーンテキストファイルが検索可能なデータポイントに変換されます。

---
tags: project
status: active
priority: 1
owner: "エンジニアリング部門"
--- 
# データベース移行
第3四半期のデータベースアップグレードに関するメモ。

ライブクエリの活用

インデックスページを手動で更新するのはやめましょう。20種類のプロジェクトノートがある場合は、ホームページにクエリブロックを置くだけで済みます。

<!-- #query page where tags = "project" and status = "active" render [[Library/Core/Query/Table]] -->
| 名前 | 優先度 | 担当者 |
| ---- | -------- | ----- |
| [[データベース移行]] | 1 | エンジニアリング部門 |
<!-- /query -->

「project」タグを付けた新しいメモを作成した瞬間に、このテーブルに自動的に表示されます。もはやファイルを管理しているのではなく、生きているデータベースを管理しているのです。

メンテナンスとリモートアクセス

ナレッジベースは、安全でアクセス可能であってこそ価値があります。SilverBulletはフラットなファイルを使用しているため、バックアップ戦略は非常にシンプルです。

ログの監視

クエリの挙動がおかしい場合は、コンテナのログでエラーを確認してください。通常、パーミッションの問題や構文ミスが見つかります。

docker logs -f silverbullet

確実なバックアップ

複雑なデータベースのエクスポートは不要です。すべてが.mdファイルなので、フォルダをZIP圧縮するか、プライベートなGitHubリポジトリに同期するだけです。1,000件のメモがあっても通常は20MB未満なので、バックアップは一瞬で終わります。

# 手動でのクイックバックアップ
tar -czf sb_backup_$(date +%F).tar.gz ~/homelab/silverbullet/space

どこからでもデジタルガーデンにアクセスする

外出先で「第二の脳」を使用するには、Nginx Proxy Managerのようなリバースプロキシや、Tailscaleのようなツールを使用します。プロキシ経由でアクセスする場合は、必ずWebSocketを有効にしてください。SilverBulletはブラウザとサーバーを完全に同期させるためにWebSocketを使用します。

SilverBulletをDockerでホスティングすることで、受動的なメモ取りから卒業できます。ドキュメントは、仕事の進化に合わせて成長し、クエリ可能な資産となります。これは、あなたの知識を今後何年にもわたって有用なものに保つための、安定した、高速で、プライベートな方法です。

Share: