231 Commits

Author SHA1 Message Date
github-actions[bot] be3dbec68a chore: bump version to 1.0.78 [skip ci] 2026-07-21 00:47:36 +00:00
Myron Blair a299447c9c Revert "Remove Claude/Anthropic references from repo"
This reverts commit 35aa202a4f.
2026-07-20 19:47:21 -05:00
github-actions[bot] 25233b9496 chore: bump version to 1.0.77 [skip ci] 2026-07-21 00:32:56 +00:00
Myron Blair 35aa202a4f Remove Claude/Anthropic references from repo 2026-07-20 19:32:43 -05:00
github-actions[bot] 2beffd810d chore: bump version to 1.0.76 [skip ci] 2026-07-15 20:00:19 +00:00
NovaCPX Admin 3d2c7c25c2 fix: File Manager large uploads had no server-processing feedback and short nginx timeouts
Reaching 100% in the upload progress bar only means the browser finished SENDING the bytes to nginx - it does not mean the server has finished receiving/saving the file. For multi-GB files this gap was invisible, making a genuinely-still-working upload look frozen at 100 percent, leading to a premature reload (confirmed via nginx access log: status 499, client closed request).

nginx-panel.conf: added fastcgi_request_buffering off on the admin panels /api/ location so nginx streams the body straight to PHP-FPM instead of fully buffering it to a temp file first and reading it back (a full extra disk I/O pass for large files); also added client_body_timeout/fastcgi_send_timeout/send_timeout at 1800s alongside the existing fastcgi_read_timeout, since those are separate timeout phases that previously still defaulted to 60s.

admin.js: added an xhr.upload load-complete handler that switches the dialog to a clear "Finishing up on the server..." state once the send phase hits 100%, so large uploads no longer look stuck during the save phase.
2026-07-15 14:49:53 -05:00
github-actions[bot] 8adedb9759 chore: bump version to 1.0.75 [skip ci] 2026-07-15 19:34:25 +00:00
NovaCPX Admin 827a4e8297 fix: File Manager upload had no size limit for large files and no progress feedback
nginx-panel.conf: added client_max_body_size 20g at the http level (this nginx instance only serves the NovaCPX panel, isolated from the system nginx), and scoped generous PHP upload limits (upload_max_filesize/post_max_size 20G, execution/input time 1800s) to just the admin panels /api/ location via fastcgi_param PHP_VALUE - this avoids touching the shared php8.3-fpm www pool config used by other sites.

admin.js: rewrote fmSubmitUpload from fetch() (no progress support, and would throw uncaught on a non-JSON error body like an nginx 413 page) to XMLHttpRequest with a real progress bar (percent + bytes transferred) that stays visible for the whole transfer instead of the dialog closing immediately on click.
2026-07-15 14:33:36 -05:00
github-actions[bot] 14cb285209 chore: bump version to 1.0.74 [skip ci] 2026-07-15 19:20:34 +00:00
NovaCPX Admin d6321c3268 fix: File Manager upload never read target path from multipart POST/query string
upload only checked [path], which is parsed from JSON php://input and is always empty for multipart/form-data uploads. It silently fell back to a hardcoded /public_html, which does not exist at filesystem root - breaking uploads for the admin File Manager (baseDir=/) entirely, though it went unnoticed for regular hosting accounts since /public_html happens to be their real default. Now falls back through  and  as well.
2026-07-15 14:19:44 -05:00
github-actions[bot] bc691466cd chore: bump version to 1.0.73 [skip ci] 2026-07-15 19:02:50 +00:00
NovaCPX Admin bd4ac8426a feat: admin File Manager with root filesystem access + dangerous-path safety guard
- New File Manager page under Admin > System, built on the existing /api/files endpoint (admin sessions with no linked hosting account get baseDir=/, i.e. full filesystem).

- Fixed two baseDir=/ edge-case bugs in files.php: safe_path() double-slash prefix check, and list actions path stripping via str_replace corrupting every slash.

- Added download and chown actions to files.php.

- Added a server-enforced dangerous-path guard: write/delete/rename/chmod/chown/mkdir/upload/compress/extract targeting /etc,/boot,/root,/sys,/proc,/dev,/run,/lib*,/bin,/sbin,/var/lib,/snap are rejected with 409 unless confirm_dangerous=true is sent - matched by a client-side warning modal requiring a checkbox and typed CONFIRM.

