IPFS Cluster installieren – Dezentralisierter Speicher via IPFS

Ich habe schon eine Anleitung erstellt, wie du einen IPFS Speicher installieren kannst und Daten über das Netzwerk zur Verfügung stellen kannst.
Damals haben wir als Beispiel die Verwendung von Videos für D.Tube genutzt.

Mit dieser „Schnellstart-Anleitung“, erstellen wir uns ein IPFS-Cluster.
Das hat den Vorteil, das wir unsere Daten auf mehrere Systeme auslagern können.
Das ganze passiert am Ende voll automatisch.
Somit können wir unsere Daten von mehr als nur einem System herunterladen und wenn ein System ausfällt, bleiben X andere noch übrig.
Ganz nebenbei sind auch wir weiterhin der Herr über die Daten auf unseren Systemen, denn das Cluster speichert nur, was wir ihm zum Speichern geben.
Fremddaten werden nicht heruntergeladen.

Diese Anleitung basiert auf Linux, kann jedoch auch unter anderen Systemen nachgemacht werden.

Wir starten hier komplett von vorne, das auch Neueinsteiger ein funktionierendes Cluster haben.

Die Voraussetzungen:
– Mehrere Systeme (Egal ob Linux, Windows, Mac, Android, …)
– Root-Zugang
– Netzwerkanbindung
– Minimum 3GB Festplattenspeicher

Los gehts!

1. Alles aktualiseren

Als erstes schalten wir uns auf unserem Linux-Server auf und aktualisieren diesen einmal.

apt update && apt upgrade -y

Ist dies gemacht, installieren wir noch ein paar schlaue Tools:

apt install iftop htop nano screen -y

Die Installation ist freiwillig, ich empfehle aber die Tools gerne!

2. IPFS installieren

Damit wir ein Cluster betreiben können, brauchen wir ein IPFS-Node.
Daher müssen wir go-ipfs installieren.

Rufe die Webseite von IPFS auf und kopiere den aktuellen Link für deinen passenden Download.

wget https://dist.ipfs.io/go-ipfs/v0.7.0/go-ipfs_v0.7.0_linux-amd64.tar.gz

Wir entpacken das archiv:

tar -xvzf go-ipfs_v0.7.0_linux-amd64.tar.gz

Wir wechseln in den Ordner:

cd go-ipfs

Nun müssen wir IPFS „installieren“. Dazu führen wir das Installations-Script aus:

./install.sh

Das Script verschiebt einfach nur die Anwendung nach /usr/local/bin.

Jetzt müssen wir nur noch den Daemon initialisieren:

ipfs init --profile server

Wir bekommen anschließend die Identität des Nodes angezeigt und einen Hash-Wert.

Damit unser System nicht voll läuft, begrenzen wir IPFS direkt noch.
Dazu rufen wir die Konfiguration auf und ändern den Speicherwert.

nano /home/DEIN-NUTZERNAME/.ipfs/config

Suche nach „StorageMax“. Du wirst den Wert in Zeile 7 finden.
Ändere den GB-Wert einfach ab.
Hier kannst du bestimmen, wie viel Speicherplatz der Node auf dem System nutzen darf.
Solltest du deinen Systemspeicher für die Daten verwenden, achte darauf, das immer genügend Speicherplatz für das System selbst übrig ist.
Mit STRG + X und Y mit Enter kannst du die Änderungen speichern!

Super. Das wäre getan.

Wir können das ganze mal in einem Screen starten, um zu sehen, ob alles sauber funktioniert.

cd /usr/local/bin
screen -S IpfsNode ./ipfs daemon

Es sollte alles ohne Probleme starten und „Daemon is ready“ zu lesen sein.

Wiederhole nun diesen Installationsschritt auf allen anderen Systemen, die du ins Cluster mit aufnehmen möchtest!

=> Ein Script für den Autostart gibts am Ende der Anleitung.

3. Das Cluster installieren

Jetzt ist es an er Zeit, das Cluster zu installieren.

Dafür laden wir ipfs-cluster-serivce und ipfs-cluster-cli auf alle Systeme unseres Clusters herunter.

wget https://dist.ipfs.io/ipfs-cluster-ctl/v0.13.1/ipfs-cluster-ctl_v0.13.1_linux-amd64.tar.gz
wget https://dist.ipfs.io/ipfs-cluster-service/v0.13.1/ipfs-cluster-service_v0.13.1_linux-amd64.tar.gz

