High Level Architecture¶
ElasticBLAST Control Plane separates the research workflow from the cloud operations needed to run it. Researchers stay in the browser; the control plane coordinates Azure identity, storage, images, AKS jobs, terminal access, and result delivery behind the scenes.
TL;DR
One Azure Container App (ca-elb-dashboard) hosts six sidecars
(frontend, api, worker, beat, redis, terminal). The api
sidecar fronts every browser request, talks to Azure as a user-assigned
managed identity, and dispatches long-running BLAST work to Celery
workers. BLAST jobs themselves run on AKS. Storage stays
publicNetworkAccess: Disabled; no SAS tokens reach the browser.
Use this page as the first architecture map. It explains the major boundaries and flows, then links to the deeper implementation references.
Architecture At A Glance¶
Main Boundaries¶
The system has three practical boundaries.
| Boundary | What Lives There | Why It Matters |
|---|---|---|
| Browser workflow | Dashboard, New Search, Jobs, Results, API Reference, Terminal | Researchers operate from one browser session instead of stitching together local commands. |
| Control plane | One Azure Container App with frontend, api, worker, beat, redis, and terminal sidecars |
Operational work is coordinated in one low-cost, always-on revision. |
| Workload plane | AKS, ElasticBLAST jobs, OpenAPI execution service, BLAST databases, queries, and results | Search execution remains isolated from the control plane that manages it. |
Request Flow¶
The browser calls the api sidecar with an MSAL bearer token. The API validates the token before doing work. For Azure operations, the backend uses the shared user-assigned managed identity rather than forwarding the user's browser token to Azure services.
Small read operations return directly from the API. Long-running work is queued through Redis and executed by the Celery worker. The UI polls task and job state from the API so researchers see progress instead of a blank spinner.
BLAST Job Flow¶
- The researcher submits a search from New Search or uses the API Reference / OpenAPI route.
- The API validates the request, normalizes it, and dispatches the work.
- The workload plane runs ElasticBLAST jobs on AKS.
- Job state, events, and audit history are written to Azure Storage.
- Result files stay in Storage and are streamed back through the API sidecar.
- The browser opens the Jobs and Results pages to inspect completion, logs, files, and result analytics.
Storage And Network Model¶
The browser never receives Storage SAS tokens and never downloads directly from private Storage endpoints. Uploads, downloads, query previews, and result files stream through the api sidecar.
Every workload Storage account stays publicNetworkAccess: Disabled from day one. The Container App reaches Storage through private endpoints inside the platform network. Developers iterating from a laptop use the explicit local-debug helper (scripts/dev/storage-public-access.sh on|off) which opens an IP-allowlisted window for the caller and refuses to run inside a deployed Container App. There is no deployed code path that flips public access on.
Terminal Model¶
The browser terminal is not a VM. It is the terminal sidecar in the same Container App revision. The browser opens a WebSocket to the API sidecar, and the API proxies it to loopback ttyd inside the terminal sidecar after authentication.
Advanced operators can still run az, kubectl, azcopy, and elastic-blast, but the default research path stays in the UI.
Why This Shape¶
- One bundled Container App keeps the steady-state control-plane cost low.
- Sidecars share loopback networking, which removes external Redis and terminal hosts.
- The
apisidecar reverse-proxies non-/api/*requests to thefrontendsidecar, so the SPA is served same-origin and the browser only ever sees one hostname. - Celery handles long-running Azure and BLAST operations without blocking HTTP requests.
- Azure Storage is enough for job state, audit history, schedules, and result access; no managed database is required.
- Managed identity keeps downstream Azure access auditable and avoids browser-to-Azure credential forwarding.
What the architecture deliberately does not include:
- No managed Cosmos DB / PostgreSQL; state lives in Azure Storage Tables + append blobs.
- No Azure Service Bus; the in-revision
redissidecar is the Celery broker. - No Azure Static Web App; the
frontendsidecar serves the React SPA. - No separate Redis VM or managed Redis service.
- No Remote Terminal VM, no SSH, no admin password; the browser shell is the
terminalsidecar over a same-origin WebSocket. - No Azure Functions or Durable Functions; the migration is complete (see Container Apps Migration).
- No SAS tokens issued to the browser; data-plane reads/writes go through the
apisidecar.
Go Deeper¶
- Container Apps Migration explains the six-sidecar target architecture, resource list, sizing, and cost reasoning.
- Auth covers browser sign-in, backend token validation, managed identity, and RBAC.
- Browser Terminal describes the terminal sidecar lifecycle and loopback WebSocket model.
- Resource Plane maps Azure preparation and monitoring work to Celery tasks.
- API Reference explains how to call the OpenAPI execution surface from the browser or an external client.