# cdami/container.training architecture

> Architecture diagram of the GitHub repository cdami/container.training, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/cdami/container.training
- Repository: https://github.com/cdami/container.training

## Overview

This repository collects container and Kubernetes lab examples, with Dockercoins as its principal runnable application. In Dockercoins, a worker fetches random bytes, hashes them, and records qualifying coins and work counts in Redis; the web UI reads that state for display. Compose and Kubernetes manifests describe deployment variants. Separate labs cover Kubernetes resources and networking, observability stacks, and a Pod admission webhook. Runtime edges are based on sampled service code; manifest examples are represented without inferring unsampled wiring.

Main entry points: [`dockercoins/docker-compose.yml`](https://github.com/cdami/container.training/blob/main/dockercoins/docker-compose.yml) (Docker Compose app), [`kubercoins`](https://github.com/cdami/container.training/tree/main/kubercoins) (Kubernetes app manifests), [`dockercoins/worker/worker.py`](https://github.com/cdami/container.training/blob/main/dockercoins/worker/worker.py) (Worker), [`dockercoins/webui/webui.js`](https://github.com/cdami/container.training/blob/main/dockercoins/webui/webui.js) (Web UI)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_app["Dockercoins runtime"]
  node_webui["Web UI<br/>[webui.js]"]
  node_worker["Worker<br/>[worker.py]"]
  node_rng["Random-byte service<br/>[rng.py]"]
  node_hasher["Hash service<br/>[hasher.rb]"]
  node_redis[("Redis state")]
end

subgraph group_deploy["Deployment examples"]
  node_compose["Docker Compose app<br/>[docker-compose.yml]"]
  node_kubercoins["Kubernetes app manifests"]
  node_dockercoin_stacks["Dockercoins stacks<br/>[dockercoins.yml]"]
end

subgraph group_klabs["Kubernetes labs"]
  node_k8s_examples["Kubernetes examples"]
  node_network_policy["Network policy examples"]
  node_stateful_storage["Stateful storage examples"]
  node_ingress["Ingress examples<br/>[traefik.yaml]"]
end

subgraph group_ops["Operations stacks"]
  node_monitoring["Prometheus stack<br/>[prometheus.yml]"]
  node_logging["ELK stack<br/>[elk.yml]"]
  node_registry["Registry stack<br/>[registry.yml]"]
end

subgraph group_admission["Admission policy"]
  node_webhook_config["Webhook configuration"]
  node_webhook_server_config["Webhook server deployment"]
  node_webhook["Pod policy webhook<br/>[webhook.py]"]
end

node_user(("Browser user"))
node_kube_api(("Kubernetes API server"))

node_user -->|"requests page"| node_webui
node_webui -->|"reads wallet and hashes"| node_redis
node_worker -->|"requests random bytes"| node_rng
node_worker -->|"posts bytes to hash"| node_hasher
node_worker -->|"updates coin state"| node_redis
node_compose -->|"defines service"| node_webui
node_compose -->|"defines service"| node_worker
node_compose -->|"defines service"| node_rng
node_compose -->|"defines service"| node_hasher
node_compose -->|"defines service"| node_redis
node_kubercoins -->|"configures deployment"| node_webui
node_kubercoins -->|"configures deployment"| node_worker
node_kubercoins -->|"configures deployment"| node_rng
node_kubercoins -->|"configures deployment"| node_hasher
node_kubercoins -->|"configures service"| node_redis
node_dockercoin_stacks -->|"describes stack"| node_webui
node_kube_api -->|"sends admission review"| node_webhook
node_webhook -->|"returns admission decision"| node_kube_api
node_webhook_config -->|"configures admission call"| node_webhook
node_webhook_server_config -->|"configures server"| node_webhook

click node_webui "https://github.com/cdami/container.training/blob/main/dockercoins/webui/webui.js"
click node_worker "https://github.com/cdami/container.training/blob/main/dockercoins/worker/worker.py"
click node_rng "https://github.com/cdami/container.training/blob/main/dockercoins/rng/rng.py"
click node_hasher "https://github.com/cdami/container.training/blob/main/dockercoins/hasher/hasher.rb"
click node_compose "https://github.com/cdami/container.training/blob/main/dockercoins/docker-compose.yml"
click node_kubercoins "https://github.com/cdami/container.training/tree/main/kubercoins"
click node_dockercoin_stacks "https://github.com/cdami/container.training/blob/main/stacks/dockercoins.yml"
click node_k8s_examples "https://github.com/cdami/container.training/tree/main/k8s"
click node_network_policy "https://github.com/cdami/container.training/blob/main/k8s/netpol-dockercoins.yaml"
click node_stateful_storage "https://github.com/cdami/container.training/blob/main/k8s/statefulset-pvc.yaml"
click node_ingress "https://github.com/cdami/container.training/blob/main/k8s/traefik.yaml"
click node_monitoring "https://github.com/cdami/container.training/blob/main/stacks/prometheus.yml"
click node_logging "https://github.com/cdami/container.training/blob/main/stacks/elk.yml"
click node_registry "https://github.com/cdami/container.training/blob/main/stacks/registry.yml"
click node_webhook_config "https://github.com/cdami/container.training/blob/main/webhooks/admission/k8s/webhook-configuration.yaml"
click node_webhook_server_config "https://github.com/cdami/container.training/blob/main/webhooks/admission/k8s/webhook-server.yaml"
click node_webhook "https://github.com/cdami/container.training/blob/main/webhooks/admission/flask/webhook.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_webui,node_worker,node_rng,node_hasher,node_redis,node_user toneBlue
class node_compose,node_kubercoins,node_dockercoin_stacks toneAmber
class node_k8s_examples,node_network_policy,node_stateful_storage,node_ingress,node_kube_api toneMint
class node_monitoring,node_logging,node_registry toneRose
class node_webhook_config,node_webhook_server_config,node_webhook toneIndigo
```

## Components

### Dockercoins runtime

- [Web UI](https://github.com/cdami/container.training/blob/main/dockercoins/webui/webui.js): `dockercoins/webui/webui.js`
- [Worker](https://github.com/cdami/container.training/blob/main/dockercoins/worker/worker.py): `dockercoins/worker/worker.py`
- [Random-byte service](https://github.com/cdami/container.training/blob/main/dockercoins/rng/rng.py): `dockercoins/rng/rng.py`
- [Hash service](https://github.com/cdami/container.training/blob/main/dockercoins/hasher/hasher.rb): `dockercoins/hasher/hasher.rb`
- **Redis state**

### Deployment examples

- [Docker Compose app](https://github.com/cdami/container.training/blob/main/dockercoins/docker-compose.yml): `dockercoins/docker-compose.yml`
- [Kubernetes app manifests](https://github.com/cdami/container.training/tree/main/kubercoins): `kubercoins`
- [Dockercoins stacks](https://github.com/cdami/container.training/blob/main/stacks/dockercoins.yml): `stacks/dockercoins.yml`

### Kubernetes labs

- [Kubernetes examples](https://github.com/cdami/container.training/tree/main/k8s): `k8s`
- [Network policy examples](https://github.com/cdami/container.training/blob/main/k8s/netpol-dockercoins.yaml): `k8s/netpol-dockercoins.yaml`
- [Stateful storage examples](https://github.com/cdami/container.training/blob/main/k8s/statefulset-pvc.yaml): `k8s/statefulset-pvc.yaml`
- [Ingress examples](https://github.com/cdami/container.training/blob/main/k8s/traefik.yaml): `k8s/traefik.yaml`

### Operations stacks

- [Prometheus stack](https://github.com/cdami/container.training/blob/main/stacks/prometheus.yml): `stacks/prometheus.yml`
- [ELK stack](https://github.com/cdami/container.training/blob/main/stacks/elk.yml): `stacks/elk.yml`
- [Registry stack](https://github.com/cdami/container.training/blob/main/stacks/registry.yml): `stacks/registry.yml`

### Admission policy

- [Webhook configuration](https://github.com/cdami/container.training/blob/main/webhooks/admission/k8s/webhook-configuration.yaml): `webhooks/admission/k8s/webhook-configuration.yaml`
- [Webhook server deployment](https://github.com/cdami/container.training/blob/main/webhooks/admission/k8s/webhook-server.yaml): `webhooks/admission/k8s/webhook-server.yaml`
- [Pod policy webhook](https://github.com/cdami/container.training/blob/main/webhooks/admission/flask/webhook.py): `webhooks/admission/flask/webhook.py`

### Other components

- **Browser user**
- **Kubernetes API server**

## Connections

- Browser user → Web UI: requests page
- Web UI → Redis state: reads wallet and hashes
- Worker → Random-byte service: requests random bytes
- Worker → Hash service: posts bytes to hash
- Worker → Redis state: updates coin state
- Docker Compose app → Web UI: defines service
- Docker Compose app → Worker: defines service
- Docker Compose app → Random-byte service: defines service
- Docker Compose app → Hash service: defines service
- Docker Compose app → Redis state: defines service
- Kubernetes app manifests → Web UI: configures deployment
- Kubernetes app manifests → Worker: configures deployment
- Kubernetes app manifests → Random-byte service: configures deployment
- Kubernetes app manifests → Hash service: configures deployment
- Kubernetes app manifests → Redis state: configures service
- Dockercoins stacks → Web UI: describes stack
- Kubernetes API server → Pod policy webhook: sends admission review
- Pod policy webhook → Kubernetes API server: returns admission decision
- Webhook configuration → Pod policy webhook: configures admission call
- Webhook server deployment → Pod policy webhook: configures server
