Back to blog
Unraid, the perfect NAS, Streaming Server & Netflix-like service for your home & office

Unraid, the perfect NAS, Streaming Server & Netflix-like service for your home & office

Want a quick summary of this post? Tune in ๐ŸŽง
Table of Contents

If you arrived here, you probably enjoy having a home server, NAS, or homelab. You might have heard about Unraid and are curious about what it is, how it works, and how you can use it to create your own Netflix-like service, NAS, or file system for your home or office.

Contents

1 - Why Unraid?

While Unraid is a pure OS that doesnโ€™t dictate specific hardware requirements, you might have heard of Synology, QNAP, or FreeNAS. While these are great solutions, theyโ€™re not as flexible as Unraid and are often more expensive with hardware restrictions and slower performance.

If youโ€™re looking for a more flexible, faster, and cost-effective solution, Unraid is the way to go! Here are some advantages of Unraid:

  • Flexibility: Run Unraid on almost any hardware and expand as needed
  • Performance: Create fast NAS or streaming servers with excellent performance
  • Cost: Affordable licensing starting at $60, compatible with most hardware
  • Community: Active community with extensive help and support resources
  • Non-intrusive: Runs from USB without modifying your drives, allowing portability to other systems
  • Plugins: Extensive plugin ecosystem for customization and expansion
  • Docker: Built-in Docker support for running containerized applications

2 - Hardware Requirements

Unraid is based on Linux and runs on almost any hardware. Here are the recommended hardware requirements:

  • CPU: 64-bit processor running 1 GHz or higher
  • RAM: While not RAM-intensive, 4GB minimum is recommended
  • Storage: Flexible storage options; minimum 1TB HDD recommended for streaming
  • SSD: At least one SSD for cache and scratch disk operations
  • Network: 1Gbps connection recommended for streaming
  • Graphics: Optional for basic use; 4K-capable GPU recommended for media server transcoding

3 - The Basic Setup

After installing and setting up the OS, configure your shares, users, and permissions. Here are the key configurations Iโ€™ve set up (detailed tutorials are available online):

  • Shares: Separate shares for Movies, TV Shows, Music, and Photos
  • Users: Individual user accounts for family members with appropriate access
  • Permissions: Share-specific permissions controlling user access
  • Essential Plugins: Compose.Manager, NerdTools, GPU Stats, Nvidia Driver, Unassigned Devices, User Scripts
  • System Settings: NFS for macOS compatibility, UPS configuration, energy monitoring, notifications, Docker, VMs
  • Unraid Connect: Remote server management and notifications

4 - Docker & Containers

One of the greatest advantages of a Docker-centric OS is running containerized applications that can be wiped without affecting the host OS. This allows complete setup recreation without data loss.

Hereโ€™s my Docker configuration:

  • Configuration Storage: Store all app configurations in a backed-up folder (e.g., /mnt/disk3/docker_data)
  • Docker Image Size: Set appropriate docker.img file size (I use 100GB)
  • Storage Location: Store docker.img on fast SSD storage
  • Management Interface: Use Unraidโ€™s native UI instead of Portainer for better integration
  • Service Organization: Group services by responsibility (media server, dev tools, etc.) in separate docker-compose files
  • Port Management: Organize ports to avoid conflicts; use reverse proxy when needed
  • Network Organization: Maintain clean networks for container communication and internal DNS

5 - External Access

With your server configured, youโ€™ll want external access to run it headlessly at home. While Unraid Connect provides server management, it doesnโ€™t grant access to your services.

Important: Verify your internet provider allows hosting services. Some providers block ports, requiring VPN or VPS solutions.

Obtain your public IP and ensure you have either a static IP or dynamic DNS setup for domain-based access.

5.1 - Domain & Cloudflare

I recommend purchasing a memorable domain for easy access from your devices. I use Cloudflare for DNS and domain management due to these benefits:

  • Free Service: No cost for DNS management with unlimited domains
  • Security Features: DDoS protection, WAF, and other security tools
  • Global Performance: Worldwide data centers for faster service delivery
  • Powerful API: Automation capabilities for domain management
  • Dynamic Updates: Automatic subdomain creation and IP address updates

