{"id":45093756,"url":"https://github.com/posit-dev/team-operator","last_synced_at":"2026-04-02T22:04:03.875Z","repository":{"id":332146303,"uuid":"1121881297","full_name":"posit-dev/team-operator","owner":"posit-dev","description":"Kubernetes Operator for Posit Team","archived":false,"fork":false,"pushed_at":"2026-03-12T01:15:55.000Z","size":20694,"stargazers_count":7,"open_issues_count":37,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-12T01:35:24.126Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/posit-dev.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-23T17:57:41.000Z","updated_at":"2026-03-11T20:10:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/posit-dev/team-operator","commit_stats":null,"previous_names":["posit-dev/team-operator"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/posit-dev/team-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/posit-dev%2Fteam-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/posit-dev%2Fteam-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/posit-dev%2Fteam-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/posit-dev%2Fteam-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/posit-dev","download_url":"https://codeload.github.com/posit-dev/team-operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/posit-dev%2Fteam-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30479100,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-13T20:45:58.186Z","status":"ssl_error","status_checked_at":"2026-03-13T20:45:20.133Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-19T18:00:44.467Z","updated_at":"2026-03-13T23:13:29.594Z","avatar_url":"https://github.com/posit-dev.png","language":"Go","readme":"# Team Operator\n\n\u003e **Warning**\n\u003e This repository is under active development and is not yet ready for production use. Please [contact Posit](https://posit.co/schedule-a-call/) before using this operator.\n\nA Kubernetes operator that manages deployment and lifecycle of Posit Team products (Workbench, Connect, Package Manager, and Chronicle) within Kubernetes clusters.\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Components](#components)\n  - [Flightdeck](#flightdeck)\n- [Quick Start](#quick-start)\n  - [Prerequisites](#prerequisites)\n  - [Installation](#installation)\n  - [Local Development](#local-development)\n- [Configuration](#configuration)\n- [Architecture](#architecture)\n- [Troubleshooting](#troubleshooting)\n- [License](#license)\n- [Documentation](docs/README.md)\n\n## Overview\n\nThe Team Operator is a Kubernetes controller built with [Kubebuilder](https://book.kubebuilder.io/) that automates deployment, configuration, and management of Posit Team products. It handles:\n\n- Multi-product Posit Team deployments through a single `Site` Custom Resource\n- Database provisioning and management for each product\n- Secure credential management via Kubernetes secrets or AWS Secrets Manager\n- License configuration and validation\n- Ingress routing and load balancing\n- Shared storage configuration across products\n- Keycloak integration for authentication\n- Off-host execution support for Workbench and Connect\n\n## Components\n\n### Flightdeck\n\nFlightdeck is the landing page and dashboard for Posit Team deployments. It provides:\n\n- Product navigation cards for Workbench, Connect, and Package Manager\n- Responsive layout that automatically adjusts based on enabled products\n- Optional Academy integration\n- Configuration page access (when enabled)\n\n#### Configuration\n\nFlightdeck can be configured through the Site spec under `spec.flightdeck`:\n\n```yaml\nspec:\n  flightdeck:\n    image: ghcr.io/rstudio/flightdeck:latest\n    replicas: 1\n    featureEnabler:\n      showConfig: false    # Enable /config page\n      showAcademy: false   # Show Academy product card\n```\n\n**Layout behavior:**\n- When Academy is hidden (default), the three core products (Workbench, Connect, Package Manager) display with Workbench and Connect in the first row, Package Manager centered in the second row\n- When Academy is shown, all four products display in a 2x2 grid\n\n**Static assets:**\n- Images and CSS are served from the `/static` path\n- Assets are included in the Flightdeck container image\n\n## Quick Start\n\n### Prerequisites\n\n- Kubernetes cluster (1.29+)\n- kubectl configured to access your cluster\n- Go 1.21+ (for local development)\n- Docker (for building images)\n- Just command runner (`brew install just` or see [installation guide](https://github.com/casey/just))\n\n### Installation\n\n#### Via Helm (Recommended)\n\n```bash\n# Install from local chart\nhelm install team-operator ./dist/chart \\\n  --namespace posit-team-system --create-namespace\n\n# With custom image\nhelm install team-operator ./dist/chart \\\n  --namespace posit-team-system --create-namespace \\\n  --set controllerManager.container.image.repository=posit/team-operator \\\n  --set controllerManager.container.image.tag=latest\n```\n\n#### Via Kustomize (Development)\n\n```bash\nmake deploy IMG=posit/team-operator:latest\n```\n\n### Local Development\n\n```bash\n# Install dependencies\njust deps\n\n# Run tests\njust test\n\n# Build the operator binary\njust build\n\n# Run operator locally against your cluster\njust run\n\n# After API changes, regenerate manifests\njust mgenerate\n\n# Helm chart targets\njust helm-lint       # Lint the Helm chart\njust helm-template   # Render templates locally\njust helm-install    # Install via Helm\njust helm-uninstall  # Uninstall via Helm\n```\n\n### Testing\n\n**Unit tests** (fast, no cluster required):\n\n```bash\nmake go-test\n```\n\n**Integration tests** use two workflows:\n\n*One-shot (CI-style):* creates a cluster, runs all tests, tears everything down.\n\n```bash\nmake test-kind       # create → deploy → test → destroy\nmake test-kind-full  # same, but forces a clean cluster first\n```\n\n*Dev loop (recommended for iterative development):* keeps the cluster running between test runs.\n\n```bash\n# One-time setup: create cluster and deploy operator\nmake kind-setup\n\n# After making code changes, reload the image and re-deploy\nmake kind-setup\n\n# Run tests against the running cluster\nmake kind-test\n\n# When done for the day\nmake kind-teardown\n```\n\nSee [docs/testing.md](docs/testing.md) for full details.\n\n## Configuration\n\nThe Site CR defines a complete Posit Team deployment. Secrets and licenses are managed automatically through cloud provider integration (AWS Secrets Manager or Azure Key Vault) - configured during PTD bootstrap.\n\nExample Site configuration:\n```yaml\napiVersion: core.posit.team/v1beta1\nkind: Site\nmetadata:\n  name: my-site\n  namespace: posit-team  # Where Site CRs are deployed (operator runs in posit-team-system)\nspec:\n  # Required: Base domain for product URLs\n  domain: example.com\n\n  # Ingress configuration\n  ingressClass: traefik\n\n  # Flightdeck landing page (optional)\n  flightdeck:\n    featureEnabler:\n      showAcademy: false\n\n  # Products to deploy\n  workbench:\n    image: ghcr.io/rstudio/rstudio-workbench-daily:latest\n    replicas: 1\n\n  connect:\n    image: ghcr.io/rstudio/rstudio-connect-daily:latest\n    replicas: 1\n\n  packageManager:\n    image: ghcr.io/rstudio/rstudio-pm-daily:latest\n    replicas: 1\n```\n\n\u003e **Note:** The operator runs in `posit-team-system` namespace, while Site CRs and deployed products live in a separate namespace (typically `posit-team` or a configured `watchNamespace`). See [docs/README.md](docs/README.md) for detailed architecture.\n\n## Architecture\n\nThe Team Operator uses a hierarchical controller pattern:\n\n```\nSite CR (single source of truth)\n    │\n    ├── Site Controller\n    │       ├── Creates Product CRs (Connect, Workbench, PackageManager, Chronicle, Flightdeck)\n    │       ├── Manages shared storage (PersistentVolumes)\n    │       └── Coordinates database provisioning\n    │\n    ├── Product Controllers\n    │       ├── Connect Controller → Pods, Services, Ingress, ConfigMaps\n    │       ├── Workbench Controller → Pods, Sessions, Job Templates\n    │       ├── PackageManager Controller → Pods, S3/Azure integration\n    │       ├── Chronicle Controller → Telemetry service, Sidecar injection\n    │       └── Flightdeck Controller → Landing page, Product navigation\n    │\n    └── Database Controller\n            └── PostgreSQL schemas, credentials, migrations\n```\n\nEach product has dedicated database schemas and isolated credentials. Workbench and Connect support off-host execution with user workloads in separate Kubernetes Jobs. Chronicle collects telemetry via sidecars injected into product pods.\n\nFor detailed architecture diagrams with component explanations, see the [Architecture Documentation](docs/architecture.md).\n\n## Troubleshooting\n\nCheck operator logs:\n```bash\nkubectl logs -n posit-team-system deployment/team-operator-controller-manager\n```\n\nCheck site status:\n```bash\nkubectl describe site -n posit-team \u003csite-name\u003e\n```\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\nCopyright (c) 2023-2026 Posit Software, PBC\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fposit-dev%2Fteam-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fposit-dev%2Fteam-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fposit-dev%2Fteam-operator/lists"}