🧩 BookStackでタイトルのみのページを一括作成する(API利用)
🧭 はじめに
この手順書は、BookStack上に「タイトルのみの空ページ」をまとめて作成するための実務向けガイドである。 天文学史ノートのように、先に構造(ページ枠)を一気に用意し、内容は後から埋める運用を前提としている。
🎯 この手順でできること
- 指定したChapter配下に 「意味だけを持つタイトル」のページを一括生成
- ページ順はBookStackのUIで自由に並び替え可能
- 本文は後から編集(最初は空に近い状態)
- BookStackの履歴・権限・URL構造を正しく維持
構造を壊さず、将来の挿入・削除に強いノート基盤を一気に用意できる。
🧱 前提条件
🔑 必須条件
-
BookStackがAPI対応バージョン(v0.27以降)
-
管理者権限ユーザー
-
対象の
- Bookshelf
- Book
- Chapter が事前に作成済み
ページは必ずChapter配下に作成する。
Book直下に作ると、後から構造整理が煩雑になる。
📐 タイトル設計の原則(重要)
🚫 数値プレフィックスを付けない
-
Chapter / Page は本の中で自由にソート可能
-
タイトルに番号を含めると:
- 挿入・削除時に欠番や重複が発生
- 分割時にタイトルが不自然になる
章・記事タイトルに番号を入れてはいけない。
それは将来の編集コストを確実に増やす。
✅ 正しい役割分担
- 順序管理:BookStackのUI(ドラッグ&ドロップ)
- 意味表現:タイトル文字列そのもの
順序はUI、意味はタイトル。
🔐 APIトークンの準備(初回のみ)
手順
-
BookStack管理画面にログイン
-
Users → 自分のユーザー
-
API Tokens セクションで新規トークン作成
-
以下を控える:
- Token ID
- Token Secret
Token Secretは二度と表示されない。
必ず安全な場所に保存する。
🧠 実装方針(なぜAPIを使うか)
BookStackは以下を内部で連動管理している:
- pages
- revisions
- permissions
- activity_log
DBを直接書き換えてはいけない。
履歴破損・権限不整合・アップデート不能の原因になる。
→ 公式APIを使うのが唯一の安全ルート。
🛠️ 実装手順(bash + curl)
① Chapter IDを確認する
- BookStackにログインした状態で、F12で開発ツールを開く
- Consoleタブを開き、プロンプトに下記のJavaScriptを貼り付ける
fetch('/api/chapters', {
headers: {
'Accept': 'application/json'
}
}).then(r => r.json()).then(console.log)
- JSONが下記のように出力されるので当該ChapterのIDをメモしておく
[
{
"id": 1,
"slug": "aws-lightsailbookstack",
"name": "AWS LightsailにBookStackをセットアップする",
"description": "",
"priority": 2,
"book_id": 2,
"created_at": "2025-05-11T08:56:49.000000Z",
"updated_at": "2025-05-11T08:56:49.000000Z",
"owned_by": 6,
"book_slug": "fc221",
"created_by": 6,
"updated_by": 6
},
:
{
"data": [
{
:
},
{
"id": 35,
"slug": "74071",
"name": "時系列",
"description": "",
"priority": 3,
"book_id": 109,
"created_at": "2025-12-30T06:45:35.000000Z",
"updated_at": "2025-12-30T06:45:35.000000Z",
"owned_by": 6,
"book_slug": "061",
"created_by": 6,
"updated_by": 6
}
]
}
② 作成するページタイトル一覧を定義(番号なし)
titles=(
"天文学とは何か"
"天文学史をどう見るか"
"先史・古代文明の天文学"
"メソポタミア・エジプト天文学"
"ギリシャ天文学"
"中国天文学"
"インド・イスラーム天文学"
"中世ヨーロッパの宇宙観"
"観測精度の限界と停滞"
"地動説の登場"
"観測革命"
"物理法則の導入"
"万有引力と宇宙"
"望遠鏡の進化"
"分光学と恒星の正体"
"恒星の進化と分類"
"銀河の発見"
"相対論と宇宙"
"ビッグバン宇宙論"
"現代の観測技術"
"系外惑星と生命探査"
)
タイトルは内容の意味のみを表し、順序は持たせない。
③ API接続情報とバッチ処理をまとめて定義する
この手順では、BookStack APIに接続し、ページを一括作成するための実行用スクリプトを1つ作成する。 API接続情報は環境ファイルではなく、このスクリプト内で完結させる。
📁 作業用スクリプトを作成する
まず、任意の作業ディレクトリでスクリプトファイルを作成する。
touch create_pages.sh
このファイルが「設定」と「処理」の両方を持つ。
.env のような環境ファイルではない。
✍️ スクリプトを編集する
vim create_pages.sh
🔧 スクリプト全文を記述する
以下をそのままファイルに貼り付け、 必要な値だけ自分の環境に合わせて修正する。
#!/bin/bash
# ===== BookStack API 接続情報 =====
API_URL="https://your-bookstack.example.com/api/pages"
TOKEN_ID="xxxxx"
TOKEN_SECRET="yyyyy"
CHAPTER_ID=123
# ===== 作成するページタイトル一覧 =====
titles=(
"天文学とは何か"
"天文学史をどう見るか"
"先史・古代文明の天文学"
"メソポタミア・エジプト天文学"
"ギリシャ天文学"
"中国天文学"
"インド・イスラーム天文学"
"中世ヨーロッパの宇宙観"
"観測精度の限界と停滞"
"地動説の登場"
"観測革命"
"物理法則の導入"
"万有引力と宇宙"
"望遠鏡の進化"
"分光学と恒星の正体"
"恒星の進化と分類"
"銀河の発見"
"相対論と宇宙"
"ビッグバン宇宙論"
"現代の観測技術"
"系外惑星と生命探査"
)
# ===== ページ一括作成処理 =====
for title in "${titles[@]}"; do
curl -s -X POST "$API_URL" \
-H "Authorization: Token $TOKEN_ID:$TOKEN_SECRET" \
-H "Content-Type: application/json" \
-d "{
\"name\": \"$title\",
\"html\": \"<p></p>\",
\"chapter_id\": $CHAPTER_ID
}"
done
📌 各設定項目の意味
API_URL
- BookStackのページ作成API
/api/pagesは固定- ドメイン部分のみ自分の環境に合わせる
末尾にスラッシュは付けない。
TOKEN_ID / TOKEN_SECRET
- BookStack管理画面で発行したAPIトークン
- Authorizationヘッダで使用される
このスクリプトをGit管理してはいけない。
Token Secretが漏洩するとBookStack全体が操作可能になる。
CHAPTER_ID
- ページを作成する親Chapterの数値ID
確認方法: ① Chapter IDを確認する を参照
Chapter名では指定できない。
▶️ スクリプトを実行する
実行権限を付与してから起動する。
chmod +x create_pages.sh
./create_pages.sh
実行後、Chapterを再読み込みするとタイトルのみのページが作成されている。
⚠️ 注意点(重要)
html フィールドは空にできない。
<p></p> のような最小ダミーを必ず指定する。
✅ 実行後の確認
- Chapter配下に、タイトルのみのページが作成されている
- ページ順はUI上で自由に並び替え可能
- 各ページは通常どおり編集・分割・移動できる
この時点で「書くための器」だけが完成している状態。
🧠 運用上のベストプラクティス
-
初期本文は以下でも可:
<p><em>TODO</em></p> -
中身は1ページずつ順不同で書き始めてよい
-
後からページを分割・統合してもURLは壊れない
BookStackは「後から並び替える」ことを前提にした設計。