Open-source homelab knowledge
Your NAS is broken.
Let's fix it.
Practical DIY guides for Synology, TrueNAS, Unraid, and bare-metal homelab NAS builds. No fluff, just solutions.
scroll
What's broken?
Pick your problem.
Every guide starts with the actual error you're seeing — not a generic overview.
Disk & RAID failures
Degraded arrays, failed drives, rebuild times, SMART errors.
synology · truenas · unraid
Network & access issues
Can't reach your NAS, SMB drops, VPN tunnels, reverse proxy.
nginx · tailscale · samba
Performance & thermals
Slow transfers, high CPU, RAM pressure, disk temps spiking.
hdparm · iostat · lm-sensors
Docker & containers
Compose stacks, networking, volume mounts, update strategies.
portainer · compose · bridge
Backup & recovery
3-2-1 strategies, snapshot recovery, config backups, Restic.
rsync · restic · snapshots
First-time builds
Hardware picks, OS selection, pool layout, first-boot checklist.
beginner · hardware · zfs
Step-by-step
Latest guides.
Reproducible fixes with real commands. Updated when things break (because they always do).
Loading guides…
Quick diagnostics
Commands worth knowing.
Copy-paste commands for when you need answers fast. Works on TrueNAS, Unraid, Debian-based NAS, and most Linux systems.
# Install sensors (if not present)
$ sudo apt install lm-sensors && sudo sensors-detect --auto
# Read all CPU / motherboard sensor temps
$ sensors
coretemp-isa-0000
Core 0: +38.0°C (high = +80.0°C, crit = +100.0°C)
Core 1: +40.0°C (high = +80.0°C, crit = +100.0°C)
Core 2: +74.0°C (high = +80.0°C) ⚠ getting warm
# Watch temps live, refresh every 2s
$ watch -n 2 sensors
# GPU temp — NVIDIA
$ nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader
52
# GPU temp — AMD (via rocm-smi) or Intel iGPU
$ rocm-smi --showtemp
$ cat /sys/class/drm/card0/device/hwmon/hwmon*/temp1_input
45000 # divide by 1000 = 45°C
# Drive temperatures — all at once
$ for d in /dev/sd?; do echo -n "$d: "; sudo smartctl -A $d | grep -i temp | awk '{print $10"°C"}'; done
/dev/sda: 34°C
/dev/sdb: 35°C
/dev/sdc: 51°C ⚠
# CPU load average (1m / 5m / 15m)
$ uptime
14:32:01 up 12 days, 3:17, load average: 0.42, 0.38, 0.31
# RAM usage at a glance
$ free -h
total used free available
Mem: 31Gi 8.2Gi 18Gi 22Gi
# Top 5 processes by memory
$ ps aux --sort=-%mem | head -6
# Network usage in real time
$ sudo apt install nload && nload eth0
Bonus guide
Temperature alerts via Discord or Slack webhook
Get a message in Discord or Slack when a drive or CPU goes above your threshold. No extra software — just bash and cron.
# Discord:
Server Settings → Integrations → Webhooks → New Webhook → Copy URL
https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN
# Slack:
api.slack.com → Your Apps → Create App → Incoming Webhooks → Activate → Copy URL
https://hooks.slack.com/services/T.../B.../XXXX
#!/bin/bash
# ── CONFIG ──────────────────────────────────────────────
WEBHOOK="https://discord.com/api/webhooks/YOUR_ID/YOUR_TOKEN"
CPU_WARN=75 # °C threshold for CPU cores
DRIVE_WARN=48 # °C threshold for drives
HOST=$(hostname)
# ─────────────────────────────────────────────────────────
# Check CPU temp via sensors
CPU_TEMP=$(sensors 2>/dev/null | awk '/Core 0/ {gsub(/[^0-9.]/,"",$3); print int($3)}')
# Check all drive temps via SMART
ALERTS=""
for DISK in /dev/sd?; do
TEMP=$(smartctl -A "$DISK" 2>/dev/null | awk '/Temperature_Celsius/ {print $10}')
[ -z "$TEMP" ] && continue
if [ "$TEMP" -ge "$DRIVE_WARN" ]; then
ALERTS="$ALERTS\n🔥 Drive $DISK: ${TEMP}°C (threshold: ${DRIVE_WARN}°C)"
fi
done
# Add CPU alert if over threshold
if [ -n "$CPU_TEMP" ] && [ "$CPU_TEMP" -ge "$CPU_WARN" ]; then
ALERTS="$ALERTS\n🌡️ CPU: ${CPU_TEMP}°C (threshold: ${CPU_WARN}°C)"
fi
# Send to Discord/Slack only if there's something to report
if [ -n "$ALERTS" ]; then
MESSAGE="⚠️ **$HOST** — temperature alert$(printf "$ALERTS")"
# Discord
curl -s -X POST "$WEBHOOK" \
-H "Content-Type: application/json" \
-d "{"content": "$MESSAGE"}"
# Slack (swap the curl above for this instead)
# curl -s -X POST "$WEBHOOK" -H "Content-Type: application/json" \
# -d "{"text": "$MESSAGE"}"
fi
# Make the script executable
$ sudo chmod +x /usr/local/bin/nas-temp-alert.sh
# Test it manually first
$ sudo /usr/local/bin/nas-temp-alert.sh
# Add to cron — run every 10 minutes
$ sudo crontab -e
*/10 * * * * /usr/local/bin/nas-temp-alert.sh
# Verify cron entry was saved
$ sudo crontab -l
*/10 * * * * /usr/local/bin/nas-temp-alert.sh
# You'll now get a Discord/Slack message like this when temps spike:
⚠️ nas-server — temperature alert
🔥 Drive /dev/sdc: 51°C (threshold: 48°C)
🌡️ CPU: 78°C (threshold: 75°C)