{"id":32136819,"url":"https://github.com/mightymoud/sidekick","last_synced_at":"2025-10-21T04:41:08.943Z","repository":{"id":256740094,"uuid":"823365697","full_name":"MightyMoud/sidekick","owner":"MightyMoud","description":"Bare metal to production ready in mins; your own fly server on your VPS.","archived":false,"fork":false,"pushed_at":"2025-10-19T10:32:33.000Z","size":10968,"stargazers_count":7073,"open_issues_count":17,"forks_count":147,"subscribers_count":25,"default_branch":"main","last_synced_at":"2025-10-19T20:55:25.879Z","etag":null,"topics":["deployment","heroku","self-host","self-hostable","self-hosted","self-hosting","selfhosting","vps-admin","vps-server","vps-setup","vps-ubuntu"],"latest_commit_sha":null,"homepage":"https://www.sidekickdeploy.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MightyMoud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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":"2024-07-02T22:43:42.000Z","updated_at":"2025-10-19T10:32:37.000Z","dependencies_parsed_at":"2025-08-16T09:19:29.051Z","dependency_job_id":null,"html_url":"https://github.com/MightyMoud/sidekick","commit_stats":null,"previous_names":["mightymoud/sidekick","ms-mousa/sidekick"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/MightyMoud/sidekick","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MightyMoud%2Fsidekick","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MightyMoud%2Fsidekick/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MightyMoud%2Fsidekick/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MightyMoud%2Fsidekick/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MightyMoud","download_url":"https://codeload.github.com/MightyMoud/sidekick/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MightyMoud%2Fsidekick/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280207158,"owners_count":26290613,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-21T02:00:06.614Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["deployment","heroku","self-host","self-hostable","self-hosted","self-hosting","selfhosting","vps-admin","vps-server","vps-setup","vps-ubuntu"],"created_at":"2025-10-21T04:41:07.830Z","updated_at":"2025-10-21T04:41:08.935Z","avatar_url":"https://github.com/MightyMoud.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cdiv\u003e\n    \u003cimg width=\"110px\" src=\"https://emoji.aranja.com/static/emoji-data/img-apple-160/1f91c-1f3fb.png\"\u003e\n    \u003cimg width=\"110px\" src=\"https://emoji.aranja.com/static/emoji-data/img-apple-160/1f91b-1f3fb.png\"\u003e\n  \u003c/div\u003e\n\nBare metal to production ready in mins; imagine fly.io on your VPS\n\n  \u003cdiv\u003e\n    \u003cimg width=\"600px\" src=\"/demo/imgs/hero.png\"\u003e\n  \u003c/div\u003e\n\n![GitHub](https://img.shields.io/github/license/mightymoud/sidekick)\n![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/mightymoud/sidekick)\n![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/mightymoud/sidekick)\n\n\u003c/div\u003e\n\n## Features\n\n- 👍 One command VPS setup (docker, traefik, sops, age)\n- 💻 deploy any application from a dockerfile\n- ✊ Zero downtime deployment\n- 🌏 High availability and load balancing\n- 🔒 Zero config SSL Certs\n- ✅ Connect domains or use sslip.io out of the box\n- 🔥 Built in integration with SOPS\n- 🛸 Escape the vendorlock forever\n\n## Motivation\n\nI'm tired of the complexity involved in hosting my side projects. While some platforms, like Fly.io, stand out in the crowded field of Heroku replacements, I believe a simple VPS can be just as effective. That's why I created Sidekick: to make hosting side projects as straightforward, affordable, and production-ready as possible. You'll be surprised how much traffic a $8/month instance on DigitalOcean can handle.\n\n## Installation\n\nUsing brew:\n\n```bash\nbrew install sidekick\n```\n\nNOTE: Sidekick uses `brew` later on to handle installing `sops` on your local. So `brew` is a requirement at this point. Sidekick will throw an error if `brew` is not found. You can install `brew` from [here](https://brew.sh/).\n\n## Usage\n\nSidekick helps you along all the steps of deployment on your VPS. From basic setup to zero downtime deploys, we got you! ✊\n\nFirst you need a VPS with Ubuntu LTS. I recommend DigitalOcean. Hetzner also gets very good reviews. You can host your own silicon too. As long as you have a public IP address you can use Sidekick.\n\nJust make sure the following is true:\n\n- VPS running Ubuntu - LTS recommended\n- SSH Key available on your machine to login to VPS.\n\nThat's it!\n\n### VPS Setup\n\n  \u003cdiv align=\"center\" \u003e\n    \u003cimg width=\"600px\" src=\"/demo/imgs/init.png\"\u003e\n  \u003c/div\u003e\n\nFirst you need to setup your VPS. To do this you need to run:\n\n```bash\nsidekick init\n```\n\nThen you need to enter the following:\n\n- IP Address of your VPS\n- An email address to use for setting up SSL certs\n\nAfter that Sidekick will setup many things on your VPS - Usually takes around 2 mins.\nIf you run this command once more and enter a different IP Address, Sidekick will warn you that you are overriding the current config with a prompt.\n\nYou can use flags instead. Read more [in the docs](https://www.sidekickdeploy.com/docs/command/init/).\n\n\u003cdetails\u003e\n  \u003csummary\u003eWhat does Sidekick do when I run this command?\u003c/summary\u003e\n  \n* Login with `root` user\n* Make a new user `sidekick` and grant sudo access\n* Logout from `root` and login with `sidekick`\n* Disable login with `root` user - security best practice\n* Update and upgrade your Ubuntu system\n* Install `sops` and copy over the public key to your sidekick config file\n* Use `age` to make secret and public keys to use later for encrypting env file.\n* Send public key back to host machine to be used later for encryption\n* Install Docker\n* Add user sidekick to docker group\n* Setup Traefik and SSL certs on your VPS\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eWhich SSH key will Sidekick use to login?\u003c/summary\u003e\n\nSidekick will look up the default keys in your default .ssh directory in the following order:\n\n- id_rsa.pub\n- id_ecdsa.pub\n- id_ed25519.pub\n\nSidekick will also get all keys from the `ssh-agent` and try them as well. If you want to use a custom key and not a default one, you would need to add the to your agent first by running `ssh-add KEY_FILE`\n\n\u003c/details\u003e\n\nRead more details about flags and other options for this command [on the docs](https://www.sidekickdeploy.com/docs/command/init/)\n\n### Launch a new application\n\n  \u003cdiv align=\"center\" \u003e\n    \u003cimg width=\"600px\" src=\"/demo/imgs/launch.png\"\u003e\n  \u003c/div\u003e\n\nIn your application folder, make sure you have a working `Dockerfile` that you can build and run. Also make sure you know at which port your app is expecting to receive traffic.\n\nThen run:\n\n```bash\nsidekick launch\n```\n\nThen you need to enter the following:\n\n- Url friendly name of your app - if you opt to use `sslip.io` domain for testing this would be your subdomain\n- HTTP exposed port for your app to get requests - Sidekick will scan your docker file to try to extract this number and default it.\n- Domain at which you want this application to be reachable - If you choose your own domain make sure to point the domain to your VPS IP address; otherwise we default to `sslip.io` domain so you can play around.\n- If you have any `env` file with secrets in it. Sidekick will attempt to find `.env` file in the root of your folder. Sidekick will use `sops` to encrypt your env file and inject the values securely at run time.\n\nShould take around 2 more mins to be able to visit your application live on the web if all goes well.\n\n\u003cdetails\u003e\n  \u003csummary\u003eWhat does Sidekick do when I run this command\u003c/summary\u003e\n  \n* Build your docker image locally for linux\n* Move the docker image to your VPS directly\n* Encrypt your env file, if available and push it to your VPS\n* Use sops to decrypt your env file and start and env with the values injected\n* Spin up your docker image using docker compose and route traffic to it using Traefik on the specified port\n\u003c/details\u003e\n\n### Deploy a new version\n\n  \u003cdiv align=\"center\" \u003e\n    \u003cimg width=\"600px\" src=\"/demo/imgs/deploy.png\"\u003e\n  \u003c/div\u003e\nWith your application deployed, it's super simple to deploy a new version.\n\nAt any point any time you need to only run:\n\n```bash\nsidekick deploy\n```\n\nThat's all. It won't take long, we use cache from earlier docker images, your latest version should be up soon.\nSidekick will deploy the new version without any downtime - you can see more in the source code.\nThis command will also do a couple of things behind the scenes. You can check that below\n\n\u003cdetails\u003e\n  \u003csummary\u003eWhat does Sidekick do when I run this command\u003c/summary\u003e\n  \n* Build your docker image locally for linux\n* Compare your latest env file checksum for changes from last time you deployed your application.\n* If your env file has changed, sidekick will re-encrypt it and replace the encrypted.env file on your server.\n* Deploy the new version with zero downtime deploys so you don't miss any traffic. \n\u003c/details\u003e\n\n### Deploy a preview environment/app\n\n  \u003cdiv align=\"center\" \u003e\n    \u003cimg width=\"600px\" src=\"/demo/imgs/preview.png\"\u003e\n  \u003c/div\u003e\nSidekick also allows you to deploy preview apps at any point from your application. Preview apps are attached to your commit hash and require a clean git tree before you can initiate them. \nOnce you have a clean git tree, you can run the following command to deploy a preview app:\n\n```bash\nsidekick deploy preview\n```\n\n\u003cdetails\u003e\n  \u003csummary\u003eWhat does Sidekick do when I run this command\u003c/summary\u003e\n  \n* Build your docker image locally for linux\n* Tag the new image with the short checksum of your git commit\n* Encrypt your env file, if available and push it to your VPS\n* Add a new folder inside your app folder called \"preview\" where Sidekick will store and manage all your preview deployments\n* Deploy a new version of your app reachable on a short hash based subdomain\n\u003c/details\u003e\n\n## Inspiration\n\n- https://fly.io/\n- https://kamal-deploy.org/\n\n## Vision\n\nSimple CLI tool that can help you:\n\n- Setup your VPS\n- Deploy all your side projects on a single VPS\n- Load balance multiple container per project\n- Deploy new versions with Zero downtime\n- Deploy preview environments with ease\n- Manage env secrets in a secure way\n- Connect any number of domains and subdomains to your projects with ease\n\n## Remove sidekick\n\nYou can easily remove sidekick if you hate it.\n\n```bash\nbrew uninstall sidekick\n```\n\n---\n\n## Roadmap\n\nI still have a couple more feature I want to add here. Also considering some of those to be on a paid version.\n\n- ✅ Preview env deployments\n- A way to deploy more complicated projects defined in docker compose file\n- Better zero downtime deploys with watchtower\n- Firewall setup\n- Managing multiple VPSs\n- Easy way to deploy databases with one command\n- TUI for monitoring your VPS\n- Streaming down compose logs - ala `fly logs`\n- Auto deploy on image push - to work with CICD better\n- Git hooks setup for managing migrations and other concerns\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmightymoud%2Fsidekick","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmightymoud%2Fsidekick","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmightymoud%2Fsidekick/lists"}