Setup process: Purchase domain โ†’ Configure Cloudflare DNS โ†’ Point domain to your public IP.

Note: This assumes basic domain setup knowledge. Let me know if you need a detailed tutorial.

Alt tag

5.2 - Reverse Proxy

With your domain pointing to your public IP, youโ€™ll want subdomain access instead of port-based access.

This is where a reverse proxy like NGINX becomes essential!

Weโ€™ll use Nginx Proxy Manager to manage subdomains, ports, and SSL certificate generation.

Here is a sample YAML file to get you started:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '3245:80' 
      - '3246:81'
      - '3247:443'
    volumes:
      - /mnt/disk3/docker_data/nginx_manager/data:/data
      - /mnt/disk3/docker_data/nginx_manager/letsencrypt:/etc/letsencrypt
    networks:
      - media_server_default
networks:
  media_server_default:
    external: true
  whisper_default:
    external: true

After the container starts, access the UI at 192.168.1.2:3246 to configure services and subdomains.

Local access only: Configure router port forwarding to enable external access:

Navigate to your routerโ€™s IPv4 Port Forwarding settings and add these rules (adjust for your NAS IP):

  • 80 โ†’ 3245
  • 443 โ†’ 3247

This enables domain-based service access instead of ports.

How the Traffic Flow Works ๐ŸŒ

Hereโ€™s the simplified request flow:

  1. Domain โ†’ Cloudflare (DNS + protection)
  2. Cloudflare โ†’ Public IP (your home router)
  3. Browser โ†’ Router (ports 80/443)
  4. Router โ†’ Unraid Server (ports 3245/3247)
  5. Nginx Proxy Manager โ†’ Service (based on subdomain)

Adding Services

Access services via subdomains by mapping them in Nginx Proxy Manager. For example, mapping bazar.domain.com to your local bazar container:

Important: Docker container names are case-sensitive.

Nginx Proxy Manager Configuration

Repeat this process for all services. The combination of Cloudflare and reverse proxy allows you to secure services behind firewalls or password protection.

6 - Media Server - Plex, Jellyfin & Emby

With your server configured, you can install a media server for streaming movies, TV shows, music, and more. You can either use your own media or download content from the internet. Please ensure you have proper rights to download and stream any content.

