BookStack Installation (ChatGPT)

For what you described — private “What I Learned Today,” searchable, web-based, VPN-only, mostly for not reinventing wheels — I’d use BookStack.

BookStack is a self-hosted wiki/documentation app with a simple WYSIWYG editor and structured organization around shelves/books/chapters/pages. That maps beautifully to your homelab notes: “Proxmox,” “Networking,” “PBS,” “Home Assistant,” “Linux fixes,” etc. (BookStack) It also has official install paths including Docker, Ubuntu scripts, and manual install options. (BookStack)

Your current lab layout already has a good place for this: a light service on pve3, or on pve1 if you want it with core services. Your fleet notes show pve1 = M93q, pve2 = M73 i7 + Coral, pve3 = M73 i5, with standalone PBS and travel/test nodes, so this is a tiny workload in your world.

My recommendation

Run:

BookStack in a small Debian/Ubuntu VM
access only by VPN
backed up by PBS
no public port forward

I’d avoid exposing it through Nginx Proxy Manager to the internet. VPN is enough and much cleaner.

Why BookStack over WordPress?

WordPress is good when you want a public site, themes, comments, plugins, SEO, publishing workflow — basically a little newspaper. That’s not your goal.

BookStack is better for:

"How did I fix that e1000e hang?"
"Where did I document PBS pruning?"
"What did I decide about file1 storage?"
"How did I mount that USB HDD?"
"What was the command for that Proxmox migration?"

That is a knowledge base, not really a blog.

Ghost is also more publishing-oriented; it’s modern and Docker-friendly, but still more “public publication/newsletter” than “private repair manual.” Ghost has official Docker install docs now, but I wouldn’t pick it for your use case. (Ghost Developer Docs)

DokuWiki is another good option: simple, mature, and it does not require a database, which is appealing for backups and portability. (DokuWiki) But BookStack is friendlier and prettier, and I think that matters because you’ll actually use it.

Suggested structure

Create shelves like this:

Homelab
Proxmox
PBS
Networking
Pi-hole / DNS / DHCP
VPN / WireGuard
Storage / Samba / NFS
Home Assistant
Frigate / Cameras
Linux Commands
House / RV / EV
RV
Genesis GV60
Electrical / UPS
Tools / Repairs
Personal Tech
Windows
Android
Hearing aids / audio
Audiobooks

For each page, use a repeatable template:

# Problem
# Symptoms
# Cause
# Fix
# Commands Used
# Verification
# Notes for Future Me

The killer section is “Notes for Future Me.” That’s where you put: “Do not try Ceph on USB drives again, genius.” Tiny little landmines defused.

Best deployment choice

I’d create a small VM, not an LXC, even though BookStack can run fine in either. Since this is something you want to keep for years, a VM is boring in a good way.

Something like:

VM name: wiltd
OS: Debian 12 or Ubuntu Server 24.04
CPU: 1 core
RAM: 2 GB
Disk: 20–40 GB
Backup: PBS weekly
Access: LAN/VPN only

Put it on internal SSD storage, not a USB HDD. The data is small, but you want it fast and reliable.

Simple Docker Compose setup

Inside the VM:

mkdir -p /opt/bookstack
cd /opt/bookstack
nano docker-compose.yml

Use this:

services:
bookstack:
image: lscr.io/linuxserver/bookstack:latest
container_name: bookstack
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
- APP_URL=http://bookstack.lan
- DB_HOST=bookstack-db
- DB_PORT=3306
- DB_USER=bookstack
- DB_PASS=change_this_password
- DB_DATABASE=bookstackapp
volumes:
- ./bookstack-config:/config
ports:
- 8080:80
restart: unless-stopped
depends_on:
- bookstack-db
bookstack-db:
image: lscr.io/linuxserver/mariadb:latest
container_name: bookstack-db
environment:
- PUID=1000
- PGID=1000
- TZ=America/Chicago
- MYSQL_ROOT_PASSWORD=change_this_root_password
- MYSQL_DATABASE=bookstackapp
- MYSQL_USER=bookstack
- MYSQL_PASSWORD=change_this_password
volumes:
- ./mariadb-config:/config
restart: unless-stopped

Then:

docker compose up -d

Access it at:

http://VM-IP:8080

Later, you can make Pi-hole resolve:

bookstack.lan -> VM-IP

Then use:

http://bookstack.lan:8080

Or, if you already have Nginx Proxy Manager internally, point:

http://wiki.lan

to:

VM-IP:8080

No public DNS. No public port forward. VPN only.

Remote access

Use your existing VPN path:

Laptop/phone away from home
-> WireGuard/PiVPN
-> http://bookstack.lan

That’s enough. Don’t expose it to the internet unless you later decide you want public sharing.

Backup plan

Because this is your “don’t reinvent the wheel” brain, back it up like it matters.

Do both:

1. PBS backup of the whole VM
2. Occasional app-level export/dump

For a simple app-level backup:

cd /opt
tar czf /root/bookstack-files-$(date +%F).tgz bookstack

The PBS VM backup is probably enough day-to-day, but having a plain tarball once in a while is comforting.

What about your old WordPress blog?

I’d handle that in one of two ways:

Option A — keep old WordPress as archive

Export the WordPress site and keep a local/static copy somewhere. Then start fresh in BookStack.

This avoids turning your new system into a migration swamp. Migration swamps are where projects go to wear little concrete shoes.

Option B — migrate only the useful posts

Go through the old posts and copy the still-useful ones into BookStack manually, cleaning them up as you go.

That sounds tedious, but it’s probably better than importing years of old cruft.

My practical “do this first” plan

I’d do this:

1. Create VM: wiltd
2. Install Docker + Docker Compose
3. Run BookStack + MariaDB
4. Make it reachable only on LAN/VPN
5. Add Pi-hole DNS entry: bookstack.lan
6. Add PBS backup job
7. Create shelves for Homelab, House/RV/EV, Personal Tech
8. Start documenting only new fixes
9. Backfill old WordPress posts only when they become useful again

The big habit change: every time you fix something annoying, write a short BookStack page before moving on. Not a novel. Just enough that Future Lynn doesn’t mutter bad words at Past Lynn.

Leave a comment