From 74dcd2de28c4fad8e163b3d0c3dba64aab5322d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Bidoul?= Date: Sun, 6 Feb 2022 18:38:40 +0100 Subject: [PATCH] Add a deployment quickstart and diagrams --- README.md | 28 +++++++++++++++++++++++ docs/deployment.plantuml | 39 +++++++++++++++++++++++++++++++++ docs/deployment/deployment.png | Bin 0 -> 34802 bytes 3 files changed, 67 insertions(+) create mode 100644 docs/deployment.plantuml create mode 100644 docs/deployment/deployment.png diff --git a/README.md b/README.md index f520ffe..2346e85 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,34 @@ For running the controller (runboat itself): The controller can be run outside the kubernetes cluster or deployed inside it, or even in a different cluster. +## Deployment quickstart + +A typical deployment looks like this. + +![Deployment diagram](./docs/deployment/deployment.png) + +The wiki has an example +[docker-compose](https://github.com/sbidoul/runboat/wiki/example-docker-compose) +configuration to get you started with running the runboat controller. + +In that docker compose, you will need to provide configuration parameters for the +postgres database and the kubernetes cluster: + +- For postgres: host, port, user, password (the postgres user must exist and have + permissions to create databases) +- For kubernetes: + - The name of the kubernetes namespace where the builds are deployed + - A KUBECONFIG for a kubernetes account that can create and delete resources in that + namespaces + - The name of a kubernetes Storage Class that can allocate Persistent Volumes that are + reclaimed on delete. + - The DNS domain corresponding to a wildcard DNS entry pointing to the kubernetes + ingress (so if your wildcard DNS record is `*.runboat-builds.mydomain.com`, you + provide `runboat-builds.mydomain.com`). + +Note that you can deploy Runboat itself as well Postgres inside the same kubernetes +cluster, or even a different one, depending on your taste. + ## Kubernetes resources All resources to be deployed in kubernetes for a build are in diff --git a/docs/deployment.plantuml b/docs/deployment.plantuml new file mode 100644 index 0000000..a591392 --- /dev/null +++ b/docs/deployment.plantuml @@ -0,0 +1,39 @@ +@startuml deployment + +actor "Runboat UI\n(Browser)" as RunboatUI + +component Runboat +interface "WebUI: /builds, /builds/{name}\nSSE: /build-events\nAPI: /docs, /api/v1/...\n(8000)" as API +interface "/webhooks/github" as Webhook + +interface "HTTP\n(80)" as IngressHTTP +actor "Builds UI\n(Browser)" as BuildsUI +component Kubernetes { + collections "Builds\n(Deployment,\nPersistentVolumeClaim,\n...)" as Builds + interface "HTTP\n(8069)" as BuildsHTTP + component Ingress +} +interface "Kubernetes API\n(HTTPS)" as K8SAPI + +database Postgres + +component GitHub + +Webhook - Runboat +API -- Runboat + +GitHub -> Webhook + +RunboatUI <--> API + +K8SAPI - Kubernetes + +Runboat <-> K8SAPI : "kubectl / HTTPS" + +Builds - BuildsHTTP +BuildsHTTP <- Ingress +Builds -- Postgres +IngressHTTP -- Ingress +BuildsUI --> IngressHTTP + +@enduml diff --git a/docs/deployment/deployment.png b/docs/deployment/deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..2303880922de78099e5ec588d26d126322bb7ac0 GIT binary patch literal 34802 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 RILY?JEx9|gMbh`5{vWW#%y9q! literal 0 HcmV?d00001