๐ค๐ฎ๐ซ๐ฏ is a process manager, mainly for Node.js and Python applications. It's written in Rust
. It daemonizes your apps so that they can run in the background. It also restarts them if they crash.
Docs โข Crate โข Readme
> [!WARNING]
> Heads up, this project is my Rust-learning playground and not production-ready yet:
>
> - I built this because my apps needed a process manager, and I had an itch to learn Rust. So, here it is... my first Rust project!
> - No tests yet (oops!)
> - Tested only on Windows 11
> - Rust newbie alert! ๐จ
> - Using it for my own projects, but not on a grand scale
## Why ๐ค๐ฎ๐ซ๐ฏ?
So, why the name ๐ค๐ฎ๐ซ๐ฏ? Well, it means "basket" in many languages I don't speak, like Norwegian (but it sounded cool ๐). Think of ๐ค๐ฎ๐ซ๐ฏ as a basket for your apps. In kurv, we call each deployed app as an `egg`. So, let's go and collect some eggs ๐ฅ in your basket ๐งบ.
## Installation
> [!NOTE]
> ๐ค๐ฎ๐ซ๐ฏ can run either as a server or as a CLI client, using the same binary.
>
> The server is responsible for managing the eggs, while the client is used to interact with the server and tell it what to do or ask it for information.
### Download binaries
Download the latest release [from GitHub](https://github.com/lucas-labs/kurv/releases).
### crates.io
You can also install it from [crates.io](https://crates.io/crates/kurv) using `cargo`:
```bash
cargo install kurv
```
## Usage
![kurv usage](.github/kurv.gif)
### Start the server
To get the server rolling, type:
```bash
kurv server
```
> [!IMPORTANT]
> - ๐ค๐ฎ๐ซ๐ฏ will create a file called `.kurv` where it will store the current
> state of the server. The file will be created in the same directory where
> the binary is located or in the path specified by the `KURV_HOME_KEY`
> environment variable.
>
> - since ๐ค๐ฎ๐ซ๐ฏ can be used both as a server and as a client, if you want
> to run it as a server, you need to set the `KURV_SERVER` environment
> to `true`. This is just a safety measure to prevent you from running
> the server when you actually want to run the client.
> To bypass this, you can use the `--force` flag (`kurv server --force`)
### Collect some ๐ฅ
To deploy/start/daemonize an app (collect an egg), do:
```bash
kurv collect
```
The path should point to a YAML file that contains the configuration for the egg.
It should look something like this:
```yaml title="myegg.kurv"
name: fastapi # the name of the egg / should be unique
command: poetry # the command/program to run
args: # the arguments to pass to the command
- run
- serve
cwd: /home/user/my-fastapi-app # the working directory in which the command will be run
env: # the environment variables to pass to the command
FASTAPI_PORT: 8080
```
This will run the command `poetry run serve` in `/home/user/my-fastapi-app` with the environment variable `FASTAPI_PORT` set to `8080`.
If for some reason, the command/program crashes or exits, ๐ค๐ฎ๐ซ๐ฏ will revive it!
### Show me my eggs
If you want a summary of the current state of your eggs, run:
```zsh
$ kurv list
๐ฅ eggs snapshot
โญโโโโฌโโโโโโโโฌโโโโโโโโโโโโฌโโโโโโโโโโฌโโโโฌโโโโโโโโโฎ
โ # โ pid โ name โ status โ โบ โ uptime โ
โโโโโผโโโโโโโโผโโโโโโโโโโโโผโโโโโโโโโโผโโโโผโโโโโโโโโค
โ 1 โ 35824 โ fastapi โ running โ 0 โ 1s โ
โ 2 โ 0 โ fastapi-2 โ stopped โ 0 โ - โ
โฐโโโโดโโโโโโโโดโโโโโโโโโโโโดโโโโโโโโโโดโโโโดโโโโโโโโโฏ
```
For details on a specific egg:
``` sh
$ kurv egg
```
This will show you the egg's configuration, process details, etc.
### Stop an egg
To halt an egg without removing it:
``` sh
$ kurv stop
```
This will stop the process but keep its configuration in the basket in case
you want to start it again later.
### Remove an egg
To actually remove an egg, run:
``` sh
$ kurv remove
```
It will stop the process and remove the egg from the basket.
### Restart
If you need the process to be restarted, run:
``` sh
$ kurv restart
```
### Inspiration
#### pm2
Inspired by the robust process manager, [pm2](https://pm2.keymetrics.io/), my goal with ๐ค๐ฎ๐ซ๐ฏ was to create a lightweight alternative. Not that pm2 is a resource hog, but I found myself in a server with extremely limited resources. Plus, I was itching for an excuse to dive into Rust, and voila, ๐ค๐ฎ๐ซ๐ฏ was born.
#### eggsecutor
Derived from [eggsecutor](https://github.com/lucas-labs/kurv), ๐ค๐ฎ๐ซ๐ฏ adopted the whimsical term "eggs" to represent deployed applications.
#### pueue
Insights from [pueue](https://github.com/Nukesor/pueue) were instrumental in helping me understand how to manage processes in Rust.
-------
With ๐ง from Argentina ๐ฆ๐ท