Heimautomatisierungsserver FHEM installieren und als Systemd-Service einrichten

Worum geht’s?

Heimautomatisierung und Energiemessung ist in aller Munde. Oft sind System hierfür aber sehr teuer und nur schwer nachträglich zu installieren. FHEM bietet hierfür eine Opensource Lösung, die über Funkt auch mit kostengünstigen Komponenten funktioniert.

Was ist zu tun?

Zunächst stellt man sicher, dass Perl installiert ist, da dies zum Betreiben von FHEM benötigt wird:

sudo yum install perl perl-libs perl-CPAN

Anschließend sollten noch einige PERL Bibliotheken installiert werden, die man typischerweise benötigt:

sudo cpan install Date::Parse
sudo cpan install Device::SerialPort
sudo cpan install Digest::MD5

Nun kann man den FHEM Server herunterladen unter: https://fhem.de/#Download (das .tar.gz Package unter Unix/OSX für Centos)

Diese Package entpackt man in das Verzeichnis seiner Wahl:

tar -xvzf fhem-5.8.tar.gz

Nun muss die passende systemd Konfiguration angelegt werden. Hierzu legt man die Datei /etc/systemd/system/fhem.service mit folgendem Inhalt an:

[Unit]
Description=FHEM
After=network.target

[Service]
Type=forking
User=root
WorkingDirectory=/srv/fhem
ExecStart=/usr/bin/perl /srv/fhem/fhem.pl /srv/fhem/fhem.cfg
Restart=on-abort

[Install]
WantedBy=multi-user.target

Achtung: Der Einfachheit halber wird der Service in diesem Beispiel unter dem User root laufen lassen, besser wäre es hierfür einen eigenen User anzulegen.

Anschließend kann der Service erstmals gestartet und dauerhaft aktiviert werden mit den Kommandos:

sudo systemctl start fhem
sudo systemctl enable fhem

Nun müssen lediglich in firewalld noch die Ports 8083-8085 freigegeben werden und das Arbeiten mit FHEM kann beginnen.

Python 3 installieren

Um was geht’s?

Unter CentOS 7 findet sich leider per Default nur Python 2. Für einige Skripte benötige ich aber Python 3, z.B. für das Tolino Python Skript, mit dem man E-Books auf seinen Tolino Cloud Account laden kann.

Was ist zu tun?

Beim Installieren von Python 3 stütze ich mich auf diesen Digital Ocean Eintrag:

https://www.digitalocean.com/community/tutorials/how-to-install-python-3-and-set-up-a-local-programming-environment-on-centos-7

Mit folgende Kommandos installiert man zunächst einige yum und Entwicklungstools:

sudo yum install yum-utils
sudo yum groupinstall development

Folgendes Kommando installiert das IUS Repository:

sudo yum install https://centos7.iuscommunity.org/ius-release.rpm

Nun kann Python zusammen mit pip mit folgenden Kommandos installiert werden:

sudo yum install python36u
sudo yum install python36u-pip
sudo yum install python36u-devel

Zusätzliche Python Packages lassen sich nun wie folgt installieren:

sudo pip3.6 install package_name

Regelmäßige Datei Backups mit rsync

Worum geht’s?

Ein Server, auf dem man all seine Daten z.B. in einer Owncloud speichert macht nur Sinn, wenn man regelmäßige Backups seiner Daten anlegt. Ein relativ einfacher Weg unter Linux Backups anzulegen, der aber in den meisten Fällen füllig genügt ist das Programm rsync.

Welche Voraussetzungen werden benötigt?
Was ist zu tun?

Man legt sich am besten ein Shell-Script an, z.B. backup.sh, in das man seine zu sichernden Verzeichnisse wie folgt hinterlegt:

rsync -aAXv --delete-delay /quelle1/ /ziel1
rsync -aAXv --delete-delay /quelle2/ /ziel2
rsync -aAXv --delete-delay /quelle3/ /ziel3

Diese hinterlegt man dann in der /etc/crontab, z.B. wie folgt um jeden Abend um 23:00 Uhr ein Backup durchzuführen:

0 23 * * * root /srv/bin/backup.sh

