Skip to main content

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_modules was 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​

  1. Persistent cache storage: Docker bind mount (./site:/app) keeps Webpack/Rspack caches on host disk across restarts.
  2. Multiple cache targets: separate cache artifacts for client/server and dev/prod profiles.
  3. Modern JS toolchain footprint: Docusaurus + search plugin + mermaid + bundler transforms produce large cache graphs.
  4. 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.