๐Ÿ‘‡ **Docker Compose for Media Server ** ๐Ÿ‘‡
version: "2.1"
services:
  transmission:
    image: lscr.io/linuxserver/transmission:latest
    container_name: transmission
    environment:
      - PUID=99
      - PGID=100
      - UMASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/transmission/data:/config
      - /mnt/disk1/library/shows:/shows
      - /mnt/disk2/library/movies:/movies
      - /mnt/disk1/library/documentaries:/documentaries
      - /mnt/disk3/downloads:/downloads
    ports:
      - 9091:9091
      - 51413:51413
      - 51413:51413/udp
    restart: unless-stopped

  sonarr:
    image: lscr.io/linuxserver/sonarr:latest
    container_name: sonarr
    environment:
      - PUID=99
      - PGID=100
      - UMASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/sonarr/data:/config
      - /mnt/disk1/library/shows:/shows
      - /mnt/disk2/library/movies:/movies
      - /mnt/disk1/library/documentaries:/documentaries
      - /mnt/disk3/downloads:/downloads
      - /mnt/disk3/downloads:/config/downloads
    ports:
      - 8989:8989
    restart: unless-stopped

      
  radarr:
    image: lscr.io/linuxserver/radarr:latest
    container_name: radarr
    environment:
      - PUID=99
      - PGID=100
      - UMASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/radarrr/data:/config
      - /mnt/disk1/library/shows:/shows
      - /mnt/disk2/library/movies:/movies
      - /mnt/disk1/library/documentaries:/documentaries
      - /mnt/disk3/downloads:/downloads
      - /mnt/disk3/downloads:/config/downloads
    ports:
      - 7878:7878
    restart: unless-stopped

  bazarr:
    image: lscr.io/linuxserver/bazarr:latest
    container_name: bazarr
    environment:
      - PUID=99
      - PGID=100
      - UMASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/bazarr/data:/config
      - /mnt/disk1/library/shows:/shows
      - /mnt/disk2/library/movies:/movies
      - /mnt/disk1/library/documentaries:/documentaries
    ports:
      - 6767:6767
    restart: unless-stopped

  prowlarr:
    image: lscr.io/linuxserver/prowlarr:latest
    container_name: prowlarr
    environment:
      - PUID=99
      - PGID=100
      - UMASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/prowlarr/data:/config
      - /mnt/disk1/library/shows:/shows
      - /mnt/disk2/library/movies:/movies
      - /mnt/disk1/library/documentaries:/documentaries
      - /mnt/disk3/downloads:/downloads
    ports:
      - 9696:9696
    restart: unless-stopped

  sabnzbd:
    image: lscr.io/linuxserver/sabnzbd:latest
    container_name: sabnzbd
    environment:
      - PUID=99
      - PGID=100
      - UMASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/sabnzbd/data:/config
      - /mnt/disk3/downloads:/config/downloads
      - /mnt/disk3/downloads:/downloads
    ports:
      - 8329:8080
    restart: unless-stopped

  nzbget:
    image: lscr.io/linuxserver/nzbget:latest
    container_name: nzbget
    environment:
      - PUID=99
      - PGID=100
      - UMASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/nzbget/data:/config
      - /mnt/disk1/library/shows:/shows
      - /mnt/disk2/library/movies:/movies
      - /mnt/disk1/library/documentaries:/documentaries
      - /mnt/disk3/downloads:/downloads
    ports:
      - 6789:6789
    restart: unless-stopped

  overseerr:
    image: sctx/overseerr:latest
    container_name: overseerr
    environment:
      - LOG_LEVEL=debug
      - TZ=Europe/London
      - PORT=5055
      - PUID=99
      - PGID=100
      - UMASK=000
    ports:
      - 5055:5055
    volumes:
      - /mnt/disk3/docker_data/overseerr/data:/app/config
      - /mnt/disk1/library/shows:/shows
      - /mnt/disk2/library/movies:/movies
      - /mnt/disk1/library/documentaries:/documentaries
      - /mnt/disk3/downloads:/downloads
    restart: unless-stopped

  tautulli:
    image: lscr.io/linuxserver/tautulli:latest
    container_name: tautulli
    environment:
      - PUID=99
      - PGID=100
      - MASK=000
      - TZ=Europe/London
    volumes:
      - /mnt/disk3/docker_data/tautulli/data:/config
    ports:
      - 8181:8181
    restart: unless-stopped

  organizr:
    container_name: organizr
    hostname: organizr
    image: organizr/organizr:latest

    ports:
        - 8333:80
    volumes:
        - /mnt/disk3/docker_data/organizrr/data:/config
    environment:
        - PUID=99
        - PGID=100
        - TZ=Europe/London
    restart: unless-stopped

  maintainerr:
    image: jorenn92/maintainerr:latest
    container_name: maintainerr
    volumes:
      - /mnt/disk3/docker_data/maintainerr/data:/opt/data
    environment:
      - PUID=99
      - PGID=100
      - TZ=Europe/London
    ports:
      - 8154:80
    restart: unless-stopped
  wizarr:
    image: ghcr.io/wizarrrr/wizarr:latest
    container_name: wizarr
    ports:
      - 5690:5690
    volumes:
      - /mnt/disk3/docker_data/wizarr/database:/data/database

6.1.1 - Plex ๐Ÿ“บ

Plex is one of the best media servers available, offering extensive features and broad device compatibility.

Pros:

  • Easy setup and intuitive interface
  • Regular UI updates and improvements
  • Pre-installed apps on most TVs for easy friend/family sharing
  • Integrates with Netflix, Amazon Prime, etc. for unified library management

Cons:

  • Limited plugin ecosystem (mostly legacy)
  • Account dependency - Plex controls your access
  • Premium features require Plex Pass subscription
  • Mobile app requires payment for video playback (affects sharing)