Die beiden Archive müssen entpackt werden.

tar -xvzf ipfs-cluster-ctl_v0.13.1_linux-amd64.tar.gz
tar -xvzf ipfs-cluster-service_v0.13.1_linux-amd64.tar.gz

Fast selbes Installationsprinzip wie beim IPFS-Node, nur müssen wir hier die Anwendung von Hand verschieben.

cd ipfs-cluster-ctl
mv ipfs-cluster-ctl /usr/local/bin
cd ..
cd ipfs-cluster-service
mv ipfs-cluster-service /usr/local/bin

Super!
Nun müssen wir einen Cluster-Master bestimmen.
Wähle also dein erstes System aus und merke dir das!
Dieser wird am Ende die Daten Verteilen und die anderen Nodes im Cluster aktuell halten.
Es ist auch empfehlenswert, das System mit meisten Speicherkapazitäten zu verwenden.
Über den Master werden wir unser Cluster erstellen und notwendige Keys generieren.

Wir müssen nun den Cluster initialisieren.

ipfs-cluster-service init --consensus crdt

Gut, führe nun alle Schritte wieder auf allen anderen Systemen durch. Dadurch werden Standardkonfigurationen und Speicherorte angelegt.
Ist das gemacht, kann es weiter gehen.

Wir müssen nun den Secret-Hash des Masters, auf den anderen Systemen nun eintragen. Dieser MUSS in unserem Cluster überall gleich sein.
Durch die Initialisierung hat jedes System sein eigenen Hash bekommen.
Öffne also die Service.json auf dem Master-Node.

nano /home/DEIN-NUTZERNAME/.ipfs-cluster/service.json

Kopiere den SECRET-Hash heraus.
Öffne nun die service.json-Datei auf allen anderen Cluster-Nodes und ersetze den dortigen Key mit dem, des Masters.

Nun müssen wir das Cluster noch absichern, so dass nur wir bestimmen, welche Daten gehostet werden.
Andere können dem Cluster zwar beitreten, sie können aber keine Daten hochladen, die von unseren Nodes gehostet werden.
In der Standardkonfiguration hören die Peers auf alles und jeden. Das ist nicht sehr gut.
Wir fügen daher die Peers bei „Trusted Peers“ hinzu, bei denen wir volle Kontrolle haben, oder denen wir voll und ganz vertrauen.
=> Über jeden „vertrauten Peer“, lassen sich Daten in das Cluster laden!

Öffne dazu auf jedem Peer die identiy.json-Datei.

nano /home/DEIN-NUTZERNAME/.ipfs-cluster/identity.json

Kopiere hier die „id“ heraus.

{
    "id": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "private_key": "SuperGeheimerKey.GebeDiesenNiemandenPreis!"
}

Gehe nun wieder zurück in die service.json-Datei jedes einzelnen Nodes.

nano /home/DEIN-NUTZERNAME/.ipfs-cluster/service.json

Füge nun bei „trusted_peers“ alle IDs deiner Peers ein.

...
"trusted_peers": [
        "AAAAAAAAAAAAA", "BBBBBBBBBBBBBB", "CCCCCCCCCCCCCC", "DDDDDDDDDDDDDDDDDDD"
      ]
...

Die Liste der Trusted Peers kann im Nachgang noch erweitert werden, setzt aber einen Neustart und Konfigurationsabgleich aller bisherigen Peers vorraus.
Hier muss auch der lokale Peer eingetragen werden. Es müssen also ALLE IDs der Peers in der Datei stehen.

Weitere freiwillige Anpassungen können nun in der service.json noch gemacht werden.
Gebe z.B. deinem Peer einen eindeutigen Namen, damit die Auffindung ggf. etwas leichter fällt.

"peername": "Peer1-Master",

Ändere z.B. den Cluster-Namen ab. Hier kannst du ein beliebigen Namen angeben.

"cluster_name": "Mein-Cluster-Name",

Gleiche nun deine Konfiguration mit allen anderen Peers ab.
Lediglich der peername muss unterschiedlich sein.
Ist die Config nicht gleich, wird der Node dem Cluster nicht beitreten können.

Gut!
Nun starten wir den ersten Cluster-Service. Also den, des Masters.
Für den ersten Anlauf nutzen wir auch hier Screen, damit wir Fehler direkt sehen und die Anwendung für Testzwecke erst einmal laufen kann.