Die Optionen für rsync bedeuten dabei folgendes:

 Option Bedeutung
 -a Archivmodus (kopiert rekursiv und nimmt z.B. Symbolische Links, Eigentümer der Dateien, letzte Ändeurng und ähnliches mit)
-A Kopiert ACLs mit
-X Kopiert ggf. zusätzliche Attribute mit
-v Steht für verbose und sorgt für ein detailliertes Logging
–delete-delay Während des Sync-Vorgangs werden Löschungen analysiert, jedoch erst am Ende gebündelt durchgeführt

Regelmäßige Aufgaben mit Cron automatisieren

Worum geht’s?

Auch auf meinem Linux Server gibt es einige immer wieder kehrenden Aufgaben, die ich gerne automatisieren möchte. Hierzu bietet sich der cron-Dienst unter Linux an.

Was ist zu tun?

Zum Anlegen von cron-Jobs editiiert man die Datei /etc/crontab. Diese hat folgenden Aufbau:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7)
# | | | | |
# * * * * * user-name command to be executed

Darüber hinaus kann man statt der ersten fünf Felder auch folgende Zeichenketten verwenden:

Zeichenkette Bedeutung
@reboot einmalig, beim Start
@daily einmal pro Tag
@midnight einmal pro Tag
@hourly einmal pro Stunde
@weekly einmal pro Woche
@monthly einmal im Monat
@annually einmal im Jahr
@yearly einmal im Jahr

Eine /etc/crontab könnte also z.B. folgende Einträge haben:

@hourly root /dir/checkmails.sh
0 22 * * * root /dir/dbdump.sh
0 23 * * * root /dir/backup.sh

Detailliertere Information rund um das Thema cron finden  sich hier:

https://wiki.ubuntuusers.de/Cron/

Plex Bibliotheken anlegen

Worum gehts?

PLEX Medienserver installiert, nun gilt es die DVD Sammlung dort auch als Bibliotheken zu hinterlegen. Beachtet man bei der Benennung und Sortierung seiner Mediendateien einige Regeln, so kann man die Erkennungsrate des PLEX Medienservers extrem steigern.

Welche Voraussetzungen werden benötigt?

Was ist zu tun?

Für Filme sollte man sich ein eigenes Verzeichnis anlegen, z.B. movies. Darin legt man die Filmdateien ab, die man wie folgt benennt:

Filmtitel (Erscheinungsjahr).ext

Das Ganze könnte sich also wie folgt darstellen:

/movies

Das_Schweigen_der_Lämmer_(1991).mp4

Weiter Infos zum Benennen von Filmen finden sich hier: https://support.plex.tv/hc/en-us/articles/200381023-Naming-Movie-files

Auch für Serien sollte ein eigenes Verzeichnis, z.B. series angelegt werden. Darunter erhält jede Serie ein eigenes Verzeichnis und darunter wiederum jede Staffel. Die einzelnen Episode werden dann wie folgt bezeichnet:

series/Serie/season_XX/Serie_sXXeYY_Zusätzliche_Info.ext

Dabei ist XX die Staffel und  YY die jeweilige Episode.

Das könnte so aussehen:

/series

/greys_anatomy

/season_01

Greys_Anatomy_S01E01_Nur_48_Stunden.mp4
Greys_Anatomy_S01E02_Grenzen.mp4

/season_02

Weitere Infos zu Benennung von Serien gibt es hier: https://support.plex.tv/hc/en-us/articles/200220687-Naming-Series-Season-Based-TV-Shows

Einen Überblick zur Vorbereitung von Medien für den PLEX Server (auch für Musik und andere) findet sich hier:

https://support.plex.tv/hc/en-us/categories/200028098-Media-Preparation

Wenn die Medien entsprechen vorbereitet wurden, legt man über die PLEX Administrationsoberfläche eine Bibliothek vom Typ Film oder Serien an und liest sein Film- bzw. Serien Verzeichnis ein.

Owncloud Server installieren