6.1.2 - Jellyfin ๐Ÿ†“

Jellyfin is a completely free and open-source media server with extensive features and broad device compatibility.

Pros:

  • Truly free and open-source
  • Clean UI with regular updates
  • Complete server ownership and control
  • Service integrations for unified library management

Cons:

  • More technical setup required
  • Manual app installation needed (limited pre-installed availability)

6.1.3 - Emby ๐Ÿ’ฐ

Emby is a popular media server that transitioned from open-source to a freemium model. Like Plex, premium features require payment.

While more โ€œfreeโ€ than Plex, the closed-source nature is a drawback.

Pros:

  • Rich plugin ecosystem and advanced features
  • More configuration options than Plex
  • Free mobile app
  • Self-hosted with data ownership

Cons:

  • Closed-source model
  • Dated UI design (lacks modern aesthetics)
  • Premium feature paywall

6.1.4 - Best Media Server in 2025? ๐Ÿ†

For home sharing with friends and family, Plex remains the top choice. Itโ€™s the most user-friendly option with extensive features. Since most viewing happens on TVs rather than mobile devices, the mobile app cost becomes less significant. A one-time Plex Pass purchase offers excellent value.

6.2 - The *Arr Stack: Automation Suite ๐Ÿค–

With your server and media server ready, letโ€™s explore automating content acquisition using specialized Docker containers from the community.

Why multiple applications? Each tool serves a specific purpose and excels at its designated task. This modular approach offers several benefits:

  • Specialized functionality: Series downloading differs from movies and music
  • Independent development: Each tool evolves at its own pace
  • Flexibility: Mix and match tools for your specific needs
  • Reliability: No single point of failure
๐Ÿ’ก

Please keep in mind that this tutorial will not cover on how to download movies, tv shows, music, etc. Please ensure you have the rights to download and stream the content that you are downloading. Subject to any applicable laws, you are responsible for your own actions.

6.3 - *Arr Stack Capabilities ๐ŸŽฏ

The *Arr software suite manages your media libraries and automates content acquisition, feeding new content directly to your media server.

Core Features:

  • Search: Find content across multiple indexers (Usenet, torrents)
  • Download: Automated content acquisition
  • Organization: Powerful renaming with proper metadata
  • Quality Control: Target specific qualities (4K, 1080p, 720p)
  • Scheduling: Track and schedule downloads

Application Roles:

6.4 - Content Acquisition Methods ๐Ÿ“ฅ

Hereโ€™s an overview of the two main content acquisition methods (research Reddit communities for detailed information):

Usenet:

  • Distributed network since the 1980s
  • Fast, secure, and difficult to track
  • Requires: Provider + Indexer

Torrents:

  • Peer-to-peer network
  • Fast but easily trackable
  • Requires: Tracker + VPN (recommended)

Indexers: Search engines for both Usenet and torrent content

The *Arr software automates downloads from both sources based on your configuration.

6.5 - Usenet vs Torrents in 2025 โš–๏ธ

While torrents remain viable, Iโ€™ve shifted to Usenet for primary content acquisition due to several factors:

Torrent Challenges:

  • Quality content frequently removed
  • Private tracker invite requirements
  • Seeding obligations for ratio maintenance
  • Provider dependency

Usenet Advantages:

  • Paid service reliability
  • No seeding requirements
  • Consistent availability
  • Enhanced security

I prefer paying for quality Usenet providers and indexers for reliable, fast, and secure downloads.

Note: This article wonโ€™t recommend specific providers. Research Reddit communities to find services matching your needs.

6.6 - Localized Content & Subtitles ๐ŸŒ

While most online media is available in English, localized content for family viewing often requires subtitles. Audio localization is more challenging, though you can configure preferences in Bazarr or Radarr.

Bazarr Capabilities:

Hereโ€™s my automation script for subtitle translation on Unraid:

๐Ÿ‘‡ Click here to watch the code block ๐Ÿ‘‡
import json
import os
from urllib import request, error

