import React, { useState } from 'react'; const WebsiteBoxDiagram = () => { const [activeView, setActiveView] = useState('flow'); const UserStep = ({ number, title, description }) => (
{number}
{title}
{description}
); const AutomatedStep = ({ title, items }) => (
{title}
); const Arrow = ({ label }) => (
{label && {label}}
); const FlowView = () => (
{/* Phase 1: Setup */}

Phase 1: Initial Setup

curl -fsSL https://<INSTALL_URL_TBD>/install.sh | bash} />
{/* Phase 2: DNS */}

Phase 2: Domain Configuration

⏳ Wait for DNS propagation (usually 5-30 min, can take up to 48h)
{/* Phase 3: Launch */}

Phase 3: Launch

docker compose up -d} />
⚠ If SSL fails (DNS not ready yet), nginx serves an HTTP page explaining the issue.
Fix: wait for DNS to propagate, then docker compose restart nginx
{/* Phase 4: Customize */}

Phase 4: Customize & Use

Ongoing automated maintenance:
🔄 SSL auto-renewal (12h check)
💾 Daily DB + weekly full backups
🔒 Wordfence monitoring
🚀 Container auto-restart on reboot
🔧 WordPress minor auto-updates
🗑️ Backup retention cleanup
); const ArchitectureView = () => (
{/* Server diagram */}

VPS Server Architecture

🌐
Internet
Ports 80, 443 only
{/* Docker container stack */}
Docker Compose Stack
restart: unless-stopped on all containers
{/* Nginx */}
📦 nginx (custom image w/ entrypoint)
SSL termination • Auto-acquires certs on first boot • Security headers • Static files
Healthcheck: curl localhost/nginx-health
↓ FastCGI
{/* WordPress */}
📦 wordpress (custom image w/ WP-CLI)
PHP-FPM • First-boot entrypoint installs themes, plugins, configures site via WP-CLI
Healthcheck: php-fpm-healthcheck • depends_on: db (healthy)
↓ MySQL protocol
{/* MariaDB */}
📦 mariadb (database)
Internal only • Not exposed to host
Healthcheck: healthcheck --connect --innodb_initialized
{/* Certbot */}
📦 certbot (SSL renewal)
Renewal loop every 12h • Shares certbot-webroot volume with nginx
{/* Volumes */}
./websitebox-data/ — single bind mount directory, all persistent data
{['wordpress/', 'database/', 'certs/', 'certbot-webroot/', 'backups/'].map(name => (
💾
{name}
))}
{/* What's automated vs manual */}

WebsiteBox Handles

  • Docker installation
  • Server configuration
  • SSL certificates (acquire + renew)
  • WordPress + theme + plugin install
  • Security hardening
  • Age gate setup
  • Automatic backups + retention
  • WordPress minor auto-updates
  • Container auto-restart on reboot

👤 User Does Manually

  • Provision VPS ($3-6/mo)
  • Register domain ($10-15/yr)
  • Configure DNS A record
  • Run install command
  • Answer setup wizard
  • Create site content
  • Update plugins (via WP admin GUI)
  • Run update.sh (occasionally)
  • Configure remote backups (optional)
  • Set up SMTP (optional)
); const FilesView = () => (
# Repository structure
websitebox/
├── docker-compose.yml
├── .env.example
├── install.sh ← curl this to start
├── setup.sh ← interactive wizard
├── README.md
├── websitebox-data/ ← all persistent data (gitignored)
├── wordpress/ database/ certs/ certbot-webroot/ backups/
├── nginx/
├── Dockerfile
├── entrypoint.sh ← SSL auto-bootstrap
├── nginx.conf
├── wordpress.conf
├── wordpress-ssl.conf
└── ssl-params.conf
├── wordpress/
├── Dockerfile ← includes WP-CLI
├── entrypoint.sh ← first-boot WP-CLI setup
├── wp-config-docker.php
├── uploads.ini
└── wp-content/
├── themes/websitebox/ ← child theme
└── mu-plugins/
└── websitebox-setup.php ← status checker + XML-RPC disable
├── scripts/
├── ssl-renew.sh
├── backup.sh ← manual backup + --prune-only
├── update.sh ← update WebsiteBox
└── healthcheck.sh
└── docs/
├── SECURITY.md
├── TROUBLESHOOTING.md
└── UPDATING.md
); return (
{/* Header */}

📦 WebsiteBox

Self-hosted WordPress portfolio in minutes

{/* View tabs */}
{[ { id: 'flow', label: 'User Flow' }, { id: 'architecture', label: 'Architecture' }, { id: 'files', label: 'File Structure' } ].map(tab => ( ))}
{/* Content */} {activeView === 'flow' && } {activeView === 'architecture' && } {activeView === 'files' && } {/* Legend */}
User action required
Automated by WebsiteBox
); }; export default WebsiteBoxDiagram;