AI

オープンソースWiki・ナレッジベース比較:Outline vs BookStack vs Wiki.js でチームWikiをセルフホストする

オープンソースラボ編集部2026年6月13日

オープンソースWiki・ナレッジベース比較:Outline vs BookStack vs Wiki.js でチームWikiをセルフホストする

ConfluenceやNotionに依存せず、チームのナレッジベースをオープンソースでセルフホストしましょう。Outline・BookStack・Wiki.jsはデータを自社サーバーに完全保持しながら、美しいドキュメント管理プラットフォームを提供します。

チームWikiが必要な場面

  • 社内ドキュメント: 運用手順書・オンボーディング・技術仕様をチームで管理
  • データ主権: 社外秘の技術ドキュメントをクラウドサービスに預けたくない
  • コスト削減: Confluenceは$5.16/ユーザー/月〜、Notionは$10/ユーザー/月〜
  • カスタマイズ: 独自のテーマ・ブランディング・統合を実装
  • エアギャップ: インターネット非接続環境での社内ナレッジ管理

主要ツールの概要

Outline

モダンなUIとMarkdownエディタを持つオープンソースWikiです。GitHubスターが29k+で最も注目されているチームナレッジベースです。リアルタイム共同編集・Slack統合・検索・コレクション(フォルダ)・テンプレート・バックリンクを提供します。

# Outlineをdocker-composeで起動
version: "3"
services:
  redis:
    image: redis
    ports:
      - "6379:6379"

  postgres:
    image: postgres:16
    environment:
      POSTGRES_DB: outline
      POSTGRES_USER: outline
      POSTGRES_PASSWORD: outline_pass
    volumes:
      - postgres_data:/var/lib/postgresql/data

  outline:
    image: outlinewiki/outline:latest
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgres://outline:outline_pass@postgres:5432/outline
      REDIS_URL: redis://redis:6379
      SECRET_KEY: your-secret-key-min-32chars
      UTILS_SECRET: your-utils-secret
      URL: https://wiki.example.com
      PORT: 3000

      # ファイルストレージ(S3互換)
      AWS_ACCESS_KEY_ID: your-access-key
      AWS_SECRET_ACCESS_KEY: your-secret-key
      AWS_REGION: ap-northeast-1
      AWS_S3_UPLOAD_BUCKET_NAME: outline-files
      AWS_S3_UPLOAD_BUCKET_URL: https://outline-files.s3.ap-northeast-1.amazonaws.com

      # 認証(Slack OAuth)
      SLACK_CLIENT_ID: your-slack-client-id
      SLACK_CLIENT_SECRET: your-slack-client-secret

    depends_on:
      - postgres
      - redis

volumes:
  postgres_data:
// Outline REST APIでドキュメントを作成
const BASE_URL = "https://wiki.example.com/api";
const API_TOKEN = "your-api-token";

const headers = {
  "Content-Type": "application/json",
  "Authorization": `Bearer ${API_TOKEN}`,
};

// コレクション(フォルダ)を作成
const collectionResp = await fetch(`${BASE_URL}/collections.create`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    name: "エンジニアリング",
    description: "技術ドキュメントのコレクション",
    color: "#0369A1",
    icon: "✏️",
    permission: "read_write",
  }),
});
const collection = (await collectionResp.json()).data;

// ドキュメントを作成
const docResp = await fetch(`${BASE_URL}/documents.create`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    title: "APIリファレンス",
    text: "# APIリファレンス

## 認証

...",
    collectionId: collection.id,
    publish: true,
  }),
});
const doc = (await docResp.json()).data;
console.log(`Created: ${doc.url}`);

// ドキュメントを検索
const searchResp = await fetch(`${BASE_URL}/documents.search`, {
  method: "POST",
  headers,
  body: JSON.stringify({ query: "デプロイ手順", limit: 10 }),
});
const results = (await searchResp.json()).data;
results.forEach((r) => console.log(`- ${r.document.title}`));
# OutlineのAPIをPythonで使う
import httpx

BASE_URL = "https://wiki.example.com/api"
API_TOKEN = "your-api-token"

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {API_TOKEN}",
}

