Amazonのアソシエイトとして、ラズパイダ(raspida.com)は適格販売により収入を得ています。詳しくは当サイトの プライバシーポリシーをご覧ください。
bookstackは個別にファイル出力(エクスポート)する機能があります。でも、1つずつなんですよね。
これはこれで便利なんですけど、まとめてすべてを書き出したいじゃないですか。

探してみると、やり方はいくつかあって、私でもできそうな方法を試しました。
結論からいえば海外の人が作ったPythonプログラムで事足りたのですけど、Raspberry Pi で実行するのにbookwormから面倒なことになったpipでインストールするアプリだったんです。
そこだけが少しややこしく感じてしまいます。でも仕方ないですよね。
この記事では、公開されているアプリを使って、ラズパイ+Dockerで構築したbookstackの全エクスポートをしてみました。
bookstack-file-exporter
使ったのはこちらの「bookstack-file-exporter」です。arm64にも対応しています。
Pythonでそのまま実行する方法と、Dockerで実行する方法がありました。今回はPythonで実行しました。
もしかしたら、もっと良いコードやアプリがあるかも知れません。これでも必要な出力はできます。
bookworm以降のpip
bookworm以降、pip installでエラーが出るようになっています。ルールが厳格化されたというのが簡単な説明で、仮想環境(env)を作成して使用することになります。
pipのエラーについて
先ずは仮想環境を作りenvに入る
コマンドで仮想環境を作成します。(例ではホームディレクトリに移動して実行しました)
cd ~/
python -m venv env
envの部分は、環境を作成するディレクトリ(ENV_DIR)を指定します。無ければ新規作成してくれます。よくあるenvという名前にしました。他でも構いません。
この仮想環境を有効にするコマンド
source env/bin/activate
プロンプトに(env)と表示されたのが分かります。
この後は、今まで通りにpipのコマンドを入力していくことになります。
今回の「bookstack-file-exporter」をインストールしてみます。(pipのバージョンはpip 23.0.1でした)
pip install bookstack-file-exporter
インストール後、リスト表示させるとインストールされていることが分かります。
pip list
Package Version
----------------------- --------
annotated-types 0.6.0
argon2-cffi 23.1.0
argon2-cffi-bindings 21.2.0
bookstack-file-exporter 1.1.0
certifi 2024.2.2
cffi 1.16.0
charset-normalizer 3.3.2
idna 3.6
minio 7.2.5
pip 23.0.1
pycparser 2.21
pycryptodome 3.20.0
pydantic 2.6.4
pydantic_core 2.16.3
PyYAML 6.0.1
requests 2.31.0
setuptools 66.1.1
typing_extensions 4.10.0
urllib3 2.2.1
これで使用できるようになりました。
(env)から抜けるには、deactiveとタイプします。
#envの有効化
source env/bin/activate
#envの無効化
deactive
■Pi 5は8GBモデルがオススメ
使用方法
このexporterを使うのに私が行った方法をご紹介します。
最初に、稼働しているbookstackでAPIにアクセスするトークンIDとトークンシークレットを作成しておきます。
場所はメニューのマイアカウント内にあるアクセス&セキュリティ項目です。

トークンIDとトークンシークレットをコピーして使用します。トークンシークレットは一度しか表示されない点は注意が必要です。
config.ymlの作成
次にターミナルに戻り、適当な場所でバックアップ(エクスポート)させるディレクトリを作成し、config.ymlを作成、作成したディレクトリでアプリのコマンドを実行しました。
mkdir backup
cd backup
nano config.yml
config.ymlは、アプリのgitからコピーして使いました。内容はコメントアウト部分を省き羅列してみます。
変更箇所を上から説明すると次のようになります。
| host | IPアドレスとポート番号 |
| token_id | bookstackで発行 |
| token_secret | bookstackで発行 |
| formats | 出力するフォーマット デフォルトなら全ての形式。 必要無いなら削除するかコメントアウト。 |
| export_images | 画像も出力するか |
| export_attachments | 添付ファイルも出力するか |
| modify_markdown | mdファイル内のリンクをローカルにするか |
| export_meta | mdファイルのメタデータを出力するか |
| verify_ssl | ssl認証をするか Dockerなのでhttpのためfalse |
| output_path | 出力するディレクトリ名をフルパス |
| keep_last | いくつまでバックアップファイルを残すか |
いくつか注意点として挙げておきます。
- hostの指定はホスト名だと名前解決できませんでしたからIPアドレスにしました。
- modify_markdownをtrueにしておけばローカル表示できます。
- verify_sslはhttpとhttpsを自動判別しないので、httpなら忘れずにfalseにしておく。
- output_pathは
~/は使えませんでした。フルパスなら確実です。
---
host: "http://192.168.0.29:6875"
credentials:
token_id: "トークンID"
token_secret: "トークンシークレット"
formats:
- markdown
- html
- pdf
- plaintext
assets:
export_images: false
export_attachments: false
modify_markdown: false
export_meta: false
verify_ssl: false
output_path: "/home/raspida/backup"
keep_last: 5
オプションの細かい説明は、アプリのgithubで確認してください。
実行してみる
config.ymlを作成した場所で行いましたが、ちゃんとパスを指定してあげればどこでも構いません。
bookstack-file-exporter -c config.yml
成功すれば、次のようなメッセージ出力後、config.ymlで指定したディレクトリ(output_path)にtgzファイルが表示されると思います。
2024-03-21 14:45:55 [INFO] Beginning run
2024-03-21 14:45:55 [INFO] Building shelve/book/chapter/page relationships
2024-03-21 14:45:59 [INFO] Beginning archive
2024-03-21 14:45:59 [INFO] Exporting all bookstack page contents
2024-03-21 14:46:05 [INFO] Completed run
~/backup $ tree -L 2
.
├── bookstack_export_2024-03-21_14-45-59.tgz
└── config.yml
bookstack_export_日時.tgzといったtgzファイルが作成されます。中身は、エクスポートしたフォーマット形式のバックアップファイルが入っています。
あとはこのファイルを解凍すればエクスポートしたものを取り出せます。
別のマシンへ取り出して確認してみる
分かりやすいように、自分の使っているメインマシンにコピーしてみましょう。
scpやsambaなど方法はいくつかありますが、そのままターミナルで一時的なサーバを立ち上げて取り出すのが簡単です。

こんな感じで4つのフォーマットで取り出せました。
本棚とブックといったタイトルは、なるべく英語にした方が良いでしょう。ランダム?な文字がファイル名になっていました。これも2バイト文字に対応させていないからだと思われます。
他の形式は日本語もOKです。

PDFの2バイト文字は今後もサポートしないらしく、欧文だけみたいですね。
一気にバックアップできる安心感
これからbookstackをラズパイで構築して使っていこうと思っているなら、やはりバックアップはしたいですよね。
実質的にPDFは使えませんけど、私としては、mdファイルで取り出せれば御の字です。txtファイルでもイイですよね。
個別にはエクスポートできるbookstackですが、まとめてバックアップが図れると思うと、気軽に使えるのではないでしょうか。
bookstack自体でまとめてエクスポート機能が採用されると嬉しいですけどね。お試しあれ。





