From 09fa6a0f097ef0bae1175d340f8911cdd38b8cb1 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 13 Feb 2026 13:56:43 +0000 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=A4=96=20docs:=20refocus=20product=20?= =?UTF-8?q?docs=20and=20tutorial=20flow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move contributor workflow out of README, add CONTRIBUTING, and align tutorials/samples with the product deployment path (coder namespace, external provisioner tutorial, clearer example naming). --- _Generated with `mux` • Model: `openai:gpt-5.3-codex` • Thinking: `xhigh` • Cost: `$0.00`_ --- CONTRIBUTING.md | 74 +++++++++++ README.md | 121 ++++-------------- .../coder_v1alpha1_coderprovisioner.yaml | 1 + .../coder_v1alpha1_coderworkspaceproxy.yaml | 2 +- docs/index.md | 55 ++++---- docs/tutorials/deploy-coderprovisioner.md | 79 ++++++++++++ docs/tutorials/getting-started.md | 108 +++++++++------- .../{aggregated => coder-templates}/README.md | 6 +- .../codertemplate-smoke-scratch.yaml | 0 mkdocs.yml | 3 +- 10 files changed, 275 insertions(+), 174 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 docs/tutorials/deploy-coderprovisioner.md rename examples/{aggregated => coder-templates}/README.md (76%) rename examples/{aggregated => coder-templates}/codertemplate-smoke-scratch.yaml (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..7eb5359e --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,74 @@ +# Contributing to coder-k8s + +Thanks for contributing to `coder-k8s`. + +> [!NOTE] +> The root [`README.md`](./README.md) is end-user focused. This guide contains local development and contribution workflows. + +## Development prerequisites + +- Go 1.25+ (`go.mod` currently declares Go 1.25.7) +- A Kubernetes cluster (OrbStack, KIND, or any conformant cluster) +- `kubectl` configured for your target cluster + +## Local development quick start (controller mode) + +```bash +# Generate and apply CRDs +make manifests +kubectl apply -f config/crd/bases/ + +# Run controller locally against your kubeconfig context +GOFLAGS=-mod=vendor go run . --app=controller + +# In another terminal, apply a sample control plane +kubectl apply -f config/samples/coder_v1alpha1_codercontrolplane.yaml + +# Verify resource creation +kubectl get codercontrolplanes -A +``` + +## KIND development cluster (k9s demos) + +Bootstrap a KIND cluster and install CRDs/RBAC (**this switches current kubectl context**): + +```bash +make kind-dev-up +``` + +Useful helpers: + +```bash +make kind-dev-status +make kind-dev-ctx +make kind-dev-load-image +make kind-dev-k9s +make kind-dev-down +``` + +## Essential development commands + +| Command | Description | +| --- | --- | +| `make build` | Build all packages | +| `make test` | Run unit + integration tests | +| `make test-integration` | Run focused controller integration tests | +| `make manifests` | Generate CRD and RBAC manifests | +| `make codegen` | Run deepcopy generation | +| `make docs-reference` | Regenerate API reference docs from Go types | +| `make docs-check` | Build docs in strict mode (CI-equivalent) | +| `make verify-vendor` | Verify vendored dependency consistency | +| `make lint` | Run linter + formatting checks | +| `make vuln` | Run vulnerability scan | + +## Before opening a PR + +Run at least: + +```bash +make verify-vendor +make test +make build +make lint +make docs-check +``` diff --git a/README.md b/README.md index 20f1fe8a..0c3d5b58 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,26 @@ `coder-k8s` is a Kubernetes control-plane project for managing Coder-related resources with native Kubernetes APIs. +## Documentation + +Start with the published docs: **https://coder.github.io/coder-k8s/** + +Helpful entry points: + +- Getting started: +- Deploy the controller: +- Deploy the workspace/template API server: +- API reference: + +Prefer reading docs in-repo? See [`docs/`](docs/) and run `make docs-serve`. + ## What this project provides - A controller-runtime operator for `coder.com/v1alpha1` resources: - `CoderControlPlane` - `CoderProvisioner` - `CoderWorkspaceProxy` -- An aggregated API server for `aggregation.coder.com/v1alpha1` resources: +- A workspace/template API server for `aggregation.coder.com/v1alpha1` resources: - `CoderWorkspace` - `CoderTemplate` - An MCP HTTP server for operational tooling. @@ -27,113 +40,35 @@ | Mode | Description | Typical usage | | --- | --- | --- | -| `all` (default) | Runs controller + aggregated API + MCP HTTP together | Local dev, demos, simple cluster deployment | -| `controller` | Runs only Kubernetes reconcilers | Controller-focused debugging and e2e smoke flows | -| `aggregated-apiserver` | Runs only aggregated API server | Split deployments with explicit Coder backend flags | +| `all` (default) | Runs controller + workspace/template API + MCP HTTP together | Single deployment for evaluation environments | +| `controller` | Runs only Kubernetes reconcilers | Controller-only deployments | +| `aggregated-apiserver` | Runs only the workspace/template API server | Split deployments with dedicated API serving | | `mcp-http` | Runs only MCP HTTP server | MCP-focused integrations | -## Prerequisites +## Quick start (brief, in-cluster) -- Go 1.25+ (`go.mod` currently declares Go 1.25.7) -- A Kubernetes cluster (OrbStack, KIND, or any conformant cluster) -- `kubectl` configured for your target cluster - -## Quick start (local controller run) +For a full setup guide, use the docs links above. For a quick smoke deploy: ```bash -# Generate and apply CRDs -make manifests +kubectl create namespace coder-system kubectl apply -f config/crd/bases/ - -# Run controller locally against your kubeconfig context -GOFLAGS=-mod=vendor go run . --app=controller - -# In another terminal, apply a sample control plane -kubectl apply -f config/samples/coder_v1alpha1_codercontrolplane.yaml - -# Verify resource creation -kubectl get codercontrolplanes -A -``` - -## Documentation - -The project docs follow Diátaxis and live in `docs/`. - -- Home: [`docs/index.md`](docs/index.md) -- Tutorial: [`docs/tutorials/getting-started.md`](docs/tutorials/getting-started.md) -- How-to guides: [`docs/how-to/`](docs/how-to/) -- Architecture: [`docs/explanation/architecture.md`](docs/explanation/architecture.md) -- API reference: [`docs/reference/api/`](docs/reference/api/) - -Serve docs locally: - -```bash -make docs-serve +kubectl apply -f config/rbac/ +kubectl apply -f deploy/deployment.yaml +kubectl apply -f deploy/apiserver-service.yaml +kubectl apply -f deploy/apiserver-apiservice.yaml +kubectl apply -f deploy/mcp-service.yaml +kubectl rollout status deployment/coder-k8s -n coder-system ``` ## Examples - [`examples/cloudnativepg/`](examples/cloudnativepg/) — Deploy a `CoderControlPlane` with a CloudNativePG-managed PostgreSQL backend. - [`examples/argocd/`](examples/argocd/) — Bootstrap CloudNativePG + `coder-k8s` + PostgreSQL + `CoderControlPlane` from one Argo CD `ApplicationSet`. - -- [`examples/aggregated/`](examples/aggregated/) - Reusable `CoderTemplate` manifests for aggregated API testing. - -## KIND development cluster (k9s demos) - -Bootstrap a KIND cluster and install CRDs/RBAC (**this switches current kubectl context**): - -```bash -make kind-dev-up -``` - -Useful helpers: - -```bash -make kind-dev-status -make kind-dev-ctx -make kind-dev-load-image -make kind-dev-k9s -make kind-dev-down -``` - -## Essential commands - -| Command | Description | -| --- | --- | -| `make build` | Build all packages | -| `make test` | Run unit + integration tests | -| `make test-integration` | Run focused controller integration tests | -| `make manifests` | Generate CRD and RBAC manifests | -| `make codegen` | Run deepcopy generation | -| `make docs-reference` | Regenerate API reference docs from Go types | -| `make docs-check` | Build docs in strict mode (CI-equivalent) | -| `make verify-vendor` | Verify vendored dependency consistency | -| `make lint` | Run linter + formatting checks | -| `make vuln` | Run vulnerability scan | - -## Repository layout - -- `api/v1alpha1/` — CRD API types (`coder.com/v1alpha1`) -- `api/aggregation/v1alpha1/` — aggregated API types (`aggregation.coder.com/v1alpha1`) -- `internal/app/` — app mode entrypoints (`allapp`, `controllerapp`, `apiserverapp`, `mcpapp`) -- `internal/controller/` — controller reconcilers -- `internal/aggregated/` — aggregated storage + Coder client/provider logic -- `config/` — generated CRDs, RBAC, samples -- `deploy/` — deployable manifests for all-in-one, APIService, and MCP service -- `docs/` — user-facing documentation site content -- `hack/` — code generation and maintenance scripts +- [`examples/coder-templates/`](examples/coder-templates/) — Reusable `CoderTemplate` manifests for workspace/template API testing. ## Contributing -Before opening a PR, run at least: - -```bash -make verify-vendor -make test -make build -make lint -make docs-check -``` +For local development workflows, validation commands, and PR guidance, see [CONTRIBUTING.md](./CONTRIBUTING.md). ## License diff --git a/config/samples/coder_v1alpha1_coderprovisioner.yaml b/config/samples/coder_v1alpha1_coderprovisioner.yaml index 019d5a2c..c676ce45 100644 --- a/config/samples/coder_v1alpha1_coderprovisioner.yaml +++ b/config/samples/coder_v1alpha1_coderprovisioner.yaml @@ -4,6 +4,7 @@ # 1. A CoderControlPlane resource must exist in the same namespace. # 2. The referenced CoderControlPlane status must report operator access ready: # status.operatorAccessReady=true and status.operatorTokenSecretRef set. +# apiVersion: coder.com/v1alpha1 kind: CoderProvisioner metadata: diff --git a/config/samples/coder_v1alpha1_coderworkspaceproxy.yaml b/config/samples/coder_v1alpha1_coderworkspaceproxy.yaml index ac33e030..010b9e9b 100644 --- a/config/samples/coder_v1alpha1_coderworkspaceproxy.yaml +++ b/config/samples/coder_v1alpha1_coderworkspaceproxy.yaml @@ -2,7 +2,7 @@ apiVersion: coder.com/v1alpha1 kind: CoderWorkspaceProxy metadata: name: coderworkspaceproxy-sample - namespace: default + namespace: coder spec: image: "ghcr.io/coder/coder:latest" primaryAccessURL: "https://coder.example.com" diff --git a/docs/index.md b/docs/index.md index 61a26128..8045499d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,38 +4,33 @@ **Highly experimental / alpha software** This project is an active prototype. Do not use it in production. -`coder-k8s` is a Kubernetes control-plane project for running and managing Coder through Kubernetes APIs. +`coder-k8s` is a Kubernetes control-plane stack for running and managing Coder through Kubernetes APIs. -## What is in this repository? +## What you can deploy `coder-k8s` ships one binary with four app modes: -- **`all` (default)**: controller + aggregated API server + MCP server in one process. -- **`controller`**: reconciles `CoderControlPlane`, `CoderProvisioner`, `CoderWorkspaceProxy` (`coder.com/v1alpha1`). +- **`all` (default)**: operator + workspace/template API server + MCP server in one process. +- **`controller`**: reconciles `CoderControlPlane`, `CoderProvisioner`, and `CoderWorkspaceProxy` (`coder.com/v1alpha1`). - **`aggregated-apiserver`**: serves `CoderWorkspace` + `CoderTemplate` (`aggregation.coder.com/v1alpha1`). -- **`mcp-http`**: serves MCP tooling over HTTP. - -## Documentation map (Diátaxis) - -- **Tutorials**: guided learning path - - [Getting started](tutorials/getting-started.md) -- **How-to guides**: task-focused operations - - [Deploy controller](how-to/deploy-controller.md) - - [Deploy aggregated API server](how-to/deploy-aggregated-apiserver.md) - - [Run MCP server](how-to/mcp-server.md) - - [Troubleshooting](how-to/troubleshooting.md) -- **Reference**: generated API reference - - [API reference](reference/api/codercontrolplane.md) -- **Explanation**: conceptual internals - - [Architecture](explanation/architecture.md) - -## Quick commands - -```bash -make manifests -make test -make build -make docs-serve -``` - -New here? Start with the [Getting started tutorial](tutorials/getting-started.md). +- **`mcp-http`**: serves operational MCP tooling over HTTP. + +## Quick start path + +If you want to deploy quickly and validate the end-to-end flow: + +1. Follow [Deploy a Coder Control Plane](tutorials/getting-started.md). +2. Verify the managed Coder Deployment and Service. +3. If you need external provisioners, continue with [Deploy an External Provisioner](tutorials/deploy-coderprovisioner.md). + +## Learn more + +- [Deploy an External Provisioner](tutorials/deploy-coderprovisioner.md) +- [Deploy controller](how-to/deploy-controller.md) +- [Deploy aggregated API server](how-to/deploy-aggregated-apiserver.md) +- [Run MCP server](how-to/mcp-server.md) +- [Troubleshooting](how-to/troubleshooting.md) +- [API reference](reference/api/codercontrolplane.md) +- [Architecture](explanation/architecture.md) + +Start with [Deploy a Coder Control Plane](tutorials/getting-started.md). diff --git a/docs/tutorials/deploy-coderprovisioner.md b/docs/tutorials/deploy-coderprovisioner.md new file mode 100644 index 00000000..b8e999f7 --- /dev/null +++ b/docs/tutorials/deploy-coderprovisioner.md @@ -0,0 +1,79 @@ +# Deploy an External Provisioner + +This tutorial deploys a `CoderProvisioner` for an existing `CoderControlPlane` managed by `coder-k8s`. + +Estimated time: **5 minutes**. + +## Prerequisite + +Complete [Deploy a Coder Control Plane](getting-started.md) first. + +This tutorial assumes the setup from that guide: + +- `CoderControlPlane` **`codercontrolplane-sample`** exists in namespace **`coder`** and is `Ready`. +- Operator access is enabled and ready (default behavior): + `.status.operatorAccessReady=true`. + +Quick check: + +```bash +kubectl get codercontrolplane codercontrolplane-sample -n coder \ + -o jsonpath='{.status.phase}{"\n"}{.status.operatorAccessReady}{"\n"}' +``` + +Expected output: + +```text +Ready +true +``` + +## 1) Confirm external provisioner entitlement + +`CoderProvisioner` requires external provisioner entitlement in the referenced Coder deployment. + +```bash +kubectl get codercontrolplane codercontrolplane-sample -n coder \ + -o jsonpath='{.status.externalProvisionerDaemonsEntitlement}{"\n"}' +``` + +Expected values to proceed: `entitled` or `grace_period`. + +If the value is `not_entitled`, update the control-plane license before continuing. + +## 2) Deploy the `CoderProvisioner` + +Apply the sample manifest: + +```bash +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/samples/coder_v1alpha1_coderprovisioner.yaml" +``` + +## 3) Verify reconciliation + +```bash +kubectl get coderprovisioner coderprovisioner-sample -n coder +kubectl get coderprovisioner coderprovisioner-sample -n coder -o jsonpath='{.status.phase}{"\n"}' +kubectl get coderprovisioner coderprovisioner-sample -n coder -o jsonpath='{range .status.conditions[*]}{.type}={.status} {.reason}{"\n"}{end}' +``` + +Verify generated resources: + +```bash +kubectl get deployment provisioner-coderprovisioner-sample -n coder +kubectl get serviceaccount coderprovisioner-sample-provisioner -n coder +kubectl get role provisioner-coderprovisioner-sample -n coder +kubectl get rolebinding provisioner-coderprovisioner-sample -n coder +kubectl get secret coderprovisioner-sample-provisioner-key -n coder +``` + +Expected: `status.phase=Ready`, `DeploymentReady=True`, and a ready provisioner pod. + +## 4) Clean up (optional) + +```bash +kubectl delete coderprovisioner coderprovisioner-sample -n coder +``` + +To tear down the full stack, follow cleanup in +[Deploy a Coder Control Plane](getting-started.md#5-clean-up-optional). diff --git a/docs/tutorials/getting-started.md b/docs/tutorials/getting-started.md index 63a432dc..abc3e2f5 100644 --- a/docs/tutorials/getting-started.md +++ b/docs/tutorials/getting-started.md @@ -1,92 +1,108 @@ -# Getting started (local development) +# Deploy a Coder Control Plane -This tutorial walks through running the `coder-k8s` **controller** locally against a Kubernetes cluster, then creating your first `CoderControlPlane` resource. +This tutorial deploys the `coder-k8s` operator and brings up one managed Coder instance from a `CoderControlPlane` resource. + +Estimated time: **10–15 minutes**. ## Prerequisites -- Go 1.25+ (`go.mod` currently declares Go 1.25.7) -- A Kubernetes cluster (OrbStack, KIND, or any conformant cluster) +- A Kubernetes cluster - `kubectl` configured to your target context +- Permissions to create namespaces, CRDs, RBAC resources, and Deployments -If you use the Nix devshell: - -```bash -nix develop -``` +## 1) Install the operator -Optional: create a disposable KIND cluster with project defaults: +Create the operator namespace and apply CRDs/RBAC/deployment from GitHub: ```bash -make kind-dev-up +kubectl create namespace coder-system +kubectl create namespace coder +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/crd/bases/coder.com_codercontrolplanes.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/crd/bases/coder.com_coderprovisioners.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/crd/bases/coder.com_coderworkspaceproxies.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/serviceaccount.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/role.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/clusterrolebinding.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/authentication-reader-binding.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/auth-delegator-binding.yaml" +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/deploy/deployment.yaml" ``` -## 1) Generate and install CRDs +!!! tip + For reproducible installs, replace `/main/` with a release tag (for example `/v0.1.0/`). -Generate manifests: +Wait for the operator pod: ```bash -make manifests +kubectl rollout status deployment/coder-k8s -n coder-system +kubectl get pods -n coder-system ``` -Install CRDs into your cluster: - -```bash -kubectl apply -f config/crd/bases/ -``` +## 2) Create a `CoderControlPlane` instance -Create the sample namespace used by shipped manifests: +Apply the sample control plane resource: ```bash -kubectl create namespace coder +kubectl apply -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/samples/coder_v1alpha1_codercontrolplane.yaml" ``` -## 2) Run the controller locally +## 3) Verify reconciliation -Start controller mode (terminal A): +Check the CR status: ```bash -GOFLAGS=-mod=vendor go run . --app=controller +kubectl get codercontrolplane codercontrolplane-sample -n coder +kubectl get codercontrolplane codercontrolplane-sample -n coder -o jsonpath='{.status.phase}{"\n"}{.status.url}{"\n"}' ``` -Leave this terminal running so you can watch reconciliation logs. - -## 3) Create a sample `CoderControlPlane` - -In a second terminal (terminal B): +Verify the managed Coder Deployment and Service are present and ready: ```bash -kubectl apply -f config/samples/coder_v1alpha1_codercontrolplane.yaml +kubectl rollout status deployment/codercontrolplane-sample -n coder +kubectl get deployment codercontrolplane-sample -n coder +kubectl get service codercontrolplane-sample -n coder ``` -## 4) Verify reconciliation +Expected result: -Check resource status: +- `status.phase` becomes `Ready` +- `status.url` is populated (for example `http://codercontrolplane-sample.coder.svc.cluster.local:80`) +- A Coder Deployment and Service named `codercontrolplane-sample` exist in `coder` -```bash -kubectl get codercontrolplanes -A -kubectl describe codercontrolplane codercontrolplane-sample -n coder -``` +## 4) Access the Coder instance (optional) -The controller creates a Deployment + Service named after the control plane (`codercontrolplane-sample`) in the same namespace. +Port-forward the Service locally: ```bash -kubectl get deploy,svc -n coder +kubectl port-forward svc/codercontrolplane-sample -n coder 3000:80 ``` -## 5) Clean up (optional) +Then open: -```bash -kubectl delete codercontrolplane codercontrolplane-sample -n coder +```text +http://127.0.0.1:3000 ``` -If you used `kind-dev-up`, you can remove the cluster with: +## 5) Clean up (optional) ```bash -make kind-dev-down +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/samples/coder_v1alpha1_codercontrolplane.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/deploy/deployment.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/auth-delegator-binding.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/authentication-reader-binding.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/clusterrolebinding.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/role.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/rbac/serviceaccount.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/crd/bases/coder.com_coderworkspaceproxies.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/crd/bases/coder.com_coderprovisioners.yaml" +kubectl delete -f "https://raw.githubusercontent.com/coder/coder-k8s/main/config/crd/bases/coder.com_codercontrolplanes.yaml" +kubectl delete namespace coder --ignore-not-found +kubectl delete namespace coder-system --ignore-not-found ``` ## Next steps -- Deploy in-cluster: [How-to → Deploy controller](../how-to/deploy-controller.md) -- Understand internals: [Explanation → Architecture](../explanation/architecture.md) -- Explore aggregated APIs: [How-to → Deploy aggregated API server](../how-to/deploy-aggregated-apiserver.md) +- Run an external provisioner daemon: [Deploy an External Provisioner](deploy-coderprovisioner.md) +- GitOps path: [Deploy operator stack with Argo CD](deploy-with-argocd.md) +- Split deployment model: [Deploy aggregated API server](../how-to/deploy-aggregated-apiserver.md) +- MCP operations: [Run MCP server](../how-to/mcp-server.md) diff --git a/examples/aggregated/README.md b/examples/coder-templates/README.md similarity index 76% rename from examples/aggregated/README.md rename to examples/coder-templates/README.md index e10c0e85..c42f453c 100644 --- a/examples/aggregated/README.md +++ b/examples/coder-templates/README.md @@ -1,7 +1,7 @@ -# Aggregated API examples +# CoderTemplate API examples This directory contains example `CoderTemplate` resources for exercising the -aggregated API server (`aggregation.coder.com/v1alpha1`). +`CoderTemplate` API (`aggregation.coder.com/v1alpha1`). ## Smoke template export @@ -12,7 +12,7 @@ aggregated API server (`aggregation.coder.com/v1alpha1`). Apply it with: ```bash -kubectl apply -f examples/aggregated/codertemplate-smoke-scratch.yaml +kubectl apply -f examples/coder-templates/codertemplate-smoke-scratch.yaml ``` If you are updating an already-existing object with `kubectl replace`, include diff --git a/examples/aggregated/codertemplate-smoke-scratch.yaml b/examples/coder-templates/codertemplate-smoke-scratch.yaml similarity index 100% rename from examples/aggregated/codertemplate-smoke-scratch.yaml rename to examples/coder-templates/codertemplate-smoke-scratch.yaml diff --git a/mkdocs.yml b/mkdocs.yml index a2413011..44ffa03d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -34,7 +34,8 @@ extra_javascript: nav: - Home: index.md - Tutorials: - - Getting started: tutorials/getting-started.md + - Deploy a Coder Control Plane: tutorials/getting-started.md + - Deploy an External Provisioner: tutorials/deploy-coderprovisioner.md - Deploy operator stack with Argo CD: tutorials/deploy-with-argocd.md - How-to guides: - Deploy controller: how-to/deploy-controller.md From 4c44ad66d1f0c52942fc928f64b6ce48b60a3233 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 13 Feb 2026 14:00:43 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=A4=96=20fix:=20satisfy=20docs-qualit?= =?UTF-8?q?y=20spell=20check=20in=20provisioner=20tutorial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use kubectl short aliases (`sa`, `rb`) in the verification snippet to satisfy cspell in docs-quality CI. --- _Generated with `mux` • Model: `openai:gpt-5.3-codex` • Thinking: `xhigh` • Cost: `$0.00`_ --- docs/tutorials/deploy-coderprovisioner.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/deploy-coderprovisioner.md b/docs/tutorials/deploy-coderprovisioner.md index b8e999f7..4ef80bae 100644 --- a/docs/tutorials/deploy-coderprovisioner.md +++ b/docs/tutorials/deploy-coderprovisioner.md @@ -61,9 +61,9 @@ Verify generated resources: ```bash kubectl get deployment provisioner-coderprovisioner-sample -n coder -kubectl get serviceaccount coderprovisioner-sample-provisioner -n coder +kubectl get sa coderprovisioner-sample-provisioner -n coder kubectl get role provisioner-coderprovisioner-sample -n coder -kubectl get rolebinding provisioner-coderprovisioner-sample -n coder +kubectl get rb provisioner-coderprovisioner-sample -n coder kubectl get secret coderprovisioner-sample-provisioner-key -n coder ``` From e232bc603167001cff9d0ed8665098f205fc80ca Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 13 Feb 2026 14:57:23 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=A4=96=20docs:=20align=20Argo=20CD=20?= =?UTF-8?q?tutorial=20naming=20with=20tutorial=20set?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename the Argo CD tutorial title and add an estimated duration so it aligns with the product-focused tutorial naming and format used across docs. --- _Generated with `mux` • Model: `openai:gpt-5.3-codex` • Thinking: `xhigh` • Cost: `$0.00`_ --- docs/tutorials/deploy-with-argocd.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/tutorials/deploy-with-argocd.md b/docs/tutorials/deploy-with-argocd.md index 2a4db076..1152ca51 100644 --- a/docs/tutorials/deploy-with-argocd.md +++ b/docs/tutorials/deploy-with-argocd.md @@ -1,4 +1,8 @@ -# Deploy coder-k8s and the CloudNativePG example with Argo CD +# Deploy operator stack with Argo CD + +This tutorial deploys `coder-k8s` and the CloudNativePG-backed example stack through Argo CD. + +Estimated time: **20–30 minutes**. By the end, your cluster will have: From 3597579f09b8c6b62f284752c13762a4ae106c15 Mon Sep 17 00:00:00 2001 From: Thomas Kosiewski Date: Fri, 13 Feb 2026 15:05:50 +0000 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=A4=96=20docs:=20create=20coder=20nam?= =?UTF-8?q?espace=20in=20contributing=20quick=20start?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an explicit `kubectl create namespace coder` step before applying the sample control plane so the CONTRIBUTING quick-start works with namespaced sample manifests. --- _Generated with `mux` • Model: `openai:gpt-5.3-codex` • Thinking: `xhigh` • Cost: `$0.00`_ --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7eb5359e..952f437e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,8 @@ kubectl apply -f config/crd/bases/ # Run controller locally against your kubeconfig context GOFLAGS=-mod=vendor go run . --app=controller -# In another terminal, apply a sample control plane +# In another terminal, create the sample namespace and apply a sample control plane +kubectl create namespace coder kubectl apply -f config/samples/coder_v1alpha1_codercontrolplane.yaml # Verify resource creation