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