def get_all_documents(collection_id: str) -> list:
    '''コレクションの全ドキュメントを取得'''
    docs = []
    offset = 0
    while True:
        resp = httpx.post(f"{BASE_URL}/documents.list", headers=headers, json={
            "collectionId": collection_id,
            "limit": 25,
            "offset": offset,
        })
        data = resp.json()["data"]
        if not data:
            break
        docs.extend(data)
        offset += 25
    return docs

def export_as_markdown(doc_id: str) -> str:
    '''ドキュメントをMarkdownでエクスポート'''
    resp = httpx.post(f"{BASE_URL}/documents.export", headers=headers, json={
        "id": doc_id,
    })
    return resp.json()["data"]

BookStack

シンプルな階層構造(棚→本→章→ページ)でドキュメントを管理するWikiです。PHPで実装されており、Wikiの構造が明確で、ページの検索・バージョン管理・権限制御が充実しています。

# BookStackをDockerで起動(docker-compose)
version: '3'
services:
  bookstack:
    image: lscr.io/linuxserver/bookstack:latest
    environment:
      PUID: 1000
      PGID: 1000
      APP_URL: https://wiki.example.com
      DB_HOST: bookstack_db
      DB_PORT: 3306
      DB_USER: bookstack
      DB_PASS: bookstack_pass
      DB_DATABASE: bookstack
    volumes:
      - bookstack_data:/config
    ports:
      - "6875:80"
    depends_on:
      - bookstack_db

  bookstack_db:
    image: lscr.io/linuxserver/mariadb:latest
    environment:
      PUID: 1000
      PGID: 1000
      MYSQL_ROOT_PASSWORD: root_pass
      MYSQL_DATABASE: bookstack
      MYSQL_USER: bookstack
      MYSQL_PASSWORD: bookstack_pass
    volumes:
      - bookstack_db_data:/config

volumes:
  bookstack_data:
  bookstack_db_data:
# BookStack REST APIでページを操作
import httpx

BASE_URL = "https://wiki.example.com/api"
API_TOKEN_ID = "your-token-id"
API_TOKEN_SECRET = "your-token-secret"

headers = {
    "Authorization": f"Token {API_TOKEN_ID}:{API_TOKEN_SECRET}",
    "Content-Type": "application/json",
}

# 本の一覧取得
books = httpx.get(f"{BASE_URL}/books", headers=headers).json()["data"]
for book in books:
    print(f"Book: {book['name']} (ID: {book['id']})")

# ページを作成(Markdown形式)
new_page = httpx.post(f"{BASE_URL}/pages", headers=headers, json={
    "book_id": books[0]["id"],
    "name": "デプロイ手順書",
    "markdown": "# デプロイ手順

## 本番環境へのデプロイ

```bash
npm run build
```",
}).json()
print(f"Created page: {new_page['name']}")

# 全ページを検索
search_results = httpx.get(
    f"{BASE_URL}/search",
    headers=headers,
    params={"query": "デプロイ"},
).json()
for result in search_results["data"]:
    print(f"- {result['name']} ({result['type']})")

Wiki.js

Node.jsで構築された高機能なWikiで、Git連携・多言語対応・多彩な認証・豊富なエディタ(Markdown/WYSIWYG/ドローイング)を提供します。PostgreSQL・MySQL・SQLite・MongoDB・Microsoft SQL Serverに対応します。

# Wiki.jsをdocker-composeで起動
version: "3"
services:
  db:
    image: postgres:16
    environment:
      POSTGRES_DB: wiki
      POSTGRES_USER: wikijs
      POSTGRES_PASSWORD: wikijs_pass
    volumes:
      - db_data:/var/lib/postgresql/data

  wiki:
    image: requarks/wiki:2
    depends_on:
      - db
    ports:
      - "3000:3000"
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: wikijs_pass
      DB_NAME: wiki

volumes:
  db_data:
# Wiki.js GraphQL APIでページを操作
mutation CreatePage {
  pages {
    create(
      content: "# はじめに

Wiki.jsのAPIでページを作成しました。"
      description: "APIで作成したページ"
      editor: "markdown"
      isPrivate: false
      isPublished: true
      locale: "ja"
      path: "engineering/api-reference"
      tags: ["api", "engineering"]
      title: "APIリファレンス"
    ) {
      responseResult {
        succeeded
        errorCode
        message
      }
      page {
        id
        path
        title
      }
    }
  }
}
// Wiki.js GraphQL APIをJavaScriptで使う
const WIKI_URL = "https://wiki.example.com";
const API_TOKEN = "your-api-token";

