{"id":43750564,"url":"https://github.com/evantbyrne/rove","last_synced_at":"2026-02-05T13:11:25.597Z","repository":{"id":249221319,"uuid":"803565377","full_name":"evantbyrne/rove","owner":"evantbyrne","description":"⧉ Deploy containers over SSH.","archived":false,"fork":false,"pushed_at":"2025-08-09T19:42:46.000Z","size":222,"stargazers_count":14,"open_issues_count":7,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-09T21:11:51.024Z","etag":null,"topics":["ci-cd","deployment","docker","infrastructure","linux","self-hosting"],"latest_commit_sha":null,"homepage":"https://rove.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/evantbyrne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","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}},"created_at":"2024-05-21T01:09:55.000Z","updated_at":"2025-08-09T20:00:20.000Z","dependencies_parsed_at":"2024-09-07T23:25:14.683Z","dependency_job_id":"b15d0d92-3330-4ab3-b2f6-fd9c72f977fc","html_url":"https://github.com/evantbyrne/rove","commit_stats":null,"previous_names":["evantbyrne/rove"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/evantbyrne/rove","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evantbyrne%2Frove","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evantbyrne%2Frove/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evantbyrne%2Frove/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evantbyrne%2Frove/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/evantbyrne","download_url":"https://codeload.github.com/evantbyrne/rove/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/evantbyrne%2Frove/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29122590,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-05T10:47:47.471Z","status":"ssl_error","status_checked_at":"2026-02-05T10:45:08.119Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5: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":["ci-cd","deployment","docker","infrastructure","linux","self-hosting"],"created_at":"2026-02-05T13:11:24.871Z","updated_at":"2026-02-05T13:11:25.591Z","avatar_url":"https://github.com/evantbyrne.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rove\n\nRove is a tool for self-hosting on Linux. It ships as a single binary which provisions machines and deploys containers directly to them via SSH.\n\n\n## Quick Start\n\n```\n% rove machine add \u003cname\u003e \u003cip\u003e \u003cuser\u003e ~/.ssh/id_ed25519\n\nConnected to remote address '\u003cip\u003e'.\n\nRove will make the following changes to remote machine:\n\n ~ Enable firewall\n ~ Install docker\n ~ Enable swarm\n\nDo you want Rove to run this deployment?\n  Type 'yes' to approve, or anything else to deny.\n  Enter a value: yes\n\n...\n\nSetup '\u003cname\u003e' and set as default machine.\n```\n\nUnder the hood, Rove just setup a standard docker installation with a firewall. No proprietary or closed-source technology is ever deployed to the server. Rove does not collect telemetry. All client configuration is saved locally in a .rove file, which does not need to be synced to deploy from other workstations, CI, etc.\n\nNext, let's deploy a python container to host a simple file server. We'll use a service for this, because we want it to run indefinitely. \n\n```\n% rove service run files --publish 80:80 python:3.12 python3 -m http.server 80\n\nRove will create files:\n\n + service files:\n +   command  = [\"python3\",\"-m\",\"http.server\",\"80\"]\n +   image    = \"python:3.12\"\n +   publish  = [\"80:80\"]\n +   replicas = \"1\"\n\nDo you want Rove to run this deployment?\n  Type 'yes' to approve, or anything else to deny.\n  Enter a value: yes\n\n...\n\nRove deployed 'files'.\n```\n\nRove diffs the options you provide against what is actually running, so you can see exactly how changes will impact services before updating.\n\nSee the [Rove homepage](https://rove.dev) for the rest of the tutorial.\n\nCheck out the [roadmap](https://github.com/users/evantbyrne/projects/1) for planned features.\n\n\n## Architecture\n\nRove is intended to be a relatively simple client for managing single-server Docker Swarms, while smoothing over some of the annoyances that come with rolling your own tooling. It is designed in such a way that if you grow beyond Rove's capabilities, then self-management does not require changes to the server because there is no runtime other than Docker. Rove commands do not have unannounced side-effects to avoid interference with other aspects of server management. You will not find a privacy policy because we do not collect telemetry.\n\nThe Rove command line client connects to servers via SSH with key-based authentication. Nothing is installed by Rove on the client. When setting up a server, Rove installs Docker, enables Swarm mode, configures the firewall to allow SSH, configures the firewall to block Swarm management ports, and enables the firewall. It does not currently manage software or OS updates but may optionally in the future.\n\n\n## Installation\n\nRove ships as a single binary which may be placed wherever you please, usually a directory found in the terminal `$PATH`. See the [releases section](https://github.com/evantbyrne/rove/releases) of the git repository for downloads.\n\n\n## Supported Systems\n\nRove currently supports running the command line client on MacOS and Linux generally. It fully supports deploying to Ubuntu 24 and Debian 12 or later, with plans to more fully support other Linux distributions once firewall configuration has been implemented for systems that don't support UFW. Both x86 and Arm architectures are supported.\n\n\n## Managing Environments\n\n- Run `rove machine use \u003cname\u003e` to switch between configured remote machines, or use the `--machine \u003cname\u003e` flag on individual commands.\n- Deploy to your local machine by providing the `--local` flag to commands. Note that Swarm mode will need to be enabled on Docker.\n\n\n## CI/CD\n\nIt is generally easiest to first setup services manually using Rove commands, and then use `rove service redeploy --force \u003cservice\u003e` from CI/CD to pull in a new image. However, any of the builtin commands may be used in automations. Your CI/CD will need SSH access and to have run `rove machine add --force --skip \u003cname\u003e \u003cip\u003e \u003cuser\u003e \u003cssh-key\u003e` before any other commands.\n\nThere are a number of flags available that may come in handy in an automated environment:\n\n- `--skip` on `rove machine add` skips remote setup steps.\n- `--force` skips confirmations.\n- `--json` outputs JSON on success for commands that support it.\n\n\n## Security\n\nThe `rove login` command uses `docker login` behind the scenes to authenticate with container registries. Secrets utilize Swarm's secrets storage, which mounts secrets files in the `/run/secrets` directory on configured containers. It is inadvisable to store secrets within environment variables. Rove is not designed to harden Docker installations.\n\n\n## Sponsorship\n\nSponsorship of features that conform to Rove's values, style, and design are encouraged. Sponsorship is required for commercial integrations. An example of a feature that should be sponsored would be integrating a webhost's REST API for provisioning virtual machines via a subcommand. Commercial features must be opt-in, must not cause harm, and they must not collect telemetry. Contact [Evan](https://www.linkedin.com/in/evan-byrne-6b23a810a/) for sponsorship inquiries.\n\n\n## Usage\n\n```\n% rove --help\nUsage: rove \u003ccommand\u003e [flags]\n\nFlags:\n  -h, --help    Show context-sensitive help.\n\nCommands:\n  inspect \u003cname\u003e [flags]\n    Inspect services and tasks.\n\n  login \u003cusername\u003e \u003cpassword-file\u003e [flags]\n    Log into docker registries.\n\n  logout [flags]\n    Log out of docker registries.\n\n  logs \u003cname\u003e [flags]\n    View logs.\n\n  machine add \u003cname\u003e \u003caddress\u003e \u003cuser\u003e \u003cpk\u003e [flags]\n\n  machine delete \u003cmachine\u003e [flags]\n\n  machine list [flags]\n\n  machine use \u003cname\u003e [flags]\n\n  network add \u003cname\u003e [flags]\n\n  network delete \u003cname\u003e [flags]\n\n  network list [flags]\n\n  secret create \u003cname\u003e \u003cfile\u003e [flags]\n\n  secret delete \u003cname\u003e [flags]\n\n  secret list [flags]\n\n  service delete \u003cname\u003e [flags]\n\n  service list [flags]\n\n  service redeploy \u003cname\u003e [flags]\n\n  service rollback \u003cname\u003e [flags]\n\n  service run \u003cname\u003e \u003cimage\u003e [\u003ccommand\u003e ...] [flags]\n\n  task list [flags]\n\n  task run \u003cimage\u003e [\u003ccommand\u003e ...] [flags]\n\n  volume add \u003cname\u003e [flags]\n\n  volume delete \u003cname\u003e [flags]\n\n  volume inspect \u003cname\u003e [flags]\n\n  volume list [flags]\n\nRun \"rove \u003ccommand\u003e --help\" for more information on a command.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevantbyrne%2Frove","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fevantbyrne%2Frove","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fevantbyrne%2Frove/lists"}