Skip to content

raspberry pi

Marcel Waldvogel edited this page Sep 29, 2018 · 56 revisions

Dein eigener autonomer und föderierter Server für Dokumente, Kalender und Kommunikation

🇬🇧 This article is also available in English

Auch bekannt als: Aufsetzen von Nextcloud+JSXC+ejabberd auf dem Raspberry Pi

…oder einem anderen Rechner mit Debian Stretch oder Ubuntu 18.04 LTS (bionic). Für sonstige Setups gibt es die allgemeine Installationsanweisung.

⚠️ Wenn Sie eine ältere Distribution verwenden, installieren Sie bitte statt der ejabberd-Version aus der Distribution die neueste ejabberd-Version von Hand.

Erste Schritte

⚠️ Die einzelnen Schritte, die zur Konfiguration des Geräts beitragen, sind mit einem Schraubenschlüssel (🔧) gekennzeichnet.

🔧 Auf dem Router:

  • Dem Raspberry Pi eine (interne) fixe Adresse zuweisen
  • Ports 80, 443, 5222, 5223, 5269 und 7777 vom Router auf den Raspberry Pi weiterleiten
  • DynDNS-Provider aktivieren (bei dynamischer IP-Adresse)
  • Wenn möglich zusätzliche DNS-Einträge dafür aktivieren. Auch ohne diese ist Text- und Videochat 1:1 möglich; Einschränkungen existieren bei:
    • Gruppenchats: Sind nur zwischen den lokalen Nutzern möglich; Mitglieder aus der Föderation können nicht teilnehmen.
    • Auf XMPP aufbauende soziale Netzwerkfunktionen wie sie z.B. von Movim zur Verfügung gestellet werden, können nicht genutzt werden (die Chatfunktionen von Movim sind davon nicht betroffen).

🔧 Auf dem Raspberry Pi (oder einem sonstigen Rechner):

  • Raspbian Stretch installieren.
  • Optional: Grössere externe Platte anhängen und in /var/www/nextcloud/data einbinden

📢 In allen folgenden Texten soll das gross geschriebene SERVERNAME durch den beim DynDNS-Provider registrierten Servernamen ersetzt werden.

Installieren der Software

🔧 Wenn du ssh noch nicht aktiviert hast, dann nutze bitte raspi-config um es zu aktivieren

🔧 Login mit ssh aus einem Terminalfenster (oder auf Windows: putty)

  • Username: "pi"
  • Passwort: "raspberry"

🔧 Solltest du es noch nicht gemacht haben ändere dein Passwort (passwd), bevor jemand anders die Kontrolle über das Gerät übernimmt

🔧 Die folgenden Tätigkeiten als Superuser ausführen: sudo -s

