Docusaurus Storage Optimization Report
Scope
- Site:
brain.id86.net - Host path:
/opt/docker-data/apps/docusaurus/site - Runtime: Docker container
docusaurus(node:lts) - Objective: identify storage bloat root cause, apply safe remediation, and automate prevention.
Executive Summary
The storage bloat was caused primarily by persistent frontend build caches, not by the static site output itself.
node_moduleswas large mostly because cache directories lived inside it.- Final site output (
build) remained moderate in size. - Safe cleanup of cache directories reclaimed significant disk space with no content loss.
- A weekly cron job now removes only safe cache paths to prevent recurrence.
Findings (Measured)
Initial state
/opt/docker-data/apps/docusaurus/site/node_modules ~4.5G
/opt/docker-data/apps/docusaurus/site/node_modules/.cache ~3.9G
/opt/docker-data/apps/docusaurus/site/build ~202M
Largest cache contributors:
node_modules/.cache/webpack ~3.4G
- client-development-en ~692M
- client-production-en ~1.2G
- server-production-en ~1.5G
node_modules/.cache/rspack ~572M
Build performance check
Successful build run inside container:
sudo docker exec docusaurus sh -lc "cd /app && npm run build"
Observed compilation timings:
- Server compile:
23.17s - Client compile:
25.53s - Estimated wall time (start to finish):
~28-35s
Root Cause
- Persistent cache storage: Docker bind mount (
./site:/app) keeps Webpack/Rspack caches on host disk across restarts. - Multiple cache targets: separate cache artifacts for client/server and dev/prod profiles.
- Modern JS toolchain footprint: Docusaurus + search plugin + mermaid + bundler transforms produce large cache graphs.
- No scheduled cleanup previously: cache growth accumulated over time.
Actions Taken
1) Build blocker removed
A non-doc file was moved out of docs tree:
FROM: /opt/docker-data/apps/docusaurus/site/docs/server/linux-server/11-automation-task-execution/rezriz.code-workspace
TO: /opt/docker-data/apps/docusaurus/backups/rezriz.code-workspace.2026-03-03
2) Safe storage cleanup executed
Removed only safe cache paths:
sudo rm -rf /opt/docker-data/apps/docusaurus/site/node_modules/.cache/webpack
sudo rm -rf /opt/docker-data/apps/docusaurus/site/node_modules/.cache/rspack
3) Recurrence prevention automated
Created script:
/opt/docker-data/apps/docusaurus/backup-scripts/cleanup-docusaurus-cache-weekly.sh
Script behavior:
- validates site path exists
- logs timestamp + before/after cache size
- removes only Webpack/Rspack cache folders
- skips safely if folders do not exist
Cron schedule added:
17 3 * * 0 /opt/docker-data/apps/docusaurus/backup-scripts/cleanup-docusaurus-cache-weekly.sh >> /home/rezriz/logs/docusaurus-cache-cleanup.log 2>&1
Results
After cleanup:
/opt/docker-data/apps/docusaurus/site/node_modules ~598M
/opt/docker-data/apps/docusaurus/site/build ~202M
Approximate reclaimed storage from Docusaurus cache cleanup:
- ~3.9G
Risk and Safety Notes
- Cleanup targets are rebuildable caches, not source content.
- No docs, database data, backups, or final static output were deleted.
- First build after cleanup may be slightly slower due to cold cache; subsequent usage remains normal.
Operations Runbook
Manual safe cleanup (on demand)
sudo rm -rf /opt/docker-data/apps/docusaurus/site/node_modules/.cache/webpack \
/opt/docker-data/apps/docusaurus/site/node_modules/.cache/rspack
Quick verification
sudo du -sh /opt/docker-data/apps/docusaurus/site/node_modules \
/opt/docker-data/apps/docusaurus/site/build
sudo docker exec docusaurus sh -lc "cd /app && npm run build"
Weekly job log check
tail -n 50 /home/rezriz/logs/docusaurus-cache-cleanup.log
Recommendation
- Keep a single Docusaurus site for now.
- Continue weekly cache cleanup automation.
- Re-evaluate architecture split only if build time and search performance degrade substantially over sustained growth.