[Raspberry Pi] Nextcloud und WordPress mit PHP7, MariaDB und Let‘s Encrypt

Dies hier soll eine umfangreiche Schritt für Schritt Anleitung werden um Nextcloud und co mit aktueller Software auf einen Raspberry Pi zu installieren. Ich habe dafür WordPress in /var/www installiert und als Stammverzeichnis des Servers benutzt und Nextcloud ist in einen Unterorder.

VORABINFO:

Ich habe mein bestes dafür gegeben Fehler auszuschließen und alles möglichst Sicher zu gestalten. Aber ich kann auch Fehler machen, also macht mich nicht dafür Verantwortlich falls etwas schief läuft. Falls ihr Tipps habt, wie etwas verbessert werden kann, lasst es mich wissen 🙂

Inhaltsliste:
  1. Aus dem Internet erreichbar: Domain mit Dynamic DNS (DDNS) einrichten
  2. Raspberry einrichten: Raspian Lite installieren
  3. Portfreigaben: HTTP, HTTPs und SSH
  4. Installation aktualisieren
  5. Pakete installieren: nginx, php, mariaDB, fail2ban und co
  6. Datenbanken für die Dienste anlegen
  7. Let‘s Encrypt: Cert Bot installieren, Zertifikat generieren und Renewal einrichten
  8. Einige Konfigurationsdateien anpassen
  9. Installation von Nextcloud und WordPress und Tiny Tiny RSS
  10. Einrichtung der Dienste
  11. Apps
  12. Links

1. Aus dem Internet erreichbar: Domain mit Dynamic DNS (DDNS) einrichten

Damit der Webserver überhaupt aus dem Internet erreichbar ist brauchen wir eine Domain mit DDNS Unterstützung. DDNS wird verwendet damit die Internet Adresse immer auf die aktuelle IP-Adresse des Routers zeigt. Nicht jeder DDNS Anbieter wird von Let‘s Encrypt unterstützt (zB. dynv6.net funktioniert). Ich habe eine Adresse bei strato.de gekauft und dort DDNS aktiviert. Für DDNS wird ein Client benötigt, der geänderte IP Adressen an den Anbieter übermittelt. Die FritzBox hat dafür bereits eine Funktion. Unter Dynamic DNS kann man einen Anbieter aussuchen und die entsprechenden Daten eintragen.Falls der Router sowas nicht hat, kann man auf den Raspberry einen Client installieren, der das übernimmt.

2. Raspberry einrichten: Raspian Lite installieren

Für die Installation des Betriebssystems brauchen wir eine möglichst schnelle SD-Karte. Zur Installation habe ich Raspian-Lite von der offiziellen Internetseite ausgewählt.

  • Ladet Raspian Lite von hier herunter.
  • Schreibt das Image auf die SD-Karte: Rechts Klick auf das Image → Boot fähigen USB Stick erstellen → die SD-Karte auswählen → Bestätigen (Wenn das nicht funktioniert wird ein anderes Programm benötigt)
  • SD Karten in Raspberry einlegen und diesen mit Tastatur an einen Monitor anschließen und durch anschließen der Stromversorgung starten

Ganz viel Text erscheint auf dem Display und irgendwann müsst ihr euch einloggen. Der Standard Login ist User=pi Passwort=raspberry. Achtet darauf dass die Tastatur möglicherweise auf Englisch eingestellt ist. Nun wollen wir SSH einschalten und ein paar Einstellungen anpassen sodass wir später den Raspberry von einen anderen Computer administrieren können. Gebt sudo raspi-config ein und ändert folgende Einstellungen:

  • Change User Password (wählt ein neues Passwort für den Login aus)
  • Expand Filesystem
  • Boot Options → Console Autologin
  • Advanced Options → Memory Split → 16
  • Advanced Options → SSH →enabled

Nun kann man das Menü verlassen und den Raspberry mittels sudo shutdown -h now ausschalten, von den Gerätschaften trennen und an den Bestimmungsort zB unter den Router in den Schuhschrank stellen und mit dem Netzwerk verbinden. Die restliche Arbeit erfolgt bequem vom Computer mittels SSH.

3. Portfreigaben: HTTP, HTTPs und SSH

Als nächstes müssen Portfreigaben eingerichtet werden. Dies erfolgt wieder im Internet Router. Mit der Fritzbox können wir direkt HTTP (80) und HTTPs (443) auswählen. Als Ziel muss der Raspberry ausgewählt werden. Wer außerdem von Außerhalb den Rapsberry administrieren will muss eine Portfreigabe für SSH (22) einrichten.