🔧 Softwarepakete installieren (Apache+PHP, Let's Encrypt/CertBot, ejabberd und git)

apt update && apt upgrade
apt install dirmngr apt-transport-https
echo deb http://http.debian.net/debian stretch-backports main > /etc/apt/sources.list.d/backports.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553
echo deb https://dl.jsxc.org stable main > /etc/apt/sources.list.d/jsxc.list
wget -qO - https://dl.jsxc.org/archive.key | apt-key add -
apt update
apt install -t stretch-backports ejabberd
apt install apache2 libapache2-mod-php php-gd php-json php-sqlite3 php-curl php-mbstring php-intl php-imagick php-xml php-zip
apt install python-certbot-apache xcauth python3-bsddb3 python3-systemd

⚠️ Bei Problemen mit den PHP-Modulen hilft die Nextcloud-Installationsanleitung weiter

🔧 Automatische Sicherheitsupdates aktivieren: apt install unattended-upgrades

🔧 Download und Auspacken von Nextcloud:

cd /var/www
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
tar xfj latest.tar.bz2
chown -R www-data:www-data nextcloud
rm latest.tar.bz2

Konfiguration von Apache inklusive HTTPS

🔧 Diesen Inhalt in /etc/apache2/sites-available/000-default.conf kopieren (angepasst aus der Nextcloud-Admin-Doku):

<VirtualHost *:80>
  ServerName SERVERNAME

  DocumentRoot /var/www/nextcloud
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  ProxyPass /http-bind/ http://localhost:5280/http-bind/
  ProxyPassReverse /http-bind/ http://localhost:5280/http-bind/
  ProxyPreserveHost On
</VirtualHost>

<Directory /var/www/nextcloud/>
  Options +FollowSymlinks
  AllowOverride All

 <IfModule mod_dav.c>
  Dav off
 </IfModule>

 SetEnv HOME /var/www/nextcloud
 SetEnv HTTP_HOME /var/www/nextcloud
</Directory>

🔧 Diesen Inhalt in /etc/apache2/sites-available/userdata.conf kopieren:

<VirtualHost *:80>
  ServerName userdata.SERVERNAME
  # Mostly to satisfy certbot
  ServerAlias conference.SERVERNAME pubsub.SERVERNAME
  # This DocumentRoot is irrelevant, but match ejabberd.conf anyway
  DocumentRoot /var/www/userdata
  ErrorLog ${APACHE_LOG_DIR}/userdata_error.log
  CustomLog ${APACHE_LOG_DIR}/userdata_access.log combined
  ProxyPass / http://localhost:5288/
  ProxyPassReverse / http://localhost:5288/
  ProxyPreserveHost On
</VirtualHost>

🔧 Die Konfiguration fertigstellen:

mkdir --mode=660 /var/www/userdata
chown ejabberd:ejabberd /var/www/userdata
a2enmod headers env dir mime proxy proxy_http
a2ensite userdata

🔧 HTTPS-Verschlüsselung (und Zertifikatserneuerung) aktivieren:

(wenn die zusätzlichen DNS-Einträge nicht gemacht wurden, dann lautet certbot-Zeile stattdessen certbot run --authenticator standalone --installer apache --redirect --uir --hsts --staple-ocsp -d $S)

S=SERVERNAME
apache2ctl stop
certbot run --authenticator standalone --installer apache --redirect --uir --hsts --staple-ocsp -d $S -d userdata.$S -d conference.$S -d pubsub.$S
chgrp -R ssl-cert /etc/letsencrypt/{archive,live}
chmod -R g+rX /etc/letsencrypt/{archive,live}
apache2ctl start

Nextcloud konfigurieren

🔧 Mit dem Webbrowser auf den Hostnamen verbinden und Nextcloud konfigurieren (sqlite als Datenbank nutzen; kann später jederzeit geändert werden) und die JSXC-App (JavaScript XMPP Client in social) installieren.

🔧 (Mindestens) zwei Benutzer anlegen.

⚠️ Diese Nutzernamen sollten nur aus ASCII-Kleinbuchstaben (az), Ziffern (09) oder dem Bindestrich (-) bestehen. Vermeide insbesondere Leereichen und das @.

🔧 Beide Benutzer in eine Gruppe geben (z.B. 'Vorreiter').

👀 Ausprobieren: Internen Chat

Zwei User anmelden und Nachrichten schicken bzw. Videochat starten.

Dazu am besten zwei verschiedene Rechner verwenden (später notwendig zum Test von Videochat). Textnachrichten können auch ausgetauscht werden zwischen zwei unterschiedlichen Browsern (z.B. Firefox und Chrome oder zwischen verschiedenen Containern im selben Browser).

😢 Geschlossenes System: Nur innerhalb von Nextcloud, funktioniert nicht zwischen verschiedenen Servern (Instanzen).

Föderierten Chat aktivieren

🔧 NextcloudEinstellungenJavaScript XMPP Client: Managed Chat aktivieren

👀 Ausprobieren: Föderierten Chat

Zwischen zwei Nextcloud/JSXC-Instanzen chatten (Text und/oder Videochat). Z.B. zwischen user1@SERVERNAME.jsxc.ch und user2@ANDERER-SERVERNAME.jsxc.ch (:warning: JSXC-Domains für Nutzer, die den Managed Server benutzen!)

👀 Ausprobieren: Föderiertes File Sharing

📌 Die Anweisungen in diesem Kapitel können übersprungen werden, wenn kein anderer User mit Nextcloud+JSXC+XMPP verfügbar ist. Lesen des Kapitels reicht, um die Motivation für das nächste Kapitel zu kennen.

Zwischen zwei Nextcloud/JSXC-Usern Dateien/Verzeichnisse teilen. Z.B. zwischen user1@SERVERNAME und user2@ANDERER-SERVERNAME

😢 Kein einheitlicher Domainname, da Server unter unterschiedlichem Management; Chatverkehr geht über "fremden" Server (welcher auf jsxc.ch endet)

Eigenen XMPP-Server auf dem Raspberry Pi unter der eigenen Domain aufsetzen

Dieses Setup ergibt einen XMPP-Server mit 100% Kompatibilität in der Conversations Compliance Chart.

🔧 /etc/ejabberd/ejabberd.yml mit dem Inhalt der Beispieldatei /etc/ejabberd/ejabberd.yml-xcauth-example füllen und SERVERNAME wie üblich ersetzen.

🔧 (Zu einem späteren Zeitpunkt willst du vielleicht loglevel (weniger Output mit 3) und acladminuser (die Liste derer, welche administrative Kommandos versenden dürfen) anpassen.)

🔧 Passe /etc/xcauth.conf so an, dass url (API URL) und secret (Secure API token) den Werten aus deiner Nextcloud entsprechen. Diese erhältst du wie folgt:)

