Versioning & releases
Taranac is shipped as a small set of containers that run as one stack. To keep upgrades predictable, the project versions software along deployment boundaries, not along source directories. As an operator you mostly deal with one number — the platform version — plus an independent number for the optional push-MFA service. This page explains what each version covers, what actually guarantees compatibility, and where to read the running version and the applied database migration from the admin UI.
- v0.9.0
- v1.0.0-rc
- v1.0.0 migration → head
- v0.8.2
- v1.0.0
independent lines — not expected to match
The two version lines
Section titled “The two version lines”There are two independent version lines. They move on their own cadence and are not expected to match each other.
| Line | What it covers | Why these ship together |
|---|---|---|
| Platform | Backend, admin UI (frontend), captive portal, and the TACACS+, RADIUS and NAC daemons | They roll out as one stack from one docker-compose, under one Git tag. The daemons consume configuration generated by the backend, and the captive portal is configured by the backend — so the config format is contract-bound to the backend version and cannot be released separately. |
| taranac-mfa (push-MFA) | The optional push-authentication backend that talks to the mobile app | A separate service with its own database and process, reached over an HTTP API. It can be released on its own schedule. |
At the time of writing the platform line is at 1.0.8. Both lines follow a MAJOR.MINOR.PATCH (semantic-versioning) shape, but see What versions don’t tell you below — for an operator the contracts matter more than the number.
The platform version has a single source of truth: the VERSION file shipped in the deployment bundle (deploy/dist/VERSION), which is baked into the container images at build time. It is not a runtime .env value — you don’t set APP_VERSION in your environment; the version is fixed by the image tag you deploy. This removes any chance of the reported version drifting from the images actually running.
What a platform version covers
Section titled “What a platform version covers”A single platform version pins the whole AAA/NAC stack together: the admin UI you log into, the AAA engines that answer device requests, the captive-portal frontend, and — crucially — the database schema that backs all of it. When you move from one platform version to another, all of these move as a set. You should not run a backend of one version against a frontend or a daemon configuration of another; that combination is untested and unsupported.
Database migrations
Section titled “Database migrations”The platform stores its configuration and logs in a relational database. Each platform release that changes the schema ships one or more migrations — ordered, numbered scripts that bring an existing database forward to the new layout.
Migrations are applied automatically: on container startup the backend runs the pending migrations up to the latest (“head”) before the application begins serving. In practice this means an upgrade is pull the new images, restart the stack — the schema is brought current for you. You do not run migrations by hand in normal operation.
The migration cadence follows the release cadence: a release that needs a schema change includes the migration for it, so the applied migration on a healthy system corresponds to the platform version that introduced it.
Reading the version and migration in the admin UI
Section titled “Reading the version and migration in the admin UI”The dashboard’s System Info widget is the operator-facing place to read what is actually running. It shows:
| Field | Meaning |
|---|---|
| Version | The running platform version (the backend’s reported version). |
| Migration | The currently applied database schema revision (the Alembic migration “head”), shown as a short identifier. |
| Uptime | How long the backend process has been running. |
| Timezone / clock | The system timezone and a live server clock. |
The dashboard System Info widget reports the running platform version and the applied schema migration.
The platform version is also shown in the admin-UI footer (as v<version>) and on error pages, so it is visible even when you are not on the dashboard.
For automation and health checks, the backend exposes HTTP probes:
GET /healthz → { "status": "ok" } # liveness onlyGET /ready → { "status": "healthy", "version": "1.0.8", "uptime_seconds": 1234, "checks": { "database": "ok", "master_key": "loaded" } }/healthz is a bare liveness probe and returns no version. The version, uptime and component health live on /ready — use that endpoint if you want to read the running version programmatically. status is healthy only when the database is reachable and the master key is loaded; otherwise it reports degraded.
What versions don’t tell you
Section titled “What versions don’t tell you”A version number does not, by itself, guarantee that two components will interoperate. Real compatibility lives in contracts:
- Backend ↔ TACACS+/RADIUS/NAC daemons — the format of the configuration the backend generates for the daemons.
- Backend ↔ taranac-mfa — the HTTP API between them.
Bumping a number does not protect against a broken contract, and matching numbers across the two version lines do not imply compatibility. This is why the platform components are versioned and released as one unit: it removes the question of “which backend goes with which daemon” entirely. For push-MFA, keep the taranac-mfa service and the mobile app on releases that share the same API contract.
Upgrading: what to check
Section titled “Upgrading: what to check”When you upgrade the platform:
- Back up first (configuration and database) — see Backups & upgrades.
- Pull the new platform images and restart the stack. Pending migrations apply automatically on startup.
- Confirm the result in System Info: the Version should reflect the new release and Migration should advance to the new head.
/readyshould reporthealthy.
When you upgrade the push-MFA service, treat it as its own unit: its version moves independently, and what matters is that its API contract stays compatible with the mobile app in use.
Reference: version summary
Section titled “Reference: version summary”| Aspect | Platform line | taranac-mfa line |
|---|---|---|
| Covers | Backend, admin UI, captive portal, TACACS+/RADIUS/NAC daemons, database schema | Push-MFA backend |
| Released as | One Git tag, one stack | Separate service, own cadence |
| Where shown to operators | System Info widget, UI footer, /ready | (separate service surface) |
| Compatibility guaranteed by | Generated-config contract; shipped as one set | HTTP API contract with the mobile app |
| Current value | 1.0.8 | 1.0.0 |
Related
Section titled “Related”- Backups & upgrades — the recommended backup-then-upgrade procedure.
- Architecture — how the platform components and daemons fit together.
- Settings reference — configuration surface of the platform.
- Taranac on GitHub — the deployment bundle, releases and tags.