Kontakt
de
Building a Private IPFS Network
R&D

IPFS-Tutorial: Aufbau eines privaten IPFS-Netzwerks mit IPFS-Cluster zur Datenreplikation

Da Sicherheitsinitiativen immer mehr an Bedeutung gewinnen, werden sichere private Netzwerke für Unternehmen immer wichtiger. Ein Beispiel für ein solches Netzwerk ist IPFS - ein verteiltes Peer-to-Peer-Dateisystem. In der folgenden IPFS-Anleitung erfahren Sie, wie Sie ein privates verteiltes Netzwerk organisieren können, um eine sichere Speicherung, gemeinsame Nutzung und Replikation von Daten zu ermöglichen.

Informationssicherheit steht ganz oben auf der In-vestitionsliste von CIOs für 2019. Cybersicherheit und Risikomanagement in Unternehmen stehen ganz oben auf der Agenda von CIOs und CEOs, wie die "State of the CIO"-Studie zeigt. In diesem IPFS-Kurs werden wir den Prozess der Erstellung eines privaten IPFS-Netzwerks und die Einrichtung eines IPFS-Clusters für die Datenreplikation auf einem privaten IPFS-Netzwerk durchgehen.

Es gibt zwei Arten von IPFS Netzwerken: öffentlich und privat. Alle Dateien im öffentlichen IPFS-Netzwerk sind für jeden zugänglich. Da die meisten Geschäftsanwendungen, insbesondere Unternehmenslösungen, die volle Kontrolle über ihre Daten benötigen, ist es keine Option, ihre Netzwerke öffentlich zugänglich zu machen. Hier können die Datenschutzfunktionen von IPFS helfen: Das Netzwerk kann für bestimmte Unternehmen geschlossen werden.

Während IPFS selbst keine Datenreplikation zwischen allen Knoten im Netzwerk bietet, gibt es zwei Möglichkeiten, Daten in IPFS zu replizieren: Filecoin und IPFS Cluster. Wir werden IPFS-Cluster verwenden, um diese Funktion zu aktivieren. In unserem Fall werden wir unser privates Netzwerk auf den drei virtuellen Maschinen in der Cloud einrichten. Bevor wir jedoch beginnen, hier die Links zu den Support-Dokumentationen der verwendeten Tools:

IPFS: Ein Protokoll und Netzwerk, das eine inhaltsadress-ierbare Peer-to-Peer-Methode zur Speicherung und gemeinsamen Nutzung von Hypermedia in einem verteilten Dateisystem ermöglicht. Mehr erfahren

Private IPFS: Ermöglicht IPFS, sich nur mit anderen Peers zu verbinden, die über einen gemeinsamen geheimen Schlüssel verfügen. In privaten IPFS-Netzwerken bestimmt jeder Knoten, mit welchen anderen Knoten er sich verbinden möchte. Die Knoten in diesem Netzwerk reagieren nicht auf Nachrichten von Knoten außerhalb dieses Netzwerks. Mehr dazu

IPFS-Cluster: Ein IPFS-Cluster ist eine eigenständige Anwendung und ein CLI-Client, der Pins in einem Cluster von IPFS-Daemons zuweist, repliziert und verfolgt. IPFS-Cluster verwendet einen Leader-basierten Raft-Algorithmus, um die Speicherung eines Pin-sets zu koordinieren und den Datensatz auf die teilnehmenden Knoten zu verteilen. Read more

Es ist zu beachten, dass ein privates Netzwerk eine Standardfunktion ist, die in der IPFS-Kernfunktionalität implementiert ist, während IPFS-Cluster eine separate Anwendung ist. IPFS- und IPFS-Cluster-Anwendungen werden als unterschiedliche Pakete installiert, laufen als separate Prozesse und haben unterschiedliche Peer-IDs, API-Endpunkte und Ports. Der IPFS-Cluster-Daemon hängt vom IPFS-Daemon ab und sollte nach diesem gestartet werden.

Standardmäßig verwenden IPFS und IPFS-Cluster die folgenden Ports:

IPFS
4001 – Communication with other nodes
5001 – API server
8080 – Gateway server

