Full health check: fix startup crash, add subnet input to network discovery

Server fixes:
- database.js: auto-create data/ directory on startup — was crashing on
  fresh clone because the gitignored directory didn't exist
- better-sqlite3 upgraded to latest (13.x) for Node 26 compatibility

Network discovery:
- discoverNetwork() accepts optional subnet param; scans that range instead
  of auto-detecting when provided
- New GET /api/network-subnets endpoint returns detected local interfaces
  so UI can offer quick-select buttons
- Discovery modal: subnet text input + Scan button + auto-detect quick-select;
  local subnet buttons populate once the modal is open
- server/index.js: pass subnet from request body to discoverNetwork()

Infra:
- React client runs on PORT=3456 in dev to avoid port conflicts
- .claude/launch.json added for one-command preview via Express (serves
  the pre-built client, no port conflict with the preview tool)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nmemmertandClaude Sonnet 4.6 committed 2026-08-06 17:21:34 -04:00
1 parent 59078362da
commit f119168399
14 files changed
+119 -427

No files matched your search

+12 -2
View File
@@ -13,7 +13,7 @@ const notificationService = require('./notificationService');
const cache = require('./cache');
const security = require('./securityMiddleware');
const metrics = require('./metrics');
const { discoverNetwork } = require('./networkDiscovery');
const { discoverNetwork, getLocalSubnets } = require('./networkDiscovery');
const auditLog = require('./auditLog');
// Initialize notifications table if it doesn't exist
@@ -1541,7 +1541,8 @@ app.post('/api/test-ntfy', async (req, res) => {
// Network discovery — scan local network for monitorable hosts
app.post('/api/network-discovery', async (req, res) => {
try {
const hosts = await discoverNetwork();
const { subnet } = req.body || {};
const hosts = await discoverNetwork(subnet || null);
res.json({ hosts });
} catch (error) {
console.error('Network discovery error:', error);
@@ -1549,6 +1550,15 @@ app.post('/api/network-discovery', async (req, res) => {
}
});
// Return detected local subnets so the UI can offer them as quick-select options
app.get('/api/network-subnets', (req, res) => {
try {
res.json({ subnets: getLocalSubnets() });
} catch (e) {
res.json({ subnets: [] });
}
});
// Clear cache endpoint for debugging
app.post('/api/cache/clear', (req, res) => {
cache.clear();