もっと簡単な方法をお探しですか? デスクトップインストーラーを使えば、ワンクリックで自動構成のデプロイが可能です。コマンドラインは不要です!
前提条件
始める前に、システムに以下がインストールされていることを確認してください:- Docker Engine (20.10.0 以上)
- Docker Compose (v2.0.0 以上)
- OpenSSL (SSL 証明書の生成用)
Docker のインストール
macOS の場合:
- Docker Hub から Docker Desktop をダウンロードしてインストールします
- インストールウィザードに従います
- インストールを確認します:
docker --version
docker compose --version
Linux (Ubuntu/Debian) の場合:
# パッケージインデックスを更新
sudo apt-get update
# 前提パッケージをインストール
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# Docker の公式 GPG キーを追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 安定版リポジトリを設定
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Docker Engine をインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# ユーザーを docker グループに追加
sudo usermod -aG docker $USER
Windows の場合:
- Docker Hub から Docker Desktop をダウンロードしてインストールします
- Docker のドキュメントに従って WSL 2 を有効にします
- インストールウィザードに従います
- PowerShell でインストールを確認します:
docker --version
docker compose --version
ステップ 1: プロジェクトディレクトリの作成
CaseBender のデプロイ用に新しいディレクトリを作成し、そこに移動します:mkdir casebender-deployment
cd casebender-deployment
ステップ 2: 環境変数の設定
以下の内容で.env ファイルを作成します:
# 認証
AUTH_SECRET="B7OawnWf6+LwB/9yXbxbk4ppZ1khydqj4qc9k9g3nnE="
AUTH_SALT="B7OawnW"
AUTH_TRUST_HOST=true
NEXTAUTH_URL=https://local.casebender.com
NEXTAPP_URL=https://local.casebender.com
# ライセンス
# 初回起動時にアプリが Community ライセンスを自動生成します。再起動後もライセンスが
# 維持されるよう、安定したキーを設定してください。
# 次のコマンドで生成できます: openssl rand -hex 32
LICENSE_SECRET_KEY=openssl-rand-hex-32-の出力に置き換えてください
# Liveblocks の設定 (リアルタイムコラボレーション)
LIVEBLOCKS_SECRET_KEY=sk_dev_HaIczPV4gPit5_gx7YRsNXLGJNzBE5wQ8z8I1H8ft3ZPZHVrfH2ryJJ586ezHYla
# データベースの設定 (ホストは内部サービス "db")
POSTGRES_PASSWORD=88AlwaysTimeToWin88
POSTGRES_PRISMA_URL="postgresql://superadmin:88AlwaysTimeToWin88@db:5432/casebender?schema=public"
POSTGRES_URL="postgresql://superadmin:88AlwaysTimeToWin88@db:5432/casebender?schema=public"
POSTGRES_URL_NON_POOLING="postgresql://superadmin:88AlwaysTimeToWin88@db:5432/casebender?schema=public"
# Redis の設定
REDIS_URL="redis://redis:6379"
CaseBender は複数のコンテナとして実行されます: Web アプリ (
app)、REST API ゲートウェイ
(api)、アラート取り込みゲートウェイ (ingestion、Microsoft Defender などの統合 Webhook を
受信します)、バックグラウンドの worker、そして workflow と MISP プロセッサーです。
Nginx が前面に立ち、適切なサービスへトラフィックをルーティングします。これらはすべて以下の
Compose ファイルに含まれています。ステップ 3: SSL 証明書の生成
ローカル開発用に、自己署名 SSL 証明書を生成します:# SSL 証明書とキーを生成
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout local-casebender.key \
-out local-casebender.crt \
-subj "/CN=local.casebender.com/O=CaseBender/C=US"
# 証明書を確認
openssl x509 -in local-casebender.crt -text -noout
ステップ 4: Nginx の設定
以下の内容でnginx.conf を作成します:
events {
worker_connections 1024;
}
http {
# ─── アップストリーム ──────────────────────────────────────
upstream web_app {
server app:3000;
}
upstream api_service {
server api:3005;
}
upstream ingestion_service {
server ingestion:3003;
}
# ─── レート制限 ────────────────────────────────────────────
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;
limit_req_zone $binary_remote_addr zone=ingest_limit:10m rate=1000r/s;
# ─── HTTP -> HTTPS リダイレクト ────────────────────────────
server {
listen 80;
server_name local.casebender.com;
return 301 https://$server_name$request_uri;
}
# ─── メイン HTTPS サーバー ─────────────────────────────────
server {
listen 443 ssl;
http2 on;
server_name local.casebender.com;
ssl_certificate /etc/nginx/certs/local-casebender.crt;
ssl_certificate_key /etc/nginx/certs/local-casebender.key;
ssl_protocols TLSv1.2 TLSv1.3;
client_max_body_size 100M;
# ─── セキュリティヘッダー ─────────────────────────────
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# ─── 取り込み API (統合 Webhook) ──────────────────────
location /api/v1/ingest/ {
limit_req zone=ingest_limit burst=500 nodelay;
proxy_pass http://ingestion_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# レガシー取り込みルート
location /api/ingest/ {
limit_req zone=ingest_limit burst=500 nodelay;
proxy_pass http://ingestion_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# ─── REST API ゲートウェイ ────────────────────────────
location /api/v1/ {
limit_req zone=api_limit burst=50 nodelay;
proxy_pass http://api_service;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /api/openapi.json {
proxy_pass http://api_service;
proxy_set_header Host $host;
}
# ─── ヘルスチェック ───────────────────────────────────
location /health {
access_log off;
return 200 "healthy";
add_header Content-Type text/plain;
}
# ─── Web アプリケーション (キャッチオール) ────────────
location / {
proxy_pass http://web_app;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
# WebSocket サポート
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}
}
ステップ 5: Docker Compose 設定の作成
以下の内容でdocker-compose.yml を作成します:
services:
# ─── コアサービス ────────────────────────────────────────────
app:
image: casebender/casebender:latest
platform: linux/amd64
ports:
- "3000:3000"
environment:
- AUTH_SECRET=${AUTH_SECRET}
- AUTH_SALT=${AUTH_SALT}
- AUTH_TRUST_HOST=true
- NEXTAUTH_URL=${NEXTAUTH_URL:-https://local.casebender.com}
- NEXTAPP_URL=${NEXTAPP_URL:-https://local.casebender.com}
- LICENSE_SECRET_KEY=${LICENSE_SECRET_KEY}
- LIVEBLOCKS_SECRET_KEY=${LIVEBLOCKS_SECRET_KEY}
- POSTGRES_PRISMA_URL=${POSTGRES_PRISMA_URL}
- POSTGRES_URL=${POSTGRES_URL}
- POSTGRES_URL_NON_POOLING=${POSTGRES_URL_NON_POOLING}
- REDIS_URL=${REDIS_URL:-redis://redis:6379}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "node -e \"require('http').get('http://localhost:3000/api/health', (r) => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))\""]
interval: 10s
timeout: 5s
retries: 5
start_period: 60s
api:
image: casebender/api:latest
platform: linux/amd64
ports:
- "3005:3005"
environment:
- PORT=3005
- POSTGRES_PRISMA_URL=${POSTGRES_PRISMA_URL}
- POSTGRES_URL=${POSTGRES_URL}
- POSTGRES_URL_NON_POOLING=${POSTGRES_URL_NON_POOLING}
- REDIS_URL=${REDIS_URL:-redis://redis:6379}
- AUTH_SECRET=${AUTH_SECRET}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
ingestion:
image: casebender/ingestion:latest
platform: linux/amd64
ports:
- "3003:3003"
environment:
- PORT=3003
- POSTGRES_PRISMA_URL=${POSTGRES_PRISMA_URL}
- POSTGRES_URL=${POSTGRES_URL}
- POSTGRES_URL_NON_POOLING=${POSTGRES_URL_NON_POOLING}
- REDIS_URL=${REDIS_URL:-redis://redis:6379}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
# ─── 処理サービス ────────────────────────────────────────────
worker:
image: casebender/worker:latest
platform: linux/amd64
ports:
- "3002:3002"
environment:
- PORT=3002
- POSTGRES_PRISMA_URL=${POSTGRES_PRISMA_URL}
- POSTGRES_URL=${POSTGRES_URL}
- POSTGRES_URL_NON_POOLING=${POSTGRES_URL_NON_POOLING}
- REDIS_URL=${REDIS_URL:-redis://redis:6379}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
restart: unless-stopped
workflow-processor:
image: casebender/workflow-processor:latest
platform: linux/amd64
ports:
- "3001:3001"
environment:
- POSTGRES_PRISMA_URL=${POSTGRES_PRISMA_URL}
- POSTGRES_URL=${POSTGRES_URL}
- POSTGRES_URL_NON_POOLING=${POSTGRES_URL_NON_POOLING}
- REDIS_URL=${REDIS_URL:-redis://redis:6379}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
app:
condition: service_healthy
restart: unless-stopped
misp-processor:
image: casebender/misp-processor:latest
platform: linux/amd64
ports:
- "3004:3004"
environment:
- PORT=3004
- POSTGRES_PRISMA_URL=${POSTGRES_PRISMA_URL}
- POSTGRES_URL=${POSTGRES_URL}
- POSTGRES_URL_NON_POOLING=${POSTGRES_URL_NON_POOLING}
- REDIS_URL=${REDIS_URL:-redis://redis:6379}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
app:
condition: service_healthy
restart: unless-stopped
# ─── インフラストラクチャ ────────────────────────────────────
db:
image: postgres:17
environment:
POSTGRES_USER: superadmin
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-88AlwaysTimeToWin88}
POSTGRES_DB: casebender
ports:
- "5433:5432"
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U superadmin -d casebender"]
interval: 5s
timeout: 5s
retries: 10
start_period: 30s
restart: unless-stopped
redis:
image: redis:7.2-alpine
command: redis-server --protected-mode no
ports:
- "6379:6379"
volumes:
- redis_data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
restart: unless-stopped
minio:
image: quay.io/minio/minio
mem_limit: 512m
command: ["minio", "server", "/data", "--console-address", ":9090"]
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
ports:
- "9090:9090"
- "9000:9000"
volumes:
- "miniodata:/data"
restart: unless-stopped
# ─── リバースプロキシ ────────────────────────────────────────
nginx:
image: nginx:alpine
ports:
- "443:443"
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./local-casebender.crt:/etc/nginx/certs/local-casebender.crt:ro
- ./local-casebender.key:/etc/nginx/certs/local-casebender.key:ro
depends_on:
app:
condition: service_healthy
restart: unless-stopped
volumes:
miniodata:
pgdata:
redis_data:
エンタープライズ検索 (OpenSearch) が必要ですか? デスクトップインストーラーは
search-sync、
opensearch、opensearch-dashboards の各サービスを追加できます。ほとんどのローカル評価では、
上記の PostgreSQL ベースの検索で十分です。ステップ 6: ローカル DNS の設定
hosts ファイルに次のエントリを追加します:macOS と Linux の場合:
sudo echo "127.0.0.1 local.casebender.com" >> /etc/hosts
Windows の場合:
C:\Windows\System32\drivers\etc\hosts に次の行を追加します:
127.0.0.1 local.casebender.com
ステップ 7: アプリケーションの起動
- 必要なイメージをプルします:
docker compose pull
- すべてのサービスを起動します:
docker compose up -d
- ログを監視します:
docker compose logs -f
https://local.casebender.comでアプリケーションにアクセスします
デフォルトのログイン認証情報
CaseBender をデプロイした後、以下のデフォルト認証情報でログインできます:ユーザー名: admin@casebender.app
パスワード: secret1234
セキュリティ上の理由から、初回ログイン後はこれらのデフォルト認証情報を直ちに変更することを強く推奨します。
トラブルシューティング
よくある問題
-
証明書の警告:
- 自己署名証明書を使用しているため、ブラウザにセキュリティ警告が表示されます
- 「詳細設定」をクリックして Web サイトに進みます
- 開発目的では、これは想定内であり安全です
-
ポートの競合:
- ポート 80、443、3000、3001、3002、3003、3004、3005、5433、6379、9000、9090 が使用されていないことを確認します
- 必要に応じて、docker-compose.yml のポートマッピングを変更します
-
データベース接続:
- PostgreSQL のログを確認します:
docker compose logs db - .env のデータベース認証情報を確認します
- データベースが実行中であることを確認します:
docker compose ps db
- PostgreSQL のログを確認します:
-
サービスの依存関係:
- サービスが起動しない場合は、依存関係を確認します:
docker compose ps docker compose logs [サービス名]
ログの確認
特定のサービスのログを表示します:# すべてのサービス
docker compose logs
# 特定のサービス
docker compose logs [サービス名]
# ログを追従
docker compose logs -f [サービス名]
サービスの管理
# 特定のサービスを再起動
docker compose restart [サービス名]
# すべてのサービスを停止
docker compose down
# ボリュームを削除 (すべてのデータが削除されます)
docker compose down -v
次のステップ
CaseBender がローカルで動作するようになったので、次のことを行うとよいでしょう:本番環境へのデプロイ
CaseBender を本番環境にデプロイします
構成
高度な構成オプションについて学びます