4. Installation aktualisieren

Am PC öffnet man jetzt einen Terminal (an einen Windows PC wird PuTTY benötigt) und gebt ssh pi@lokaleipadresse ein und gebt den vorher geänderten Passwort ein. Es erscheint die Shell des Raspberries. Alternativ müsstet ihr auch schon ssh pi@domainadresse eingeben können, weil wir bereits vorher die Domain und Portfreigaben eingerichtet haben. Gleich wird auch fail2ban installiert, damit Bruteforce Attacken für den SSH Login erschwert werden

In der Raspberry Shell führt zunächst ein System Update durch, zwischendurch Updates bestätigen: (das könnte ne Weile dauern)

sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade

Anschließend fügen wir einen neuen User www-data für den Webserver hinzu

sudo usermod -a -G www-data www-data

Die Spracheinstellungen produzieren immer einen locale Fehler den man aber ignorieren kann.

5. Pakete installieren: nginx, php, mariaDB, fail2ban und co

Wir installieren nun die benötigten Programme. Php7.0 ist nicht in den Standard Paketquellen, daher müssen wir es zuerst hinzufügen:

sudo nano /etc/apt/sources.list

Darin fügen wir am Ende folgendes hinzu und speichern mit Strg+O und beenden mit Strg+X

deb http://repozytorium.mati75.eu/raspbian jessie-backports main contrib non-free

Nun fügen wir dafür den Key hinzu, damit apt-get nicht rum meckert:

sudo gpg --keyserver pgpkeys.mit.edu --recv-key CCD91D6111A06851
sudo gpg --armor --export CCD91D6111A06851 | sudo apt-key add -

Anschließend die Paketliste aktualisieren:

sudo apt-get update

Und endlich alle Pakete installieren, dabei wird ein Passwort für mariaDB angelegt, was ihr euch merken müsst, da es später noch gebraucht wird:

sudo apt-get install nginx curl libapr1 libtool memcached varnish fail2ban php7.0-fpm php7.0-mysql php7.0-common php7.0-gd php7.0-json php7.0-cli php7.0-curl php7.0-xml php7.0-zip php7.0-mbstring php5-apcu mariadb-server mariadb-client

Falss es Probleme mit dem Paket php7.0-gd gibt, musst du zuerst eine neuere Version von libgd3 und libwebp5 über die Jessie Backports installieren:

sudo apt-get -t jessie-backports install libgd3 libwebp5

Danach solltest du php7.0-gd in folgender Weise installieren können:

sudo apt-get install php7.0-gd

Nach der Installation mariaDB absichern:

sudo mysql_secure_installation

Dort dann die Fragen mit n,y,n,y,y beantworten.

6. Datenbanken für die Dienste anlegen

Nun erstellen wir die Datenbanken für unsere Webdienste. Dafür wechseln wir in die MySQL Shell. Benutzt für den Login das Passwort was ihr vorher für MariaDB festgelegt habt. Ersetzt die SecurePasswords jeweils durch ein richtig sicheres Passwort und merkt sie euch, denn wir brauchen sie später wieder wenn alles installiert ist.

sudo mysql -u root -p

und geben folgendes ein:

CREATE DATABASE nextcloud;
CREATE DATABASE wordpress;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'SecureNextcloudPassword';
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'SecureWordpressPassword';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'localhost';
FLUSH PRIVILEGES;
exit
7. Let‘s Encrypt: Cert Bot installieren, Zertifikat generieren und Renewal einrichten

Nun installieren wir den Certbot von Let‘s Encrypt um die Verbindung zu unserem Raspberry abzusichern. Die Anleitung finden man auch hier. Ich werde den Certbot in einen Ordner unter /etc/ installieren und in das Verzeichnis wechseln:

sudo mkdir /etc/certbot && cd /etc/certbot

Nun ladet den Script herunter und macht es ausführbar:

sudo wget https://dl.eff.org/certbot-auto
sudo chmod a+x certbot-auto

Bevor wir ein Zertifikat erstellen können müssen wir die nginx conf anpassen:

sudo nano /etc/nginx/sites-available/default

