meshviewer

Die Folgenden Schritte dienen dazu, eine Karte anzuzeigen. Dies lässt sich auch auf einem vom Gateway getrennten System durchführen.

_images/meshviewer-concept.png

Vorraussetzungen

Für einen Kartenserver brauchen wir einen Server mit einem aktuellen Linux, diese Anleitung geht von Debian 9 aus. Die Hardware Anforderung hängen von der Größe und der zu erwartenden Last der Community ab. Bei uns läuft die Karte auf einem der Gateways mit 4 VCores und 4GB RAM und es gab keine Probleme.

Eine Anbindung an das entsprechende Freifunk Netzwerk ist natürlich auch notwendig.

yanic

yanic sammelt von den Knoten Daten, welche dann auf einer Karte angezeigt werden können, früher wurde hierfür Alfred benutzt. yanic ist in go geschrieben also installieren wir eine neue Version von go. golang

Als erstes wechseln wir in den root user.

sudo su
wget https://dl.google.com/go/go1.12.4.linux-amd64.tar.gz
# Bitte sha256 vergleichen https://golang.org/dl/
tar -C /usr/local -xzf go1.12.4.linux-amd64.tar.gz
rm go1.10.8.linux-amd64.tar.gz

In ~/.bashrc

GOPATH=/opt/go
PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

Hier musst du dich einmal abmelden und neu anmelden damit die Variablen auch gesetzt werden.

Nach dem Anmelden kann man prüfen ob die Variablen korrekt gesetzt wurden.

echo $GOPATH
/opt/go

Mit whereis go prüfen ob go gefunden wird:

go: /usr/local/go /usr/local/go/bin/go

Dann wird yanic installiert.

go get -v -u github.com/FreifunkBremen/yanic

Die Konfiguration von Yanic wird in /etc/yanic.conf angelegt:

[respondd]
enable           = true
synchronize      = "1m"
collect_interval = "1m"

[respondd.sites.ffsh]
domains            = ["ffsh", "ffod", "ffrz"]

[respondd.sites.ffod]
domains            = []

[respondd.sites.ffrz]
domains            = []

[[respondd.interfaces]]
ifname = "br-ffsh"
port = 10001

[webserver]
enable  = false
bind    = "127.0.0.1:8080"
webroot = "/var/www/html/meshviewer"

[nodes]
state_path    = "/var/lib/yanic/state.json"
prune_after   = "14d"
save_interval = "2m"
offline_after = "10m"

[[nodes.output.meshviewer-ffrgb]]
enable   = true
path = "/var/www/map/data/meshviewer.json"

[nodes.output.meshviewer-ffrgb.filter]
no_owner = true
blacklist = ["f4f26d4a2ecc"]

[[nodes.output.meshviewer]]
enable = true
version    = 2
nodes_path = "/var/www/map/data/nodes.json"
graph_path = "/var/www/map/data/graph.json"

[nodes.output.meshviewer.filter]
no_owner = true
blacklist = ["f4f26d4a2ecc"]

[[nodes.output.nodelist]]
enable   = true
path = "/var/www/map/data/nodelist.json"

[nodes.output.nodelist.filter]
no_owner = true
blacklist = ["f4f26d4a2ecc"]

[database]
delete_after    = "30d"
delete_interval = "1h"

[[database.connection.influxdb]]
enabled  = true
address  = "http://localhost:8086"
database = "ffsh"
username = "CHANGE ME"
password = "CHANGE ME"

[database.connection.influxdb.tags]

[[database.connection.graphite]]
enable   = false
address  = "localhost:2003"
prefix   = "freifunk"

[[database.connection.respondd]]
enable   = false
type     = "udp6"
address  = "stats.bremen.freifunk.net:11001"

[[database.connection.logging]]
enable   = false
path     = "/var/log/yanic.log"

Wir können testen ob yanic funktioniert in dem wir eine manuelle Anfrage stellen hier an das Gateway Hopfenbach:

yanic query --wait 5 br-ffsh "fddf:0bf7:80::128:1"

Damit yanic auch als Deamon läuft legen wir noch einen Service an.

sudo cp /opt/go/src/github.com/FreifunkBremen/yanic/contrib/init/linux-systemd/yanic.service /lib/systemd/system/yanic.service
sudo systemctl daemon-reload

influxdb

Influxdb dient als Datenbank für yanic

sudo apt install influxdb influxdb-client

Nun sichern wir die influxdb ab /etc/influxdb/influxdb.conf

Hier werden nur die empfohlenen Anpassungen beschrieben: Noch vor der [meta] Sektion setzen wir, sonst wäre der port 8088 überall offen.

bind-address = "localhost:8088"

Weiter unten bei [admin] das gleiche:

bind-address = "localhost:8083"

kurz danach in [http]

bind-address = "localhost:8086"
systemctl restart influxdb

Nun sollte influxdb nur noch auf localhost erreichbar sein, prüfen kann man dies mit netstat -tlpn

Grafana

Grafana kann Graphen erstellen welche im meshviewer eingebunden werden können. Hier wird Grafana über eine Repository installiert.

deb https://packagecloud.io/grafana/stable/debian/ stretch main
curl https://packagecloud.io/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install grafana

Da Grafana bei uns hinter einem Proxy laufen soll, setzen wir auch hier alle IPs auf localhost. Am besten einmal am Ende prüfen ob alles richtig konfiguriert ist mit netstat -tlpn.

Ein wichtiger Punkt ist der öffentliche Zugang, damit die Statistiken auch von Besuchern abgerufen werden können.

#################################### Anonymous Auth ##########################
[auth.anonymous]
# enable anonymous access
enabled = true

# specify organization name that should be used for unauthenticated users
org_name = Freifunk Südholstein

# specify role for unauthenticated users
org_role = Viewer

Die Organisation kann man als Admin in Grafana anlegen.

meshviewer

Für den Meshviewer installieren wir als erstes nodejs und yarn

nodejs

Wir brauchen ein aktuelles nodejs das finden wir auf nodejs.org Wir benutzen die LTS Variante 8.x

curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs

yarn

Dann installieren wir yarn

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
apt install yarn

meshviewer-rgb

Nun installieren wir den meshviewer selbst. Im web Verzeichnis /var/www/

git clone https://github.com/ffsh/meshviewer.git
cd meshviewer
yarn

Nun muss die Konfiguration in meshviewer/config.js eventuell noch angepasst werden.

Danach yarn run gulp Nun muss nur noch ein Webserver meshviewer/build ausliefern.

Tile-cache mit nginx

Für den Meshviewer benötigt man einen Tile-Server, der die Karte als einzelne Kacheln ausliefert. Wir verwenden dabei das kostenlose und freie Angebot von OpenStreetMap. Damit die Server von OpenStreetMap weniger stark belastet werden verwenden wir einen Tile-Cache. Bei einer Anfrage für eine Karten-Kachel fragt der Browser den Cache, hat dieser die Datei bereits, so liefert er sie direkt aus. Hat er sie nicht, so fragt er bei den OpenStreetMap Servern und speichert die Datei in seinem Cache. Für die einfache Umsetzung haben ein paar Freifunker an einer Konfiguration für nginx gearbeitet, welche genau das umsetzt.

Voraussetzungen: - nginx erreichbar unter der entsprechenden Domain - TLS mit gültigem Zertifikat (Let’s Encrypt) - ein wenig Speicherplatz

Die für uns angepasste Version ist so konfiguriert das sie sich hinter einem apache-Server befindet und deshalb keine TLS Konfiguration braucht, passe sie für deinen Anwendungsfall an.

#
# Nginx >= 1.9.15 - 1.10.1 recommended
#
# Thanks to https://github.com/cbricart
proxy_cache_path /var/www/tilecache/osm
  levels=1:2 inactive=7d
  keys_zone=tilecache:64m
  max_size=500M;

upstream osm_tiles {
        server a.tile.openstreetmap.org;
        server b.tile.openstreetmap.org;
        server c.tile.openstreetmap.org;
        keepalive 16;
}

server {
        listen 127.0.0.1:8090 ;

        access_log              /var/www/tilecache/logs/access.log;
        error_log               /var/www/tilecache/logs/error.log;

        root /var/www/tilecache/html;

        location / {
                try_files $uri @osm;
        }

        location @osm {
                proxy_pass http://osm_tiles;
                proxy_http_version      1.1;
                proxy_set_header    Connection "";
                proxy_set_header    Accept-Encoding "";
                proxy_set_header    User-Agent "Mozilla/5.0 (compatible; OSMTileCache/1.0; +mailto:noc@freifunk-suedhosltein.de; +https://map.freifunk-suedholstein.de/)";
                proxy_set_header    Host tile.openstreetmap.org;

                proxy_temp_path     /var/www/tilecache/temp;
                proxy_cache         tilecache;
                proxy_store         off;
                proxy_cache_key     $uri$is_args$args;
                proxy_ignore_headers Expires Cache-Control;
                proxy_cache_valid   200 301 302 7d;
                proxy_cache_valid   404 1m;
                proxy_cache_valid   any 1m;
                proxy_next_upstream   error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404;
                proxy_cache_use_stale error timeout updating invalid_header http_500 http_502 http_503 http_504 http_403 http_404;

                proxy_hide_header   Via;
                proxy_hide_header   X-Cache;
                proxy_hide_header   X-Cache-Lookup;

                expires 7d;
        }
}