Skip to content
All work

Case study 13 / 17CI/CD DevOps

Single-source runtime configuration for air-gapped installations

Each offline install reads every setting from one file at startup: no rebuilds, no values baked into code, and a build guard on what ships.

Stack

  • Next.js
  • TypeScript
  • Node.js
  • PowerShell
  • Windows batch
  • nginx
  • CesiumJS

01 · How it works

  • TodaytoChanged in this work
  • Data flow

What it does

The monitoring platform runs on-premises: each customer has an isolated server with no internet access, running the API, the web client, the 3D map service and two databases.

Read more

I made one set of files the single source of every setting, each value defined once and read at startup. A build guard now prevents values, and data, from being baked into the code or the package again.

7 connections· select a part to trace it
  1. Per-install config files to Key table: read once at startup
  2. Key table to API: values; names missing keys
  3. Per-install config files to Runtime config script: browser values at startup
  4. Runtime config script to Web client: loads before the app
  5. Key table to Build guard: lists the allowed keys
  6. Build guard to Release package: fails on any baked value
  7. Release package to Per-install config files: ships a template, no values

02Results

  • R01Lower is better

    Values baked into the build

    Before 25, after 0, eliminated. Lower is better.
    Before
    After
  • R02Lower is better

    Port numbers hard-coded in deployment scripts

    Before 58, after 1, 58× lower. Lower is better.
    Before
    After
  • R03Lower is better

    Install and maintenance tools failing

    Before 4, after 0, eliminated. Lower is better.
    Before
    After

What it achieved

  • Changing a setting: a rebuild for 25 baked-in values → edit the file and restart, for every value
  • Hidden configuration: 27 code defaults, 21 unread and 41 missing template keys → 0
  • Deploying to a server: the whole folder with development values → a clean copy, settings backed up first
Read more
  • Field data in packages: 3.2 MB of real readings → none, enforced on the finished package
  • Network isolation: 6 calls to a hosted map service with no token set → 0

The challenge

Every installation is offline and customer-owned, so every setting must be correct on the server itself. An audit of where each value originated showed the configuration files were not authoritative: browser values were baked in at build time, the API ran silently on defaults written in code, some of them real customer values, and templates and code disagreed about which keys existed.

Read more

Deployments copied development settings over the server's own, every package shipped real field readings, and even with the map token removed, the application still called a hosted map service.

What I learned

An empty setting is not the same as off: with the token empty, the map library fell back to its own default, so no token now means no hosted map at all. Guard what ships, not only the source: the build's file tracer copied every JSON file the code might read, test data included, so the check runs on the finished package.

Read more

Missing keys with a safe default warn rather than block, and a backup is never restored silently, because it could resurrect an outdated configuration.

Stack

  • Next.js
  • TypeScript
  • Node.js
  • PowerShell
  • Windows batch
  • nginx
  • CesiumJS

Skills

  • Configuration management
  • Build and release engineering
  • On-premises deployment
  • Security hygiene
  • Code auditing
Cover picture for Single-source runtime configuration for air-gapped installationsCover picture for Single-source runtime configuration for air-gapped installations