rustus 0.5.10

TUS protocol implementation written in Rust.
---
title: "Deployment"
description: "How to deploy rustus"
---

# Deployment

Deploying an application is always a challenge. Rustus was made to make deployment as easy as possible.
Since Rustus works with files you have to be careful while scaling it. All rustus instances
must have access to the same data and info storages.

!!! info

    If you want to track you rustus instances with **prometheus** you can
    always get metrics at `/metrics` endpoint.

## Docker compose

``` yaml title="docker-compose.yml"
# This is super simple configuration
version: "3.7"

services:
  rustus:
    image: s3rius/rustus
    volumes:
    # Volume mounted to default data directory
    # So it's available across multiple containers.
      - rustus_data_volume:/app/data

volumes:
  rustus_data_volume:
```

After running `docker compose up` you will see rustus startup logs.

If you want to deploy multiple rustus instances you can simply
use config as this one:

``` yaml title="docker-compose.yml"
version: "3.7"

services:
  proxy:
    image: jwilder/nginx-proxy:alpine
    container_name: proxy
    # Actual proxy ports.
    ports:
      - 8080:80
    volumes:
    # This thing helps to locate containers
    # within this composition to generate nginx config.
      - /var/run/docker.sock:/tmp/docker.sock:ro

  rustus:
    image: s3rius/rustus
    ports:
    # Ports definition
    # To generate correct nginx config.
      - 1081
    volumes:
    # Volume mounted to default data directory
    # So it's available across multiple containers.
      - rustus_data_volume:/app/data
    environment:
        # Idk why but without this variable
        # load balancing with jwilder/nginx-proxy doesn't work.
        VIRTUAL_HOST: localhost

volumes:
  rustus_data_volume: # This is named volume
```

The main idea is that traffic that comes into nginx-proxy
is routed in one of multiple rustus containers.
Here I used `jwilder/nginx-proxy` but you can use other
reverse-proxies such as [Nginx proxy](https://www.nginx.com/), [Traefik](https://traefik.io/) or [Envoy proxy](https://www.envoyproxy.io/).

Now you can run multiple rustus instances like this.

```bash
docker compose up --scale rustus=3
```

After that you can upload files to `http://localhost:8080/files`

## Kubernetes

Configuration for Kubernetes is almost the same as for Docker.
But the most preferable way is an official helm chart.

Load balancing is done by Kubernetes, so you just have to
create a volume to mount data and info directories.

## Helm

You can install rustus by running this set of commands:
``` bash
helm repo add "rustus" "https://s3rius.github.io/rustus/helm_releases"
helm repo update
helm install "rustus" "rustus/rustus"
```

### Configuration

Since default deployment may not fit you.
You can adjust it to satisfy your needs.
You can do it easily with helm.


At first you need to save default values on disk.

``` bash
# You can download basic configuration by running
helm show values "rustus/rustus" > values.yml
```

!!! warning

    For production use you must provide and mount PersistentVolumeClaim
    in order to scale rustus.

    This helm chart has only one replica by default.

You can read more about configuration below.

After you done editing `values.yml`, you can apply the configuration like this:

``` bash
helm upgrade \
--install \ # Install chart if it's not installed
--namespace rustus \ # k8s namespace
--create-namespace \ # Creates namespace if it doesn't exist
--atomic \ # Ensures that everything is deployed correctly
--values "values.yml" \ # Link to values.yml file
"rustus" \ # name of a release
"rustus/rustus" # Name of the chart
```

### Persistence

You can add PVC mount by editing `persistence` section.
The most preferable way is to create `PersistentVolume` and `PersistentVolumeClaim`
before installing this chart.

After you created claim you can apply this values file to mount your claim into rustus.
``` yaml title="values.yml"
persistence:
  enabled: true
  existingClaim: "rustus-pvc"
```

!!! warning

    Currently there's no ability to create multiple mounts
    and if you use file info storage you must specify the same directory
    as you specified for data storage.

    But it would be better to use other type of info-storage.

### Subcharts

For example if you want to use redis as your info storage.

``` yaml title="values.yml"
env:
  RUSTUS_INFO_STORAGE: redis-info-storage
  RUSTUS_INFO_DB_DSN: redis://:pass@rustus-redis-master/0

redis:
  enabled: true
```

`redis`, `postgresql` and `mysql` are subcharts.

You can find information about configuration these subcharts here:

* [Repo]https://github.com/bitnami/charts/tree/master/bitnami/redis for redis;
* [Repo]https://github.com/bitnami/charts/tree/master/bitnami/mysql for mysql;
* [Repo]https://github.com/bitnami/charts/tree/master/bitnami/postgresql for postgresql.

In production you may ignore these subcharts to deploy your own redis or mysql or postgresql.