IPFS-CLUSTER
9094 – HTTP API endpoint
9095 – IPFS proxy endpoint
9096 – Cluster swarm, used for communication between cluster nodes

Wir werden drei kürzlich erstellte virtuelle Maschi-nen (in meinem Fall habe ich DigitalOcean ver-wendet) mit installiertem Linux Ubuntu Distributive Version 16.04 und die Kommandozeile als Hauptinstrument für die Installation der erforderli-chen Pakete und Einstellungen verwenden. Je nach Cloud-Anbieter (AWS, Azure, Google, etc.) müssen Sie eventuell einige zusätzliche Einstellungen vornehmen, wie z.B. die Konfiguration der Firewall oder der Sicherheitsgruppen, damit sich Ihre Peers gegenseitig sehen können.

Nehmen wir an, wir haben drei VMs mit den fol-genden IP-Adressen:

Node0: 192.168.10.1
Node1: 192.168.10.2
Node2: 192.168.10.3

Beginnen wir mit dem Nullknoten (Node0), der un-ser Bootstrap-Knoten sein wird.

Step 1: Go installieren

Installieren wir zunächst Go, da wir es während des Deployments benötigen werden.

Aktualisieren Sie die Linux-Pakete und Abhäng-igkeiten:

sudo apt-get update
sudo apt-get -y upgrade

Laden Sie die neueste Version herunter und entzippen Sie Go

wget https://dl.google.com/go/go1.11.4.linux-amd64.tar.gz
sudo tar -xvf go1.11.4.linux-amd64.tar.gz
sudo mv go /usr local

Erstellen Sie den Pfad für Go und setzen Sie die Umgebungsvariablen.
1. Erstellen Sie einen Ordner:

mkdir $HOME/gopath

Öffnen Sie die Datei .bashrc und fügen Sie am Ende drei Variablen hinzu: GOROOT, GOPATH, PATH.
Öffnen Sie die Datei:

sudo nano $HOME/.bashrc

Fügen Sie am Ende der .bashrc-Datei Folgendes ein:

export GOROOT=/usr/local/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

2. Aktualisieren Sie die .bashrc-Datei und überprüfen Sie die Go-Version:

source ~/.bashrc
go version

Step 2: IPFS installieren

Wir werden die neuste Version von go-ipfs installieren. Zum Zeitpunkt des Schreibens dieses Artikels war es v0.4.18 für Linux. Sie können die neueste Ver-sion hier finden:https://dist.ipfs.io/#go-ipfs

Laden Sie IPFS herunter, entpacken Sie die tar-Datei, verschieben Sie den entpackten Ordner unter bin und initialisieren Sie den IPFS-Knoten:

wget https://dist.ipfs.io/go-ipfs/v0.4.18/go-ipfs_v0.4.18_linux-amd64.tar.gz 
tar xvfz go-ipfs_v0.4.18_linux-amd64.tar.gz 
sudo mv go ipfs/ipfs /usr/local/bin/ipfs 
ipfs init 
ipfs version

Wiederholen Sie die Schritte 1 und 2 für alle Ihre VMs.

Step 3: Erstellen eines privaten Netzwerks

Sobald Sie Go und IPFS auf allen Ihren Knoten in-stalliert haben, führen Sie den folgenden Befehl aus, um das Dienstprogramm zur Erzeugung von Schwarmschlüsseln zu installieren. Mit dem Swarm-Schlüssel können wir ein privates Netzwerk erstellen und den Netzwerk-Peers mitteilen, dass sie nur mit den Peers kommunizieren dürfen, die diesen geheimen Schlüssel teilen.

Dieser Befehl sollte nur auf Ihrem Knoten0 ausgeführt werden. Wir generieren swarm.key auf dem Bootstrap-Knoten und kopieren ihn dann einfach auf die anderen Knoten.

go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen
Führen Sie nun dieses Dienstprogramm auf Ihrem ersten Knoten aus, um swarm.key im Ordner .ipfs zu erzeugen:
ipfs-swarm-key-gen & > ~/.ipfs/swarm.key

Kopieren Sie die generierte Datei swarm.key in das IPFS-Verzeichnis jedes Knotens, der an dem privaten Netzwerk teilnimmt. Zunächst müssen Sie die Standardeinträge der Bootstrap-Knoten von al-len Knoten, die Sie erstellt haben, entfernen.