Dort ändern wir root zu dem Pfad den wir haben wollen. Ich wähle für diese Anleitung root /var/www/; server_name muss auch zu server_name deineDomain.de; geändert werden. Anschließend Speichern schließen, Änderungen anwenden:

sudo service nginx reload

Jetzt fordern wir ein Zertifikat über webroot an. Das bedeutet dass der Webserver nginx dafür nicht abgeschaltet werden muss. Ersetzt deineDomain.de mit eurer Domain. Nimmt unbedingt eure Domain einmal mit www und einmal ohne, sonst kann es später Probleme mit der Gültigkeit geben! Ihr werdet nach einer E-Mail Adresse gefragt, womit Let‘s Encrypt euch kontaktieren kann.

/etc/certbot/certbot-auto certonly --webroot -w /var/www/ -d deineDomain.de -d www.deineDomain.de

Dabei werden wieder eine Menge neuer Pakete installiert. (es werden auch Python Pakete installiert, was dauern kann) Die Zertifikatsdateien werden unter /etc/letsencrypt/live/deineDomain.de/ gespeichert. Das sollte auch auf der Konsole ausgegeben werden.

Testet nun die automatische Erneuerung. Die Zertifakte gelten immer nur 90 Tage, deswegen ist die automatische Erneuerung per Cronjob Pflicht. Zum testen führt folgendes aus

/etc/certbot/certbot-auto renew --dry-run

Wenn es geklappt hat legen wir einen Cronjob an der 2 mal am Tag überprüft ob eine Erneuerung notwending ist. Das scheint sehr oft, wird aber so vorgeschlagen.

crontab -e

Anschließend werden wir nach einen Editor gefragt, ich nehme nano. Daraufhin öffnet sich der Editor und fügen am Ende in einer neuen Zeile folgendes hinzu. Wichtig: Ersetzt das X durch eine Zahl zwischen 0 und 59, sodass die Erneuerung zu einer zufälligen Minute passiert.

X */12 * * * /etc/certbot/certbot-auto renew --quiet --no-self-upgrade
8. Einige Konfigurationsdateien anpassen

Wir müssen unbedingt die nginx Konfigurationen anpassen um sie sicherer zu machen. Ich habe die Konfigurationen für WordPress und Nextcloud in eigene Dateien gepackt, damit alles übersichtlicher wird. Die entsprechenden Inhalte zeige ich in separate Text Dateien, da sonst die Anleitung noch viel länger wird.

Ich habe versucht die Verbindung möglichst sicher einzustellen. Es ist nicht perfekt aber mit diesen Konfigurationsdateien erhält die Website relativ gute Bewertungen bei Sicherheitstests. Ich habe diese Seite für den Nextcloud Teil und diese Seite für den WordPress Teil zu Hilfe genommen.

Also wir sichern zuerst die nginx default config:

sudo mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default_old

Dann legen wir eine neue config an und fügen diesen Inhalt ein. Ändert die Serveradresse und Pfade zu den Keys entsprechend.

sudo nano /etc/nginx/sites-available/default

Wir erstellen einen neuen Ordner für die folgenden conf Dateien: (oder wählt einen anderen Namen)

sudo mkdir /etc/nginx/global

Datei wordpress.conf erstellen und mit diesen Inhalt füllen

sudo nano /etc/nginx/global/wordpress.conf

Dann noch nextcloud.conf erstellen und mit diesen Inhalt füllen

sudo nano /etc/nginx/global/nextcloud.conf

Die PHP Konfigurationen müssen auch an einigen Stellen angepasst werden:

sudo nano /etc/php/7.0/fpm/php.ini

Dort suchen wir mit STRG+W nach folgenden Zeilen:

upload_max_filesize = 2M
post_max_size = 8M
;cgi.fix_pathinfo=1

und ersetzen diese Zeilen jeweils mit (beim letzten wird nur das Semikolon entfernt):

upload_max_filesize = 2G
post_max_size = 2G
cgi.fix_pathinfo=1

Wir öffnen die www.conf:

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

und ändern

 listen = /run/php/php7.0-fpm.sock 

zu:

listen = 127.0.0.1:9000

Wir suchen außerdem die folgenden Zeilen und entfernen jeweils das Semikolon am Anfang:

;env[HOSTNAME] = $HOSTNAME
;env[PATH] = /usr/local/bin:/usr/bin:/bin
;env[TMP] = /tmp
;env[TMPDIR] = /tmp
;env[TEMP] = /tmp