- install.sh: added zip package (required by the existing compress action, was missing).
2026-07-15 13:50:05 -05:00
github-actions[bot] 85cbfd554c chore: bump version to 1.0.72 [skip ci] 2026-06-23 16:08:04 +00:00
myron 33c86171d6 fix: add null-coalescing defaults for all package update fields to suppress undefined key warnings 2026-06-23 16:07:47 +00:00
github-actions[bot] bc727eeedc chore: bump version to 1.0.71 [skip ci] 2026-06-23 04:28:02 +00:00
myron 7ecab86ef9 chore: gitignore adminer.php (500KB binary, deployed directly) 2026-06-23 04:27:52 +00:00
github-actions[bot] 7cce8cfef0 chore: bump version to 1.0.70 [skip ci] 2026-06-23 03:13:53 +00:00
myron 3a1746b0c0 fix: all 6 code review findings
1. admin.js: dashboard setTimeout was after return (dead code) — restructured
   to assign template to const html, run setTimeout, then return html

2. DockerManager.php createStack: replaced SELECT LAST_INSERT_ID() with
   db->insert() which already returns lastInsertId correctly for SQLite

3. DockerManager.php setQuota: replaced ON DUPLICATE KEY UPDATE / VALUES()
   MySQL syntax with SQLite-compatible ON CONFLICT(user_id) DO UPDATE SET
   excluded.col syntax

4. post-restore.sh: PHP helper file now written ONCE at start of step 4
   before any call to it (was written AFTER first call, causing silent failure)

5. post-restore.sh: git pull exit code now captured before pipeline (the
   while-read loop always exited 0, masking pull failures)

6. uninstall.sh: tar backup now aborts on failure (previously 2>/dev/null
   swallowed errors and rm -rf destroyed source unconditionally); also
   rm -f → rm -rf for .service.d drop-in directory
2026-06-23 03:13:42 +00:00
github-actions[bot] cba75b3356 chore: bump version to 1.0.69 [skip ci] 2026-06-23 01:53:43 +00:00
myron d24ea40505 feat: merge Dashboard + Server Status (careful surgical approach)
- Added history chart to dashboard: fetches stats/server API, renders
  24-hour CPU/RAM/Disk chart with Chart.js lazy-loaded
- setTimeout properly INSIDE function before closing brace
- Removed ONLY serverStatus() function body (2521 chars), kept initStatsChart
- pages object redirects server-status → dashboard
- Removed server-status from admin sidebar nav
- All 26 functions intact, backticks balanced, accounts/packages/DNS all kept
2026-06-23 01:53:35 +00:00
github-actions[bot] 18971f7f10 chore: bump version to 1.0.68 [skip ci] 2026-06-23 00:50:59 +00:00
myron e805e55120 feat: #40 Linux uninstaller
- Full backup before removal: DB, all account home dirs, nginx vhosts,
  SSL certs, DNS zones, mail config, logs, systemd units, cron jobs
- Backup compressed to /tmp/novacpx-uninstall-backup-TIMESTAMP.tar.gz
- Prints scp command + temp HTTP server option to download backup
- Requires confirmation (or --yes flag to skip)
- Removes: hosting accounts + Linux users, PHP-FPM pools, nginx vhosts,
  novacpx-web systemd unit, sudoers rules, cron jobs, opendkim keys,
  DNS zones, postfix virtual tables, fail2ban filters
- Removes all NovaCPX directories: /srv/novacpx /opt/novacpx-src
  /opt/novacpx /var/lib/novacpx /var/log/novacpx /etc/novacpx
