Backup + Migration
Not tested yet!
❓ I installed BookStack via Docker (as in the guide). Could you please explain how to create backups (full content backup) so that I can migrate the website if needed, e.g., to another server/domain? Here is BookStack’s official guide.
Full BookStack backup (Docker) – so that a move to another server/domain works 🧰📦
For a complete, restorable backup, you essentially need two components:
- Database (all pages, books, users, permissions, settings …)
- Files/config (uploads, attachments,
.env/APP_KEY, possibly themes/modules)
Since you have the setup like in your guide (/opt/bookstack with docker-compose.yml, volumes ./mariadb and ./bookstack), this is pleasantly simple.
✅ What exactly needs to be backed up?
1) Database (MariaDB)
- The content is in the DB container, and in your setup it’s persisted under:
./mariadb(as volume./mariadb:/config)
- Cleanest approach: SQL dump (portable, tolerant across versions)
2) Files (BookStack container volume)
- Persistent data is located under:
./bookstack(as volume./bookstack:/config)
- In it, especially important:
.env(including APP_KEY!)- uploads/attachments
- possibly
www/themes/custom/...(your hacks/modules)
3) Compose/Caddy (helpful for migration)
docker-compose.ymlCaddyfile- Caddy data optional:
./caddy/data&./caddy/config(certificates/state).Not strictly required, but sometimes saves re-issuing/rate limits.
🗂️ Create a backup (recommended approach)
Assumption: project is located in
/opt/bookstackand the containers are named as in your YAML:bookstack-mariadbandbookstack.
Step 1: Create a backup folder
cd /opt/bookstack
mkdir -p backups
Step 2: Dump the database as SQL 💾
docker exec -i bookstack-mariadb \
mysqldump -u bookstack -pbookstack \
--single-transaction --routines --triggers \
bookstack > backups/bookstack-db-$(date +%F).sql
Important: Replace -pbookstack with your real password (from MYSQL_PASSWORD).
Alternative (safer because the password won’t end up in shell history):
Omit-p..., thenmysqldumpwill prompt interactively for the password:docker exec -it bookstack-mariadb mysqldump -u bookstack -p --single-transaction --routines --triggers bookstack > backups/bookstack-db-$(date +%F).sql
Step 3: Archive files/volumes 📦
tar -czvf backups/bookstack-files-$(date +%F).tar.gz \
docker-compose.yml Caddyfile \
bookstack mariadb caddy
If you don’t want to back up Caddy, you can do it leaner:
tar -czvf backups/bookstack-files-$(date +%F).tar.gz \
docker-compose.yml Caddyfile \
bookstack mariadb
Step 4: (Optional) Integrity check ✅
ls -lh backups/
head -n 5 backups/bookstack-db-*.sql
tar -tzf backups/bookstack-files-*.tar.gz | head
🔁 Restore (on a new server) – incl. domain/URL migration
Step 0: Prerequisites
- Docker + Docker Compose installed
- DNS of the new domain points to the new server (for HTTPS via Caddy)
Step 1: Copy the backup over
Pack on the old server or copy directly:
scp -r /opt/bookstack/backups user@new-server:/opt/bookstack/
Step 2: Restore files (Compose/volumes) 📂
On the new server:
cd /opt/bookstack
tar -xvzf backups/bookstack-files-YYYY-MM-DD.tar.gz
(Adjust the date, of course.)
Step 3: Start containers (DB should already be running) 🐳
cd /opt/bookstack
docker compose up -d mariadb
Wait a few seconds until MariaDB is ready.
Step 4: Import the database 🧩
cat backups/bookstack-db-YYYY-MM-DD.sql | \
docker exec -i bookstack-mariadb mysql -u bookstack -pbookstack bookstack
Again: adjust the password or use interactive mode.
Step 5: Start BookStack
docker compose up -d
🌍 Domain/URL changed? (very important!)
If you move to a different URL/domain, you must:
1) Adjust APP_URL in the .env
In your volume, the .env is typically located at:
./bookstack/www/.env(common with linuxserver/bookstack)- or
./bookstack/.env(depending on image/setup)
Find it like this:
find /opt/bookstack/bookstack -maxdepth 3 -name ".env" -print
Then set APP_URL=https://new-domain.tld.
Pay attention: The
APP_KEYmust remain the old one (otherwise encrypted data will break, e.g., MFA secrets).
2) BookStack command: “Update System URL”
So that content/links in the DB are rewritten cleanly:
docker exec -it bookstack php /app/www/artisan bookstack:update-url https://old-domain.tld https://new-domain.tld
(If the path in the container is different, this often also works: php artisan ... from /app/www.)
🧠 Practical notes (so it’s truly “migration-safe”)
-
Always store backups offsite (another system/storage).
-
Database dump + file archive is the most portable.
-
If you restore to a newer BookStack version:
-
Restore DB
-
Bring containers up
-
Then run migrations (if needed):
docker exec -it bookstack php /app/www/artisan migrate --force
-
If you want: I’ll make you a “one-command backup script” 🧾
Just tell me briefly:
- Is your
.envlocated atbookstack/www/.env? - What are your containers actually named (
docker psoutput)? - Do you want to back up Caddy certificates or preferably not?
Then I’ll give you a small script including rotation (e.g., “keep the last 7 backups”) and optional upload to S3/Hetzner Storage Box.