Worum geht’s?
Wir haben bei uns im Haus 4 Rechner, 2 Smartphones und ein Tablet im Einsatz. Auf allen Geräten hätten wir gerne unsere Daten im Zugriff, gleichzeitig möchten wir die Kontrolle über unsere Daten behalten. Eine gute Lösung bietet hier Owncloud, welches neben Synchronisierungsclients für Linux und Windows auch Apps für Android und iOs bietet.
Welche Voraussetzungen werden benötigt?
Was ist zu tun?

Zunächst muss das Owncloud Repository installiert werden. Zunächst importiert man hierzu den Schlüssel des Repositories:

sudo rpm --import https://download.owncloud.org/download/repositories/stable/CentOS_7/repodata/repomd.xml.key

Anschließend wird das Repository installiert:

sudo curl -L https://download.owncloud.org/download/repositories/stable/CentOS_7/ce:stable.repo -o /etc/yum.repos.d/ownCloud.repo

Nun kann Owncloud installiert werden:

sudo yum clean expire-cache

sudo yum install owncloud

Anschließend muss eine Datenbank angelegt werden (inkl. einem User mit allen Rechten an dieser Datenbank). Dies kann wahlweise per phpMyAdmin gemacht werden oder über die Kommandozeile.

Weitere Dateils zum anlegen per Kommandozeile und dem Konfigurieren des Owncloud Servers finden sich hier:

https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-owncloud-on-centos-7

Plex Medienserver installieren

Worum geht’s?

Meine Frau und ich haben über die Jahre – vor allem zu Zeiten als es Netflix und Co noch nicht gab  – eine beträchtliche Sammlung an DVDs angesammelt. Diese nehmen viel Platz weg und sollten deshalb in den Keller verbannt werden. Dennoch will man den einen oder anderen Klassiker hin und wieder mal sehen. Dazu kommt das unser etwas in die Jahre gekommene LG Smart-TV einen eingebauten Plex Client hat. Also muss auch ein Plex Medienserver her…

Was ist zu tun?

Zunächst wird unter https://www.plex.tv/download/das passende RPM Paket für  CentOS 64 Bit heruntergeladen. Dieses wird anschließend mit folgendem Kommando installiert:

sudo rpm -i plexmediaserver-1.8.1.4139-c789b3fbb.x86_64.rpm

Anschließend kann der Medienserver mit folgendem Kommando gestartet werden:

sudo systemctl start plexmediaserver

Und folgendes Kommando sorgt dafür, dass er bei jeden Systemstart erneut gestartet wird:

sudo systemctl enable plexmediaserver

Ist bereits ein Version des Plex Medienservers installiert, kann diese (nach Download der neuen Version) wie folgt aktualisiert werden:

sudo rpm -U plexmediaserver-1.8.4.4249-3497d6779.x86_64.rpm

Die Managementoberfläche des Plex Medienservers ist per Default unter http://<server_ip>:32400/manage/index.html zu erreichen. Man meldet sich dort zunächst mit seinem Plex-User an.

Voraussetzung ist natürlich, dass der Port 32400 an der Firewall firewalld freigeschaltet ist. Folgende Ports sollten – je nach Bedarf –  offen sein:

  • TCP: 32400 (für Zugriff auf den Plex Media Server) [Pflicht]
  • UDP: 1900 (für Zugriff auf den Plex DLNA Server)
  • TCP: 3005 (um Plex Home Theater via Plex Companion zu steuern)
  • UDP: 5353 (für alte Bonjour/Avahi Netzwerkerkennung)
  • TCP: 8324 (um Plex for Roku via Plex Companion zu steuern)
  • UDP: 32410, 32412, 32413, 32414 (für aktuelle GDM Netzwerkerkennung)
  • TCP: 32469 (für Zugriff auf den Plex DLNA Server)

Siehe auch https://support.plex.tv/hc/en-us/articles/201543147-What-network-ports-do-I-need-to-allow-through-my-firewall-

Nicht alle Plex Clients unterstützen Authentifizierung am Server (so z.B. auch nicht der in unserm LG TV eingebaute Client). Man kann die Authentifizierung aber für einzelne IPs oder ganze Netze über die Weboberfläche deaktivieren unter: Einstellungen > Server > Netzwerk > Liste der IP-Adressen und Netzwerke, die keine Authentifizierung benötigen

