Homeserver

Die Datensouveränität ist ein wichtiger Bestandteil der Digitalen Souveränität.Sie erlaubt die vollständig selbstbestimmte Kontrolle über Erhebung, Speicherung, Nutzung und Verarbeitung der eigenen Daten.

NextCloud
Weil ich es super finde wenn meine Daten bei mir liegen – und ich trotzdem immer Zugriff habe

Mastodon
Als Gegengewicht zu Facebook, TikTok und Instagram. Einfach mal ausprobieren und reinschauen.

ioBroker
Ein wenig Heimautomation – wer rennt schon zwei Stockwerke um das Licht auszumachen oder Rollos herunter zufahren?

Backup
Wer kennt den Spruch: Kein Backup – kein Mitleid?
Vorbeugen ist besser als auf die Schuhe kotzen!

Homeserver Jonsbo N3 Case

Jonsbo N3 NAS Case

Motherboard (das falsche!),
Netzteil und CPU

Ein erster Blick ins BIOS

Morbi tortor nibh fringilla
Curabitur non bibendum ligula
In non pulvinar purus curabitur nisi

Address

1234 Divi St. #1000, San Francisco, CA 94220

Einkaufsliste & Bautagebuch

Anbei meine initiale Einkaufsliste. Mit der Zeit wurden es dann mehr und mehr Komponenten,
man lernt ja auch dazu 😀

Im Bautagebuch sind weitere Teile und Bezugsquellen vermerkt.

Case: Jonsbo N3

Und hätte ich am Anfang bereits geahnt welche Herausforderungen dieses Gehäuse mit sich bringt, vermutlich hätte ich mich anders entschieden. Aber es war Liebe auf den ersten Blick: Ein noch recht kleines Case mit der Möglichkei auf zwei Ebenen alles unterzubringen. Im unteren Teil befinden sich bis zu 8 Laufwerke, oben finden Motherboard etc . Platz.
Die vier montierten Lüfter sorgen für ein vernünftiges Kühlsystem damit es Dauerlauf geeignet ist.

Jonsbo N3 Case

Motherboard: Gigabyte Aorus

Gigabyte AORUS Pro Intel B760

Jonsbo N3 Case

PSU

Tatsächlich ist dieses Netzteil nicht für den Einbau in das Jonsbo N3 Case geeignet
(Was ich zuerst nicht wahrhaben wollte!).

Erst mit einer selbstgedruckten Halterung war es möglich das Netzteil sicher und fest im Case zu verbauen. Mehr dazu unten im Bautagebuch.

PSU Silentstorm

Weitere Teile

2 x 32 GB RAM
4 Noctua Lüfter
Farbige Sata Kabel 50cm
HDMI Dummy Plug

Im Verlauf des Projektes stellte sich heraus das einige Teile mittels 3D Druck selbst angefertigt werden müssen.
Dazu zählt die Halterung des Netzteiles sowie SSD Käfige damit diese im unteren Teil des Gehäuses sicher aufgenommen werden.

Bautagebuch

März 2024

3D-Druck: Nach dem Desaster mit meinem Netzteil habe ich endlich eine gangbare und vernünftige Lösung gefunden. Auf Printables konnte ich die .stl Datei für eine passende Adapterplatte finden, drucken und einbauen.
Die .stl Datei könnt ihr auch hier herunterladen (ohne Gewähr!).

Adapterplatte für Jonsbo N3 Power

Mai 2024

Weitere Maßnahmen zur Reduzierung der Stromaufnahme, aktueller Verbrauch: 30 Watt (HDD alle im spindown, alle Docker und VM up & running).

Mai 2024

3D-Druck: HDD Einschübe / Halterungen zur SSD-Montage ausgedruckt und eingebaut.

Die Druckvorlage habe ich bei Thingiverse gefunden, dort findet ihr auch die .stl Datei.
Oder ihr ladet diese hier herunter, ohne Gewähr!

Mai 2024

Austausch des bestehenden Caches durch eine 2TB Samsung 980 pro

Ausgetausch werden die beiden 1TB SSD unterschiedlicher Hersteller.

Mit der Samsung 980 pro werden deutlich bessere Energiesparzustände erreicht.

Juni 2024

Die Energieaufnahme des Systemens beschäftigt mich weiterhin. Bei ruhendem System werden etwa 25 Watt aufgenommen, alle HDDs im Spin-down aber Docker aktiv. Das entspricht dem Zustand in dem sich das System etwa 95% der Zeit befindet.
Nun gibt es ein neues BIOS für das Gigabyte Motherboard, die Releasenotes lesen sich recht vielversprechend:

Additionally, GIGABYTE BIOS not only features optimized power settings that suits every different CPU but also offers exclusive easy settings, like PerfDrive, to enable a simple balance of performance, power consumption, and temperature with Intel® Core™ processors. This ensures achieving the same performance at lower CPU operating temperatures as well as excellent stability and high efficiency, safeguarding the durability of CPU/VRM components.

 Die Pressemitteilung ist hier zu finden, zum BIOS download geht es hier lang.

Juli 2024