# ------------------
# Credentials
# ------------------
TRANSLATION_FILE_PATH = './translation_attempts.json'
API_KEY = 'YOURKEY'
API_BASE_URL = 'https://YOURBAZARURL.com/api'
COMMON_HEADERS = {
   'Accept': 'application/json',
   'X-API-KEY': API_KEY,
   'User-Agent': 'curl/8.4.0'
}

# ------------------
# Make a request
# ------------------
def make_request(url, method='GET'):
   req = request.Request(url, method=method, headers=COMMON_HEADERS)
   try:
       with request.urlopen(req) as response:
           if response.status == 200 or response.status == 204:
               return json.loads(response.read().decode()) if method == 'GET' else True
           else:
               print(f"Failed request at {url}, Status code: {response.status}")
               return None
   except error.HTTPError as e:
       #print(f"HTTP error: {e.code} - {e.reason}")
       return None
   except error.URLError as e:
       #print(f"URL error: {e.reason}")
       return None
   
# ------------------
# Load The attempts
# ------------------
def load_translation_attempts():
   if os.path.exists(TRANSLATION_FILE_PATH):
       with open(TRANSLATION_FILE_PATH, 'r') as file:
           return json.load(file)
   return {}

# ------------------
# Save The Attempts
# ------------------
def save_translation_attempts(attempts):
   with open(TRANSLATION_FILE_PATH, 'w') as file:
       json.dump(attempts, file, indent=4)

# ------------------
# Get all series IDs
# ------------------
def get_series_ids():
   data = make_request(f"{API_BASE_URL}/series?start=0&length=-1")
   return [series['sonarrSeriesId'] for series in data['data']] if data else []

# ------------------
# Get subtitle paths for multiple series
# ------------------
def get_subtitle_paths_for_multiple_series(series_ids):
   # Constructing the query string for multiple series IDs
   series_ids_query = '&'.join([f'seriesid%5B%5D={id}' for id in series_ids])
   episode_url = f"{API_BASE_URL}/episodes?{series_ids_query}"

   data = make_request(episode_url)
   subtitle_info = []
   if data:
       for episode in data['data']:
           english_subtitles = [sub for sub in episode['subtitles'] if sub['code2'] == 'en']
           portuguese_subtitles = [sub for sub in episode['subtitles'] if sub['code2'] == 'pt']
           if english_subtitles and not portuguese_subtitles:
               subtitle_info.extend([{
                   'path': sub['path'],
                   'id': episode['sonarrEpisodeId'],
                   'type': 'episode'
               } for sub in english_subtitles if sub['path'] is not None])
   return subtitle_info

# ------------------
# Get subtitle paths for movies
# ------------------
def get_movie_subtitle_paths():
   data = make_request(f"{API_BASE_URL}/movies?start=0&length=-1")
   subtitle_info = []
   if data:
       for movie in data['data']:
           english_subtitles = [sub for sub in movie['subtitles'] if sub['code2'] == 'en']
           portuguese_subtitles = [sub for sub in movie['subtitles'] if sub['code2'] == 'pt']
           if english_subtitles and not portuguese_subtitles:
               subtitle_info.extend([{
                   'path': sub['path'],
                   'id': movie['radarrId'],
                   'type': 'movie'
               } for sub in english_subtitles if sub['path'] is not None])
   return subtitle_info

# ------------------
# Translate subtitle
# ------------------
# Update the translate_subtitle function
def translate_subtitle(subtitle_info, language='pt'):
   subtitle_path = subtitle_info['path']
   translation_attempts = load_translation_attempts()

   if translation_attempts.get(subtitle_path, 0) >= 3:
       print(f"Skipping translation for {subtitle_path} due to multiple failures.")
       return

   if make_request(f"{API_BASE_URL}/subtitles?action=translate&language={language}&path={request.quote(subtitle_path)}&type={subtitle_info['type']}&id={subtitle_info['id']}", 'PATCH'):
       print(f"Translate: Subtitle translated: {subtitle_path}")
   else:
       print(f"Translate: Failed to translate subtitle: {subtitle_path}")
       translation_attempts[subtitle_path] = translation_attempts.get(subtitle_path, 0) + 1
       save_translation_attempts(translation_attempts)

