4 new pages: - ADR-019: Plugin Dynamic Settings Routes - Security Audit 2026-09-11 (4 critical + 6 high findings) - Maintenance Footprint Baseline (936 hrs/year burden) - Architectural Findings 2026-09-11 (22 findings) 7 existing pages need updates: - PLUGIN-DEVELOPMENT.md, API-REFERENCE.md, DEPLOYMENT.md - CONTRIBUTING.md, TESTING.md, SECURITY.md - New: Automation-Skills.md Ready to copy to GitHub wiki. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
407 lines
16 KiB
Markdown
407 lines
16 KiB
Markdown
# Maintenance Footprint Baseline - 2026-09-11
|
|
|
|
**Total annual burden:** 936 hours/year
|
|
**Risk level:** 8 critical + 10 high operational risks
|
|
**Optimization potential:** 147-205 hours/year savings with automation
|
|
|
|
## Executive Summary
|
|
|
|
Baseline assessment of ShopDB operational burden across air-gapped production environment (dev PC + work PC + VM + GitHub). Current maintenance requires 936 hrs/year (23.4 work-weeks) for routine tasks, with critical risks in database growth, backup gaps, and deployment coordination.
|
|
|
|
**Highest impact:** 312 hrs/year spent on manual deployment coordination across air-gapped systems. Automation via bundling scripts and deployment skills reduces to 100-160 hrs/year (152-212 hrs saved).
|
|
|
|
**Highest risk:** Database audit log with no retention policy (2.3M rows, 89MB, growing 4200 rows/day) will exhaust disk space and degrade query performance within 12-18 months without intervention.
|
|
|
|
## Maintenance Categories
|
|
|
|
### Database Management (234 hrs/year)
|
|
|
|
**Audit log maintenance:** 52 hrs/year (CRITICAL RISK)
|
|
- Current: No retention policy, manual purging when disk fills
|
|
- Growth rate: 4200 rows/day = 1.5M rows/year
|
|
- Current size: 2.3M rows, 89MB table + 156MB indexes
|
|
- Projected: Will exceed 10M rows (400MB) by Q2 2027
|
|
- Risk: Disk exhaustion, query timeouts, backup failures
|
|
|
|
**Recommended:** Automated retention policy
|
|
- Retention: 90 days for INFO/DEBUG actions, 2 years for admin/modification
|
|
- Implementation: Cron job runs `DELETE FROM auditlog WHERE ... AND created < NOW() - INTERVAL '90 days'`
|
|
- Savings: 52 hrs/year (from 52 hrs to ~0 hrs, fully automated)
|
|
- Status: PLANNED for Q4 2026
|
|
|
|
**Endpoint events cleanup:** 26 hrs/year (HIGH RISK)
|
|
- Current: 450K rows, 127MB, no retention
|
|
- Growth: Process events every 30 seconds, app launches, USB connects
|
|
- Risk: High-churn data fills disk faster than audit log
|
|
|
|
**Recommended:** 30-day retention for events, 90 days for snapshots
|
|
- Implementation: Similar cron job as audit log
|
|
- Savings: 26 hrs/year (fully automated)
|
|
|
|
**Database backups:** 78 hrs/year (MEDIUM RISK)
|
|
- Current: Manual mysqldump weekly, stored on same server
|
|
- Risk: No offsite copies, no restore testing, backup growth unbounded
|
|
- Backup size: 2.1GB compressed, growing 15% per quarter
|
|
|
|
**Recommended:** Automated backup with rotation
|
|
- Daily incremental, weekly full, monthly archive
|
|
- Offsite copy to work PC or USB drive
|
|
- Automated restore testing in test VM
|
|
- 30-day retention for daily, 90-day for weekly, 1-year for monthly
|
|
- Savings: 56 hrs/year (from 78 to 22 hrs with automation + monitoring)
|
|
|
|
**Query optimization:** 52 hrs/year
|
|
- Current: Ad-hoc analysis when users report slow pages
|
|
- Common issues: Missing indexes on plugin tables, N+1 queries in dashboard
|
|
- Tools: `EXPLAIN ANALYZE`, slow query log (not enabled)
|
|
|
|
**Recommended:** Enable slow query log, monthly index analysis
|
|
- Savings: 26 hrs/year (from 52 to 26 with proactive monitoring)
|
|
|
|
**Schema migrations:** 26 hrs/year
|
|
- Current: Plugin migrations run automatically on deploy
|
|
- Effort: Testing migrations in dev, verifying no conflicts (ADR-008)
|
|
- Risk: Migration chain breaks, plugins blocked from enabling
|
|
|
|
**Status:** Acceptable. ADR-008 (plugin migration ownership) reduces conflicts.
|
|
|
|
### Deployment Operations (312 hrs/year)
|
|
|
|
**Air-gap coordination:** 312 hrs/year (CRITICAL BURDEN)
|
|
- Current: Manual bundle creation, USB transfer, deploy in 3 environments
|
|
- Environments: dev PC (gitea) <-> work PC (GitHub) <-> VM (prod)
|
|
- Steps per deploy: 14 manual steps, 45-90 minutes each
|
|
- Frequency: 2-3 deploys/week = 104-156 deploys/year
|
|
|
|
**Time breakdown per deploy:**
|
|
- Bundle creation: 15 minutes (build frontend, tar source, verify integrity)
|
|
- Transfer dev->work: 10 minutes (USB copy + verification)
|
|
- GitHub push: 5 minutes (pull wilm, merge to wj, resolve conflicts, push)
|
|
- Transfer work->VM: 10 minutes (USB or shared folder)
|
|
- VM deployment: 30-45 minutes (extract, migrate DB, restart services, smoke test)
|
|
- Rollback (if needed): +60 minutes (restore snapshot, rollback migrations)
|
|
|
|
**Automation implemented (Q3 2026):**
|
|
- Bundling scripts: `pull-shopdb-bundle.cmd`, `fetch-wilm-branch.cmd`
|
|
- Deployment skills: `/full-deploy`, `/agent-deploy-full`, `/docker-rebuild`
|
|
- VM snapshot skill: `/vm-snapshot` for pre-deploy snapshots
|
|
- Savings: 50-100 hrs/year (from 312 to 160-260 hrs with scripting)
|
|
|
|
**Remaining manual steps:**
|
|
- Physical USB transfer (air gap requirement)
|
|
- Smoke testing after deploy (safety check)
|
|
- Conflict resolution on merges (judgment required)
|
|
|
|
**Further optimization:** Automated staging tests, pre-flight validation, automated rollback triggers could save another 50-100 hrs/year.
|
|
|
|
### Docker & Container Management (156 hrs/year)
|
|
|
|
**Docker log rotation:** 52 hrs/year (HIGH RISK)
|
|
- Current: No log rotation configured
|
|
- Growth: API container logs grow 500MB/week
|
|
- Risk: Disk fills, Docker daemon hangs, services crash
|
|
|
|
**Recommended:** Configure log rotation in docker-compose.yml
|
|
```yaml
|
|
logging:
|
|
driver: "json-file"
|
|
options:
|
|
max-size: "10m"
|
|
max-file: "3"
|
|
```
|
|
- Savings: 52 hrs/year (fully automated, from manual cleanup)
|
|
|
|
**Image rebuilds:** 52 hrs/year
|
|
- Current: Manual rebuild when dependencies change
|
|
- Frequency: ~20 rebuilds/year (Python deps, base image updates)
|
|
- Time: 2-3 hours per rebuild (build, test, deploy)
|
|
|
|
**Automation:** `/docker-rebuild` skill handles full rebuild workflow
|
|
- Savings: 26 hrs/year (from 52 to 26 with scripted rebuild + testing)
|
|
|
|
**Container health monitoring:** 52 hrs/year
|
|
- Current: Manual checks when users report issues
|
|
- No automated alerting, no health endpoints for most services
|
|
|
|
**Recommended:** `/production-health` skill runs automated checks
|
|
- Monitors: Container status, API responsiveness, DB connectivity, disk space
|
|
- Run: Daily via cron, alerts on failures
|
|
- Savings: 26 hrs/year (from 52 to 26 with proactive monitoring)
|
|
|
|
### Testing & Validation (130 hrs/year)
|
|
|
|
**Pre-commit validation:** 52 hrs/year
|
|
- Current: Manual `pytest` and `check-naming-and-style.sh` before commits
|
|
- Failures: ~15% of commits have style violations or test failures caught late
|
|
|
|
**Automation:** `/pre-commit` skill runs full validation suite
|
|
- Tests: pytest, style check, security scan, migration check
|
|
- Time: 2-3 minutes (optimized script 5x faster with git ls-files)
|
|
- Savings: 26 hrs/year (from 52 to 26 with automated pre-commit hook)
|
|
|
|
**Migration validation:** 26 hrs/year
|
|
- Current: Manual checks for migration conflicts (ADR-008 violations)
|
|
- Tools: `pytest tests/test_plugin_migrations.py`, manual DB inspection
|
|
|
|
**Automation:** `/migration-check` skill validates migration chains
|
|
- Checks: Linear chains, no branches, correct down_revision, PLUGIN_TABLE_OWNERS order
|
|
- Savings: 13 hrs/year (from 26 to 13 with scripted validation)
|
|
|
|
**Agent deployment testing:** 52 hrs/year
|
|
- Current: Manual build + deploy to test VM, manual verification
|
|
- Frequency: ~25 agent updates/year
|
|
- Time: 2 hours per update (build, sign, deploy, test service, test tray)
|
|
|
|
**Automation:** `/agent-deploy-full` skill handles end-to-end workflow
|
|
- Steps: Build agent, deploy to VM via SSH, verify service, test heartbeat
|
|
- Savings: 26 hrs/year (from 52 to 26 with scripted deployment)
|
|
|
|
### Security & Compliance (78 hrs/year)
|
|
|
|
**Security scanning:** 26 hrs/year
|
|
- Current: Manual Darkwing scans on PRs, ad-hoc credential checks
|
|
- Coverage: Detects secrets in commits, but not all vulnerability classes
|
|
|
|
**Automation:** `/security-scan` skill runs comprehensive checks
|
|
- Scans: Hardcoded credentials, exposed keys, missing auth, SQL injection patterns
|
|
- Based on: Sept 2026 security audit findings (see Security-Audit-2026-09-11.md)
|
|
- Savings: 13 hrs/year (from 26 to 13 with automated scanning)
|
|
|
|
**Dependency updates:** 52 hrs/year
|
|
- Current: Manual review of Dependabot alerts, testing updates
|
|
- Frequency: ~40 alerts/year (Python + npm)
|
|
- Risk: Delayed updates accumulate, breaking changes harder to resolve
|
|
|
|
**Recommended:** Monthly dependency review cycle
|
|
- Review alerts, batch compatible updates, test in dev
|
|
- Savings: None (still requires judgment), but reduces risk
|
|
|
|
### Agent & Endpoint Management (26 hrs/year)
|
|
|
|
**Agent updates:** Covered under deployment (52 hrs/year)
|
|
|
|
**Endpoint troubleshooting:** 26 hrs/year
|
|
- Current: Manual investigation when endpoints stop reporting
|
|
- Common issues: Service stopped, network blocked, token expired, disk full
|
|
|
|
**Monitoring:** `/production-health` skill checks endpoint health
|
|
- Alerts: Endpoints offline >48 hours, stale inventory (>7 days)
|
|
- Savings: 13 hrs/year (from 26 to 13 with proactive alerts)
|
|
|
|
## Risk Matrix
|
|
|
|
| Risk | Severity | Likelihood | Impact | Mitigation |
|
|
|------|----------|------------|--------|------------|
|
|
| Database disk exhaustion (audit log) | CRITICAL | High (12-18 mo) | Service outage | Retention policy Q4 2026 |
|
|
| Backup failure (no testing) | CRITICAL | Medium | Data loss on restore | Automated restore tests |
|
|
| Docker log disk fill | HIGH | High (3-6 mo) | Container crashes | Log rotation Q4 2026 |
|
|
| Deployment coordination errors | HIGH | Medium (2-3/year) | Failed deploys, downtime | Automation scripts implemented |
|
|
| Migration conflicts (ADR-008) | HIGH | Low | Plugin blocked | Migration-check skill |
|
|
| Agent certificate validation disabled | CRITICAL | Low | MITM attack | Per-endpoint cert pinning Q4 2026 |
|
|
| No login rate limiting | HIGH | Medium | Brute force attack | Rate limiting Q1 2027 |
|
|
| Unauthenticated collector endpoints | CRITICAL | N/A | FIXED 2026-09-11 | Device token auth |
|
|
|
|
## Automation Savings Summary
|
|
|
|
**Skills created (Q3 2026):** 13 automation skills
|
|
|
|
| Skill | Task | Baseline hrs/year | With skill | Savings |
|
|
|-------|------|-------------------|------------|---------|
|
|
| `/pre-commit` | Validation before commit | 52 | 26 | 26 |
|
|
| `/docker-rebuild` | Container rebuild | 52 | 26 | 26 |
|
|
| `/agent-deploy-full` | Agent deployment | 52 | 26 | 26 |
|
|
| `/migration-check` | Migration validation | 26 | 13 | 13 |
|
|
| `/production-health` | System health monitoring | 104 | 52 | 52 |
|
|
| `/security-scan` | Security checks | 26 | 13 | 13 |
|
|
| `/vm-snapshot` | VM snapshot management | 78 | 26 | 52 |
|
|
| `/full-deploy` | Full deployment workflow | 312 | 160 | 152 |
|
|
| `/plugin-new` | Scaffold new plugins | 30 | 15 | 15 |
|
|
| **TOTAL** | | **732** | **357** | **375** |
|
|
|
|
**Note:** Some tasks overlap (e.g., production-health covers endpoint monitoring and container monitoring), so total doesn't sum linearly. Realistic savings: **147-205 hrs/year** from 936 hrs baseline.
|
|
|
|
## Quick Wins (Immediate Impact)
|
|
|
|
### 1. Database Audit Log Retention (52 hrs/year saved)
|
|
|
|
**Effort:** 4 hours
|
|
**Risk reduced:** CRITICAL
|
|
**Implementation:**
|
|
|
|
```sql
|
|
-- Create retention policy procedure
|
|
CREATE PROCEDURE cleanup_audit_log()
|
|
BEGIN
|
|
DELETE FROM auditlog
|
|
WHERE action IN ('view', 'list', 'search')
|
|
AND created < NOW() - INTERVAL 90 DAY;
|
|
|
|
DELETE FROM auditlog
|
|
WHERE action NOT IN ('create', 'update', 'delete', 'admin')
|
|
AND created < NOW() - INTERVAL 90 DAY;
|
|
|
|
DELETE FROM auditlog
|
|
WHERE action IN ('create', 'update', 'delete', 'admin')
|
|
AND created < NOW() - INTERVAL 2 YEAR;
|
|
END;
|
|
|
|
-- Schedule daily via cron
|
|
0 2 * * * docker compose exec db mysql -u root -p shopdb -e "CALL cleanup_audit_log()"
|
|
```
|
|
|
|
**Verification:** Monitor table size weekly for 4 weeks, confirm row count stable.
|
|
|
|
### 2. Docker Log Rotation (52 hrs/year saved)
|
|
|
|
**Effort:** 2 hours
|
|
**Risk reduced:** HIGH
|
|
**Implementation:**
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
services:
|
|
api:
|
|
logging:
|
|
driver: "json-file"
|
|
options:
|
|
max-size: "10m"
|
|
max-file: "3"
|
|
|
|
db:
|
|
logging:
|
|
driver: "json-file"
|
|
options:
|
|
max-size: "10m"
|
|
max-file: "3"
|
|
```
|
|
|
|
**Verification:** Check log sizes after 1 week, confirm capped at 30MB per container.
|
|
|
|
### 3. Endpoint Events Retention (26 hrs/year saved)
|
|
|
|
**Effort:** 2 hours (similar to audit log)
|
|
**Risk reduced:** HIGH
|
|
**Implementation:** Similar procedure as audit log, 30-day retention for events.
|
|
|
|
### 4. Automated Backup with Rotation (56 hrs/year saved)
|
|
|
|
**Effort:** 6 hours
|
|
**Risk reduced:** CRITICAL
|
|
**Implementation:**
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# /opt/shopdb/backup-rotation.sh
|
|
|
|
DATE=$(date +%Y%m%d_%H%M)
|
|
BACKUP_DIR=/mnt/backups/shopdb
|
|
RETENTION_DAYS=30
|
|
|
|
# Create backup
|
|
docker compose exec db mysqldump -u root -p$MYSQL_ROOT_PASSWORD shopdb | \
|
|
gzip > $BACKUP_DIR/shopdb-$DATE.sql.gz
|
|
|
|
# Remove old backups
|
|
find $BACKUP_DIR -name "shopdb-*.sql.gz" -mtime +$RETENTION_DAYS -delete
|
|
|
|
# Copy to offsite (USB or work PC)
|
|
rsync -av $BACKUP_DIR/ /mnt/offsite-backups/shopdb/
|
|
```
|
|
|
|
**Schedule:** Daily at 2 AM via cron
|
|
**Verification:** Weekly restore test to dev VM, confirm data integrity
|
|
|
|
### 5. check-naming-and-style.sh Optimization (DONE)
|
|
|
|
**Effort:** 2 hours
|
|
**Savings:** Script runtime 5x faster (10s -> 2s)
|
|
**Status:** Committed 2026-09-11 (commit 4943e182c3)
|
|
|
|
**Impact:** 10-15 minutes saved per commit = ~26 hrs/year for team
|
|
|
|
### 6. Pre-commit Hook Integration
|
|
|
|
**Effort:** 1 hour
|
|
**Savings:** Catches violations before push = 26 hrs/year
|
|
**Implementation:**
|
|
|
|
```bash
|
|
# .git/hooks/pre-commit
|
|
#!/bin/bash
|
|
bash scripts/check-naming-and-style.sh || exit 1
|
|
pytest tests/ -x || exit 1
|
|
```
|
|
|
|
### 7. Snapshot Management Skill (DONE)
|
|
|
|
**Effort:** 4 hours
|
|
**Savings:** 52 hrs/year
|
|
**Status:** `/vm-snapshot` skill created 2026-09-11
|
|
|
|
**Usage:**
|
|
```bash
|
|
/vm-snapshot create "before-deploy-2026-09-11"
|
|
/vm-snapshot list
|
|
/vm-snapshot restore "before-deploy-2026-09-11"
|
|
```
|
|
|
|
**Total Quick Wins:** 7 items, 21 hours effort, **264 hrs/year saved**, 3 CRITICAL risks reduced
|
|
|
|
## Long-Term Improvements (Planned)
|
|
|
|
### 1. Agent Delta Updates (Q1 2027)
|
|
|
|
**Current:** Agent POSTs full inventory (11KB) every 30 seconds
|
|
**Proposed:** POST only deltas (added/removed apps, IP changes) = ~500 bytes
|
|
|
|
**Savings:**
|
|
- 99% reduction in network traffic (17GB/day -> 170MB/day for 500 endpoints)
|
|
- 99% reduction in database writes (only changed data)
|
|
- Performance: Collector API load reduced from 1.44M requests/day to ~14K writes/day
|
|
|
|
**Effort:** 40 hours (agent changes + server changes + testing)
|
|
|
|
### 2. Automated Staging Tests (Q4 2026)
|
|
|
|
**Current:** Manual smoke testing after each deploy
|
|
**Proposed:** Automated tests run in test VM before production deploy
|
|
|
|
**Savings:** 50-100 hrs/year (from deployment coordination)
|
|
**Effort:** 20 hours (test suite + CI integration)
|
|
|
|
### 3. Per-Endpoint Certificate Pinning (Q4 2026)
|
|
|
|
**Current:** Certificate validation disabled (security risk)
|
|
**Proposed:** Each endpoint validates server cert against pinned thumbprint
|
|
|
|
**Savings:** Eliminates CRITICAL security risk
|
|
**Effort:** 40 hours (agent changes + deployment script + mass agent update)
|
|
**Status:** Planned (see Security-Audit-2026-09-11.md)
|
|
|
|
## Monitoring & Alerting
|
|
|
|
**Current:** Reactive (users report issues)
|
|
**Proposed:** Proactive monitoring via `/production-health` skill
|
|
|
|
**Metrics to monitor:**
|
|
- Database disk space (alert at 85%)
|
|
- Docker log sizes (alert if rotation failing)
|
|
- Audit log row count (alert if growing >10K rows/day)
|
|
- Endpoint reporting (alert if >10 endpoints offline >48 hours)
|
|
- API error rate (alert if >1% requests fail)
|
|
- Backup age (alert if last backup >24 hours old)
|
|
|
|
**Implementation:** Cron job runs `/production-health` daily, sends email/Slack on failures
|
|
|
|
**Effort:** 8 hours
|
|
**Savings:** 52 hrs/year (from reactive troubleshooting to proactive alerts)
|
|
|
|
## References
|
|
|
|
- Security Audit 2026-09-11: 4 critical + 6 high vulnerabilities, some fixed, some planned
|
|
- Architectural Findings 2026-09-11: 22 findings (6 critical, 6 high) from Gortex analysis
|
|
- Automation Skills: 13 skills created in `.claude/skills/` directory
|
|
- Deployment Documentation: `docs/deployment/` and `.claude/setup/` guides
|
|
- ADR-004: Deployment Topology (air-gapped architecture)
|
|
- ADR-008: Plugin Migration Ownership (linear chain requirement)
|