Step 4: Bootstrapping der IPFS Knoten

ipfs bootstrap rm –all

Fügen Sie die Hash-Adresse Ihres Bootstraps zu jedem der Knoten hinzu, einschließlich des Boot-straps.

ipfs bootstrap add /ip4/192.168.10.1/tcp/4001/ipfs/QmQVvZEmvjhYgsyEC7NvMn8EWf131EcgTXFFJQYGSz4Y83

Der IP-Teil (192.168.10.1) wird in die IP Ihres Knoten 0-Rechners geändert. Der letzte Teil ist die Peer-ID, die generiert wird, wenn Sie Ihren Peer initial-isieren (ipfs init). Sie können es oben sehen, wo es "peer identity" anzeigt:

QmQVvZEmvjhYgsyEC7NvMn8EWf131EcgTXFFJQYGSz4Y83

oder wenn Sie den ipfs id Befehl in der Konsole ausführen. Sie müssen also die IP und die Peer-ID für Ihren Node0 entsprechend ändern. Tun Sie dies für alle Ihre Knoten.

Wir müssen auch die Umgebungsvariable “LIBP2P_FORCE_PNET” setzen, um unser Netzwerk in den privaten Modus zu versetzen.

export LIBP2P_FORCE_PNET=1

Configuring IP for communication

Innerhalb des Ordners .ipfs befindet sich die Datei "config". Sie enthält viele Einstellungen, darunter auch die Netzwerkdetails, mit denen unsere IPFS-Knoten arbeiten werden. Öffnen Sie diese Konfigurationsdatei und suchen Sie "Addresses". Sie sieht wie folgt aus:

"Addresses": {
"API": "/ip4/192.168.10.1/tcp/5001",
"Announce": [],
"Gateway": "/ip4/192.168.10.1/tcp/8080",
"NoAnnounce": [],
"Swarm": [
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001"
]
},

Die in der API genannte IP ist diejenige, an die sich IPFS für die Kommunikation bindet. Standardmäßig ist dies localhost (127.0.0.1). Damit sich unsere Knoten gegenseitig "sehen" können, müssen wir diesen Parameter entsprechend auf die IP jedes Knotens setzen. Der Gateway-Parameter ist für den Zugriff über den Browser gedacht.

Step 5: Starten Sie die Netzknoten und testen Sie sie

Wir sind mit allen Konfigurationen fertig, und nun ist es an der Zeit, alle Knoten zu starten, um zu sehen, ob alles gut gelaufen ist und ob sie mit dem privaten Netzwerk verbunden sind. Starten Sie den IPFS-Daemon auf allen Ihren Knoten.

ipfs daemon

Nun fügen wir die Datei von einem der Knoten aus hinzu und versuchen, von einem anderen aus darauf zuzugreifen.

mkdir test-files
echo hello IPFS & > file.txt
ipfs add file.txt

Nehmen Sie den ausgedruckten Hash und ver-suchen Sie, die Datei von einem anderen Knoten aus zu katalogisieren.

ipfs cat QmZULkCELmmk5XNfCgTnCyFgAVxBRBXyDHGGMVoLFLiXEN

Sie sollten den Inhalt der hinzugefügten Datei des ersten Knotens sehen. Um zu prüfen und sicher zu sein, dass wir ein privates Netz haben, können wir versuchen, auf unsere Datei über ihre CID vom öffentlichen IPFS-Gateway aus zuzugreifen. Sie können eines der öffentlichen Gateways aus dieser Liste auswählen:https://ipfs.github.io/public-gateway-checker.

Wenn Sie alles richtig gemacht haben, wird die Datei nicht zugänglich sein. Sie können auch den Befehl ipfs swarm peers ausführen, der eine Liste der Peers in dem Netzwerk anzeigt, mit dem er ver-bunden ist. In unserem Beispiel sieht jeder Peer zwei andere.

Step 6: IPFS-Daemon als Dienst im Hintergrund laufen lassen