Ende Juni kam ein aktuelles BIOS heraus, ich habe es sofort eingespielt. Leider werden alle Usereinstellungen komplett überschrieben, sodass man hier wieder von vorne anfängt. Sehr ärgerlich! Zudem wäre es super wenn ich meine BIOS Einstellungen auf z.B. USB sichern könnte. Gigabyte!!!

Inhalt GO File
#!/bin/bash

# Start the Management Utility /usr/local/sbin/emhttp

# -------------------------------------------------

# Set power-efficient CPU governor

# -------------------------------------------------

/etc/rc.d/rc.cpufreq powersave

# ------------------------------------------------- # Disable CPU Turbo # ------------------------------------------------- [[ -f /sys/devices/system/cpu/intel_pstate/no_turbo ]] && echo "1" > /sys/devices/system/cpu/intel_pstate/no_turbo [[ -f /sys/devices/system/cpu/cpufreq/boost ]] && echo "0" > /sys/devices/system/cpu/cpufreq/boost # ------------------------------------------------- # Enable power-efficient ethernet # ------------------------------------------------- # enable IEEE 802.3az (Energy Efficient Ethernet): Could be incompatible to LACP bonds! for i in /sys/class/net/eth?; do dev=$(basename $i); [[ $(echo $(ethtool --show-eee $dev 2> /dev/null) | grep -c "Supported EEE link modes: 1") -eq 1 ]] && ethtool --set-eee $dev eee on; done # Disable wake on lan for i in /sys/class/net/eth?; do ethtool -s $(basename $i) wol d; done # ------------------------------------------------- # powertop tweaks # ------------------------------------------------- # Enable SATA link power management echo med_power_with_dipm | tee /sys/class/scsi_host/host*/link_power_management_policy # Runtime PM for I2C Adapter (i915 gmbus dpb) echo auto | tee /sys/bus/i2c/devices/i2c-*/device/power/control # Autosuspend for USB device echo auto | tee /sys/bus/usb/devices/*/power/control # Runtime PM for disk echo auto | tee /sys/block/sd*/device/power/control # Runtime PM for PCI devices echo auto | tee /sys/bus/pci/devices/????:??:??.?/power/control

Juli 2024

Ich habe eine, bisher nicht bespielte, HDD wieder aus dem System entfernt. An den frei gewordenen SATA Anschluss habe ich eine 1TB Samsung SSD angeschlossen. Auf diese wurden alle Docker Container sowie große Teile meiner Bildersammlungausgelagert.
Somit wird nicht mehr das komplette Array gestartet wenn ein Docker Container schreibt oder liest.

Da absehbar ist das mir die Festplatten nicht ausreichen werden habe ich bei Amazon eine weitere ASM1166 Karte bestellt. Diesmal keine PCI Karte sondern die NVM Version in der Hoffnung das ich diese in den Stromsparstatus C8 bekommen.

In einem interessanten Beitrag im Unraid Forum habe ich ein Script entdeckt, das die zuletzt in Pplex hinzugefügten Daten via preload in den RAM verlagert. Zumindestens die ersten Minuten jeder Datei. Somit kommen die ersten Szenen des Filmes aus dem Cache und das Array kann starten während der Film bereits läuft. Getestet und für gut befunden!
Plex preload Script
#!/bin/bash
# #####################################
# Script: Video Preloader v1.4
# Description: Preloads the recent video files of a specific path into the RAM to bypass HDD spinup latency
# Author: Marc Gutt
# ######### Settings ##################

video_paths=(
"/mnt/user/Movie"
"/mnt/user/TV"
)

# the size of a video files must be at least 2GB (to exclude bonus content)
video_min_size="2000MB"

# we preload 60MB of the beginning of the video file into the RAM (raise this value if your video buffers after ~5 seconds)
preload_head_size="60MB"

# we preload 1MB of the end of the video file
preload_tail_size="1MB"

# if a preload is faster than 0.150 seconds than the video is already preloaded to the RAM
preload_threshold="0.150"

# preload only video files with specific extensions https://support.plex.tv/articles/203824396-what-media-formats-are-supported/
video_ext='avi|mkv|mov|mp4|mpeg'

# preload only subtitle files with specific extensions # https://support.plex.tv/articles/200471133-adding-local-subtitles-to-your-media/#toc-1
sub_ext='srt|smi|ssa|ass|vtt'

# we use 50% of our free RAM for preloading (it will be still free, check https://www.linuxatemyram.com/)
free_ram_usage_percent=50

# set this to "1" to remove all preloads (this is only usefull if you want to force reading from Disk)
preclean_cache=0

# notify if the execution was sucessful (errors produce notifications by default)
notification=1

# #####################################
#
# ######### Script ####################

# timestamping logs
exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d 'n' -I {} date '+%F %T {}')

# make script race condition safe
if [[ -d "/tmp/${0///}" ]] || ! mkdir "/tmp/${0///}"; then exit 1; fi; trap 'rmdir "/tmp/${0///}"' EXIT;

