5 KiB
Sawa Control Panel — Issues & Decisions
Track open questions, known problems, and architectural decisions here.
Open Issues
ISSUE-001 — sudo whitelist scope
Status: Partially resolved ✅
Note: Sudoers whitelist deployed. Panel still runs as root via PM2 — migration to panel user pending.
ISSUE-002 — Client cert distribution to mobile
Status: Open
Priority: High
Installing a client certificate on Android/iOS requires PKCS12 (.p12) format. Script generates .p12 correctly. Transfer mechanism not yet implemented.
Options:
- One-time HTTPS download endpoint on server (auto-deletes after download)
- AirDrop (iOS only)
- Manual USB transfer
ISSUE-003 — Service status parsing reliability
Status: Open
Priority: Medium
rc-service <name> status returns inconsistent output across services. Should normalize to started | stopped | crashed | unknown.
Suggested fix: Use rc-status instead — returns structured view of all services in one call.
ISSUE-004 — Build and deploy workflow
Status: Resolved ✅
deploy.ps1 implemented. Tar+gzip bundles, single file upload per component, server-side extract. Flags: -All -Backend -Frontend -Nginx -Certs.
ISSUE-005 — wlan0 fails on boot
Status: Open — low priority
wpa_supplicant starts before WiFi hardware is ready. sleep 5 pre-up workaround in /etc/network/interfaces — not yet confirmed stable across reboots.
ISSUE-006 — Diskless/RAM mode not configured
Status: Open — planned
Currently in sys mode. USB wear reduction requires diskless conversion. Test on spare USB clone first — never on master.
ISSUE-007 — Disk usage shows corrupt data intermittently
Status: Open
Priority: High — fix in Phase 4
Disk panel shows / at 445% full with 224GB size, then snaps back to correct values on next poll. Virtual/pseudo filesystems leaking through filter in systemInfo.js.
Fix: Filter by filesystem type — only include ext4, ext3, xfs, btrfs, vfat. Exclude tmpfs, devtmpfs, sysfs, proc, cgroup, overlay, and any mount where size is 0.
ISSUE-008 — MariaDB restart shows false error in UI
Status: Open — cosmetic
Priority: Low
Panel shows error dialog on MariaDB restart:
/usr/bin/mysqld_safe: Deprecated program name.
Use 'mariadbd-safe' instead.
* ERROR: mariadb failed to start
Service actually starts correctly. Exit code is non-zero due to deprecation warning being misread as failure.
Fix: In rcService.js, treat this specific stderr pattern as warning not error for mariadb.
ISSUE-009 — TLS 1.3 incompatible with nginx mTLS client cert request
Status: Resolved ✅
With TLS 1.3, nginx never sends CertificateRequest — browsers never prompt for or send client cert. Fixed by setting ssl_protocols TLSv1.2; in sawa-panel.conf. Revisit when nginx adds proper TLS 1.3 post-handshake auth support.
ISSUE-010 — Rogue default.conf intercepted mTLS requests
Status: Resolved ✅
/etc/nginx/conf.d/default.conf had a listen 443 ssl catch-all block with no mTLS, intercepting all requests before sawa-panel.conf. Deleted. http.d/default.conf (port 80 → 404) retained.
Prevention needed: Deploy script should warn about conflicting 443 server blocks.
Resolved Decisions
DECISION-001 — Authentication: nginx mTLS ✅
Client certificates only. No login page. Unauthorized devices get TLS handshake failure.
DECISION-002 — Frontend: React + Vite + Tailwind CSS ✅
DECISION-003 — Backend: Node.js + Express ✅
DECISION-004 — Database stack convention ✅
| Use case | Database |
|---|---|
| WordPress, Laravel | MariaDB |
| Node.js apps | PostgreSQL |
| Sessions, queues | Redis (RDB+AOF) |
| Pure caching | Memcached |
DECISION-005 — Panel on LAN only, port 443 ✅
DECISION-006 — Phase 4 UI redesign ✅
- Header: persistent CPU% + RAM% + Uptime + Live dot
- Sidebar: collapsible sections — System / Services (tree) / Websites
- Services: toggle switches, each service gets own detail page
- Websites: add/remove form + enable/disable toggles
- Per-service pages: relevant stats + controls (pgAdmin iframe for PostgreSQL, phpMyAdmin for MariaDB — Phase 5)
Technical Debt
- Panel runs as
rootvia PM2 — migrate topaneluser noatimenot set on fstab — USB write wear pending- Diskless mode not configured — ISSUE-006
- MariaDB deprecated binary warning — ISSUE-008
resolv.confnot protected fromnetworking restartoverwritefirstboot.shclone logic not tested on real hardware clone- No log rotation — logs will grow unbounded
- SSH on port 22 — move to non-standard port to reduce scan noise
- Deploy script does not warn about conflicting nginx 443 server blocks
create-client.shuses temp file workaround for EKU extension — works but fragile