Noch die Swapsize erhöhen:

sudo nano /etc/dphys-swapfile

und ersetzt

CONF_SWAPSIZE=100 

mit:

CONF_SWAPSIZE=512

Jetzt neustarten damit die Änderungen angewendet werden. Danach müsst ihr euch erneut über SSH anmelden.

sudo reboot
9. Installation von Nextcloud und WordPress

Wir laden jetzt Nextcloud herunter und entpacken es in das Verzeichnis /var/www/nextcloud/. Falls es eine neuere Version als 10.0.0 gibt ändert die Angaben entsprechend.

cd /var/www
sudo wget https://download.nextcloud.com/server/releases/nextcloud-10.0.0.zip
sudo unzip nextcloud-10.0.0.zip
sudo rm nextcloud-10.0.0.zip

Nun WordPress herunterladen und in /var/www/ entpacken

sudo wget https://de.wordpress.org/latest-de_DE.zip
sudo unzip latest-de_DE.zip
sudo mv wordpress/* ./
sudo rm latest-de_DE.zip
sudo rm -R wordpress/

Noch die Schreibrechte anpassen:

sudo chown -R www-data:www-data /var/www
10. Einrichtung der Dienste

Wir müssen noch die Websiten aufrufen um die Ersten Konfiguarionen vorzunehmen. Dazu werden wir die Seiten über den Internet Browser aufrufen. Wir geben jeweils die Datenbank Namen/User und Passwörter an, die wir vorher unter Punkt 6 festgelegt haben.

Nextcloud: Im Browser www.deinedomain.de/nextcloud aufrufen.

Legt ein Benutzerkonto an und wählt ein Datenverzeichnis. Ich habe einen USB Stick unter /media/pi/usbstick gemounted und wähle es daher aus. Der Default Wert kann aber auch beibehalten werden. Datenbank Benutzer und Name sind beide nextcloud und das Passwort wurde vorher festgelegt. Klickt auf Abschließen damit ihr zu ersten mal zur Dateiansicht kommt! Bei wurde nach etwas Warten ein Gateway Timeout angezeigt, aber einfach Neuladen hat geholfen. Im Admin Bereich von Nextcloud können wir dann Cron von Ajax auf Cron (systemeigen) wechseln. Dort wird auch ein PHP Memory Cache Fehler angezeigt. Um diesen zu lösen geben wir folgendes auf dem Raspberry ein:

sudo apt-get install php5-apcu

Das php5 stimmt so bereits. Anschließend muss ein neuer Eintrag in der Config hinzugefügt werden:


sudo nano /var/www/nextcloud/config/config.php

Und dort folgendes vor der letzten Zeile hinzufügen:

'memcache.local' => '\OC\Memcache\APCu',

Ladet die Webseite neu. Falls ein Fehler angezeigt wird, entfernt einfach die memcache.local Zeile wieder aus der config.php. Wir erstellen auch direkt den Cronjob für Nextcloud:

sudo crontab -u www-data -e

Nachdem wieder ein Editor gewählt wird folgendes in neuen Zeilen hinzufügen:

*/15 * * * * php -f /var/www/nextcloud/cron.php

WordPress: Im Browser www.deinedomain.de aufrufen!

Ihr müsst nur den Datenbank Benutzername auf wordpress ändern und euer Passwort eingeben. Der Rest bleibt so. Anschließend erstellt ihr ein Benutzer für euren Blog und schon ist die Installation fertig! Zum Schluss anmelden und ihr landet direkt im Adminbereich.

Und das wars! Der Raspberry ist fertig konfiguriert und läuft dank php7 recht flott. Für einen weiteren Geschwindigkeitsschub kann man im raspi-config Menü eine Übertaktungsrate auswählen. Natürlich nur wenn man den Raspberry mit Kühlern/Lüfter ausstattet.

11. Apps für Nextcloud

Für die automatische Synchronisation euer Daten mit der Nextcloud könnt ihr am PC einen passenden Client auswählen. Windows und Mac Clients gibt es hier. Für Linux bietet Nextcloud nur den Source an, man kann jedoch auch die Owncloud Clients von hier verwenden.

Für IOS und Android gibt es auch Apps von Nextcloud. (Für Android auch im F-Droid Store). Dazu kann man wenn man die Kontakte und Kalender Apps in Nextcloud installiert hat mittels DavDroid diese auch auf Android synchronisieren.

12. Links