Data & MoreOperationsmt.dataandmore.com

Operate the fleet.

The Management Tool is the internal console at mt.dataandmore.com that operations uses to run the entire customer fleet: deploy a new toolbox, push a version upgrade, watch CPU and disk, see which client owns which deployment, publish release notes, read logs, and check NPS. It sits one floor above the platform itself, looking down on every running instance.

One console, every toolbox, every client, one screen at a time.

354toolboxes managed
8sidebar surfaces
14API blueprints
6container services
Section 01Purpose

What the tool does

Every Data & More customer runs their own platform instance, the "toolbox": a self-contained set of microservices for ingestion, profiling, classification, policy and reporting. The Management Tool is the place from which an operator deploys those toolboxes, keeps them on the right version, watches their health, and ties them back to a paying client, a partner, a contract, a subscription and a renewal date.

Lifecycle

Deploy and upgrade toolboxes

Add a new server, push a new platform version, toggle auto-updates, download the toolbox SSH key or TLS certificate, retire an instance. Every action is one row in the Servers list.

Commerce

Tie toolboxes to clients

Each toolbox carries a client, a partner, a plan, a price, a start and renewal date. Subscriptions, payments (Stripe), CRM (HubSpot) and notifications are wired in.

Insight

See the fleet, not the trees

CPU, disk, RAM and source-ingestion rates per toolbox, plus aggregate views: classification drift, source health, logs, NPS surveys, release-note delivery.

Section 02Architecture

The container layout

The tool ships as a Docker Compose stack. NGINX terminates TLS in front; a Flask API and a Celery-style worker share the same image; a Vue 3 SPA serves the UI; RabbitMQ moves async tasks between API and worker; dm-notify sends email. Persistent state lives in the platform's shared Elasticsearch, reached over the same secure network as every other Data & More service.

CLIENT EDGE SPA API PLATFORM Operator browser authenticated session mt.dataandmore.com NGINX TLS, reverse proxy :80, :443 Vue 3 SPA services/client views + Vuex store Flask API 14 blueprints servers, clients datasources, workspaces payment, notifications, nps release_notes, logs, auth Worker async tasks .Dockerfile.worker RabbitMQ queue, AMQP rabbit (hostname) enqueue dm-notify email + alerts ECR image, :8002 send mail Platform shared substrate Elasticsearch (data) Prometheus (metrics) IAM / JWT keys Stripe (billing) HubSpot (CRM) read + write External Docker network: dm shared with every other Data & More service, no public ports except 80 / 443 via NGINX
Internal data path Platform read / write Stateful / shared substrate
Figure 01, docker-compose at a glance
Section 03Wayfinding

Eight surfaces in the sidebar

The left rail is the entire navigation. Each surface is one Vue view and one or more Flask blueprints behind it.

01

Servers

The toolbox fleet. The default landing screen for ops.

02

Sources

Per-toolbox source connectors, with scan / ingest / profile rates.

03

Clients

Customer companies, plans, MRR, renewal dates, NPS.

04

Policy

Plans editor, what each subscription tier includes.

05

NPS

Net Promoter survey analytics across the fleet.

06

Classification

Global classification dictionaries pushed to every toolbox.

07

Logs

Searchable audit / activity log across deployments.

08

Releases

Release notes that get delivered into customer toolboxes.

Section 04The fleet

The Servers list

This is what every operator sees first. 354 of 354 toolboxes, one row per deployment, with the filter rail on the left and a tight action row on the right. The mockup below is faithful to the live screen.

Management Tool djunge Servers Sources Clients Policy NPS Classify Logs Releases Filters Search filters Alerts Business Stage Server ID Instance Type Server Location Partner Server Status Server Version Updates Enabled +++ +++ +++ Servers List (354 from 354) Search Hide ES Nodes + Add Server SERVER ID CLIENT NAME VERSION CPU DISK RAM PRICE SERVER TYPE ACTIONS aesp01 A. Espersen v26.4.14 12% 56% 45% 160€ EX130-R airalsie01 Air Alsie v26.4.14 9% 34% 52% 92.3€ AX61-NVMe aka01es01 Akademikernes A-kasse (es node) 1% 4% 57% 45€ EX44 aka01tool01 Akademikernes A-kasse v26.4.14 2% 44% 28% 62€ EX44 ao02 Brødrene A&O Johansen A/S v26.4.14 45% 39% 77% apcoa01es01 Apcoa (es node) 1% 3% 57% 45€ EX44 apcoa01tool01 Apcoa v26.4.14 2% 25% 31% 59€ EX44 355 of 354 rows, including ES nodes; toggle "Hide ES Nodes" to see only one row per toolbox.
Figure 02, Servers list, faithful to the live screen
Columns