async function queryWiki(query, variables = {}) {
  const resp = await fetch(`${WIKI_URL}/graphql`, {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Authorization": `Bearer ${API_TOKEN}`,
    },
    body: JSON.stringify({ query, variables }),
  });
  return resp.json();
}

// ページ一覧取得
const pages = await queryWiki(`
  query {
    pages {
      list(orderBy: TITLE) {
        id path title description updatedAt
      }
    }
  }
`);

// Gitリポジトリのコミットごとに同期
const syncResult = await queryWiki(`
  mutation {
    storage {
      syncAllTargets {
        responseResult { succeeded message }
      }
    }
  }
`);

機能比較表

比較項目OutlineBookStackWiki.js
エディタMarkdown + リッチテキストWYSIWYG / Markdown / HTMLMarkdown / WYSIWYG / Draw.io
共同編集✅ リアルタイム
検索✅ 全文検索
Git連携
バックリンク
コレクション/階層コレクション棚→本→章→ページフォルダ
テンプレート
Slack統合
SSO(SAML/OIDC)
APIの質✅ REST✅ REST✅ GraphQL
多言語対応✅ 日本語
バックアップS3エクスポートmysqldumpGit / FS
実装言語TypeScript(Node.js)PHP(Laravel)Node.js
ライセンスBSL 1.1MITAGPL 3.0
GitHub Stars29k+15k+24k+

ナレッジ管理・ドキュメントツールはknowledgeカテゴリ(/categories/knowledge)で一覧でき、チームコミュニケーションツールはcommunicationカテゴリ(/categories/communication)でも探せます。

FAQ

Q. OutlineはConfluenceの代替になりますか?

A. スタートアップ〜中規模チームのドキュメント管理用途では十分代替できます。Outlineが現在Confluenceに劣る点: Jira・Trelloとの深いネイティブ統合(Confluenceはアトラシアン製品と緊密に連携)・マクロ・テンプレートの豊富さ・エンタープライズ向けのコンプライアンス機能。しかし、ConfluenceがCloud基本プランで$5.16/ユーザー/月〜かかるのに対し、OutlineはOSS版なら無料(ホスティングコストのみ)です。SlackをOIDCプロバイダーとして使う場合、Outlineの認証設定は非常にシンプルです。

Q. Wiki.jsのGit連携はどう動きますか?

A. Wiki.jsはストレージプロバイダーとしてGitHubやGitLabを設定できます。設定すると: ページの保存時に自動的にGitリポジトリにコミット→プッシュ、GitリポジトリのMarkdownファイルを変更すると自動的にWiki.jsに反映、複数の環境間でWikiを同期できます。PRを使ったドキュメントレビューやgit blameでの変更履歴追跡ができるため、開発チームのドキュメントワークフローに自然に統合されます。

Q. BookStackは大規模なドキュメントに向いていますか?

A. BookStackの4階層構造(棚→本→章→ページ)は大規模ドキュメントの整理に適しています。ただしページ数が数千を超えると全文検索のパフォーマンスが低下する場合があります。本番環境では: MariaDB/MySQLの全文検索インデックスを有効化、Redis/Memcachedでキャッシュ、十分なRAM(2GB以上推奨)が必要です。OutlineやWiki.jsと比べてUIがシンプルなため、技術者以外のスタッフにも教えやすい利点があります。

Q. Confluenceからのデータ移行はできますか?

A. OutlineはConfluenceのエクスポート(HTMLやXML形式)を取り込む機能を提供しています。完全な移行ガイドは公式ドキュメントにあります。BookStackもConfluenceのHTMLエクスポートをインポートできます。Wiki.jsはMarkdownファイルをGit経由で直接インポートできます。移行前にConfluenceからPDFやWordではなくHTML/Markdown形式でエクスポートすることが重要です。

まとめ

ユースケース推奨ツール
モダンUI・リアルタイム共同編集Outline
シンプル・非技術者も使いやすいBookStack
Git連携・バックアップWiki.js
Confluence代替Outline

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。