Damit der IPFS-Dämon auch nach Beendigung der Konsolensitzung weiterläuft, müssen wir den sys-temd-Dienst einrichten. Bevor wir dies tun, stop-pen/beenden Sie Ihren ipfs-Daemon. Erstellen Sie eine Datei für einen neuen Dienst.

sudo nano /etc/systemd/system/ipfs.service

Und fügen Sie die folgenden Einstellungen hinzu:

[Unit]
 Description=IPFS Daemon
 After=syslog.target network.target remote-fs.target nss-lookup.target
 [Service]
 Type=simple
 ExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub
 User=root
 [Install]
 WantedBy=multi-user.target

Speichern und schließen Sie die Datei.
Wenden Sie den neuen Dienst an.

sudo systemctl daemon-reload
sudo systemctl enable ipfs
sudo systemctl start ipfs
sudo systemctl status ipfs

Starten Sie Ihr System neu und überprüfen Sie, ob der IPFS-Daemon aktiv ist und läuft. Dann können Sie erneut versuchen, die Datei von einem Knoten aus hinzuzufügen und von einem anderen darauf zuzugreifen.

Wir haben einen Teil der Erstellung eines privaten IPFS-Netzwerks abgeschlossen und seine Dämonen als Dienst laufen lassen. In dieser Phase sollten Sie drei IPFS-Knoten haben, die in einem privaten Netzwerk organisiert sind. Lassen Sie uns nun un-seren IPFS-CLUSTER für die Datenreplikation erstellen.

Einsatz IPFS-Cluster

Nachdem wir ein privates IPFS-Netzwerk erstellt haben, können wir mit dem Einsatz von IPFS-Cluster auf IPFS beginnen, um die Datenreplikation zu automatisieren und unsere Daten besser zu verwalten.

Es gibt zwei Möglichkeiten, IPFS-Cluster zu organi-sieren, die erste ist, einen festen Peerset festzule-gen (so können Sie Ihren Cluster nach der Erstellung nicht mit weiteren Peers erweitern) und die andere  Bootstrap-Knoten (Sie können neue Peers hinzufügen, nachdem der Cluster erstellt wurde).

IPFS-Cluster besteht aus zwei Komponenten:

  • ipfs-cluster-service hauptsächlich zur Initialisierung von Cluster-Peers und zum Ausführen seines Daemons
  • ipfs-cluster-ctl für die Verwaltung von Knoten und Daten innerhalb des Clusters

Step 1: IPFS-Cluster installieren

There are many ways how to install IPFS-Cluster. In this manual, we are using the installing from source method. Sie können alle Methoden hier sehen.

Führen Sie die folgenden Befehle in Ihrem Konsolenterminal aus, um ipfs-cluster-Komponenten zu installieren:

git clone https://github.com/ipfs/ipfs-cluster.git $GOPATH/src/github.com/ipfs/ipfs-cluster
cd $GOPATH/src/github.com/ipfs/ipfs-cluster
make install

Überprüfen Sie die erfolgreiche Installation durch Ausführen:

ipfs-cluster-service --version
ipfs-cluster-ctl --version

Wiederholen Sie diesen Schritt für alle Ihre Knoten.

Step 2: Erzeugen und Einrichten der Variable CLUSTER_SECRET

Nun müssen wir CLUSTER_SECRET generieren und als Umgebungsvariable für alle am Cluster be-teiligten Peers einrichten. Durch die gemeinsame Nutzung desselben CLUSTER_SECRET können die Peers erkennen, dass sie Teil eines IPFS-Clusters sind. Wir werden diesen Schlüssel auf dem Null-knoten erzeugen und ihn dann auf alle anderen Knoten kopieren. Führen Sie auf Ihrem ersten Kno-ten die folgenden Befehle aus:

export CLUSTER_SECRET=$(od -vN 32 -An -tx1 /dev/urandom | tr -d ' \n')   echo $CLUSTER_SECRET

Sie sollten etwas wie dieses sehen:

9a420ec947512b8836d8eb46e1c56fdb746ab8a78015b9821e6b46b38344038f