cd /usr/local/bin
screen -S IpfsCluser-Host ./ipfs-cluster-service daemon

Wir bekommen nun im Log die Adressen angezeigt, unter der der Master erreichbar ist.
Kopiere diese mal in die Zwischenablage.
Diese sieht in etwa so aus:

/ip4/192.168.178.16/tcp/9096/p2p/Deine-ID-Des-Nodes-Des-Clusters

Über die angegebene IP ist der Master-Node erreichbar. Diese Info müssenw wir an unsere Nodes des Clusters nun übermitteln.
Als nächstes starten wir die anderen Peers des Clusters. Diese erhalten aber den Zusatzparameter mit dazu, damit sie den Master direkt kennen und auf ihn hören.
Wir setzen dem Node also einen Rucksack (Bootstrap) mit allen notwendigen Infos auf.

cd /usr/local/bin
screen -S IpfsCluser-Node ./ipfs-cluster-service daemon --bootstrap /ip4/192.168.178.16/tcp/9096/p2p/Deine-ID-Des-Nodes-Des-Clusters

Der IPFS Cluster Peer sollte nun Kontakt mit dem Master aufbauen.
Im Log solltest du erkennen können, das er erfolgreich eine Verbindung zum Cluster mit der IP hergestellt hat. Das gleiche auf der Master-Seite. Dort sollten wir erkennen können, das ein Node sich dem Cluster angeschlossen hat.

Wir sind fertig!
Das Cluster lebt!
Wir sehen nun auch im Log des Masters, das sich die Peers mittlerweile gemeldet haben sollten. Wir sollten daher pro Peer folgenden Eintrag sehen:

DATUM:UHRZEIT:GMT-ZEIT INFO cluster Peer added PeerID

4. Cluster testen

Nun können wir eine Beispieldatei hochladen.
Gehe dazu in einen Ordner mit einer Wunschdatei und lade diese hoch.

ipfs-cluster-ctl add DATEINAME

Der Master synchronisiert nach dem Abschicken des Befehls nun die Datei auf alle anderen Peers.
Im Output der Peers sollten wir erkennen, das ein neuer PIN hinzugefügt wurde mit dem aktuellen Hash.

Um die Datei nun dauerhaft zu speichern (Pinning), schicken wir noch folgenden Befehl hinterher:

ipfs-cluster-ctl pin add HASHWERT-DER-DATEI

Wir sollten als Ausgabe eine Liste aller Peers erhalten, die nun die Datei angepinnt haben und der Uhrzeit.

Mit dem Befehl

ipfs-cluster-ctl pin ls

können wir überprüfen, wo die Datei gerade überall vorhanden ist und welche Hashes wir vorhalten.
Es sollte [everywhere] als Ergebnis raus kommen.

Wenn du nun die Datei z.B. via Webbrowser öffnest, sollte er von Minimum 2 Cluster-Peers die Datei beziehen können.
Also folgende URL einfach aufrufen:

https://ipfs.io/ipfs/Dein-Hash-Wert-Der-Datei

5. Firewall erlauben

Damit auch alles durch deine Firewall geht, habe ich hier die notwendigsten Ports aufgelistet und wie mit ihnen umgegangen werden soll.
4001/TCP – Schwarm-Port. Zum erkunden neuer Schwarm-Mitglieder. Kann freigegeben werden, muss aber nicht.
5001/TCP – API für IPFS. Sollte nicht freigegeben werden. Zugriff nur vom lokalen System erlauben!
9094/TCP – HTTP API für IPFS. Sollte nicht freigegeben werden. Freigabe nur empfohlen, wenn SSL und eine Basis-Authentifizierung aktiviert ist.
9095/TCP – IPFS Proxy Endpoint. Sollte nicht freigegeben werden!
9096/TCP – Sollte freigegeben werden, wenn Nodes außerhalb deines Netzwerkes stehen. Darüber halten die Nodes ihre Verbindung. Laut Dokumentation kann das Cluster-Secret hier als eine Art Passwort das ganze Sicher machen.
Also geben wir mal den Cluster-Port frei, damit die anderen Nodes die Verbindung herstellen können.

ufw allow 9096/any comment 'IPFS-Cluster'

