Releases: innotelinc/zeus
Release list
Zeus v1.3.1
Zeus v1.3.1 — generated by the release pipeline.
Docker images (published to GHCR by this run):
ghcr.io/innotelinc/zeus:v1.3.1(portal) +:latestghcr.io/innotelinc/zeus:v1.3.1-fullstack(Asterisk + FreePBX) +:latest-fullstack
Artifacts
- Source bundle (
zeus-source-bundle.tar.gz+ checksum) - Deployment payload (
zeus-deployment.tar.gz+SHA256SUMS)
Zeus v1.3.0
Zeus v1.3.0 — generated by the release pipeline.
Docker images (published to GHCR by this run):
ghcr.io/innotelinc/zeus:v1.3.0(portal) +:latestghcr.io/innotelinc/zeus:v1.3.0-fullstack(Asterisk + FreePBX) +:latest-fullstack
Artifacts
- Source bundle (
zeus-source-bundle.tar.gz+ checksum) - Deployment payload (
zeus-deployment.tar.gz+SHA256SUMS)
Zeus v1.2.0
Zeus v1.2.0 — generated by the release pipeline.
Docker images (published to GHCR by this run):
ghcr.io/innotelinc/zeus:v1.2.0(portal) +:latestghcr.io/innotelinc/zeus:v1.2.0-fullstack(Asterisk + FreePBX) +:latest-fullstack
Artifacts
- Source bundle (
zeus-source-bundle.tar.gz+ checksum) - Deployment payload (
zeus-deployment.tar.gz+SHA256SUMS)
Zeus v1.1.1
Zeus is the TelephonyOps platform of the Innotel Platform Stack — PBX, SMS, and voice.
Zeus v1.1.0
Zeus v1.1.0 — generated by the release pipeline.
Docker images (published to GHCR by this run):
ghcr.io/innotelinc/zeus:v1.1.0(portal) +:latestghcr.io/innotelinc/zeus:v1.1.0-fullstack(Asterisk + FreePBX) +:latest-fullstack
Artifacts
- Source bundle (
zeus-source-bundle.tar.gz+ checksum) - Deployment payload (
zeus-deployment.tar.gz+SHA256SUMS)
v0.5.0 — Admin portal, dynamic plans & GHCR image publishing
Highlights
- Full-stack image publishing — the Asterisk + FreePBX image is now built and pushed to GHCR (
ghcr.io/innotelinc/pbx-portal:*-fullstack) automatically on every push to master and on releases.docker-compose.full.ymlpulls the prebuilt image, so fresh deployments start in minutes instead of a 45-90 min local build (docker-compose.full.build.ymlretains the local-build path). - Admin portal — admin user CRUD, dynamic plan management with Stripe price auto-sync, billing fixes, password change.
- Dashboard rewrite — modern UI with light/dark theme toggle, live device-state polling, loading skeletons, health dashboard page.
- Phone management — number release, FreePBX extensions API restored (GQL patches, OAuth scopes, portal schema).
- Softphone / WebRTC — AMI Originate & Hangup, configurable WSS URL (settings UI + ws.innotel.us), WSS cert regeneration, PJSIPShowEndpoint event parsing, many stability fixes.
Fixes
- Demo login — runtime-generated hash + self-healing seed repair
- AMI handler crash on Local-channel calls (call_history user_id NULL)
- Asterisk watchdog + FreePBX module repair + MariaDB persistence
- FreePBX module persistence across reboots and rebuilds
- AMI health probe (ping-based), reconnect race removed, AMI credential sync on startup,
ucp_eventsuser restore - Health probes — VoIP.ms
getBalance, FreePBX HTTP connectivity check, run concurrently - Portal binds to 0.0.0.0 (fixes EADDRNOTAVAIL), stale root-owned data volume self-heal, AppArmor handling
- Theme-aware dropdowns, light-mode fixes, lazy-loaded softphone, session verification after login
Full changelog (37 commits)
$(git log v0.4.4..master --format='- %h %s')
v0.4.4 — Session persistence + fax stack fixes
Session persistence (critical fix)
- Fixed: Session cookie
secureflag was tied toNODE_ENV, which is"production"in Docker. Browsers refused to store/sendSecurecookies over HTTP, causing every page navigation after login to redirect back to/login(blank pages, forced re-auth). - Fix: Use explicit
SESSION_SECUREenv var (defaults tofalse). SetSESSION_SECURE=trueonly when behind HTTPS/TLS. - Added
.env.docker.examplewith all required environment variables documented.
Fax stack fixes
- sendfax: Bypass
hfaxdauthentication by writing jobs directly to the HylaFAXsendq/spool directory (fixes"Login failed: 500 PASS syntax error"). - fax status: Read
sendq//doneq/qfiles directly from spool instead of callingfaxstat(which requireshfaxdauth). - spool permissions: Create
sendq/,doneq/,docq/directories with770 uucp:uucpat startup. - cross-container: Base64-encode PDF content for portal→freepbx fax transfer (containers dont share filesystems).
FreePBX fixes
- UCP Node: Start
fwconsole ucpdaemon in entrypoint + add[ucp_events]AMI user (fixes "UCP Node is not running" in FreePBX dashboard). - Postfix: Start postfix in entrypoint + add
showqservice tomaster.cf(fixes"mailq: Queue report unavailable").
Docker / build
- IAXModem 1.3.5 + HylaFAX+ 7.0.11 compiled from source
- 4 virtual fax modems (
ttyIAX1-4) with matching IAX2 peers in Asterisk - AvantFax 3.4.1 web UI at
/faxvia PHP 7.4 FPM - IAX calltoken fix for local Asterisk connections
- Updated SourceForge download URLs (old
downloads.sourceforge.netpaths 404)
v0.4.2 — Full-stack runtime fixes
What's fixed
FreePBX API / OAuth2 module installed
- The
apimodule is now installed during the Docker build, providing the OAuth2 token endpoint and GraphQL API that the portal uses viasrc/lib/freepbx.ts - Auto-registers the portal as an OAuth2 client_credentials application on startup when
FREEPBX_CLIENT_IDandFREEPBX_CLIENT_SECRETare set
AMI secret wiring
- Fixed env var name mismatch: the entrypoint was looking for
AMI_SECRETbut the compose file passesFREEPBX_AMI_SECRET
Landing page cleanup
- Removed "7-day free trial" mentions from the landing page CTA
Previous fixes (v0.4.1)
- AppArmor
apparmor=unconfinedon all compose services - FreePBX FPM pool runs as asterisk user (fixes 503 on FreePBX UI)
- Removed phantom avantfax service and redundant external mariadb
- FreePBX installer exit-code workaround
v0.4.1 — AppArmor fix
What's changed in v0.4.1
Patch release — ships the AppArmor fix that landed after v0.4.0.
- Disable AppArmor for compose services — Docker's
docker-defaultAppArmor profile can't be checked on sandboxed/containerized Docker hosts (unreadable/sys/kernel/security/apparmor), sodocker compose up/docker runfailed with "Could not check if docker-default AppArmor profile was loaded: permission denied". Addedsecurity_opt: [apparmor=unconfined]to all services indocker-compose.full.ymlanddocker-compose.yml.
Images
- Portal:
ghcr.io/innotelinc/pbx-portal:0.4.1(andlatest) - Full-stack:
ghcr.io/innotelinc/pbx-portal:0.4.1-fullstack
v0.4.0 — Build fix + full-stack CI
What's changed
Build fix (critical) — Restored a working production build on Next.js 16.3.0, which was crashing while prerendering synthetic error routes (_global-error, _not-found) and pages-router status pages (framework bug vercel/next.js #86177/#86178).
patches/next+16.3.0.patchapplied via patch-package (postinstallhook) — skips static generation of the broken synthetic/status routesforce-dynamicroot layout; customnot-found.tsxandglobal-error.tsxpages- Dockerfile copies
patches/beforenpm ciso the fix applies in Docker builds
CI/CD
- New full-stack
Dockerfile.fullbuild check job (Asterisk + FreePBX, 45–90 min) — runs weekly and via manual dispatch, deliberately not on every PR workflow_dispatchtrigger and weekly schedule addeddocker composevalidation for the full-stack compose file
Lint & tooling
- Switched ESLint to
eslint-config-nextflat configs directly (FlatCompat was broken on ESLint 9); fixed all lint errors (set-state-in-effect, unused vars/imports across API routes and libs)
Docs & config
- README updated with the build workaround, error pages, and release process
- Removed
NODE_ENVfrom env example files (Next.js warns against setting it)
Images
- Portal:
ghcr.io/innotelinc/pbx-portal:0.4.0(andlatest) - Full-stack:
ghcr.io/innotelinc/pbx-portal:0.4.0-fullstack