System Architecture
Overview
This document specifies the system architecture for an image scanning, resumable chunked upload, asynchronous processing pipeline with libvips, S3 storage, certificate-based scanner authentication, Auth0 dashboard authentication, device health monitoring, and OTA update rollback capabilities.
1. High-Level Architecture Diagram
flowchart TD
%% Users & Authentication
subgraph Users["User Types & Roles (Dashboard / Auth0)"]
SysAdmin["System User\n(Full Platform & Infrastructure Access)"]
DevAdmin["Device Admin\n(Scanner Fleet, Health & OTA)"]
Staff["Staff Member\n(Image Review & Processing Status)"]
Auth0["Auth0 Identity Provider\n(Roles: system, device_admin, staff_member)"]
SysAdmin & DevAdmin & Staff <-->|"Authenticate & Receive Role JWT"| Auth0
end
subgraph ScannerClient["Scanner Device Layer"]
Scanner["Scanner Hardware\n(A/B Partitions for OTA)"]
Chunker["Chunking & Checksum Engine"]
Scanner --> Chunker
end
%% Security & Ingress Layer
subgraph SecurityGateway["API Gateway / Security Layer"]
JWTValidator["Auth0 JWT & RBAC Validator\n(system / device_admin / staff_member)"]
CertValidator["mTLS Client Cert Validator\n(X.509 Device Certificates)"]
end
SysAdmin & DevAdmin & Staff -->|"Bearer JWT (user_type)"| JWTValidator
Scanner -->|"mTLS Handshake"| CertValidator
%% Backend & Queue Infrastructure
subgraph BackendLayer["Backend & Queue Infrastructure"]
Backend["Backend API"]
DB[("Database (PostgreSQL / Relational)")]
Redis[("Redis")]
BullMQ_Producer["BullMQ Producer"]
BullMQ_Worker["BullMQ Worker"]
Backend <-->|"State, Certs, Telemetry, OTA & Metadata"| DB
Backend -->|"Upload complete -> Enqueue job"| BullMQ_Producer
BullMQ_Producer -->|"Push job"| Redis
Redis -->|"Consume job"| BullMQ_Worker
end
%% Scanner Communication
CertValidator -->|"Authenticated Scanner Traffic"| Backend
Chunker -->|"1. Async chunk upload & progress resume"| CertValidator
Scanner -.->|"Heartbeat & Telemetry (CPU, Temp, Storage, Version)"| CertValidator
%% Dashboard Role Access
JWTValidator -->|"Device Admin / System: Manage Fleet & Trigger OTA"| Backend
JWTValidator -->|"Staff / System: View Uploads, Processed Images & Thumbnails"| Backend
%% Processing Layer
subgraph ProcessingLayer["Processing Compute (ECS Fargate / EC2)"]
Libvips["libvips Processing Service (Self-Deployed)"]
BullMQ_Worker -->|"2. Dispatch image asynchronously"| Libvips
end
%% Storage Layer
subgraph StorageLayer["Storage Layer (Amazon S3)"]
S3_Images[("S3: Processed Images & Thumbnails")]
S3_OTA[("S3: OTA Firmware Packages")]
end
%% Storage & Metadata Return
Libvips -->|"3. Store processedImage"| S3_Images
Libvips -->|"4. Store thumbnail"| S3_Images
Libvips -->|"5. Send metadata back"| Backend
Backend -->|"6. Persist metadata"| DB
Backend <-->|"Manage OTA Releases"| S3_OTA2. Component Workflows
2.1 Chunking & Resumable Async Upload (Part 1)
- Image Partitioning: Scanner divides large, high-resolution scans into chunks.
- Session / Resume Verification: Scanner queries the Backend API using image identifiers. If previous transmission failed, Backend returns
last_uploaded_chunk_indexto resume without restarting from scratch. - Async Upload: Scanner uploads chunks asynchronously, with each chunk receipt updating progress in the database.
2.2 Async Event Queue & libvips Compute (Part 2)
- BullMQ Enqueue: When the final chunk is received, the Backend acknowledges the client and pushes an image processing job into BullMQ (persisted in Redis).
- libvips Dispatch: The BullMQ Worker consumes the task and dispatches the raw image asynchronously to the self-deployed
libvipsservice on AWS ECS Fargate / EC2.
2.3 Storage & Metadata Persistence (Part 3)
- Output Generation:
libvipscreatesprocessedImageandthumbnail. - Direct S3 Upload:
libvipsuploads both image assets directly to Amazon S3. - Metadata Callback:
libvipssends image dimensions, sizes, formats, and S3 keys back to the Backend API. - Database Persistence: Backend saves the image metadata into the database.
3. Security & Authentication Architecture
- Scanner Device: Authenticates over mutual TLS (mTLS) using device-specific X.509 client certificates. Validated at the API Gateway / Reverse Proxy.
- Dashboard Users: Authenticate through Auth0 (OIDC/OAuth2) with Bearer JWT tokens. RBAC roles enforced:
system: Unrestricted platform access and auditing.device_admin: Scanner fleet provisioning, health tracking, and OTA updates.staff_member: Access to scan workflows, thumbnails, and processed images.
4. OTA (Over-The-Air) Update & Health Validation Flow
sequenceDiagram
autonumber
actor Admin as Device Admin / System
participant Backend as Backend API
participant S3 as Amazon S3 (OTA)
participant Scanner as Scanner Hardware (A/B Partition)
participant DB as Database
Admin->>Backend: Trigger OTA Release
Backend->>S3: Upload / Locate Firmware Binary
Backend->>Scanner: Notify / Serve Update Metadata
Scanner->>Backend: Download Update Package
Scanner->>Scanner: Verify Checksum & Install to Inactive Partition
Scanner->>Scanner: Reboot into New Version
Scanner->>Scanner: Run Health Checks (CPU, Temp, Storage, Version)
alt Health Metrics PASS
Scanner->>Scanner: Mark New Partition as Active
Scanner->>Backend: Report OTA Status: APPLIED
Backend->>DB: Update Scanner Status & Version
else Health Metrics FAIL
Scanner->>Scanner: Roll back to Previous Stable Partition
Scanner->>Backend: Report OTA Status: ROLLED_BACK (Failure Reason)
Backend->>DB: Record Rollback Incident & Alert Admin
end