# check user settings
video_min_size="${video_min_size//[!0-9.]/}" # float filtering https://stackoverflow.com/a/19724571/318765
video_min_size=$(awk "BEGIN { print $video_min_size*1000000}") # convert MB to Bytes
preload_head_size="${preload_head_size//[!0-9.]/}"
preload_head_size=$(awk "BEGIN { print $preload_head_size*1000000}")
preload_tail_size="${preload_tail_size//[!0-9.]/}"
preload_tail_size=$(awk "BEGIN { print $preload_tail_size*1000000}")

# check if paths are used in docker containers
if docker info > /dev/null 2>&1; then
# get docker mounts of all running containers
# shellcheck disable=SC2016
docker_mounts=$(docker ps -q | xargs docker container inspect -f '{{$id := .Id}}{{range .Mounts}}{{if .Source}}{{printf $id}}:{{.Source}}{{println}}{{end}}{{end}}' | grep -v -e "^$")
for path in "${video_paths[@]}"; do
if [[ $docker_mounts != *"$path"* ]]; then
/usr/local/emhttp/webGui/scripts/notify -i alert -s "Plex Preloader failed!" -d "$path is not used by a docker container!"
exit 1
fi
done
fi

# clean the read cache
if [ "$preclean_cache" = "1" ]; then
sync; echo 1 > /proc/sys/vm/drop_caches
fi

# preload calculation
preloaded=0
skipped=0
preload_total_size=$((preload_head_size + preload_tail_size))
free_ram=$(free -b | awk '/^Mem:/{print $7}')
free_ram=$((free_ram * free_ram_usage_percent / 100))
echo "Available RAM: $(numfmt --to si $free_ram)"
preload_amount=$((free_ram / preload_total_size))
preload_size=$(( preload_head_size + preload_tail_size ))
echo "Amount of videos that can be preloaded: $preload_amount (each video occupies $(numfmt --to si $preload_size))"

# find all video files
while IFS= read -r -d '' file; do
video_files+=("$file")
done < <(find "${video_paths[@]}" -not -path '*/.*' -size +"$video_min_size"c -regextype posix-extended -regex ".*.($video_ext)" -printf "%T@ %p")

# no video files found
if [[ ${#video_files[@]} -eq 0 ]]; then
echo "No $video_ext files found in ${video_paths[*]}!"
else

# sort all video files
while IFS= read -r -d '' file; do
video_files_sorted+=("$file")
done < <(printf '%s' "${video_files[@]}" | sort -znr) # preload video files into RAM for i in "${!video_files_sorted[@]}"; do # stop if we reached our preload limit if [[ $i -ge $preload_amount ]]; then break; fi # remove modification time file=$(echo "${video_files_sorted[$i]}" | cut -f2- -d" ") TIMEFORMAT=%R seconds=$( { time head -c "$preload_head_size" "$file" >/dev/null; } 2>&1 )
if awk 'BEGIN {exit !('"$seconds"' >= '"$preload_threshold"')}'; then
preloaded=$((preloaded + 1))
echo "Preloaded $file in $seconds seconds"
else
echo "Skipped $file as loading needed only $seconds"
skipped=$((skipped + 1))
fi
tail -c "$preload_tail_size" "$file" > /dev/null
video_path=$(dirname "$file")
# fetch subtitle files
find "$video_path" -not -path '*/.*' -regextype posix-extended -regex ".*.($sub_ext)" -print0 |
while IFS= read -r -d '' file; do
echo "Preloaded $file"
cat "$file" >/dev/null
done
done

fi

# notification
if [[ $preloaded -eq 0 ]] && [[ $skipped -eq 0 ]]; then
/usr/local/emhttp/webGui/scripts/notify -i alert -s "Plex Preloader failed!" -d "No video file has been preloaded (wrong path?)!"
elif [ "$notification" == "1" ]; then
/usr/local/emhttp/webGui/scripts/notify -i normal -s "Plex Preloader has finished" -d "$preloaded preloaded (from Disk) / $skipped skipped (already in RAM)"
fi

Migration zu PLEX

Migration zu PLEX

Ich war lange Jahre großer Fan von Kodi bzw. Libreelec auf Raspberry. Aber je größer die Familie und Ansprüche, desto weniger Zeit und Lust am Basteln.Und Plex bot genau das was ich suchte. Da ich zeitgleich angefangen habe einen neuen Heimserver zu bauen war klar das...

mehr lesen
Plex Server TV & DVR einrichten

Plex Server TV & DVR einrichten

Die Einrichtung eines Plex Medienservers mit TV, in meinem Beispiel liefert eine FritzBox 6660 mit vier Tunern den DVB-C Stream. Benötigt wird auch ein PlexPass! Ich beginne in der Weboberfläche, dort klicken wir auf Live TV & DVR und beginnen mit der Einrichtung....

mehr lesen
LCD Display an Raspi4

LCD Display an Raspi4

Kochbuch: LCD Display an Libreelec RPI4 Benötigte Zutaten Abgesehen von einem Raspberry 4, auf dem vermutlich Libreelec läuft, braucht ihr natürlich noch ein Display - möglichst mit einem I2C Bus Adapter sowie vier Drähte um alles zu verbinden Meine beiden, ein...

mehr lesen