Als Nextcloud-Administrator navigierst du im Browser zu Nextcloud→Settings→Administration→JavaScript XMPP Client und setzt den Server type auf External. Weiter unten auf der Seite siehst du dann API URL und Secure API token. Stelle unbedingt sicher, dass das Secure API token nict in falsche Hände fällt. Wer es kennt, kann dem XMPP-Server jeden beliebigen Nutzer vorgaukeln.

🔧 Aktiviere (d.h. lösche das führende #) der Zeile ejabberdctl=/usr/sbin/xcejabberdctl in /etc/xcauth.conf um die automatische Pflege der Shared Roster Groups zu aktivieren. Als Ergebnis sieht jeder Nextcloud-User alle anderen Mitglieder seiner Gruppen im Roster und darf auch deren Präsenzstatus sehen.

🔧 Danach führe folgende Kommandi aus:

chown -R xcauth:xcauth /etc/xcauth.conf /var/{lib,log}/xcauth
chmod 640 /etc/xcauth.conf
xcrestart
adduser ejabberd ssl-cert
openssl dhparam -out /etc/ejabberd/dhparams.pem 2048

Das openssl dhparam-Kommando kann auf einem Raspberry Pi auch über ein halbe Stunde dauern. Wem das zu lange ist, kann /etc/ejabberd/dhparams.pem auch auf einem schnelleren Rechner generieren oder zur Not auf /etc/ejabberd/dhparams.pem-xcauth-example zurückgreifen.

🔧 Weiter geht es hier:

service ejabberd restart

🔧 Jetzt in den Nextcloud-JSXC-Einstellungen noch folgendes ändern:

⚠️ Ignoriere "BOSH server unreachable"-Fehler bis du sowohl XMPP Domain als auch BOSH URL angepasst hast.

  • Sever type: "Externer Server" (wenn nicht schon so eingestellt)
  • XMPP-Domain: Trage hier dein DynDNS Namen (SERVERNAME) ein
  • BOSH-URL: Auf https://SERVERNAMEN/http-bind/ ändern
  • External Services: Löschen, dafür userdata.SERVERNAME Der Rest ist von der Nutzung mit dem Managed Server schon richtig gesetzt.
  • ‼️Einstellungen speichern‼️ (ganz unten)

😢 Für Videochat ist ein STUN-, besser TURN-Server notwendig, der zwischen Nutzern hinter NAT vermittelt. Der lässt sich aber nicht einfach hinter einer dynamischen IP-Adresse aufsetzen. Deshalb bleibt der auf turn.jsxc.ch gesetzt.

👀 Ausprobieren: Chat mit der eigenen Domain

Jetzt heissen die User user1@SERVERNAME, sowohl für XMPP als auch für Nextcloud. Jetzt fehlen nur noch die Mailadressen…

Anwendungen

😎 Den eigenen Server geniessen!

Referenzen

Dieses How-To basiert unter Anderem auf folgenden Informationen: