seeseekey.net - Invictus Deus Ex Machina

Den freien Suchserver Elasticsearch kann man, wie das Wort Suchserver es dezent andeutet, als Server betreiben. Allerdings ist es manchmal nicht gewünscht einen dedizierter Server zu betreiben. In einem solchen Fall kann man den Elasticsearch-Server in eine Java-Applikation einbetten. Der sicherlich häufigste Fall für eine solche Einbettung ist dabei die Nutzung zu Testzwecken (z.B. Unit-Tests zum Test der Suchergebnisse). Im ersten Schritt sollte in das Java-Projekt die entsprechende Abhängigkeit zum Projekt hinzugefügt werden. In diesem Beispiel wird dabei auf einem auf Maven basierenden Projekt ausgegangen – in diesem muss die pom.xml entsprechend erweitert werden:

<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>2.3.4</version>
</dependency>

Damit wurde Elasticsearch dem Projekt hinzugefügt. Nun muss der eigentliche Server im Java-Projekt gestartet werden. Dafür werden nur wenige Zeilen Quellcode benötigt:

Settings.Builder elasticsearchSettings = Settings.settingsBuilder()
    .put("http.enabled", "true")
    .put("path.data", "data")
    .put("path.home", "home");

Node node = nodeBuilder()
    .local(true)
    .settings(elasticsearchSettings.build())
    .node();

In diesem Beispiel werden im ersten Schritt die Einstellungen für Elasticsearch definiert. Dabei wird unter anderem der HTTP-Modus aktiviert. Wenn dieser deaktiviert ist, ist die Kommunikation per HTTP nicht mehr möglich. Stattdessen kann dann nur noch die Kommunikation über das Transport-Interface genutzt werden. Dieses Interface wird im Normalfall für die interne Kommunikationen zwischen einzelnen Elasticsearch-Clustern genutzt – allerdings ist eine Nutzung mit dem Elasticsearch-Java-Client ebenfalls möglich. Mit dem aktivierten Modus, ist die Entwicklung einfacher (z.B. für den Einsatz von Analyse-Tools) und die Konfiguration näher an der Praxis. Standardmäßig horcht der Elasticsearch-Server dabei auf dem Port 9200 – in diesem Beispiel wäre er über die URL:

http://localhost:9200

erreichbar. Nachdem die Einstellungen angelegt wurden, werden diese dem NodeBuilder übergeben, welcher schlussendlich den Elasticsearch-Server hochfährt. Nachdem dieser hochgefahren wurde, kann die Nutzung des selben beginnen.

Ein REST-API von Hand entwickelt, benötigt eine Dokumentation, ein entsprechenden Server und eventuell einige Clients als Referenz. Einfacher wird es mit einem Framework wie Swagger. Unter Zuhilfenahme der Beschreibungssprache YAML können mit Hilfe des Frameworks REST-APIs, Dokumentation, Server und Clients generiert werden.

Der Swagger Editor

Der Swagger Editor

Doch Swagger versteht sich nicht nur als Framework, sondern auch als Spezifikation. Begonnen wurde mit der Entwicklung bereits im 2010; die Swagger Specification trägt seit Anfang Januar 2012 offiziell den Namen OpenAPI Specification und beschreibt eine maschinenlesbare Interfacedefinitionen einer REST-API. Ähnliches wurde unter anderem schon mit WSDL und WADL versucht – alles Konzepte bzw. Beschreibungsprachen welche an ihren eigenen Limitationen gescheitert sind und wenn überhaupt nur noch sporadisch genutzt werden.

Betreut und weiterentwickelt wird die Spezifikation nun von der Open API Initiative, zu der namenhafte Firmen wie Google, PayPal, IBM, Atlassian und Microsoft gehören. Die Spezifikation als solche ist freie Software und auf GitHub zu finden. Sie ist unter der Apache Lizenz lizenziert. Aktuell ist die Spezifikation in der Version 2.0 veröffentlicht.

Auf der offiziellen Webseite von Swagger findet sich ein Editor, mit welchem APIs definiert werden können und anschließend exportiert werden können. Der Editor kann dabei Server unter anderem in den Sprachen bzw. für die Framworks Haskel, Jax-RS, Node.js, Python, Rails und PHP erzeugen. Bei den Clients ist die Auswahl noch größer. Diese können in C#, HTML, Dart, Go, Groovy, Java, Javascript, Objective C, Perl, PHP, Ruby, Scala, Swift und vielen weiteren Sprachen erzeugt werden.

Neben dem Editor kann für die Erzeugung von Clients auch der Swagger Codegen genutzt werden. Dabei handelt es sich um eine Java-Anwendung um die Clients lokal auf dem eigenen Rechner zu erzeugen. Der Editor und viele weitere Tools rund um Swagger sind ebenfalls auf GitHub zu finden. – auch diese sind freie Software, welche unter der Apache Lizenz stehen.

Unter Umständen kann es unter Ubuntu, oder anderen Distributionen basierend auf Debian passieren, das ein apt-get Vorgang fehlschlägt. Dies kann sich darin äußern das apt-get nicht mehr genutzt werden kann – stattdessen bekommt man folgende Meldung zu sehen:

E: Could not get lock /var/lib/dpkg/lock - open (11 Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/) is another process using it?

Hintergrund ist das dpkg Sperrdateien mit dem Name lock anlegt und sie nach getaner Arbeit wieder entfernt. Bei plötzlichen Unterbrechungen wie z.B. einem Stromausfall kann es passieren das die Dateien nicht mehr entfernt werden. Lösen kann man das Problem indem man die entsprechenden Sperrdateien entfernt:

rm /var/lib/dpkg/lock
rm /var/lib/apt/lists/lock
rm /var/cache/apt/archives/lock

Abschließend sollte dpkg bzw. apt-get wieder ohne Probleme funktionieren.

Vor einigen Tagen migrierte ich einen Minecraft-Server von einem Server mit Ubuntu 14.04 LTS auf einen Server mit Ubuntu 16.04 LTS. Der Minecraft-Server lief dabei auf dem alten als auch auf dem neuen Server jeweils in einer KVM-Gast-Maschine. Er startete ohne Probleme und wenn man sich das ganze von außen mit nmap anschaute, war der entsprechende Port auch offen gekennzeichnet. Allerdings konnte der Minecraft-Client keinerlei Verbindung mit dem Server aufnehmen. Lösen ließ sich das Problem mit der Änderung einer Einstellung in der server.properties Datei. Konkret ging es dabei um die Einstellung:

use-native-transport = true

welche auf false gesetzt werden musste. Mit diesem Flag wird das optimierte Senden und Empfangen von Paketen unter Linux deaktiviert. Damit funktionierte der Minecraft-Server wieder ohne Probleme.

Auf der Suche nach einem kleinen Tool, um zu testen ob ein Minecraft-Server ordnungsgemäß läuft, bin ich auf den Minecraft Server Status Checker gestoßen. Er überprüft ob der Server erreichbar ist und liefert einige weitere Informationen wie z.B. die aktuelle Spieleranzahl. Zu finden ist der Check auf der Webseite des ehemaligen Minecraft-Entwickler Nathan Adams.

dinnerbone.com/minecraft/tools/status/

dinnerbone.com/minecraft/tools/status/

Der Minecraft Server Status Checker ist dabei freie Software dessen Quelltext auf GitHub zu finden ist. Als Lizenz wurde die Apache Licence gewählt.

Wenn man unter Linux eine Session mittels screen gestartet hat und diese später wieder aufrufen möchte, so nutzt man den Befehl:

screen -r

Unter bestimmten Bedingungen kann es vorkommen, das die Sitzung noch gebunden ist. Auf der Konsole würde das dann wie folgt aussehen:

# screen -r

There is a screen on:
	29711.ubuntu-release-upgrade-screen-window	(05/05/2016 04:09:56 PM)	(Attached)
There is no screen to be resumed matching 29711.ubuntu-release-upgrade-screen-window.

Vorkommen kann so etwas z.B. wenn man die SSH-Verbindung während einer Screen-Sitzung verliert. Damit man diese Screen-Sitzung wieder aufnehmen kann, muss die bestehende Bindung zuerst wieder gelöst werden. Dazu gibt es das Kommando:

screen -d

welches die Bindung löst. Bei mehreren offenen Sitzungen muss zusätzlich die ID der Sitzung angegeben werden. Anschließend kann die Sitzung wieder mittels:

screen -r

aufgenommen werden.

Wenn man auf einem Ubuntu-Server:

do-release-upgrade

eingibt so wird auf die aktuelle Version (je nachdem welche Einstellungen man in der Datei /etc/update-manager/release-upgrades getätigt hat) aktualisiert. Allerdings kann es bei LTS-Releases vorkommen das man stattdessen die Meldung:

Checking for a new Ubuntu release
No new release found

Der Grund hierfür ist, das man bei einem LTS Release erst mit dem ersten Pointrelease, also z.B. 16.04.1 upgraden kann. Damit soll Fehlern vorgebeugt werden, welche in der ersten Release-Version noch vorhanden sein könnten. Möchte man auf dem entsprechenden Gerät trotzdem die aktuelle Version installieren so muss man den Parameter -p nutzen:

do-release-upgrade -p

Damit wird das versucht das aktuelle Release zu installieren, was von LTS zu LTS Version dazu führt das die aktuelle LTS Version installiert wird auch wenn kein Pointrelease verfügbar ist.

Vor ein paar Tagen schrieb ich in einem Artikel wie man Gogs (einen Git-Service) auf einem Ubuntu-Server aufsetzt. Das aktuelle Release v0.6.15 wird dabei mit einem Init-Script für Debian mitgeliefert. Dieses Skript funktioniert allerdings nicht wie gewünscht.

Die Änderung welche das Init-Script wieder repariert

Die Änderung welche das Init-Script wieder repariert

Wenn man das Skript mittels:

service gogs start

ausführt wird Gogs angeblich gestartet. Allerdings zeigt:

service gogs status

das dies nicht der Fall ist. Das Problem am Init-Skript ist die nicht gesetzte USER-Variable. Mit der aktuellen Version des Skriptes funktioniert der Start von Gogs über service wieder ohne Probleme.

Möchte man Git-Repositories auf einem Ubuntu-Server hosten, so ist das schnell erledigt. Wenn etwas mehr Komfort aller GitHub gewünscht ist, so sollte man sich Gogs anschauen. Gogs steht dabei für Go Git Service. Wie der Name andeutet handelt es sich um einen komplett in Go geschriebenden Git-Service. Im ersten Schritt muss Git auf dem Server installiert werden:

apt-get install git

Nachdem Git installiert ist, muss der für Gogs verwendete Nutzer angelegt und in diesen gewechselt werden:

useradd -m gogs
su gogs
cd

Danach kann das Gogs Binary heruntergeladen:

wget https://github.com/gogits/gogs/releases/download/v0.6.15/linux_amd64.zip
linux_amd64.zip
unzip linux_amd64.zip

und anschließend entpackt werden. Nachdem man mittels cd in den Ordner gogs gewechselt ist, kann gogs gestartet werden:

./gogs web

Damit wird ein Webserver auf Port 3000 gestartet. Mit dem Aufruf der passenden URL im Browser (z.B. http://example.org:3000) öffnet sich die Installationsroutine von Gogs.

Die Installationsroutine von Gogs

Die Installationsroutine von Gogs

In der Routine wird die gewünschte Datenbank eingestellt und einige weitere Punkte konfiguriert. Die Installationsroutine erstellt eine app.ini im Verzeichnis custom/conf/. Dort können die Optionen später geändert werden. Damit Gogs automatisch startet – wird der Nutzer verlassen und ein Initscript angelegt, an die Konfiguration angepasst und zu den automatisch startenden Prozessen hinzugefügt:

cp /home/gogs/scripts/init/debian/gogs /etc/init.d/gogs
nano /etc/init.d/gogs
chmod +x /etc/init.d/gogs
update-rc.d gogs defaults

Damit sollte sich der Service über:

service gogs start

starten lassen. Bei mir führt das allerdings zu dem Problem das der Service angeblich gestartet wird, aber trotzdem nicht läuft. Wird der Service manuell per:

sh -x /etc/init.d/gogs start

gestartet funktioniert er ohne Probleme – hier ist noch der entsprechende Fehler zu finden.

Wenn man einen Server mit einem Mail Transfer Agent wie Postfix betreibt, kann man von diesem auch Mails versenden. Auf der Konsole ist dies dabei mit dem Kommando mail möglich, welches sich im Paket mailutils befindet. Mit dem Kommando kann mittels:

echo "Nachricht" | mail -s 'Betreff' mail@example.com

eine Mail versandt werden. Natürlich können auch lokale Konten bespielt werden:

echo "Nachricht" | mail -s 'Betreff' root

Damit wird in diesem Fall dem Nutzer root eine Mail gesendet.