# RustFS Instance

RustFS is an open-source, S3-compatible distributed object storage system built in Rust, designed for high performance and memory safety.

# NFS Share + RustFS Docker Deployment

In this tutorial we will explain how you setup your own RustsFS S3 Storage. This will allow you to use S3 storage for self hosted applications that allow or require it. It is yet another way of storing photos and videos but instead of using an NFS share or local storage. Now, ideally you setup a dedicated box with hard drives to run your RustFS instance. However, in a HomeLab that is not always feasible nor necessary. The beauty of RustFS is that it just needs a folder to store all the objects in. Therefor, if you already have an NAS or NAS VM you could create an NFS share and attach it to that folder. This is what we will do in this tutorial

#### **Setup the NFS Share** 

1\. The first thing we need to do on your TrueNas instance is create a new user: 1001 and group 1001. The reason for this is because RustFS runs on this user and group and hence the objects folder /mnt/rustfs needs to be owned by that user and group. For instructions check out our [TrueNas Book ](https://homelab.deternet.org/books/03-truenas-scale "03. TrueNas Scale")

2\. Then create a new dataset and attach the user 1001 and group 1001 to it

3\. Then setup the NFS share on your TrueNas instance.

4\. Sweet, now you setup on TrueNas is set and done. Now, you will enter either your DockerVM or a new dedicated VM to run your RustFS instance on. Regardless we first make a new folder

```
mkdir rustfs
```

5\. We then make the data directory that will store all the objects with. You can choose any location and name but for this example we will use

```
mkdir /mnt/rustfs
```

6\. Next make sure that an NFS-Client is installed and if not it is easy to install with

```
sudo apt install nfs-common
```

7\. Perfect, now attach the NFS share to the /mnt/rustfs folder by adding a new entry in the /etc/fstab section

```
sudo nano /etc/fstab
```

8\. Then add the following line

```
IP-Address-TrueNasVM:/mnt/tank/rustfs /mnt/rustfs  nfs  defaults 0 0
```

9\. Alrightieee!!! NFS and Storage folder is all setup, then now we can move to the Docker compose file


#### **Docker Compose File**

Below the simple docker compose file of RustFS is provided. Where simple means that it is only rustfs and not all extra add-ons to measure the performance and maintain the instance e.g Prometheus etcetera. This file can be obtained at their [repository page](https://github.com/rustfs/rustfs/blob/main/docker-compose-simple.yml). Do note that the Github version sets 4 folders whereas we only use one folder called rustfs. This is because we have the redundancy already embedded in the NFS share.

<details id="bkmrk-compose.yml-services"><summary>compose.yml</summary>

```yaml
services:
  rustfs:
    image: rustfs/rustfs:latest
    container_name: rustfs
    volumes:
      - /mnt/rustfs:/data
      - ./logs:/app/logs
    environment:
      - RUSTFS_VOLUMES=/data
      - RUSTFS_ADDRESS=0.0.0.0:9000
      - RUSTFS_CONSOLE_ADDRESS=0.0.0.0:9001
      - RUSTFS_CONSOLE_ENABLE=true
      # Without this, logs go to stdout and ./logs stays empty
      - RUSTFS_OBS_LOG_DIRECTORY=/app/logs
      - RUSTFS_ACCESS_KEY=${RUSTFS_ACCESS_KEY:?set_a_non_default_access_key}
      - RUSTFS_SECRET_KEY=${RUSTFS_SECRET_KEY:?set_a_non_default_secret_key}
    ports:
      - "9000:9000"
      - "9001:9001"
    healthcheck:
      test: ["CMD", "sh", "-c", "curl -f http://10.69.4.90:9000/health && curl -f http://10.69.4.90:9001/rustfs/console/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: "2.0"
          memory: 4GB
```

</details>Things to Note in this compose file

<p class="callout info">**1.** The location of your data folder. In this example it is located at **/mnt/rustfs** which is again mounted to the NFS share. Change this if your object storage folder is located somewhere else</p>

<p class="callout info">**2.** You can choose the port you want to host your RustFS instance on, by default this is 9001</p>

<p class="callout info">**3**. The second things is to have localhost in he healthcheck test changed to your VM's IP address e.g 10.50.20.20</p>

That's all for the compose file

#### **Environment Variables File**

Then the compose file is pretty simple as it only requires two entries

<details id="bkmrk-.env-rustfs_access_k"><summary>.env</summary>

```yaml
RUSTFS_ACCESS_KEY=A37045B70F04225A2EC24718
RUSTFS_SECRET_KEY=wIc1icWwzBoUoJlO752fW/13/aq3EHUfXj5trcR9QUE=
```

</details><p class="callout info">Access Key can be generated with: **openssl rand -hex 12 \| tr 'a-f' 'A-F'** </p>

<p class="callout info">SECRET\_KEY can be generated with: **openssl rand -base64 32**</p>

#### **Default RustFS Region**

Yes — the default RustFS region is `us-east-1`, defined as the `RUSTFS_REGION` constant, and you can override it by setting the `RUSTFS_REGION` environment variable (or the `--region` CLI flag / `config.rustfs.region` Helm value). <span class="bg-pacific/10 text-pacific active:bg-pacific/20 hover:bg-pacific/20 cursor-pointer rounded-md px-[0.25rem] py-[0.12rem] text-xs font-normal leading-[15px] transition-colors duration-100 before:hidden after:hidden" role="link" style="font-family: 'IBM Plex Mono', 'IBM Plex Mono Fallback'; font-weight: 400; font-style: normal;" tabindex="0">app.rs:289-292</span> <span class="bg-pacific/10 text-pacific active:bg-pacific/20 hover:bg-pacific/20 cursor-pointer rounded-md px-[0.25rem] py-[0.12rem] text-xs font-normal leading-[15px] transition-colors duration-100 before:hidden after:hidden" role="link" style="font-family: 'IBM Plex Mono', 'IBM Plex Mono Fallback'; font-weight: 400; font-style: normal;" tabindex="0">config\_struct.rs:233-234</span>

####  

#### **Domain Name**

If you have an application that needs to be accessible over the internet or want other people make use of your S3 instance then you need to add a public domain name to your instance. In the case of Caddy on your OPNSense router that is simply adding the domain name and point it to your VM where RustFS is running on and the port your have set, which by default is 9001

#### **Deploy**

Then you can simply deploy the compose stack with

```
docker compose up -d
```

After you have deployed it and your services are healthy then you should be able to access it via the domain name you have set for your RustFS instance.

#### **First Time Login**

The first time you enter the RustFS Dashboard you need to login with the ACCESS and SECRET keys you have set in your **.env** file

- Account: ACCESS\_KEY
- Key: SECRET\_KEY

Then after that we directly will create a new user account that is not the root account

1. To do this go to Users &gt; + Add users
2. Then create a username and password
3. Make sure you select the consoleAdmin role s.t your user has administrator permissions

dpasn@sandbox:~$ sudo chown dpasn:dpasn -R /mnt  
dpasn@sandbox:~$ sudo chmod 775 -R /mnt  
dpasn@sandbox:~$ mkdir /mnt/rustfs

Make sure NFS Client is installed with

# TrueNas VM + RustFS

### <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Suggested</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 250ms; --sd-easing: ease-in;">setup</span>

1. <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">TrueNAS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VM:</span></span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Pass</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">disks</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">or,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">preferably,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">their</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">controller</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">through</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">to</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">TrueNAS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">so</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">ZFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">sees</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">actual</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">drives.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Don’t</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">create</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">pool</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">from</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">virtual</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">disks</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">if</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">you</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">can</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">avoid</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">it;</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">TrueNAS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">warns</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">that</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">virtualized</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">storage</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">regular</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">or</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">critical</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">data</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">is</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">not</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">a</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">supported</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">setup</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">may</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">risk</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">corruption.</span> [<span class="TnZ2avhXINFbkS_FmRw2 uHPaz1NVFLwooyN_82Xl ZBCD6edNlK6lCexfhgoI CacXtJfGtE47SYE_l9Hn">truenas.com</span>](https://www.truenas.com/docs/scale/gettingstarted/tnhardwareguide/)
2. <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Make</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">separate</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">datasets:</span></span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">For</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">example,</span> `pool/apps-nfs` <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> `pool/rustfs-data`<span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Export</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">them</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">over</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">NFS,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">restrict</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">exports</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">to</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">your</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">app/RustFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VM</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">addresses,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">keep</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">permissions</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">deliberate.</span>
3. <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">RustFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 250ms; --sd-easing: ease-in;">VM:</span></span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Keep</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">its</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">OS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VM</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">disk</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">on</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Proxmox’s</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">local</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">storage;</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">mount</span> `pool/rustfs-data` <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">inside</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VM</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">configure</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">RustFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">to</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">use</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">that</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">mount</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">as</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">its</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">data</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">directory.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">RustFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">supports</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">single-node</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">operation</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">an</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">S3-compatible</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">API.</span>
4. <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Apps:</span></span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Point</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Ente</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">PeerTube</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">to</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">RustFS’s</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">S3</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">endpoint.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Make</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">that</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">endpoint</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">reachable</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">from</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">both</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">app/server</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">side</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">clients</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">that</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">upload</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">directly—Ente’s</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">presigned</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">uploads</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">require</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">both</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">to</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">reach</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">same</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">address.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">PeerTube’s</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">S3</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">setup</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">also</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">requires</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">attention</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">to</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">public</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">access</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">CORS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">video</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">delivery.</span>
5. <span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Other</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 250ms; --sd-easing: ease-in;">apps:</span></span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Mount</span> `pool/apps-nfs` <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">directly</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">from</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">TrueNAS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">where</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">a</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">regular</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">shared</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">filesystem</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">is</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 250ms; --sd-easing: ease-in;">appropriate.</span>

<span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">I’d</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">avoid</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">using</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">same</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">NFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">export</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Proxmox</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VM</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">disks</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">application/object</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">data.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">If</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">you</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">do</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">want</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">NAS-backed</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VM</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">disks,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">make</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">a</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">separate</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">dataset/export</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">that.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">NFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">can</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">work</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Proxmox</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VM</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">storage,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">but</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">it</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">adds</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">network</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">NAS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">availability</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">as</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">dependencies</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VMs;</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">keeping</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">their</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">disks</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">local</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">is</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">simpler</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">for</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">this</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">design.</span>

<span class="font-semibold" data-streamdown="strong"><span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Important</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">tradeoff:</span></span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">RustFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">data</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">is</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">still</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">on</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">mirror,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">so</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">it</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">is</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">protected</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">against</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">one</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">disk</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">failing,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">but</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">the</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">mirror</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">is</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">not</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">a</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">backup.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Take</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">separate</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">backups</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">of</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">important</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">photos</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">videos.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">Also,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">with</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">TrueNAS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">RustFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">as</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">separate</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">VMs,</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">RustFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">depends</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">on</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">TrueNAS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">being</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">up</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">and</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">its</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">NFS</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">mount</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">being</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">available.</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">A</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">single</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">mirrored</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">pair</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">does</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">not</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">provide</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">storage</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 0ms; --sd-easing: ease-in;">high</span> <span data-sd-animate="true" style="--sd-animation: sd-fadeIn; --sd-duration: 250ms; --sd-easing: ease-in;">availability.</span>