Deployment & Operations
Docker, Kubernetes, CI/CD, IaC, SBOM tooling, mission kits, and release channels
OMEN is designed for edge-first deployment — containers run on disconnected hardware as easily as cloud clusters. The infrastructure layer (ops/) provides everything needed for reproducible, signed, and auditable deployments.
Directory Structure
Docker Development Environment
Docker Compose Stack — ops/docker/docker-compose.dev.yaml
A complete development environment with five services:
| Service | Port | Image | Description |
|---|---|---|---|
engine |
8000 | Dockerfile.engine |
Mission Engine API with health check |
cal |
8001 | Dockerfile.cal |
CAL + Adapters service with health check |
map-app |
5173 | Built from map-app/ |
Tactical map dev server |
prometheus |
9090 | prom/prometheus:v2.48.0 |
Metrics collection |
grafana |
3000 | grafana/grafana:10.2.0 |
Observability dashboards |
Launch:
cd ops/docker
docker-compose -f docker-compose.dev.yaml up
Access Points:
- Engine API:
http://localhost:8000 - CAL Service:
http://localhost:8001 - Map Application:
http://localhost:5173 - Prometheus:
http://localhost:9090 - Grafana:
http://localhost:3000
Engine Container — ops/docker/Dockerfile.engine
FROM python:3.11-slim
WORKDIR /app
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
COPY engine/requirements.txt ./engine/requirements.txt
RUN pip install --no-cache-dir -r engine/requirements.txt
COPY engine/ ./engine/
COPY sdk/ ./sdk/
RUN useradd -r -u 1001 omen
USER omen
EXPOSE 8000
HEALTHCHECK --interval=10s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8000/healthz
CMD ["python", "-m", "engine.service", "--host", "0.0.0.0", "--port", "8000"]
Security:
- Non-root user (
omen, UID 1001) - Minimal base image (
python:3.11-slim) - Health check endpoint (
/healthz) - No secrets baked into image
CAL Container — ops/docker/Dockerfile.cal
FROM python:3.11-slim
WORKDIR /app
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
COPY cal/requirements.txt ./cal/requirements.txt
COPY adapters/requirements.txt ./adapters/requirements.txt 2>/dev/null || true
RUN pip install --no-cache-dir -r cal/requirements.txt
COPY cal/ ./cal/
COPY adapters/ ./adapters/
COPY sdk/ ./sdk/
RUN useradd -r -u 1001 omen
USER omen
EXPOSE 8001
HEALTHCHECK --interval=10s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8001/healthz
CMD ["python", "-m", "cal.service", "--host", "0.0.0.0", "--port", "8001"]
CI/CD Pipeline
GitHub Actions — ops/ci/ci.yaml
The CI pipeline runs on push to main/develop and on pull requests:
| Step | Description |
|---|---|
| Checkout | actions/checkout@v4 |
| Python Setup | actions/setup-python@v5 (matrix: 3.11, 3.12) |
| Dependencies | pip install pydantic>=2.0 pytest>=7.0 pytest-asyncio>=0.21 |
| Linting | ruff check . --select E,W,F --ignore E501 |
| Tests | Sample adapter, sample plugin, engine core, evaluation harnesses |
Linting Rules:
E— PEP 8 style errorsW— PEP 8 warningsF— PyFlakes logical errorsE501ignored — line length is not enforced
Kubernetes Deployment
K3s / Kubernetes — ops/k8s/
Edge-capable orchestration manifests for production deployment:
- Namespace isolation for engine, CAL, and presentation tiers
- Network policies restricting pod-to-pod communication to declared dependencies
- Resource limits on CPU/memory per container
- Health/readiness probes on all services
- Rolling update strategy with configurable surge/unavailable counts
Infrastructure as Code
Terraform / OpenTofu — ops/terraform/
IaC modules for provisioning:
- Cloud environments (CI/CD runners, artifact registries)
- Edge hardware configurations
- Network topology and security groups
- DNS and certificate management
SBOM & Artifact Signing
SBOM Generation — ops/sbom/
Every build generates a Software Bill of Materials:
- Format: CycloneDX or SPDX
- Tools:
syft,cdxgen - Published alongside release artifacts
- Enables downstream dependency auditing
Artifact Signing
Build → SBOM Generation → Container Build → Cosign Sign
│
▼
OCI Registry + Sigstore Log
- All container images signed with Cosign
- Transparency log entries in Sigstore
- Verification at deployment time
Deployment Modes
| Mode | Environment | Connectivity | Description |
|---|---|---|---|
| Local Development | Developer workstation | Full | Docker Compose with hot-reload |
| Edge Standalone | Tactical hardware | DDIL | Single-node K3s with offline mission packages |
| Edge Cluster | Multi-node tactical | DDIL | K3s cluster with service mesh |
| Hybrid | Mixed edge + cloud | Intermittent | Edge processes with cloud sync when connected |
| Cloud | Cloud infrastructure | Full | Full Kubernetes with HA and auto-scaling |
Mission Kit
A mission kit is a pre-packaged, signed deployment artifact:
| Component | Description |
|---|---|
| Container images | Signed engine, CAL, map-app images |
| Mission packages | Signed data bundles (routes, threats, airspace, NOTAMs) |
| Configuration | Environment-specific config files |
| Certificates | Device and service identity certificates |
| SBOM | Software Bill of Materials for audit |
Release Channels
| Channel | Frequency | Audience | Signing |
|---|---|---|---|
development |
Continuous | Developers | Unsigned builds |
staging |
Release candidates | QA / Test | Signed with dev key |
production |
Scheduled releases | Operations | Signed with production key + Sigstore attestation |
Observability Stack
| Tool | Purpose | Port |
|---|---|---|
| OpenTelemetry | Distributed tracing instrumentation | — |
| Prometheus | Metrics collection and alerting | 9090 |
| Grafana | Dashboards and visualization | 3000 |
| Loki | Structured log aggregation | — |
All services expose health (/healthz) and readiness endpoints for orchestration probes.
Prerequisites
| Tool | Version | Purpose |
|---|---|---|
| Docker | 24+ | Container builds |
| Podman | 4+ | Docker alternative |
| Python | 3.11+ | Engine, CAL, SDK, evaluation |
| Node.js | 20+ | Map-app, SDK TypeScript |
| GNU Make | — | Build orchestration |
| kubectl / k3s | Latest | Kubernetes deployment |
| Cosign | Latest | Artifact signing |