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.
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:
- Domain โ Cloudflare (DNS + protection)
- Cloudflare โ Public IP (your home router)
- Browser โ Router (ports 80/443)
- Router โ Unraid Server (ports 3245/3247)
- 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.
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:
- Radarr: Movie management
- Sonarr: TV show management
- Prowlarr: Indexer management
- Bazarr: Subtitle management
- Tdarr: Media transcoding
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:
- Downloads subtitles from OpenSubtitles.org
- AI Generation: Uses ahmetoner/whisper-asr-webservice AI for subtitle creation
- Translation: Converts English subtitles to other languages (generally effective)
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:
- Advanced features
- Popular community choice
- Open source with freemium model
- Complex UI that can be confusing
- Superior user interface
- Built-in plugins and tools
- Responsive smaller community
- Intuitive flow building
- Easy multi-node setup
- Better Docker integration
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.
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.