{"id":34187684,"url":"https://github.com/dpogorzelski/speedrun","last_synced_at":"2026-03-12T06:40:12.032Z","repository":{"id":45053656,"uuid":"282493444","full_name":"dpogorzelski/speedrun","owner":"dpogorzelski","description":"Control your compute fleet at scale","archived":false,"fork":false,"pushed_at":"2024-09-15T15:12:21.000Z","size":679,"stargazers_count":16,"open_issues_count":8,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-09-15T16:29:36.760Z","etag":null,"topics":["automation","cli","cloud","command-execution","devops","gcp","go","google-cloud","sre","sysadmin"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dpogorzelski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"dpogorzelski","ko_fi":"dawid"}},"created_at":"2020-07-25T17:34:40.000Z","updated_at":"2024-08-06T06:57:54.000Z","dependencies_parsed_at":"2024-06-19T04:01:09.734Z","dependency_job_id":"f914a100-4ebc-44b4-9606-893fa714c4b0","html_url":"https://github.com/dpogorzelski/speedrun","commit_stats":{"total_commits":92,"total_committers":4,"mean_commits":23.0,"dds":0.05434782608695654,"last_synced_commit":"39803ea514de038c19f321f111ff1c42c1c78089"},"previous_names":["speedrunsh/speedrun"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/dpogorzelski/speedrun","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpogorzelski%2Fspeedrun","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpogorzelski%2Fspeedrun/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpogorzelski%2Fspeedrun/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpogorzelski%2Fspeedrun/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dpogorzelski","download_url":"https://codeload.github.com/dpogorzelski/speedrun/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dpogorzelski%2Fspeedrun/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30417542,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-12T04:41:02.746Z","status":"ssl_error","status_checked_at":"2026-03-12T04:40:12.571Z","response_time":114,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: 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":["automation","cli","cloud","command-execution","devops","gcp","go","google-cloud","sre","sysadmin"],"created_at":"2025-12-15T15:19:25.490Z","updated_at":"2026-03-12T06:40:12.025Z","avatar_url":"https://github.com/dpogorzelski.png","language":"Go","funding_links":["https://github.com/sponsors/dpogorzelski","https://ko-fi.com/dawid"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca rel=\"nofollow\"\u003e\n    \u003cimg src=\"assets/logo.png?raw=true\" width=\"200\" style=\"max-width:100%;\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n# Speedrun\n\n[![license](https://img.shields.io/badge/license-MPL2-blue.svg)](https://github.com/dpogorzelski/speedrun/blob/master/LICENSE)\n[![Go Report Card](https://goreportcard.com/badge/github.com/dpogorzelski/speedrun)](https://goreportcard.com/report/github.com/dpogorzelski/speedrun)\n[![Go](https://github.com/dpogorzelski/speedrun/actions/workflows/go.yml/badge.svg)](https://github.com/dpogorzelski/speedrun/actions/workflows/go.yml)\n\nSpeedrun helps you control your compute fleet with minimal effort.\n\nExample, stop nginx across 3k machines:\n\n```bash\nspeedrun service stop nginx --target \"Labels.role == 'nginx'\"\n```\n\nFeatures:\n\n* stateless\n* serverless\n* idempotent\n* no complex configuration required\n* service discovery via native cloud integration (currently Google Cloud only, AWS, Azure and Consul coming up!)\n* extensible (plugin system is in the works)\n\n## Installation\n\n#### MacOS, Linux, Windows\n\nDownload the precompiled binaries from here: [Releases](https://github.com/dpogorzelski/speedrun/releases)\n\n## Usage\n\n#### Quickstart\n\nOn a server:\n\n```bash\nsudo ./portal --insecure\n```\n\nOn your machine:\n\n```bash\nexport GOOGLE_APPLICATION_CREDENTIALS=/path/to/serviceaccount.json\nspeedrun run whoami --insecure\n```\n\n## Architecture\n\n\u003cp align=\"center\"\u003e\n  \u003ca rel=\"nofollow\"\u003e\n    \u003cimg src=\"assets/architecture-overview.png\" width=\"600\" style=\"max-width:100%;\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n#### Speedrun\nSpeedrun is the client. Speedrun is the CLI tool you run on your computer to send commands to your VMs.\n\n#### Portal\nPortal is the agent running on each server you want to send commands to. It will receive commands sent from Speedrun and respond with the outcome details accordingly.\n#### Service Discovery\nThere is no server component in Speedrun's architecture. Service discovery is performed against native facilities of each supported provider such as GCP, AWS or Consul.\nThis eliminates the need to deploy,maintain and operate a server and all problems that would come with it as a consequence, such as: scalability, failure tolerance, redundancy, agent lifecycle management etc.\n\n```mermaid\nsequenceDiagram\nSpeedrun -\u003e\u003e GCP API: Get list of VMs\nGCP API -\u003e\u003e Speedrun: Return list of VMs\nSpeedrun -\u003e\u003e Speedrun: Filter list of VMs\nSpeedrun -\u003e\u003e Portals: Send command\n```\n\n#### Protocols\n\nCommunication between Speedrun and Portals is performed via [dRPC](https://github.com/storj/drpc), a lightweight, drop-in replacement for gRPC. All dRPC interactions travel on top of TLS1.3 and can be mutually authenticated ([mTLS](https://en.wikipedia.org/wiki/Mutual_authentication)).\n\n#### Language Definition\nSpeedrun supports a flexible yet simple expression language to filter Service Discovery results (`--target`), it's based on [antonmedv/expr](https://github.com/antonmedv/expr). Full language definition can be found [here](https://github.com/antonmedv/expr/blob/master/docs/Language-Definition.md).\n\n#### Plugins\nPlugins will allow you to add custom commands without altering the source code. This is not implemented yet.\n\n## Examples\n\nStop Nginx on VMs that have a label `role` with value `nginx` and a label named `project` with value `someproject`\n\n```bash\nspeedrun service stop nginx --target \"Labels.role == 'nginx' and Labels.project == 'someproject'\"\n```\n\nRun arbitrary shell command on the target machines. Ignore Portal's certificate and connect via private IP address.\n\n```bash\nspeedrun run \"ls -la\" --target \"Labels.env != 'prod'\" --insecure --use-private-ip\n```\n\nUse a different config file\n\n```bash\nspeedrun run whoami -c /path/to/config.toml\n```\n\n## Configuration\nConfig samples are located under [conf](conf/).\n\n#### Run Portal as a systemd service\nFind a sample unit [here](init/portal.service)\n\n#### Use self signed certificates during testing\nIn the [scripts](scripts/) folder you can find scripts that will help you generate:\n* a CA cert/key\n* Speedrun cert/key\n* Portal cert/key\n\nRun them:\n```bash\nscripts/generate_fake_ca.sh\nscripts/generate_portal_cert.sh\nscripts/generate_speedrun_cert.sh\n```\nThis will generate the required key/cert pairs:\n```\nca.crt\nca.key\nportal.crt\nportal.key\nspeedrun.crt\nspeedrun.key\n```\nSet the path in the `[tls]` config block:\n\nPortal:\n```toml\n[tls]\n  ca = \"ca.crt\"\n  cert = \"portal.crt\"\n  insecure = false\n  key = \"portal.key\"\n```\nSpeedrun:\n```toml\n[tls]\n  ca = \"ca.crt\"\n  cert = \"speedrun.crt\"\n  insecure = false\n  key = \"speedrun.key\"\n```\n\n## List of built-in Actions\n* [x] run: run arbitrary shell commands\n* [X] service: control systemd services\n* [X] file: perform file operations such as read or cp\n* [ ] disk: perform storage operations such as listing partitions and available disk space\n* [ ] ps: fetch process information\n* [ ] top: fetch or stream high level system stats\n* [ ] pkg: manage packages via default package manager\n* [X] system: host control operations such as reboot, shutdown etc.\n...\n## Contributing\n\nPull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.\n\n## Project Status\n\nThis project is in a very early stage so expect a lot of breaking changes in the nearest future\n\n## Community \u0026 Support\n\nJoin the [Speedrun Slack](https://join.slack.com/t/slack-w9m7528/shared_invite/zt-11lyemhxe-EdWi0zqh0rIEYc85mKI6_g) and ask questions 😃\n\n## License\n\n[MPL-2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdpogorzelski%2Fspeedrun","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdpogorzelski%2Fspeedrun","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdpogorzelski%2Fspeedrun/lists"}