---
title: "ドキュメントサイトのデプロイメント"
description: "nibiru-framework.comの本番デプロイメントは、jwilder/nginx-proxyと独自のOllamaを使用してneuronetz.aiで行います。"
---

このページでは、ドキュメントサイトがプロダクションでデプロイされる方法について説明します。セットアップは、**jwilder/nginx-proxy** を使用して自動的に Docker コンテナのルーティングを行うこと、**letsencrypt-nginx-proxy-companion** を使用して HTTPS を提供すること、および **あなたの Ollama at api.neuronetz.ai** を使用して Oracle バックエンドを提供することを含んでいます。有料の LLM API キーは不要です。

## トポロジー
```
                     Internet
                        │
                        ▼
            ┌──────────────────────┐
            │ jwilder/nginx-proxy  │  ← reverse proxy on :80 / :443
            │ (network: nginx-proxy)│    terminates TLS
            └──────────┬───────────┘
                       │ http://nibiru-docs:4321
                       ▼
            ┌──────────────────────┐         ┌──────────────────────┐
            │ nibiru-docs          │ ──────▶ │ api.neuronetz.ai     │
            │ Astro Node SSR :4321 │ HTTPS   │ Ollama (5× GPU)      │
            │ Oracle endpoint      │         │ qwen2.5-coder:14b    │
            └──────────────────────┘         │ nomic-embed-text     │
                                             └──────────────────────┘
```
## ホストの前提条件
```bash
# 1) Create the shared external network (one time)
docker network create nginx-proxy

# 2) Run nginx-proxy + acme-companion (one time)
#    See https://github.com/nginx-proxy/nginx-proxy for the canonical compose.

# 3) Pull the Oracle's models on neuronetz.ai (one time)
curl https://api.neuronetz.ai/api/pull -d '{"name":"qwen2.5-coder:14b"}'
curl https://api.neuronetz.ai/api/pull -d '{"name":"nomic-embed-text"}'
```
## `docs/` 内のファイル

| ファイル | 機能 |
|---|---|
| `Dockerfile` | 多段階ビルド: neuronetz.ai に対して Oracle インデックスを構築し、Astro を構築し、開発依存関係を削減します。 |
| `docker-compose.yml` | 生産 — `VIRTUAL_HOST=nibiru-framework.com`、nginx-proxy ネットワークに参加しています。 |
| `docker-compose.local.yml` | ローカルテストオーバーライド — `4321:4321` を公開し、nginx-proxy 環境変数を削除します。 |
| `.dockerignore` | `node_modules`、`.git` などの構築コンテキストから除外します。 |
| `.env.example` | テンプレート — neuronetz.ai の Ollama をデフォルトにし、API キーは不要です。 |

## 起動する
```bash
cd docs
cp .env.example .env
# defaults are fine for production unless you want to override the Ollama URL or models

docker compose up -d --build
```
最初のビルドでは、`build-oracle-index.mjs` がドキュメントを Ollama に埋め込みます。その後の再構築は高速です — Docker が依存関係層をキャッシュし、変更されたチャンクのみを再埋め込みします。

約30秒後、jwilder/nginx-proxy が新しいコンテナを検出し、Let's Encrypt の証明書をリクエストし、`https://nibiru-framework.com` → `:4321` へのルーティングを行います。

## 確認
```bash
curl -s https://nibiru-framework.com/api/oracle | jq
# {
#   "status": "ok",
#   "llm":   { "provider": "ollama", "model": "qwen2.5-coder:14b", … },
#   "embed": { "provider": "ollama", "model": "nomic-embed-text", … },
#   "index": { "present": true, "chunks": 177, … }
# }
```
ブラウザでサイトを開き、アマバー色のOracleランチャーをクリックし、質問してください。

## ドキュメント変更後の更新
```bash
git pull
docker compose up -d --build
```
ビルドは最新のコンテンツに対してOracleインデックスを再実行します；新しいコンテナが`:4321`で開始されます；jwilderはアップストリームをスワップし、古いコンテナを停止します — 任意のダウンタイムはありません。

## 環境変数

| 変数 | デフォルト | 使用場所 | 機能 |
|---|---|---|---|
| `LLM_PROVIDER` | `ollama` | 実行時 | `ollama`（デフォルト）または `anthropic`。 |
| `OLLAMA_BASE_URL` | `https://api.neuronetz.ai` | ビルド + 実行時 | Ollama に到達するための場所。 |
| `OLLAMA_CHAT_MODEL` | `qwen2.5-coder:14b` | 実行時 | チャット完了モデル。 |
| `OLLAMA_EMBED_MODEL` | `nomic-embed-text` | ビルド + 実行時 | 埋め込みモデル。 |
| `EMBED_PROVIDER` | `ollama` | ビルド + 実行時 | `ollama` または `openai`。 |
| `ANTHROPIC_API_KEY` | — | 実行時 | `LLM_PROVIDER=anthropic` の場合のみ使用されます。 |
| `ANTHROPIC_MODEL` | `claude-haiku-4-5-20251001` | 実行時 | Claude モデルを上書きします。 |
| `OPENAI_API_KEY` | — | ビルド + 実行時 | `EMBED_PROVIDER=openai` の場合のみ使用されます。 |
| `ORACLE_TOP_K` | `6` | 実行時 | Oracle 応答ごとに注入されるチャンク数。 |
| `LETSENCRYPT_EMAIL` | `stephan.kasdorf@bittomine.com` | letsencrypt | Let's Encrypt が期限切れ通知を送る場所。 |
| `VIRTUAL_HOST` | `nibiru-framework.com,www.nibiru-framework.com` | nginx-proxy | compose で設定します。 |

## トラブルシューティング

**`502 Bad Gateway`.** 上流コンテナが起動に失敗しました。`docker logs nibiru-docs` を確認してください — おそらく `dist/server/entry.mjs` にビルドアーティファクトがない可能性があります。

**証明書が発行されていません。** Let's Encrypt は激しくレート制限を行っています。原因については `docker logs letsencrypt-nginx-proxy-companion` を確認してください。

**Oracleは引用せずに回答します。** エンベディングインデックスが空です。`nomic-embed-text`がOllamaで取得されていないか、ビルドがneuronetz.aiに到達できなかった可能性があります。モデルを再度取得してください：```bash
curl https://api.neuronetz.ai/api/pull -d '{"name":"nomic-embed-text"}'
docker compose up -d --build
```
**Oracle は「Oracle が回答することができませんでした」を返しました。** チャットモデルが取得されていることを確認してください：```bash
curl https://api.neuronetz.ai/api/tags | jq '.models[].name'
```
**Claudeにフォールバックしたい場合** `LLM_PROVIDER=anthropic` と `ANTHROPIC_API_KEY` を `.env` ファイルに設定し、その後 `docker compose up -d` を実行します。

## リソース使用率

| | 待機中 | Oracle ロード下 |
|---|---|---|
| RAM | 約 120 MB | 約 200 MB |
| CPU | < 0.5% | 約 5% |
| ネットワーク | 最小限 | 問題ごとに 1 回の HTTPS 待ち時間 |
| ディスク | 約 60 MB の画像 + 約 5 MB のインデックス | コーパスエクスポートに加えて |

1 GB / 1 vCPU のドロップレットは、ドキュメントサイトを快適に処理しつつ他のサービスも一緒に扱います。重い作業（LLM 推論）は、ドキュメントコンテナではなく、あなたの GPU クラスターで行われます。