Damit CLUSTER_SECRET nach dem Beenden der Konsolensitzung nicht verschwindet, müssen Sie es als konstante Umgebungsvariable in die .bashrc-Datei einfügen. Kopieren Sie den gedruckten Schlüssel nach dem Befehl echo und fügen Sie ihn am Ende der Datei .bashrc auf allen Ihren Kno-ten ein.

Sie sollte wie folgt aussehen:

export CLUSTER_SECRET=9a420ec947512b8836d8eb46e1c56fdb746ab8a78015b9821e6b46b38344038f

Und vergessen Sie nicht, Ihre .bashrc-Datei mit dem Befehl zu aktualisieren:

source ~/.bashrc

Step 3: Init und Start des Clusters

Nachdem wir den IPFS-Cluster-Dienst installiert und die Umgebungsvariable CLUSTER_SECRET gesetzt haben, sind wir bereit, den ersten Cluster-Peer ("Knoten0") zu initialisieren und zu starten.

Hinweis: Stellen Sie sicher, dass Ihr ipfs-Daemon läuft, bevor Sie den ipfs-cluster-service-Daemon starten. Um den Cluster-Peer zu initialisieren, müs-sen wir den folgenden Befehl ausführen:

-cluster-service init

Um den Cluster-Peer zu starten, führen Sie aus:

-cluster-service daemon

You should see the output in the console:

INFO cluster: IPFS Cluster is ready cluster.go:461
ipfs-cluster-service daemon 

In der Konsole sollten Sie die folgende Ausgabe sehen:

INFO cluster: IPFS Cluster is ready cluster.go:461

Öffnen Sie nun ein neues Konsolenfenster und verbinden Sie sich mit Ihrer zweiten VM ("Node"). Hinweis: Stellen Sie sicher, dass Ihr ipfs daemon läuft, bevor Sie den ipfs-cluster-service-Daemon starten.

Sie müssen die IPFS-Cluster-Komponenten instal-lieren und eine CLUSTER_SECRET-Umgebungsvariable setzen (Kopie von Node0), wie wir es für unseren ersten Knoten getan haben. Führen Sie die folgenden Befehle aus, um IPFS-Cluster zu initialisieren und auf node 0 zu booten:

ipfs-cluster-service init
ipfs-cluster-service daemon --bootstrap
/ip4/192.168.10.1/tcp/9096/ipfs/QmZjSoXUQgJ9tutP1rXjjNYwTrRM9QPhmD9GHVjbtgWxEn

Der IP-Teil (192.168.10.1) wird in die IP Ihres Knotens 0 geändert. Der letzte Teil ist die Cluster-Peer-ID, die erzeugt wird, wenn Sie Ihren Cluster-Peer initialisieren (ipfs-cluster-service init). Beach-ten Sie, dass es sich um eine IPFS-Cluster-Peer-ID und nicht um eine IPFS-Peer-ID handeln sollte.

Sie können den Befehl ipfs-cluster-service id in der Konsole ausführen, um diese zu erhalten. Sie müs-sen IP und Cluster-Peer-ID entsprechend Ihrem Knoten0 ändern. Tun Sie dies für alle Ihre Knoten. Um zu überprüfen, ob wir zwei Peers in unserem Cluster haben, führen Sie den Befehl aus:

Ipfs-cluster-ctl peers ls

Sie sollten die Liste der Cluster-Peers sehen

node1 & > ipfs-cluster-ctl peers ls
QmYFYwnFUkjFhJcSJJGN72wwedZnpQQ4aNpAtPZt8g5fCd | Sees 1 other peers
Addresses:
- /ip4/127.0.0.1/tcp/10096/ipfs/QmYFYwnFUkjFhJcSJJGN72wwedZnpQQ4aNpAtPZt8g5fCd
- /ip4/192.168.1.3/tcp/10096/ipfs/QmYFYwnFUkjFhJcSJJGN72wwedZnpQQ4aNpAtPZt8g5fCd
IPFS: Qmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- /ip4/127.0.0.1/tcp/4001/ipfs/Qmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- /ip4/192.168.1.3/tcp/4001/ipfs/Qmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
QmZjSoXUQgJ9tutP1rXjjNYwTrRM9QPhmD9GHVjbtgWxEn | Sees 1 other peers
Addresses:
- /ip4/127.0.0.1/tcp/9096/ipfs/QmZjSoXUQgJ9tutP1rXjjNYwTrRM9QPhmD9GHVjbtgWxEn
- /ip4/192.168.1.2/tcp/9096/ipfs/QmZjSoXUQgJ9tutP1rXjjNYwTrRM9QPhmD9GHVjbtgWxEn
IPFS: Qmbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
- /ip4/127.0.0.1/tcp/4001/ipfs/Qmbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
- /ip4/192.168.1.2/tcp/4001/ipfs/Qmbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

