This episode turns the NAS into an application server: TrueNAS Apps, Docker, Portainer, and Helm installation, and deployment of Plex, Nextcloud, Vaultwarden, and Gitea containers with resource limits. You also learn the Docker, Compose, and KVM plugins on OpenMediaVault.

A modern NAS doesn't just store files. Episode 18 turns your NAS into an application server: running self-hosted services like Plex, Nextcloud, Vaultwarden, and Gitea on top of the storage you've built.
The key is containerization: applications run in isolated containers, with mounts to NAS datasets for persistent data. This approach makes installations clean, upgrades safe, and security better than running applications directly on the main system.
By the end of this episode you'll be able to use TrueNAS Apps, install Docker with Portainer and Helm, deploy container applications with resource limits, and leverage the Docker, Compose, and KVM plugins on OpenMediaVault.
TrueNAS SCALE provides an application catalog that can be installed directly from the Web UI. Popular apps like Plex, Nextcloud, and many more are available with guided configuration. Each app runs in a container and stores its data in a dataset you choose.
midclt call app.query | python3 -m json.toolThe midclt call app.query command lists installed applications along with their status. Use it to verify an app is running and healthy.
When installing an app, choose a dataset for the application data — for example tank/apps/plex. By separating app data from the image, upgrading an app never deletes data, and backup can target just that dataset.
Docker is the widely supported container standard. On TrueNAS SCALE, Docker runs underneath Apps; on OpenMediaVault, Docker is installed through a plugin. Once active, docker commands are available in the shell.
docker version
docker psThe docker version output shows the client and server versions, while docker ps shows running containers. Make sure the daemon responds before deploying.
Portainer provides a graphical interface for managing Docker containers, stacks, and volumes. Many NAS administrators use Portainer as a management layer on top of the Docker CLI.
docker run -d --name portainer \
-p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data portainer/portainer-ce:latestThe docker run command above runs Portainer on port 9000. With Portainer, you can create Compose stacks from the UI without opening a terminal.
TrueNAS SCALE supports Helm for Kubernetes charts. Apps installed through the catalog are actually Helm charts deployed to an internal cluster. If you're already familiar with Kubernetes, Helm provides advanced configuration flexibility.
Plex turns the NAS into a media server: movies and music on a media dataset are served to TVs, browsers, and mobile devices. Plex is configured by mounting the media dataset as a volume.
docker run -d --name plex \
-p 32400:32400 \
-v tank-media:/data \
plexinc/pms-docker:latestThe docker run command runs Plex with media data in the tank-media volume. Once active, library configuration is done through the Plex interface on port 32400.
Nextcloud provides file sync, calendars, contacts, and private-cloud-style collaboration. It's a popular replacement for public cloud services. Data is stored on a dataset that can be backed up with ZFS snapshots.
Vaultwarden is a Bitwarden-compatible implementation for a self-hosted password manager. Because it holds all your credentials, make sure this instance runs on a secure network and its data is backed up diligently.
Gitea is a lightweight git server for self-hosting repositories. It suits small teams that want full control over their code without depending on public services. Repository data is stored on a dataset and can be replicated with ZFS.
Unbounded containers can consume the NAS's entire RAM and CPU, disrupting storage services. Always set resource limits: CPU, memory, and swap caps.
docker run -d --name app \
--memory=512m --cpus=1.0 \
--restart unless-stopped \
contoh/app:1.0The docker run command above caps the container at 512 megabytes of RAM and 1 CPU. In Portainer or Helm, similar limits are set through the resources fields on the manifest.
services:
app:
image: contoh/app:1.0
deploy:
resources:
limits:
memory: 512M
cpus: "1.0"The manifest above sets limits via Compose. The resources.limits pattern is a must for every application running alongside storage services.
OpenMediaVault manages containers through the Docker and Compose plugins. These plugins provide an interface for running Compose stacks, easing deployments that previously required the CLI.
docker, compose, kvm, nut, prometheus, omv-extraOpenMediaVault also offers a KVM plugin for running light virtual machines alongside Docker. This plugin combination makes OMV a flexible homelab platform despite its small resource footprint.
Tip
Separate application data into its own dataset, apart from the container image. ZFS snapshots on the app dataset provide consistent backups without stopping the service, and image upgrades never threaten the data.
In this episode 18 you turned the NAS into an application server: using TrueNAS Apps, installing Docker with Portainer and Helm, deploying Plex, Nextcloud, Vaultwarden, and Gitea, setting resource limits, and leveraging the Docker, Compose, and KVM plugins on OpenMediaVault.
Key takeaways:
In the next episode, episode 19, we'll cover virtualization on the NAS — from KVM and QEMU-based VMs on TrueNAS SCALE, nested virtualization, GPU passthrough, to zvol storage for VMs, disk passthrough, and snapshot-consistent VM backups. Containers are running; now it's time to add full virtual machines.