# ------------------
# Translate Series
# ------------------
def translate_series():
   # Usage
   all_series_ids = get_series_ids()

   # Check if there are any series IDs, exit if not
   if not all_series_ids:
       print("Series: No series found to process.")
       #exit(0)

   all_subtitles_info = get_subtitle_paths_for_multiple_series(all_series_ids)

   # Check if there are any subtitle paths, exit if not
   if not all_subtitles_info:
       print("Series: No subtitle paths found to translate.")
       #exit(0)

   # Translate 10 Subtitles
   subtitles_to_translate = all_subtitles_info[:20]

   # Translate the selected subtitles
   for subtitle in subtitles_to_translate:
       translate_subtitle(subtitle)

# ------------------
# Translate Movies
# ------------------
def translate_movies():
   # Usage
   all_subtitles_info = get_movie_subtitle_paths()

   # Check if there are any subtitle paths, exit if not
   if not all_subtitles_info:
       print("Movies: No subtitle paths found to translate.")
       #exit(0)

   # Translate 10 Subtitles
   subtitles_to_translate = all_subtitles_info[:20]

   # Translate the selected subtitles
   for subtitle in subtitles_to_translate:
       translate_subtitle(subtitle)

# ------------------
# Main
# ------------------
if __name__ == '__main__':
   translate_series()
   translate_movies()

6.7 - Transcoding & Optimization ๐ŸŽฌ

For advanced streaming optimization, research transcoding and optimal streaming formats. No perfect video/audio format exists - it depends on your use case and playback hardware.

While platforms like Netflix convert content into multiple codecs for different users, home servers canโ€™t afford this luxury of storing multiple formats per movie.

Choose formats that best fit your specific needs. Transcoding serves two purposes:

  • Space saving: Smaller file sizes
  • Performance: Faster streaming

6.8 - Format Selection ๐Ÿ“‹

HEVC + H.265: Modern format for 2015+ hardware MP4 + H.264: Widely compatible with modern and legacy devices

While H.265 offers better compression for 2025 streaming, it requires newer hardware. For family sharing, ensure devices support H.265, otherwise Plex will transcode to H.264, increasing hardware usage and power consumption.

6.9 - Transcoding & Processing Pipeline ๐Ÿ”„

Hereโ€™s what you need to know about transcoding and video processing software.

Configure Radarr and Sonarr to prefer specific formats to minimize re-processing needs.

โ„น๏ธ

A budget NVIDIA GPU is recommended for efficient transcoding. CPU transcoding is resource-intensive and consumes more energy.

File Processing Benefits:

  • Compression: Reduce disk space usage
  • Audio Management: Remove unwanted language tracks
  • Subtitle Control: Remove unnecessary subtitle tracks
  • Format Conversion: Convert audio formats (5.1 to 2.1)
  • Subtitle Extraction: Extract subtitles for translation
  • Track Organization: Organize audio and subtitle track order

All processing relies on FFmpeg - consider supporting this amazing project!

Tool Comparison:

Tdarr:

  • Advanced features
  • Popular community choice
  • Open source with freemium model
  • Complex UI that can be confusing

Fileflows:

  • Superior user interface
  • Built-in plugins and tools
  • Responsive smaller community
  • Intuitive flow building
  • Easy multi-node setup
  • Better Docker integration

Fileflows Dashboard Statistics

Results: Saved approximately 3TB from my current library!

For large transcoding workloads, deploy multiple nodes working in parallel for simultaneous content processing.

6.10 - Advanced Media Server Features ๐Ÿš€

Enhance your media server setup with these additional tools for a better library experience:

  • Tautulli: Monitor Plex server performance, user statistics, and transcoding metrics
  • Overseerr: Enable friends and family to request content with approval workflows for automatic downloads
  • Kometa: Plex Meta Manager for enhanced metadata, custom categories, library organization, and popular content lists
  • Wizarr: Streamlined user invitation system with permission management
  • Organizr: Unified dashboard for all your services with clean UI access
  • Maintainerr: Automatically manage content lifecycle - remove unwatched or completed content