Mehr Ports benötigen wir nicht. Alle anderen würden ein Sicherheitsrisiko darstellen, soweit du den Cluster nicht mit Kennwörtern und HTTPS abgesichert hast.

Damit sind wir auch durch!
Viel Spaß mit deinem IPFS-Cluster!


Service-Daten für Autostart:

WICHTIG: Trage bei User und Group jeweils den Nutzernamen ein, unter dem ipfs ausgeführt werden soll!
Die Startdateien müssen hier abgelegt werden:

cd /etc/systemd/system

Lege pro Dienst einen Service an. Den Namen kannst du frei bestimmen.

nano ipfs-name.service

Go-IPFS

[Unit]
Description=ipfs daemon

[Service]
ExecStart=/usr/local/bin/ipfs daemon
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

IPFS-Cluster-Master

[Unit]
Description=ipfs cluster daemon

[Service]
ExecStart=/usr/local/bin/ipfs-cluster-service daemon
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

IPFS-Cluster-Nodes

[Unit]
Description=ipfs cluster daemon

[Service]
ExecStart=/bin/ipfs-cluster-service daemon --bootstrap /ip4/192.168.178.16/tcp/9096/p2p/Dein-Hash-Wert-Des-Masters
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target

Nun müssen wir den Dienst nur noch aktivieren.

systemctl enable ipfs-name.service

Absofort kannst du IPFS über das Terminal per Dienst starten, stoppen, neustarten und nach dem Status sehen.

systemctl start ipfs-name.service

Pimp-My-Cluster

Um die beste Leistung zu erzielen, können wir unser Cluster noch etwas „tunen“.
Die Anpassungen sind freiwillig und sollten mit Bedacht gesetzt werden.

Swarm-Erkennung für das private Heimnetz

Wir haben dem ipfs-Dienst gesagt, er soll das Profil „Server“ nutzen. Dies hat den Vorteil, dass der IPFS-Daemon nicht andauernd nach neuen Mitgliedern in privaten Netzwerken sucht.
Das ist vorallem dann unnötig, wenn wir den Server in einem Rechenzentrum haben und dieser mit einer öffentlichen IP-Adresse ausgestattet ist. Da muss er nach keinen neuen Mitgliedern mit privaten IP-Adressen suchen.
Wenn du dies auf Servern in Rechenzentren aktivierst, kann es vorkommen, das dein Anbieter dein Server sperrt, oder du unangenehme Mails bekommst, da dein Server Scanns auf privaten Adressen ausführt. Dies finden die Anbieter zum Teil nicht so „geil“.
Du sparst auch einiges an Bandbreite dadurch ein.
Wenn du dennoch möchtest, das IPFS nach neuen Peers im Privaten Netzwerk sucht, passe die config von ipfs wie folgt an.

nano /home/DEIN-NUTZERNAME/.ipfs/config

Suche nach „NoAnnounce“: [],.
Du wirst eine Liste mit lokalen IP-Adressen vorfinden, die eben NICHT abgefragt werden.
Entferne hier einfach den Eintrag DEINES Heimnetzes. Also z.B. „/ip4/192.0.0.0/ipcidr/24“,.
Das gleiche Spiel dann auch für IPv6.
Du kannst auch alles entfernen, dann Scann IPFS eben Netzwerke ab, die es gar nicht gibt.

Suche dann noch nach „Discovery“ und finde den Wert „Enabled“.
Setze ihn von false auf true.

"Enabled": true,

Suche dann nach „AddrFilters“ und entferne auch dort dein Netzwerk.
Suche dann noch nach „DisableNatPortMap“ und setze den Wert von true auf false.

"DisableNatPortMap": false,

Absofort surcht IPFS neue Swarm-Mitglieder in deinem Netzwerk.

Speicherort für Daten ändern

Falls du den Speicherort für die Daten ändern möchtest, gibt es zwei Wege dies zu tun.
Stoppe in beiden Fällen zuerst IPFS, bevor zu Anpassungen machst!
Achte auch in beiden Varianten darauf, das die passenden Rechte für die Daten vorliegen. Alle Daten müssen von dem User editiert werden dürfen, mit dem IPFS läuft.

Weg 1:
Verschiebe den „blocks“-Ordner im Ornder .ipfs an einen geeigneteren Ort und erstelle einen Hartlink dort hin.

