Repository navigation
Releases: PhoenixTechMSP/phoenix-nexus
Release list
Phoenix-Nexus 2.0.0-alpha.1
2.0.0-alpha.1 - Phoenix Nexus (ITAM + CMDB + SAM)
Fixed
- Clean shutdown: the server now handles SIGTERM and SIGINT (stops accepting connections, finishes in-flight requests, checkpoints and closes SQLite). Before, inside a container it ignored the stop signal and was killed after 10 s, which slowed every restart, deployment and rollback.
Added
- New brand: the colour phoenix mascot replaces the line logo in the header, the login page and the favicon. A loading screen (pulsing mascot) shows while the app starts and while the Dashboard and Forecast load. GitHub banners (light and dark) and the social preview image are in
docs/brand/. - Licence: Community is released under AGPL-3.0-only (
LICENSE), with a commercial licence available (COMMERCIAL.md).
Community files:CODE_OF_CONDUCT.md, issue and pull request templates, private vulnerability reporting inSECURITY.md,
publicROADMAP.md(Community / Pro split). - Numbered database migrations with an automatic backup before each upgrade (
ptx.db.pre-v<N>-<date>.bak, last 5 kept),
one transaction per migration, and a refusal to start on a database newer than the application. SeeUPGRADING.md. - CI/CD (
deploy/CICD.md):developdeploys to UAT,mainto production after manual approval, image published to
ghcr.io, automatic rollback, smoke test after each deployment. Release workflow on version tags (RELEASING.md). - Zero-configuration first start (Docker): without
JWT_SECRET, a strong secret is generated once and kept in the data volume;
on an empty database an administrator is created (ADMIN_EMAIL/ADMIN_PASSWORD, or a random password shown once in the logs);
SEED_SAMPLE=1loads fictional sample data without public accounts and never erases anything. Never changes an existing account. deploy/docker-compose.prod.ymland.env.prod.example: install on your own server from the published image, automatic HTTPS,
no demo mode. README "Get started" with three paths (live demo, run locally, install on a server).
Fixed
- Dark mode: low-stock rows, error banners and the dashboard alert used fixed light backgrounds with light text (unreadable). They now use theme tokens
(--warn-*,--error-*,--danger-text,--success-text), checked at WCAG AA (4.5:1) in both themes by a test. multerupgraded from 1.x to 2.x (1.x is deprecated and has published vulnerabilities in upload handling). Import behaviour is unchanged.- Upgrading from a very old database crashed at startup: SQLite refuses
ADD COLUMN ... UNIQUE(users.oid). The column is now
added first and a unique index created separately.
Added (earlier in this alpha)
-
CMDB (
/api/cmdb, page CMDB): configuration items fed one-way from the asset lifecycle
(ITAM to CMDB, never the reverse), relationships stored only in the CMDB, archived (not deleted)
when an asset is retired. Existing instances are reconciled at startup (idempotent). -
SAM (
/api/sam, page SAM): software products, entitlements and assignments, with the licence
position (entitled minus consumed), status per product (compliant, oversized, limit reached,
over-deployed, no entitlement), savings identified, compliance exposure and renewals within 90 days.
The contract metric decides what consumes a licence (per agent or per asset) and is enforced server-side. -
categories.equipment_class(Nominative / Infrastructure) and anintegration_eventsoutbox table. -
Demo data:
scripts/seed-dummy-data.jsandscripts/seed-sam-demo.js(fictional, idempotent,
renewal dates relative to today). -
Test suite (
node --test server/test/*.test.js, no new dependency) and real-browser scenarios
(scripts/e2e/run.sh cmdb|sam, Playwright, temporary database). -
Phoenix logo on the login page, in the header and as the favicon. Two colours: the brand red
(#C00000) on light surfaces and a lighter red (#E5484D) on dark ones, because the brand red only
reaches 2.7:1 on the dark header and login card (WCAG asks 3:1 for graphics) while the lighter red
reaches 4.4 to 4.6:1. The stroke is thickened on small sizes (the source line is 12 px thick, which
becomes a 0.5 px hairline at header size). Images are generated byscripts/brand/make-assets.py
fromscripts/brand/phoenix-logo-source.png(2.9 to 19 KB each instead of 60 KB). -
.gitignore(secrets, SQLite databases and their WAL/SHM files,node_modules,data,dist) and two
tests that fail if git ever tracks.env, a database ornode_modules. The first public commits had
none of this: agit add .had published.env,data/ptx.dband 7,470node_modulesfiles. -
Public demo deployment (
deploy/): Docker Compose with Caddy (automatic HTTPS),DEPLOY.mdrunbook,
update and nightly-reset scripts.DEMO_MODE=1shows shared demo accounts on the login page, a banner, a 28-day
synthetic history so the dashboard and forecast are not empty, and disables file imports (thexlsxlibrary
has a known vulnerability: nobody should be able to upload on a public instance). -
Security hardening: production refuses placeholder or short
JWT_SECRETvalues (the value in.env.exampleand the old
compose default were public); login attempts are rate-limited (8 failures per account and address, 40 per address,
per 15 minutes) andTRUST_PROXYmakes that work behind a reverse proxy; security headers; mistyped login input is a
400 instead of a 500. -
Test suite: 143 server tests (API smoke over every read route and both Excel exports, security, demo mode, real
process startup, translations, deployment files, client API helper) and five real-browser suites (npm run test:e2e):
a crawl of every page in 3 languages, 2 themes and 3 roles, business flows, demo mode, CMDB and SAM.
scripts/smoke.mjs <url>checks any deployed instance with Node alone. GitHub Actions (.github/workflows/ci.yml) runs
everything on each push.
Fixed
- The Forecast page was broken:
/api/events/forecastreturned 500 (ambiguous column name: department_id) and the page
swallowed the error and showed nothing. - A wrong password showed no message: the API helper treated the 401 of a failed login as an expired session and reloaded
the login page, erasing the error. - The server never started on Windows: the "is this the main module" test compared
import.meta.urlto
file://plus the path, which can never match a Windows path (C:\...). It now usespathToFileURL. - Adding an agent with a duplicate badge failed silently (no error handling in the page).
- A failed Excel export (server error, expired session) was saved as a
.xlsxfile containing JSON; it now shows an error. - Import silently turned
in_useintoavailable(the status normaliser stripped the underscore).
Both the classic and the guided importer now readin_use,in useandIN-USE. - API errors no longer leak SQLite table/column names (
UNIQUE constraint failed: ...): shared helper
inserver/lib/errors.jsapplied to every route that returned the raw message. server/index.jsno longer starts listening on import, so the app can be tested.- A guided-import dry run can no longer write anything, CMDB reconciliation included.
Changed
- Renamed the product to Phoenix-Nexus (formerly Site Asset Manager): interface, page title,
package (phoenix-nexus2.0.0-alpha.1), Docker image/container/service, installers and documentation.
Kept on purpose so existing installations upgrade with no migration: the database fileptx.db, the
Windows servicePTXFleet, theptxsystem user in the image and theptx_tokenbrowser key.
Docker upgrade from a version before 2.0: rundocker compose downfirst (the container name changed). - The README no longer calls the asset inventory a "CMDB": it is the ITAM module, the CMDB is its own module.
- Excel inventory snapshot is now
phoenix-nexus-inventory-<date>.xlsx(wassite-cmdb-<date>.xlsx). - All em-dashes replaced by plain hyphens across code, pages and documentation.
- Header spacing is tighter below 1200 px so that, logo included, the header still fits on one line
down to 1060 px (it needed 1070 px before the logo existed). - Amounts in the SAM page follow the language chosen in the app, not the browser locale.
Security
xlsx(SheetJS from npm) has known high-severity advisories with no npm fix: restrict who can
upload spreadsheets or move to the vendor distribution before exposing the import to untrusted users.
Image: ghcr.io/phoenixtechmsp/phoenix-nexus:2.0.0-alpha.1
Upgrading: see UPGRADING.md. A database backup is made automatically before any migration.