7 - Energy Efficiency โšก

Energy saving is often overlooked but crucial for high-end servers running 24/7. Here are effective power management strategies:

  • Disk Spindown: Automatically spin down unused drives to reduce power consumption
  • Sleep Mode: Enable server sleep mode with wake-on-demand capabilities
  • CPU Power Management: Configure power scaling based on usage patterns
  • GPU Power Management: Optimize NVIDIA GPU power states when idle
๐Ÿ‘‡ Click here to watch the code block ๐Ÿ‘‡
#!/bin/bash
# check for driver
command -v nvidia-smi &> /dev/null || { echo >&2 "nvidia driver is not installed you will need to install this from community applications ... exiting."; exit 1; }
echo "Nvidia drivers are installed"
echo
echo "I can see these Nvidia gpus in your server"
echo
nvidia-smi --list-gpus 
echo
echo "-------------------------------------------------------------"
# set persistence mode for gpus ( When persistence mode is enabled the NVIDIA driver remains loaded even when no active processes, 
# stops modules being unloaded therefore stops settings changing when modules are reloaded
nvidia-smi --persistence-mode=1
#query power state
gpu_pstate=$(nvidia-smi --query-gpu="pstate" --format=csv,noheader);
#query running processes by pid using gpu
gpupid=$(nvidia-smi --query-compute-apps="pid" --format=csv,noheader);
#check if pstate is zero and no processes are running by checking if any pid is in string
if [ "$gpu_pstate" == "P0" ] && [ -z "$gpupid" ]; then
echo "No pid in string so no processes are running"
fuser -kv /dev/nvidia*
echo "Power state is"
echo "$gpu_pstate" # show what power state is
else
echo "Power state is" 
echo "$gpu_pstate" # show what power state is
fi
echo
echo "-------------------------------------------------------------"
echo
echo "Power draw is now"
# Check current power draw of GPU
nvidia-smi --query-gpu=power.draw --format=csv
exit

8 - Data Protection: Backups & Parity ๐Ÿ›ก๏ธ

Unraidโ€™s Parity system protects your data differently from traditional RAID. Parity offers more flexibility and allows expansion as needed.

For detailed information about Parity, RAID, and backups, consult the Unraid FAQ.

My Backup Strategy: I use Duplicacy for cloud backups with easy restoration capabilities. Currently storing backups with Backblaze for their excellent service quality and competitive pricing.

9 - Expanding Your Unraid Capabilities ๐Ÿš€

The possibilities are endless with your NAS and Unraid setup. Run virtually any application including:

  • Personal cloud storage (Dropbox alternative)
  • LLM inference servers
  • DNS ad-blocking servers
  • Development environments
  • Home automation systems

Unraidโ€™s Docker support enables running almost any containerized application with simple expansion capabilities.

The community app ecosystem grows daily, providing countless applications installable with just a few clicks.

Unraid Community Apps Marketplace

10 - Conclusion ๐ŸŽฌ

Weโ€™ve explored Unraid fundamentals, setup procedures, and how to create your own Netflix-like service, NAS, or office file system. The configuration and tweaking process has been enjoyable while learning about Docker, Linux, and microservices.

Disclaimer: Some information may contain inaccuracies as Iโ€™m sharing personal learning experiences. This article aims to help you start your own NAS and Unraid journey.

11 - My Hardware Specifications ๐Ÿ’ป

Hereโ€™s my current hardware setup:

  • CPU: Intelยฎ Coreโ„ข i7-8700 @ 3.20GHz
  • RAM: 16GB DDR4
  • GPU: RTX A2000
  • Motherboard: Gigabyte Z390 DESIGNARE-CF
  • Network: 1Gbps (1GB Download / 500MB Upload)
  • UPS: APC Back-UPS Pro 900
  • Storage: 2x 10TB WDC WD101KRYZ drives
  • Cache: 2x 1TB Samsung SSD 970 EVO Plus

Do you need this much? No! I repurposed existing hardware for this project. You can run the same setup with much less powerful hardware.

Like this post? Sharing it means a lot to me! โค๏ธ