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 VMaccess only by VPNbacked up by PBSno 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 CommandsHouse / RV / EV RV Genesis GV60 Electrical / UPS Tools / RepairsPersonal 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: wiltdOS: Debian 12 or Ubuntu Server 24.04CPU: 1 coreRAM: 2 GBDisk: 20–40 GBBackup: PBS weeklyAccess: 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/bookstackcd /opt/bookstacknano 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 VM2. Occasional app-level export/dump
For a simple app-level backup:
cd /opttar 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: wiltd2. Install Docker + Docker Compose3. Run BookStack + MariaDB4. Make it reachable only on LAN/VPN5. Add Pi-hole DNS entry: bookstack.lan6. Add PBS backup job7. Create shelves for Homelab, House/RV/EV, Personal Tech8. Start documenting only new fixes9. 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.