# Bare metal to production ready in mins; your own fly server on your VPS.


![](https://github.com/MightyMoud/sidekick/raw/main/demo/imgs/hero.png align="center")

## Features

* 👍 One command VPS setup (docker, traefik, sops, age)
    
* 💻 deploy any application from a dockerfile
    
* ✊ Zero downtime deployment
    
* 🌏 High availability and load balancing
    
* 🔒 Zero config SSL Certs
    
* ✅ Connect domains or use sslip.io out of the box
    
* 🔥 Built in integration with SOPS
    
* 🛸 Escape the vendorlock forever
    

## Motivation

I'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.

## Installation

With GO installed on your system you need to run

```yaml
go install github.com/mightymoud/sidekick@latest
```

## Usage

Sidekick helps you along all the steps of deployment on your VPS. From basic setup to zero downtime deploys, we got you! ✊

First 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.

Just make sure the following is true:

* VPS running Ubuntu - LTS recommended
    
* SSH Public Key available on your machine to login to VPS.
    

That's it!

### VPS Setup

![](https://github.com/MightyMoud/sidekick/raw/main/demo/imgs/init.png align="left")

First you need to setup your VPS. To do this you need to run:

```yaml
sidekick init
```

Then you need to enter the following:

* IP Address of your VPS
    
* An email address to use for setting up SSL certs
    
* Docker registry to host your docker images - defaults to `docker.io`
    
* Docker username in the said registry
    
* Confirm you are currently logged in to that said registry with the username - This is needed to be able to push images on your behalf
    

After that Sidekick will setup many things on your VPS - Usually takes around 2 mins

<details><summary>What does Sidekick do when I run this command</summary><ul><li><code></code></li><li><code></code></li><li><code></code><code></code></li><li></li><li><code></code></li><li><code></code></li><li></li><li></li><li></li></ul></details>

### Launch a new application

![](https://github.com/MightyMoud/sidekick/raw/main/demo/imgs/launch.png align="left")

In 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.

Then run:

```yaml
sidekick launch
```

Then you need to enter the following:

* Url friendly name of your app - if you opt to use `sslip.io` domain for testing this would be your subdomain
    
* HTTP exposed port for your app to get requests - Sidekick will scan your docker file to try to extract this number and default it.
    
* 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.
    
* 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.
    

Should take around 2 more mins to be able to visit your application live on the web if all goes well.

<details><summary>What does Sidekick do when I run this command</summary><ul><li></li><li></li><li></li><li></li><li></li></ul></details>

### Deploy a new version

![](https://github.com/MightyMoud/sidekick/raw/main/demo/imgs/deploy.png align="left")

With your application deployed, it's super simple to redeploy a new version.

At any point any time you need to only run:

```yaml
sidekick deploy
```

That's all. It won't take long, we use cache from earlier docker images, your latest version should be up soon. Sidekick will deploy the new version without any downtime - you can see more in the source code. This command will also do a couple of things behind the scenes. You can check that below

<details><summary>What does Sidekick do when I run this command</summary><ul><li></li><li></li><li></li><li></li></ul></details>

### Deploy a preview environment

![](https://github.com/MightyMoud/sidekick/raw/main/demo/imgs/preview.png align="left")

Sidekick also allows you to deploy preview envs at any point from your application. Preview envs are attached to your commit hash and require a clean git tree before you can initiate them. Once you have a clean git tree, you can run the following command to deploy a preview environment:

```yaml
sidekick deploy preview
```

<details><summary>What does Sidekick do when I run this command</summary><ul><li></li><li></li><li></li><li></li><li></li><li></li></ul></details>

## Inspiration

* [https://fly.io/](https://fly.io/)
    
* [https://kamal-deploy.org/](https://kamal-deploy.org/)
    

## Vision

Simple CLI tool that can help you:

* Setup your VPS
    
* Deploy all your side projects on a single VPS
    
* Load balance multiple container per project
    
* Deploy new versions with Zero downtime
    
* Deploy preview environments with ease
    
* Manage env secrets in a secure way
    
* Connect any number of domains and subdomains to your projects with ease
    

## Remove sidekick

You can easily remove sidekick if you hate it.

```yaml
// Mac/Linux
cd $HOME/go/bin
rm sidekick
cd ~/.config
rm -rf sidekick

// Win
cd %USERPROFILE%\go\bin
del sidekick.exe

// Powershell
cd $HOME\go\bin
Remove-Item sidekick.exe
```

---

## Roadmap

I still have a couple more feature I want to add here. Also considering some of those to be on a paid version.

* Preview env deployments
    
* A way to deploy more complicated projects defined in docker compose file
    
* Better zero downtime deploys with watchtower
    
* Firewall setup
    
* Managing multiple VPSs
    
* Easy way to deploy databases with one command
    
* TUI for monitoring your VPS
    
* Streaming down compose logs - ala `fly logs`
    
* Auto deploy on image push - to work with CICD better