Wiederholen Sie diesen Schritt für den dritten Knoten und alle anderen Knoten, die Sie dem Cluster hinzufügen möchten.

Step 4: IPFS-Cluster-Daemon als Dienst ausführen

Damit der IPFS-Cluster-Daemon auch nach dem Schließen der Konsolensitzung weiterläuft, müssen wir einen systemd-Dienst für ihn erstellen. Führen Sie den folgenden Befehl aus, um eine Datei für den IPFS-Cluster-Systemdienst zu erstellen:

sudo nano /etc/systemd/system/ipfs-cluster.service

Und fügen Sie in diese Datei ein:

[Unit]
Description=IPFS-Cluster Daemon
Requires=ipfs
After=syslog.target network.target remote-fs.target nss-lookup.target ipfs
[Service]
Type=simple
ExecStart=/home/ubuntu/gopath/bin/ipfs-cluster-service daemon
User=root
[Install]
WantedBy=multi-user.target

Wenden Sie den neuen Dienst an und führen Sie ihn aus:

sudo systemctl daemon-reload 
sudo systemctl enable ipfs-cluster 
sudo systemctl start ipfs-cluster 
sudo systemctl status ipfs-cluster 

Starten Sie Ihren Rechner neu und überprüfen Sie, ob die Dienste IPFS und IPFS-Cluster laufen.

Step 5: Testen Sie IPFS-Cluster und Datenreplikation

Um die Datenreplikation zu testen, erstellen Sie die Datei und fügen Sie sie dem Cluster hinzu:

ipfs-cluster-ctl add myfile.txt 

Nehmen Sie die CID der kürzlich hinzugefügten Datei und überprüfen Sie ihren Status:

ipfs-cluster-ctl status CID

Sie sollten sehen, dass diese Datei auf allen Clusterknoten PINNED wurde.

Zusammenfassung

Wenn Sie Fragen zu IPFS-Netzwerken und ihrer möglichen Nutzung für Datenreplikation und sicheren Datenaustausch haben, zögern Sie nicht, uns zu kontaktieren!

Haben Sie Fragen?
Sprechen Sie mit Experten
Kontakt
  • Wir benötigen Ihren Namen für die korrekte Ansprache
  • Wir benötigen Ihre Telefonnummer, um Sie hinsichtlich Ihrer Anfrage kontaktieren zu können
  • Wir benötigen Ihren Standort, um entscheiden zu können, welches unserer Büros für Sie zuständig ist
  • Wir benötigen Ihren Unternehmensnamen als Hintergrundinformation, um zu ermitteln, wie wir Ihnen helfen können
  • Akzeptierte Dateitypen: jpg, gif, png, pdf, doc, docx, xls, xlsx, ppt, pptx, png, Max. Dateigröße: 10 MB.
(jpg, gif, png, pdf, doc, docx, xls, xlsx, ppt, pptx, PNG)

Wir speichern Ihre Daten in unserem CRM-System, um Sie kontaktieren zu können. Für weitere Informationen beachten Sie bitte unsere Datenschutzrichtlinie
  • Dieses Feld dient zur Validierung und sollte nicht verändert werden.

Wir sind zufrieden mit dem Know-how sowie der Arbeit, die ELEKS für uns geleistet hat. Wir haben zum Produkt, über dessen Design, den Funktionen sowie der Benutzerfreundlichkeit hervorragendes Feedback erhalten. Insgesamt waren wir sehr zufrieden mit der Zusammenarbeit mit ELEKS, und wir können uns ganz sicher vorstellen, weitere Projekte mit ihnen durchzuführen.

corentine piette
Corentine Piette
Manager, appygas