# mv /home/DEIN-NUTZERNAME/.ipfs/blocks /Pfad/zu/mehr/Speicher
# ln -s /Pfad/zu/mehr/Speicher/blocks /home/DEIN-NUTZERNAME/.ipfs

Weg 2:
Setze neue Speicherorte in der Config von IPFS.

nano /home/DEIN-NUTZERNAME/.ipfs/config

Surche dort nach dem Abschnitt „mountpoint“: und definiere dort deinen neuen Speicherpfad.

Kennenlernen der IPFS-Nodes beschleunigen

Im Cluster-Service haben mitgeteilt, wie unser Master erreicht werden kann. Der Node muss sich also aktiv beim Master melden.
Wir können die beiden aber schon früher zumindest bekannt machen.
Füge in der IPFS-Config einfach die Adresse deiner Nodes hinzu.

nano /home/DEIN-NUTZERNAME/.ipfs/config

Suche nach „Bootstrap“: [.
Füge einfach pro Zeile die Adresse zu deinen Nodes hinzu.

/ip4/192.168.1.55/tcp/4001/p2p/QmaHashwertDeinesNodes

Zyklische Speicherberenigung

Damit deinn Speicher schlank bleibt, sollte er zyklisch berenigt werden.
Dadurch werden nicht mehr benötigte Daten, welche nicht angepinnt sind aus dem IPFS-Datastore gelöscht.
Erstell dazu am besten einen CronJob auf jedem Server, auf dem du IPFS installiert hast.

0 0 * * * user ipfs repo gc

Editiere hier in meinem Beispiel einfach nur den Nutzernamen (user) gegen dein verwendeten Benutzer.
Damit wird 1x am Tag der Speicher bereinigt.
Um angepinnte Daten zu löschen, muss zuerst der Pin entfernt werden. Ansonsten werden die Daten nie gelöscht.

Standard-Daten entfernen

IPFS kommt mit ein paar Standard-Daten daher, welche z.B. diverse Kurzanleitungen enthalten.
Diese Daten sind angepinnt und bleiben daher auf dem System.
Dadurch sendet unser IPFS-Node diese Daten auch immer in das Netzwerk, falls ein neuer Node irgendwo online geht und diese Daten nicht hat.
Also schmeissen wir diese mal noch raus:

ipfs pin ls --type recursive | cut -d' ' -f1 | xargs -n1 ipfs pin rm
ipfs repo gc

Es wird empfohlen diese zwei Befehle direkt zu beginn einzugeben. Sie löschen ALLE angepinnten Daten.

Limitiere die Verbindungen

In der Standardkonfiguration lässt der IPFS-Dienst maximal 900 Verbindungen zu und hat ein minimum von 600 Verbindungen.
Du kannst diese Zahlen erhöhen, um mehr Verbindungen zu erlauben, oder sie reduzieren, um ein stabileren Server mit etwas weniger Bandbreitenverschwendung zu haben.
Durch weniger Verbindungen, haben wir kein konstant hohen Traffic. Dieser entsteht, da eine Verbindung zu den anderen Peers im Netzwerk aufrecht erhalten wird.
Öffnme die Config

nano /home/DEIN-NUTZERNAME/.ipfs/config

und suche nach „ConnMgr“.

"ConnMgr": {
      "Type": "basic",
      "LowWater": 600,
      "HighWater": 900,
      "GracePeriod": "20s"
    }

Du kannst hier die Verbindungen radikal einschränken, indem du z.B bei LowWater 50 einträgst und bei HighWater 100.

Sobald HighWater erreicht wird, werden keine weiteren Verbindungen mehr akzeptiert, bis (durch fertige Übertragungen oder Verbindungsverlust) der Wert von LowWater erreicht wird.


SpeedTest

Du willst mal das IPFS-Netzwerk testen?
Lade hier eine Testdatei herunter. Damit kannst du selbst einmal Messen, wie schnell das Netzwerk bei dir ist.
1GB.bin Test-Datei5GB.bin Test-Datei10GB.bin Test-Datei
Tipp: Der Download über dein Browser via HTTPS geht über die IPFS-Gateways. Für das beste Tempo solltest du z.B. den IPFS Desktop-Client installieren oder eine Browsererweiterung. Dann kannst du direkt von den Nodes herunterladen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Durch das Absenden dieses Kommentars werden deine angegebenen Daten auf dem Server gespeichert. Du stimmst dadurch den Datenschutzbedingungen zu.