What each column tells you

  • Server ID, the deployment slug (aesp01, apcoa01tool01). Tool nodes end in toolNN, ES nodes in esNN.
  • Client name, the paying customer, linked back to Clients.
  • Version, the toolbox platform version (v26.4.14). Drives the upgrade flow.
  • CPU / Disk / RAM, live resource pills coloured green under threshold, amber over it.
  • Price, monthly hosting cost in euros.
  • Server type, the Hetzner instance (EX44, EX130-R, AX61-NVMe, AX102).
  • Actions, the per-row toolbar: open monitoring, redeploy, upgrade, restart services, download cert / SSH key, edit, delete.
Filters

Slice the fleet

Each filter on the left expands into a faceted list with counts. The most useful for ops are Server status (running, stopped, errored), Server version (which toolboxes are behind), Alerts (active monitor hits) and Updates enabled (which toolboxes opt-in to auto-update).

AlertsBusiness stageServer ID Instance typeServer locationPartner Server statusServer versionUpdates enabled
Section 05Toolbox lifecycle

Deploy, upgrade, retire a toolbox

Every action on a toolbox maps to one HTTP route on the Flask API. The mapping is small and stable, which keeps the operator console predictable.

ActionRouteWhat happens
Open the fleetPOST /servers/tablePaginated query with search + filters, returns rows for the Servers list
Available toolboxesGET /servers/availableThe set this operator may act on, scoped by company / partner
On-prem onlyPOST /servers/on_premFilter to on-premise deployments for a named company
Build the filter railPOST /servers/filterFacet values; POST /servers/cascade for dependent filters
Open a toolboxPOST /servers/detailsSingle deployment + statistics chart for the chosen period
Get a single recordGET /servers/single/<id>Just the deployment document
Deploy a new toolboxPOST /servers/singleCreate a deployment record; the worker provisions the host and installs the platform
Upgrade or reconfigurePUT /servers/singlePush a new version, change instance type, toggle auto-updates, change ownership
RetireDELETE /servers/single/<id>Remove the deployment from the registry; the worker tears down infra
Download certGET /server/single/download/certificate/<id>Base64-decoded TLS certificate, served as octet-stream
Download SSH keyGET /server/single/download/ssh_key/<id>Base64-decoded private key for direct host access
Deploy

Adding a new server

Click + Add Server in the top-right of the Servers list. The form (ServersAdd.vue) collects: client name, partner, instance type, location, business stage, server version, alert thresholds, updates-enabled toggle. On submit, POST /servers/single creates the deployment record. The worker picks the task up off RabbitMQ and provisions the host (Hetzner Cloud), installs the docker stack and registers the new server back into the registry. Operator gets an email through dm-notify when it is live.

Upgrade

Pushing a new version

Filter Servers by Server Version to see which deployments are behind. From the row's action toolbar, choose Upgrade; the client calls PUT /servers/single with the target version. The worker pulls the new platform image on the toolbox host, runs migrations, restarts services. Updates enabled on a row lets the toolbox opt in to scheduled upgrades, so ops only has to nudge the laggards.

Section 06Adjacent surfaces

Clients, sources, releases, logs

The other sidebar surfaces follow the same pattern as Servers: a filter rail on the left, a search bar in the header, an actions column on the right, and a Flask blueprint behind each one.

Clients

The commercial view

Columns: Company name, Server ID, Start, Renew, Type, Users, MRR, Next notification, NPS. Filters by alerts, country, partner, MRR, plan type, start / renew date, status, user limit. Export to Excel and + Add Client in the top-right. Plans live behind Policy; payments via Stripe; CRM sync to HubSpot.

Sources

Per-toolbox connectors

Columns: Server ID, Source name, Source ID, Workspace, Source type, Scan/h, Ingest/h, Profiled/h, Updated at, Profiled, Total. Filters by server, workspace, type, partner. Toggle Hide inactive sources to focus on what is moving.

Releases

Release notes for the fleet

Operators publish release notes here that flow back into the customer-facing tools. Filters by Type, Tags, Version, Deployment ID, Instance type, Deployment type, Location. Sort by Newest first. + Add New Release opens the editor. The seed_release_notes.py script seeds defaults.

Logs

Searchable activity

Filters by username, workspace, deployment id, type, partner id. Date / time range plus a full-text search box. The case-log surface (case_log blueprint) sits adjacent for higher-level operator notes per client.

Quieter surfaces

  • Policy, the plans editor (EditPlans.vue): what each subscription tier costs, which features it unlocks, used by Clients.
  • NPS, the NPS analytics view (NPSAnalytics.vue): score trend across the fleet, per-client breakdowns, drives Next notification on Clients.
  • Classification, the global classification view (GlClassification.vue): dictionaries and rules pushed centrally to every toolbox so terminology stays consistent.
Section 07Relations

How it sits above the rest of the platform

The Management Tool is one floor up from every other Data & More service. It does not classify documents, scan inboxes or talk to Microsoft 365; it tells the toolboxes that do. Those toolboxes are the platform repos: api, client, iam, java_profiler, ai-profiler, dlp, ocr, graph-ingestion, ews, google, fileshare-service, known-persons-service, plus the data tier (Elasticsearch, PostgreSQL, RabbitMQ, Redis, S3).

OPS CONSOLE PLATFORM TOOLBOXES Management Tool mt.dataandmore.com deploy, upgrade, monitor, bill used by Data & More operations Toolbox A aesp01 A. Espersen v26.4.14 Toolbox B airalsie01 Air Alsie v26.4.14 Toolbox C apcoa01tool01 Apcoa v26.4.14 Toolbox D arkil01 Arkil v26.4.14 Toolbox E ao02 A&O Johansen v26.4.14 … 349 more one row per deployment deploy, upgrade CPU, disk, alerts
Control plane, ops, to toolbox Telemetry, toolbox, to ops The console
Figure 03, the management tool, one floor above 354 toolboxes
Section 08API surface

The 14 Flask blueprints

The API is one Flask app with 14 blueprints registered at boot in app.py. Each blueprint groups a small set of routes for one surface. The names map cleanly to the sidebar.

serversfleet list, details, create, update, delete, cert and SSH download
clientscompany records, plan, MRR, renewal, notifications
workspacesper-toolbox workspaces (logical scopes)
datasourcessource connectors and ingest rates
notificationsoperator-side notification routing
alertsactive health / threshold hits
authJWT login, token issuance, authorisation decorator
case_logoperator notes per client / per case
paymentStripe wiring, invoices, retries
client"this client" endpoints used by the SPA itself
npsNPS survey delivery and analytics
global_classificationdictionaries pushed to every toolbox
logscross-toolbox searchable activity
release_notespublish notes that propagate to customer UIs
Section 09Under the hood

The stack

FrontendVue 3 SPA, Vuex store, custom SCSS, mounted under services/client
APIPython, Flask, served by waitress in production via waitress-serve --call env:configure
WorkerSame Python image, .Dockerfile.worker entry, async tasks via RabbitMQ
QueueRabbitMQ, AMQP, hostname rabbit
Notifydm-notify (ECR image), email + alerts at :8002
EdgeNGINX, TLS terminator, reverse proxy on :80 / :443
StateElasticsearch on monitor.gdpr.dataandmore.com, plus Prometheus for metrics, plus the platform IAM service for JWT keys
CommerceStripe (payment), HubSpot (CRM)
NetworkExternal Docker network dm, shared with every other Data & More service
Local rundocker-compose -f docker-compose.local.yml up -d --build
Repogithub.com/dataandmore/management-tool
In one lineThe shape of it

One console. 354 toolboxes. Every move on the record.

The Management Tool is the operator's seat at Data & More: the place from which every customer toolbox is born, kept current, watched, billed and (eventually) retired. The platform does the work; this is where the people who own the platform see and steer it.

github.com/dataandmore/management-tool, served at mt.dataandmore.com