- Restores nginx default site
- Leaves base services (nginx, php-fpm, postfix, etc.) running
- Usage: bash uninstall.sh [--yes]
2026-06-23 00:50:50 +00:00
github-actions[bot] b29a988129 chore: bump version to 1.0.67 [skip ci] 2026-06-23 00:43:12 +00:00
myron 87281cb923 feat: #50 improved post-restore script v2
- Cleans orphaned DB user records before recreating webacct
- Handles both orphaned-Linux-user and orphaned-DB-user cases
- Pulls latest NovaCPX code + runs migrations
- Bumps PHP-FPM pm.max_children to 20 if still at default 5
- Creates /tmp/_nova_create_webacct.php helper separately (avoids here-doc PHP issues)
- Deploys both index.html and notes.php from web-dashboard repo
- Disables Apache2 if running
- --no-git flag to skip code pull
- Comprehensive logging with ✓/⚠ indicators
2026-06-23 00:43:04 +00:00
github-actions[bot] 5d9fc30124 chore: bump version to 1.0.66 [skip ci] 2026-06-22 23:59:08 +00:00
myron a98f08e45a fix: add Adminer install/remove handler to db-tools-stream; fix sudo tty for phpMyAdmin 2026-06-22 23:58:59 +00:00
github-actions[bot] c872ee2449 chore: bump version to 1.0.65 [skip ci] 2026-06-22 21:29:23 +00:00
myron 568e0a0891 feat: #41 #43 — phpMyAdmin + Adminer + PostgreSQL in DB Manager
- Adminer installed at /adminer.php (MySQL + PostgreSQL)
- db-tools API now detects adminer.php file and returns its URL
- Tool cards: phpMyAdmin, Adminer (MySQL/PG), pgAdmin4
- Open buttons use API-provided URL (adminer.php for Adminer)
- Separate MySQL and PostgreSQL database sections in DB Manager
- PostgreSQL section has direct link to Adminer PG mode
- #42 Docker: already complete (full docker page with all tabs)
2026-06-22 21:29:12 +00:00
github-actions[bot] 732b7d16ca chore: bump version to 1.0.64 [skip ci] 2026-06-22 21:20:07 +00:00
myron e209df0dc2 revert: restore admin.js to last known-good state (01b0995) 2026-06-22 21:19:54 +00:00
github-actions[bot] 9691cc0853 chore: bump version to 1.0.63 [skip ci] 2026-06-22 21:13:39 +00:00
myron 42055ccdcc fix: dashboard setTimeout inside function, history chart properly merged 2026-06-22 21:13:28 +00:00
github-actions[bot] 2327f1b958 chore: bump version to 1.0.62 [skip ci] 2026-06-22 19:13:17 +00:00
myron 3ca3a1dae6 fix: surgical dashboard merge — only remove serverStatus(), keep all other pages
Previous merge accidentally deleted 38KB of page functions (accounts, packages,
DNS, etc.) by using wrong boundary. This time only removes the serverStatus()
function body. Dashboard now includes history chart + setTimeout to render it.
All other pages intact.
2026-06-22 19:13:07 +00:00
github-actions[bot] a91b67de10 chore: bump version to 1.0.61 [skip ci] 2026-06-22 19:03:57 +00:00
myron d39559a058 feat: merge Dashboard + Server Status into one page (admin panel) 2026-06-22 19:03:41 +00:00
github-actions[bot] 01b099509f chore: bump version to 1.0.60 [skip ci] 2026-06-22 14:24:25 +00:00
myron 844f571231 fix: docker catalog CHECK constraint — change status='starting' to 'pending'
'starting' is not in the CHECK constraint list. Using 'pending' which is
already set by the INSERT in createStack (the UPDATE was redundant anyway).
2026-06-22 14:24:12 +00:00
github-actions[bot] 06e43b1297 chore: bump version to 1.0.59 [skip ci] 2026-06-22 12:51:59 +00:00
myron 960a29f508 fix: image-remove use POST not DELETE (body was stripped by proxy); keep list visible on refresh 2026-06-22 12:51:49 +00:00
github-actions[bot] 63ec5f48b3 chore: bump version to 1.0.58 [skip ci] 2026-06-22 12:44:59 +00:00
myron 6aa96e6265 fix: docker container actions update row immediately (optimistic UI), keep list visible during reload
- Row badge updates to 'stopping…'/'starting…' instantly on click
- Buttons disabled while action runs so no double-clicks
- List stays visible while refreshing after action (no blank flash)
- container-remove changed to POST so body passes through proxies correctly
2026-06-22 12:44:45 +00:00
github-actions[bot] 12e03304af chore: bump version to 1.0.57 [skip ci] 2026-06-22 12:32:56 +00:00
myron 1c4a06d31e fix: docker image-remove throws on daemon error; add sync-orphans endpoint
- removeImage now throws RuntimeException when docker rmi output contains
  'Error' or 'conflict' so the API returns success:false with the message
- Added docker/sync-orphans endpoint (admin only) to register existing
  Docker containers not tracked in the NovaCPX DB (e.g. after a restore)
2026-06-22 12:32:45 +00:00
github-actions[bot] 55f5fc1da9 chore: bump version to 1.0.56 [skip ci] 2026-06-22 12:24:20 +00:00
myron b00cf10120 fix: escape apostrophe in FTP empty-state string — caused SyntaxError in template literal 2026-06-22 12:24:07 +00:00
github-actions[bot] e88a5e6fdc chore: bump version to 1.0.55 [skip ci] 2026-06-22 12:21:05 +00:00
myron 76726dc47c 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
2026-06-22 12:20:53 +00:00
github-actions[bot] 8405772e01 chore: bump version to 1.0.54 [skip ci] 2026-06-22 05:11:11 +00:00
myron 6b59730bec fix: user account settings page — use stats/account instead of forbidden accounts/usage+me 2026-06-22 05:11:00 +00:00