
TenHub は「学びの断片を、知識の資産へ変える」をコンセプトとした技術ナレッジベースです。Go マイクロサービス + Next.js で構築し、AI(RAG)による記事検索・質問応答機能を備えています。
開発のきっかけ
AIの進化が速い時代だからこそ、技術を実際に試し、検証し、学んだことをナレッジベースとして体系的に整理していきたいと思いました。AIを活用しながらも、設計・実装・運用まで一貫して自分で判断できる力を身につけるためのプロダクトとして作っています。
「どう作るか」を考える過程そのものが学びになるし、実際に動くものとして公開することで、設計判断やトレードオフを自分の言葉で説明できるようになります。
開発体制
- 期間: 2025年4月20日〜(約3週間で初期リリース、継続的に機能追加中)
- 体制: 個人開発(UI 実装など一部で AI コード生成を活用)
- 本番環境: Tencent Cloud Lighthouse(2 vCPU / 4GB RAM)で公開運用中
AI 活用について: 設計・アーキテクチャの判断は自分で行い、UI コンポーネントなど一部の実装で AI コード生成を活用しています。AI が生成したコードは、変更範囲の把握と動作の正確性を自分で確認した上で採用しています。
技術選定
各技術は「このプロダクトに最適かどうか」を基準に選定しました。
| 技術 | 選定理由 |
|---|---|
| Go | 軽量なバイナリ、goroutine による並行処理、マイクロサービスとの相性が良い |
| gRPC + Protocol Buffers | サービス間通信を .proto で厳密に定義し、型安全なコード生成で実装のブレを防ぐ |
| MySQL 8 | 信頼性の高い RDBMS。UTF8MB4 で日本語を含むマルチバイト文字を正しく扱える |
| Redis | CQRS の読み取り側キャッシュとして、ミリ秒単位のレスポンスを実現する |
| Next.js 16 + React 19 | SSR / SSG の使い分け、App Router でページ単位の最適化ができる |
| Docker Compose | 6つのサービス + DB + キャッシュを、ローカルでも本番でも同じ構成で動かせる |
| Ollama | 外部 API に依存せず、手元で LLM を動かして RAG を実現。コストゼロで実験できる |
認証(JWT RS256)、検索エンジン(BM25 / Vector / Hybrid)、ナレッジグラフなどは SaaS を使わず自前で実装しています。ライブラリの裏側で何が起きているかを理解した上で使うことを重視しました。
アーキテクチャ概要
マイクロサービスアーキテクチャを採用し、各サービスは gRPC で通信します。
サービス構成
ブラウザ → nginx(SSL/レート制限)→ Gateway(REST ↔ gRPC)
├── Auth (認証・JWT発行)
├── Wiki (記事CRUD・CQRS)
├── Profile (プロフィール管理)
└── AI (RAG・Agent・グラフ)
| サービス | 役割 | 主な技術 |
|---|---|---|
| Gateway | REST ↔ gRPC 変換、認証ミドルウェア | Go, gorilla/mux |
| Auth | ユーザー登録・ログイン、JWT RS256 認証 | Go, JWT, bcrypt |
| Wiki | 記事 CRUD、CQRS(MySQL 書き込み / Redis 読み取り) | Go, MySQL, Redis |
| Profile | プロフィール・ポートフォリオ管理 | Go, MySQL |
| AI | RAG 検索、ナレッジグラフ、ReAct Agent | Go, Ollama, Embedding |
| MCP | Model Context Protocol 連携 | TypeScript |
インフラ構成
- MySQL 8 — メインデータベース(UTF8MB4)
- Redis 7 — CQRS 読み取りキャッシュ
- SearXNG — Web 検索エンジン(Agent モード用)
- Ollama — ローカル LLM 推論(qwen3:0.6b)
- nginx — リバースプロキシ、SSL 終端、レート制限、fail2ban
- Docker Compose — 全サービスのオーケストレーション
主な機能
Wiki
- 記事の作成・編集・削除(Markdown 対応)
- カテゴリによる階層分類
- 「いいね」・「保存」機能(フィンガープリントベースで未ログインでも利用可能)
- OGP 画像の自動生成
AI チャット
- RAG モード: Wiki 記事を検索して、その内容に基づいて回答を生成
- Agent モード: AI が自律的にツール(Wiki 検索・記事読み取り・Web 検索)を選択・実行
- 4種類の検索エンジン: BM25 / Vector / Hybrid / Graph
ナレッジグラフ
- 記事からエンティティ(技術用語)と関係性を LLM で自動抽出
- D3.js によるインタラクティブなグラフ可視化
- グラフ探索による関連記事の発見
管理ダッシュボード
- 記事・カテゴリ・プロフィール・プロジェクトの管理
- アクセス分析(ページビュー・ランキング)
- Docker ログのリアルタイム監視
その他
- ダークモード対応
- レスポンシブデザイン
設計上のこだわり
- Proto-first 開発:
.protoファイルでサービス間の契約を先に定義し、Go / TypeScript のコードを自動生成。後から仕様がブレない - CQRS: 書き込み(MySQL)と読み取り(Redis)を分離し、読み取り性能を最適化
- JWT RS256 + Gateway認証: Auth サービスが秘密鍵で署名した JWT を、Gateway が公開鍵で検証。認証を Gateway に集約することで、内部サービスは認証ロジックを持たずに済む
- 差分更新: ナレッジグラフ・ベクトル埋め込みを JSON に永続化し、差分のみ再計算。サーバー再起動時の API 呼び出しを最小化
- 自前実装: 検索エンジン(BM25 / TF-IDF / Vector / Hybrid)、トークナイザー、ReAct Agent をすべて Go で実装し、仕組みを理解した上で使う
- 限られたリソースでの RAG 最適化: 2 vCPU / 4GB RAM の環境で LLM を動かすため、0.6B パラメータの軽量モデルを採用。モデル性能の制約は、検索エンジン側でのコンテキスト精度を高めることで補っている(Hybrid 検索による関連記事の絞り込み、閾値チューニング、差分更新による応答速度の改善)
技術スタック一覧
バックエンド
Go / gRPC / Protocol Buffers / MySQL 8 / Redis 7 / JWT RS256 / Goose(マイグレーション) / slog(構造化ログ)
フロントエンド
Next.js 16 / React 19 / TypeScript / TailwindCSS / D3.js / Motion / React Markdown / Highlight.js
インフラ・DevOps
Docker / Docker Compose / nginx / Let's Encrypt / fail2ban / Nix / GitHub Actions
今後の展望
プロダクトの進化
- 監視・可観測性: Prometheus + Grafana によるメトリクス監視の導入
- テスト拡充: ユニットテスト・統合テストのカバレッジ向上
- LLM 推論の高速化: 外部 GPU サーバー(Oracle Cloud ARM 等)を活用し、より大きなモデルでの推論を検討
- Kubernetes: スケーリングが必要になった段階で、Docker Compose から k8s への移行にも挑戦したい
AI 機能の拡張
- マルチエージェント対応: 検索・要約・提案など、役割を分担する複数エージェントの協調動作
- API Key 認証の追加: 外部の AI エージェントやツールから TenHub のナレッジを検索可能にする
- 関連記事の自動提案: 閲覧中の記事に関連するコンテンツをナレッジグラフから自動で表示
プロダクトとしての展開
- セルフホスト版:
docker compose upだけで立ち上がるパッケージとして整備し、チームや企業が自社環境で使える社内ナレッジベースとして配布する - SaaS 化: マルチテナント対応を実装し、ホスティングサービスとして提供する。個人の技術メモから、チームのナレッジ共有基盤まで対応できる形を目指す
TenHub の RAG + ナレッジグラフは、AI エージェントが「記憶」として活用する知識基盤です。エージェントが SaaS を置き換える時代でも、構造化された知識の蓄積と検索はむしろ需要が増えると考えています。