feat: #41-#47 admin root controls — enhanced pages + new APIs

#41 phpMyAdmin: quick-access links in database manager
#43 PostgreSQL: Adminer at /adminer.php (MySQL + PostgreSQL)
#44 Mail server: virtual domains list, mail log tail, better service controls
#45 FTP server: full account list from DB, better service controls
#47 Web server: stats cards, PHP defaults, log viewer

New APIs: system/read-log, email/domains
Fix: PHP-FPM pm.max_children increased to 20 (was 5, causing exhaustion)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LP9Q4kfCAYAjJnsbHBrViZ
This commit is contained in:
2026-06-22 12:20:42 +00:00
parent 8405772e01
commit 76726dc47c
3 changed files with 177 additions and 49 deletions
+16
View File
@@ -98,5 +98,21 @@ match ($action) {
Response::success(null, 'Autoresponder deleted');
})(),
'domains' => (function() use ($db) {
Auth::getInstance()->require('admin', 'reseller');
$user = Auth::getInstance()->user();
$clause = $user['role'] === 'reseller' ? "AND a.user_id IN (SELECT id FROM users WHERE reseller_id=".(int)$user['uid'].")" : "";
$rows = $db->fetchAll(
"SELECT d.domain, a.username, a.id as account_id,
(SELECT COUNT(*) FROM email_accounts WHERE account_id = a.id) as email_count
FROM dns_zones d
JOIN accounts a ON a.id = d.account_id
WHERE 1=1 $clause
ORDER BY d.domain"
);
Response::success($rows);
})(),
default => Response::error("Unknown email action: $action", 404),
};
+18 -1
View File
@@ -1057,5 +1057,22 @@ BASH;
exit;
})(),
default => Response::error("Unknown system action: $action", 404),
'read-log' => (function() {
Auth::getInstance()->require('admin');
$log = preg_replace('/[^a-z0-9-]/', '', $_GET['log'] ?? 'panel');
$map = [
'panel' => '/var/log/novacpx/panel.log',
'deploy' => '/var/log/novacpx/deploy.log',
'nginx-error' => '/var/log/novacpx/nginx-error.log',
'nginx-access' => '/var/log/novacpx/nginx-access.log',
'mail' => '/var/log/mail.log',
'stats' => '/var/log/novacpx/stats-collector.log',
];
$path = $map[$log] ?? '/var/log/novacpx/panel.log';
$raw = file_exists($path) ? trim(shell_exec('tail -100 ' . escapeshellarg($path)) ?: '') : '';
Response::success(['content' => $raw, 'log' => $log]);
})(),
default => Response::error("Unknown system action: $action", 404),
};