Ein Eintrag um die Authentifizierung für das komplette lokale Netzwerk zu deaktivieren, könnte hier wie folgt aussehen:

192.168.1.0/255.255.255.0

Siehe auch https://support.plex.tv/hc/en-us/articles/200890058-Require-authentication-for-local-network-access

Regelmäßige Backups einer MariaDB/MySQL Instanz

  Worum gehts?

Wenn man eine Datenbank betreibt, sollte man regelmäßige Backups dieser anfertigen. Ich habe wir dazu dieses einfache Backupkonzept zurecht gelegt, welches aber im Falle des Festplattendefekts auf unserem Server dafür sorgte, dass ich die komplette Datenbank wieder herstellen konnte.

Welche Voraussetzungen werden benötigt?
Was ist zu tun?

Man legt eine Shell Datei an, z.B. dbdump.sh. Diese hat folgenden Inhalt:

#!/bin/bash
#Verzeichnis für die Backupdateien (Sollte auf einer anderen Festplatte sein
BACKUP_DIR=<directory>

#Dateiname für Backupfiles
BACKUP_FILE=dbdump
#Administrationsuser des  DB Servers miit Zugriff auf alle DBs
DB_USER=<dbuser>

#Passwort des Users
DB_PASSWD=<password>

#Zeitraum über den Backups aufgehoben werden sollen
DAYS_DBDUMP=30

NOW=$(date +"%Y%m%d%H%M%S")

FILE=${BACKUP_DIR}/${NOW}_${BACKUP_FILE}.sql.gz
PATTERN_DBDUMP="${BACKUP_DIR}/*_${BACKUP_FILE}.sql.gz"

mysqldump --user=$DB_USER --password=$DB_PASSWD --all-databases | gzip > $FILE
chmod 660 $FILE

find $PATTERN_DBDUMP -ctime +$DAYS_DBDUMP -print -exec rm {} \;

Dieses Shellscript exportiert mit dem Tool mysqldump alle Datenbanken samt Inhalt in eine SQL Datei, komprimiert diese mit gzip und versieht diese mit dem aktuellen Zeitstempel. Anschließend werden alle Backups gelöscht, die älter als $DAYS_DBDUMP Tage sind.

Nun muss man noch dafür sorgen, dass das Script regelmäßig läuft. Mit dem Kommando

sudo vi /etc/crontab

trägt man hierzu folgende Zeile in die Cronjob Tabelle ein:

00 22 * * * root /dir/dbdump.sh

dir ist dabei mit dem Verzeichnis zu ersetzen, in dem das Shellscript liegt.

Um ein Backup wieder einzuspielen, entpackt man die Backupdatei mit:

gunzip <file>.sql.gz

Anschließend führt man die darin enthaltenen SQL Befehle aus mit:

mysql -u<user> -p<password> < <file>.sql

Wenn man eine Backupdatei ins Verzeichnis /var/lib/phpMyAdmin/upload/ kopiert, kann sie von dort auch direkt mit der Import Funktion von phpMyAdmin eingespielt werden. (Auf Grund der maximalen Scriptlaufzeit und dem Overhead durch die PHP Scriptausührung, empfiehlt sich dass aber nur für kleinere Backups)

Kommt es beim Einspielen eines Backups zum Fehler Unknown option 'STATS_PERSISTENT' so importiert man wahrscheinlich ein Backup einer neueren MariaDB/MySQL Version (MariaDB >= 10.0 / MySQL >= 5.6) in eine ältere Version. In diesem Fall löscht man aus der zu importierenden SQL Datei einfach alle Vorkommnisse der Zeichenkette STATS_PERSISTENT=0 und importiert dann erneut.

Installation von phpMyAdmin

Worum gehts?

Zur Verwaltung eines MariaDB/MySQL Servers ist eine grafische Oberfläche sehr hilfreich. Für mich hat sich hierbei die webbasierte Lösung phpMyAdmin bewährt.

Welche Voraussetzungen werden benötigt?
Was ist zu tun?

phpMyAdmin wird mit folgendem Kommando installier:

sudo yum -y install phpmyadmin

Per Default kann phpMyAdmin nur lokal erreicht werden. Um dies anzupassen muss die entsprechend Apache Konfigurationsdatei angepasst werden:

sudo vi /etc/httpd/conf.d/phpMyAdmin.conf

Diese kann man z.B. wie folgt anpassen:

<Directory /usr/share/phpMyAdmin/>
    Require all granted
</Directory>

(Achtung: Dadurch ist phpMyAdmin von allen Rechnern aufrufbar. Zusätzlich wird das Passwort in Klartext übertragen, wenn auf dem Apache Server keine HTTPs Verschlüsselung aktiviert ist. Dies ist eine potenzielle Sicherheitslücke, wenn der Zugriff nicht über andere Wege eingeschränktwird)

Abschließend wird der Apache Server neu gestartet mit:

sudo systemctl restart httpd

phpMyAdmin ist nun unter http://<server>/phpmyadmin erreichbar.

Installation von Apache, MariaDB und PHP

Worum gehts?

Viele Webanwendungen laufen nach wie vor auf genau diesem Stack: LAMP (Linux, Apache, MariaDB/MySQL und PHP)

Auch ich benötige diesen Stack auf meinem Server, z.B. für Owncloud. Vor Neuinstallation des Servers nutzte ich noch MySQL. Nun habe ich mich entschieden, auf MariaDB zu setzen. Dies erleichtert im Übrigen auch die Installation, da in den CentOS Repositories MariaDB bereits enthalten ist.

Was ist zu tun?

Zunächst wird Apache installiert mit dem Kommando:

sudo yum install httpd

Anschließend kann Apache gestartet werden, mit:

sudo systemctl start httpd.service

Um Apache auch beim Bootvorgang zu starten, wird der Httpd Service aktiviert mit:

sudo systemctl enable httpd.service

Anschließend sollte (wenn HTTP ohne Verschlüsselung genutzt werden soll) der Port 80 an der CentOS Firewall geöffnet werden (Annahme: Firewalld wird genutzt):

sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload

MariaDB wird mit folgendem Kommando installiert:

sudo yum install mariadb-server mariadb

Anschließend wird MariaDB wie folgt gestartet:

sudo systemctl start mariadb

Nun können einige unsichere Defaultwerte angepasst und ein Root-Passwort für die Datenbank gesetzte werden, indem man folgendes Script startet:

sudo mysql_secure_installation

Um auch MariaDB beim Bootvorgang zu starten, muss dann auch hier der Service aktiviert werden:

sudo systemctl enable mariadb.service

Abschließend wir PHP wie folgt installiert:

sudo yum install php php-mysql

Anschließend sollte der Apache Server neu gestartet werden:

sudo systemctl restart httpd.service

PHP wird unter CentOS 7 in der Version 5.4 installiert. Sollte eine neuere PHP Version (5.5, 5.6 oder 7) benötigt werden, so kann man dies über das REMI Repository bewerkstelligt werden. Dies installiert man mit folgenden Kommandos:

wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo rpm -Uvh remi-release-7*.rpm

Anschließend muss das Repository aktiviert werden, indem man in der Datei /etc/yum.repos.d/remi.repo im Block [remi] enabled=1 setzt und je nach gewünschter Version im Block [remi-php55] oder [remi-php56]

Dies könnte dann wie folgt aussehen:

[remi]
name=Remi's RPM repository for Enterprise Linux 7 - $basearch
mirrorlist=http://rpms.remirepo.net/enterprise/7/remi/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

[remi-php56]
name=Remi's PHP 5.6 RPM repository for Enterprise Linux 7 - $basearch
mirrorlist=http://rpms.remirepo.net/enterprise/7/php56/mirror
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi

Für die 7er Versionen gibt es analog die Files remi-php70.reporemi-php71.repo und remi-php72.repo.

Nun kann die PHP Installation 5.4 mit folgender Anweisung auf die gewünschte Version aktualisiert werden:

sudo yum upgrade php*

Falls PHP noch nicht installiert war kann es auch komplett installiert werden mit:

sudo yum install php php-mysql