Client: International Salon Supplies
Role: Engineer (setup & operations)
Period: Jul 2025 – Feb 2026
Status: Production
Tech stack: BookStack, Docker Compose, MySQL 8, Caddy, Bash, rclone, OneDrive, DigitalOcean
A self-hosted internal knowledge base for SOPs and documentation, running on one small DigitalOcean droplet: BookStack behind Caddy with automatic HTTPS, templated config that keeps secrets out of git, and three independent backup layers with a guarded restore script.
The need
Processes at ISS lived in people's heads, email threads and scattered documents. We needed one searchable place for SOPs and technical documentation that staff would actually use, without paying per seat or taking on a lot of maintenance.
Choosing the tool
I trialled Wiki.js and BookStack side by side. BookStack's shelves → books → chapters → pages structure matched how non-technical staff think about documentation, so it won.
Setup
Internet ─► Caddy (80/443, automatic TLS) ─► BookStack (PHP/Laravel) ─► MySQL 8
│
uploads on host volumes
- Caddy terminates TLS with automatic certificates and forwards the original protocol, so BookStack generates correct
https://links behind the proxy. - PHP limits raised for large attachments.
- SMTP configured for notifications.
- Secrets stay out of git. Only
docker-compose.yaml.templateand.env.templateare committed. Real config, SQL dumps and backups are ignored, and placeholder files keep empty upload directories in the repo.
Three layers of backup
- Droplet snapshots at the infrastructure level.
- Database dumps. A script loads the environment, validates the required variables, runs
mysqldumpinside the container and writes a timestamped.sql.gz. A companion script enforces retention, keeping only the newest N dumps. - Off-site sync. rclone mirrors the project, including uploads and dumps, to OneDrive on a short cron interval (
--fast-list --track-renames).
Restoring is deliberately careful. The script lists available backups with sizes, asks you to pick one, and requires typing yes before it streams the dump back into MySQL.
Evolution
- Jul 2025: local trial of Wiki.js and BookStack
- Aug 2025: single-file BookStack setup
- Sep 2025: production repo with templated config and backup scripts
- Feb 2026: Caddy added for end-to-end TLS
Takeaway
Self-hosting is cheap. What makes it production-grade is the operating model around it: automatic TLS, secrets hygiene, backups you've tested restoring, and a restore path that's hard to trigger by accident.