{"id":44527418,"url":"https://github.com/joelp172/uptime-robot-operator","last_synced_at":"2026-04-10T09:01:07.203Z","repository":{"id":335879207,"uuid":"1147348721","full_name":"joelp172/uptime-robot-operator","owner":"joelp172","description":"Kubernetes operator for managing UptimeRobot monitors declaratively. Automatic drift detection, all monitor types supported, GitOps-friendly.","archived":false,"fork":false,"pushed_at":"2026-04-09T21:05:04.000Z","size":1071,"stargazers_count":1,"open_issues_count":12,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-09T21:05:40.027Z","etag":null,"topics":["gitops","go","kubebuilder","kubernetes","monitoring","operator","uptimerobot"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"clevyr/uptime-robot-operator","license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joelp172.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-01T15:59:36.000Z","updated_at":"2026-04-09T20:31:26.000Z","dependencies_parsed_at":"2026-04-10T09:01:05.297Z","dependency_job_id":null,"html_url":"https://github.com/joelp172/uptime-robot-operator","commit_stats":null,"previous_names":["joelp172/uptime-robot-operator"],"tags_count":41,"template":false,"template_full_name":null,"purl":"pkg:github/joelp172/uptime-robot-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelp172%2Fuptime-robot-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelp172%2Fuptime-robot-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelp172%2Fuptime-robot-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelp172%2Fuptime-robot-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joelp172","download_url":"https://codeload.github.com/joelp172/uptime-robot-operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelp172%2Fuptime-robot-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31635969,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"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":["gitops","go","kubebuilder","kubernetes","monitoring","operator","uptimerobot"],"created_at":"2026-02-13T18:15:29.248Z","updated_at":"2026-04-10T09:01:07.193Z","avatar_url":"https://github.com/joelp172.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Uptime Robot Operator\n\n[![Build](https://github.com/joelp172/uptime-robot-operator/actions/workflows/build.yml/badge.svg)](https://github.com/joelp172/uptime-robot-operator/actions/workflows/build.yml)\n[![codecov](https://codecov.io/gh/joelp172/uptime-robot-operator/branch/main/graph/badge.svg)](https://codecov.io/gh/joelp172/uptime-robot-operator)\n[![Release](https://img.shields.io/github/v/release/joelp172/uptime-robot-operator)](https://github.com/joelp172/uptime-robot-operator/releases/latest)\n[![License](https://img.shields.io/github/license/joelp172/uptime-robot-operator)](LICENSE)\n[![Go Report Card](https://goreportcard.com/badge/github.com/joelp172/uptime-robot-operator)](https://goreportcard.com/report/github.com/joelp172/uptime-robot-operator)\n\nManage [UptimeRobot](https://uptimerobot.com/?red=joelpi) monitors as Kubernetes resources. Automatic drift detection, self-healing, and GitOps-ready.\n\n## Features\n\n- Declarative monitor configuration via CRDs\n- Drift detection and automatic correction\n- All monitor types: HTTPS, Keyword, Ping, Port, Heartbeat, DNS\n- Maintenance window scheduling\n- Alert contact management\n- **Adopt existing monitors** - Migrate monitors created outside Kubernetes without losing history\n- **Prometheus metrics** - API performance, reconciliation duration, error tracking\n\n## Security\n\nAll images are:\n- **Signed with Cosign** — Keyless signing via GitHub Actions OpenID Connect (OIDC)\n- **Scanned for vulnerabilities** — Trivy scanning; critical/high severity blocks the build\n- **SBOM included** — Software Bill of Materials (SBOM) in SPDX and CycloneDX formats\n\nSee [SECURITY.md](SECURITY.md) for verification instructions and deployment best practices.\n\n## Quick Start\n\nInstall the operator:\n\n```bash\nkubectl apply -f https://github.com/joelp172/uptime-robot-operator/releases/latest/download/install.yaml\n```\n\nCreate your first monitor:\n\n```bash\n# Store your API key\nkubectl create secret generic uptimerobot-api-key \\\n  --namespace uptime-robot-system \\\n  --from-literal=apiKey=YOUR_API_KEY\n\n# Configure account\nkubectl apply -f - \u003c\u003cEOF\napiVersion: uptimerobot.com/v1alpha1\nkind: Account\nmetadata:\n  name: default\nspec:\n  isDefault: true\n  apiKeySecretRef:\n    name: uptimerobot-api-key\n    key: apiKey\nEOF\n\n# Get your contact ID\nkubectl get account default -o jsonpath='{.status.alertContacts[0].id}'\n\n# Create contact (replace YOUR_CONTACT_ID)\nkubectl apply -f - \u003c\u003cEOF\napiVersion: uptimerobot.com/v1alpha1\nkind: Contact\nmetadata:\n  name: default\nspec:\n  isDefault: true\n  contact:\n    id: \"YOUR_CONTACT_ID\"\nEOF\n\n# Create monitor\nkubectl apply -f - \u003c\u003cEOF\napiVersion: uptimerobot.com/v1alpha1\nkind: Monitor\nmetadata:\n  name: my-website\nspec:\n  monitor:\n    name: My Website\n    url: https://example.com\n    interval: 5m\nEOF\n```\n\n## Documentation\n\n| Document | Purpose |\n|----------|---------|\n| [Installation](docs/installation.md) | Install via kubectl or Helm |\n| [Getting Started](docs/getting-started.md) | Create your first monitor (tutorial) |\n| [Security](SECURITY.md) | Verify images and deployment best practices |\n| [Monitors](docs/monitors.md) | Configure monitor types and alerts |\n| [Metrics](docs/metrics.md) | Prometheus metrics and Grafana dashboards |\n| [Migration Guide](docs/migration-guide.md) | Adopt existing UptimeRobot resources |\n| [Maintenance Windows](docs/maintenance-windows.md) | Schedule planned downtime |\n| [Architecture](docs/architecture.md) | System architecture and data flows |\n| [Troubleshooting](docs/troubleshooting.md) | Diagnose and fix common issues |\n| [API Versioning](docs/api-versioning.md) | API stability, deprecation, and upgrade policy |\n| [API Reference](docs/api-reference.md) | Complete CRD field reference |\n| [Development](docs/development.md) | Contributing and testing |\n\n## Monitor Types\n\n| Type | Use Case |\n|------|----------|\n| HTTPS | HTTP/HTTPS endpoints |\n| Keyword | Page content verification |\n| Ping | ICMP availability |\n| Port | TCP port connectivity |\n| Heartbeat | Cron jobs and scheduled tasks |\n| DNS | DNS record validation |\n\n## How It Works\n\nThe operator reconciles Monitor resources with UptimeRobot via the API. It detects drift (manual changes in UptimeRobot) and corrects them to match your Kubernetes configuration. When you delete a Monitor resource, the operator removes it from UptimeRobot (configurable via `prune` field).\n\n## Observability\n\nThe operator exposes custom Prometheus metrics for monitoring API performance, reconciliation behavior, and resource health:\n\n- **API Metrics**: Request rate, latency percentiles, error rate, retry patterns\n- **Reconciliation Metrics**: Duration, error rate by controller and error type\n- **Resource Metrics**: Monitor counts by type/status, maintenance windows, monitor groups\n\nSee [docs/metrics.md](docs/metrics.md) for complete documentation and a sample Grafana dashboard.\n\n```bash\n# Enable metrics endpoint (chart/manifests default to :8443; :8080 is also valid)\nkubectl patch deployment -n uptime-robot-system uptime-robot-controller-manager \\\n  --type=json -p='[{\"op\": \"add\", \"path\": \"/spec/template/spec/containers/0/args/-\", \"value\": \"--metrics-bind-address=:8443\"}]'\n\n# Access metrics\nkubectl port-forward -n uptime-robot-system deployment/uptime-robot-controller-manager 8443:8443\ncurl http://localhost:8443/metrics | grep uptimerobot_\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and PR guidelines.\n\n## License\n\nApache License 2.0 - see [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoelp172%2Fuptime-robot-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoelp172%2Fuptime-robot-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoelp172%2Fuptime-robot-operator/lists"}