Eigenes Gitbucket mit Qnap NAS und Docker

Auf den NAS Speichern von Qnap ist es möglich Docker Container laufen zu lassen. Dadurch kann man auch Gitbucket auf dem NAS laufen lassen und so sein eigenes “github” im Netzwerk haben. Gitbucket ist eine Webanwendung welche die Funktionen von Github beinhaltet (minimale Funktionen). Aber Schritt für Schritt. Zuerst wählt man auf dem NAS Speicher die Anwendung “Container Station” und wählt neuen Container erstellen. Dann verwendet man die Suche und sucht nach “hiono/gitbucket”. Beim erstellen am besten immer den Tab “Docker Hub” verwenden, damit man die aktuellste Version verwendet. Es ist zu empfehlen direkt eine Version auszusuchen anstatt latest. Dazu aber später mehr. Wichtig bei den Daten sind dann zwei Einstellungen unter “Erweiterte Einstellungen”:

  • Netzwerk - hier empfiehlt es sich zwei feste Ports zu vergeben. Einen für die Weboberfläche und einen für SSH. Wenn diese fest definiert werden, dann müsst ihr später bei einem Wechsel nicht immer die Ports anpassen
  • Freigabeordner - hier müsst ihr den Pfad “/var/gitbucket” mit einem Verzeichnis auf eurem Nas Speicher verbinden. Dadurch könnt ihr später die Docker Container austauschen ohne die Daten migrieren zu müssen. Da die Daten dann nicht im Container liegen, sondern als Volume gemountet werden.

Danach einfach erstellen und nutzen. Wie updatet man auf eine neue Version von gitbucket?

  1. Alten Container stoppen
  2. Neues Image von Docker Hub mit der letzten Version auswählen
  3. Beim Image die gleichen Ports für Netzwerk wie beim alten Container eintragen
  4. Beim Image den gleichen Freigabe Ordner wie beim alten Container eintragen
  5. Container erstellen und starten
  6. Prüfen
  7. Alten Container löschen oder automatisches Starten deaktivieren, falls man sich nicht sicher ist.

Das Docker Image ist das folgende: https://hub.docker.com/r/hiono/gitbucket/

Mit rsync automatisches Backup auf ein NAS Speicher

Im folgenden erkläre ich wie man seine lokalen Ordner mit einem einfachen Script mittels rsync auf ein NAS sichern kann. Zudem wird das Script nur ausgeführt wenn ich mich im richten WLAN befinde. Zuerst benötigt man dafür auf dem NAS so genannte “Module” für Rsync. Das sind freigegebene Ordner. Diese kann man sich mit ssh unter /etc/rsyncd.conf anschauen oder bei qnap unter Privilegieneinstellungen >> Freigabe-Ordner (shared folders). Das editieren der rsyncd.conf ist nicht zu empfehlen, da diese z.B. bei der Vergabe eines neuen Passworts für rsync automatisch zurückgesetzt wird bzw. durch Firmware updates auf den meisten NAS Speichern verändert werden könnte. Bei Qnap könnt ihr Rsync unter der App “Sicherungsstrategien” oder “Hybrid Backup - Sync beta” aktivieren. Dort wird auch das Passwort vergeben. Alternativ kann auch ein SSH User verwendet werden, jedoch ist bei Qnap das nur mit dem Admin User möglich. Ansonsten muss bei Qnap ein anderer SSH Server installiert werden. Aber nun zum eigentlichen rsync aufruf. Zum Testen könnt ihr folgendes verwenden:

rsync -aPuvb –modify-window=1 –exclude “.@__thumb” –delete –backup-dir ‘../backupOrdnerAufDerNasfuergeloeschteDateien’ –stats – /PfadZumOrdnerWelcherAufDerNasGesichertWerdenSoll/ rsyncusername@NAS-IP-ADRESSE::SharedFolderNameAufDerNAS/beiBedarfHierUnterverzeichnisseAngeben

Nach der Eingabe kommt eine Meldung mit der Frage nach dem Passwort für rsync, welches Ihr zuvor eingerichtet habt. Falls SSH verwendet werden soll, dann

rsyncusername@NAS-IP-ADRESSE::SharedFolderNameAufDerNAS/beiBedarfHierUnterverzeichnisseAngeben

mit dem folgendem ersetzten

username@NAS-IP-ADRESSE:/PfadAufDerNasZuEuremZielVerzeichniss

Was die Parameter bedeuten wird kurz erklärt:

  • –modify-window=1 => Bei Windows und Samba kann es zu Problemen mit der Übertragungszeit kommen, hierdurch wird Unschärfe ermöglicht. Dadurch wird verhindert das die Datei auf der NAS neuer ist wie die Lokale
  • –exclude “.@__thumb” => Beachtet automatisch erstelle Thumbmails nicht, sehr praktisch bei vielen Bilder Übertragungen
  • -b –delete –backup-dir ‘../BackupVerzeichnis’ => Es werden lokal gelöschte Dateien auch auf dem Zielsystem gelöscht. Aber zur Sicherheit in den angegeben Ordner verschoben (-b)
  • –stats => Ausgabe der Statistik bezüglich der Änderungen an den Dateien
  • -u => überspringt Dateien, die im Ziel neuer sind als in der Quelle
  • -P => Fortschrittsanzeige und Fortsetzung des Transfers bei Abbruch
  • -v => zeigt während des Synchronisierens alle ausgeführten Schritte an

Damit das ganze auch ohne Passwort funktioniert muss man das noch mit

–password-file=filewithpassowrd.txt

erweitern. In diese Datei schreibt man dann das Rsync Passwort und setzt die Lese und Schreibrechte für die Datei entsprechend so das nur das Script die Datei lesen kann. Damit nicht ständig versucht wird einen Server anzufragen obwohl man nicht zu Hause im eigenen WLAN ist - kann man das Script um folgendes erweitern:

essid=$(iwgetid -r)
echo $essid;
if [ “$essid” = “NameDeinesWlansZuHause ]
then

#rsync staff
else
echo “Wrong WLAN”
fi

Das ganze Beispiel Script findet ihr hier unter https://gist.github.com/lightszentip/9558283d339c4cb19d5b691fae0e060a Um das script automatisch ausführen zu lassen bietet sich ein crontab mit der Ausgabe in eine LogDatei an “>> naslogresult.log

Jenkins Pipeline

Die neue Pipeline Funktion von Jenkins kann mit Jenkins 1.x und 2.x verwendet werden. Bei Jenkins 2.x gibt es aber auch noch ein Plugin um die einzelnen Stages in einer View zu visualisieren. Für die Pipeline gibt es auch einen Snippet Generator unter http://localhost:8080/jenkins/job/Pipelinetest/pipeline-syntax/. Mit dessen Hilfe kann man für die meisten Anwendungsfälle Snippets generieren und diese dann nach den eigenen Anforderungen anpassen. Der Beispiel Code für einen Github checkout und Maven aufruf sieht dabei wie folgt aus:

node {
// Mark the code checkout ‘stage’….
stage ‘Checkout’
// Get some code from a GitHub repository
git url: ‘https://github.com/jglick/simple-maven-project-with-tests.git'
// Get the maven tool.
// ** NOTE: This ‘M3’ maven tool must be configured
// ** in the global configuration.
def mvnHome = tool ‘M3’
// Mark the code build ‘stage’….
stage ‘Build’
// Run the maven build
sh “${mvnHome}/bin/mvn -Dmaven.test.failure.ignore clean package”
step([$class: ‘JUnitResultArchiver’, testResults: ‘*/target/surefire-reports/TEST-.xml’])
}

Dabei sieht man auch die Änderungen bei Jenkins 2, das Thirdparty Komponenten wie Maven über Variablen und nicht mehr über Pfad Angaben in der Konfiguration gemanagt werden. Die „stage“ aufrufe bilden dabei die einzelnen Schritte welche auch in der Stage View sichtbar sind.

Slim und Ionic und CORS

Wer sich mit Slim und Ionic ein kleine App und Rest Api bauen möchte, kann schnell mit dem Thema CORS in Kontakt kommen. Besonders beim testen auf der lokalen Maschine. Damit es auch lokal funktioniert. Müssen die folgenden Zeilen am Anfang der index.php hinzugefügt werden (am besten ganz oben):

header(‘Access-Control-Allow-Origin: *’);
header(“Access-Control-Allow-Headers: Origin, Content-Type, Authorization”);
header(“Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS, DELETE”);

Dabei kann man natürlich auch die Freigabe auf bestimmte Domains einschränken. Falls man diese drei Zeilen jedoch nicht hinzufügt, erhält man bei einem http.get(…) die folgende Fehlermeldung:

{“_body”:{“isTrusted”:true},”status”:0,”ok”:false,”statusText”:””,”headers”:{},”type”:3,”url”:null}

Installation Jenkins 2.x mit Tomcat

Im folgenden Beitrag beschreibe ich die Installation eines Jenkins 2.x in einem Tomcat8. Es ist auch möglich den Jenkins ohne Tomcat laufen zu lassen.

Schritt 1

Installation Tomcat8 unter Linux mit

sudo apt-get install tomcat8

alternativ kann auch die aktuelle Version unter https://tomcat.apache.org/download-80.cgi heruntergeladen werden und entpackt werden. Dieses Vorgehen ist für Windows zu empfehlen. Unter Linux ist der Tomcat nach der Installation unter /var/lib/tomcat8/ zu finden. tomcat8

Schritt 2

Damit Jenkins im Tomcat richtig starten kann, muss JENKINS_HOME im Tomcat Environment gesetzt werden. Alternativ kann JENKINS_HOME auch als Umgebungsvariable gesetzt werden, was aber das betreiben mehrerer Jenkinses auf einem Server verhindert. Der folgende Code wir in der Datei conf/context.xml eingefügt:

Bitte “/path/to/jenkins_home/“ durch den Pfad zum Jenkins Home zu ersetzen, z.B. zum eines Jenkins Users oder unter opt. Zur Perfomancesteigerung kann man noch die Datei bin/setclasspath.sh editieren. Unter Linux findet man diese unter /usr/share/tomcat8/bin/. Dort fügt man folgende Zeile ein (bei Bedarf können die Werte angepasst werden)

CATALINA_OPTS=”$CATALINA_OPTS -Xmx1024m -Xms512m”

Die Bedeutung von Xmx und Xms findet man unter https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/optionX.html

Schritt 3

Jetzt kann man sich die aktuelle Jenkins Version von http://mirrors.jenkins-ci.org/war/latest/ herunterladen. Die war Datei muss dann nur in webapps Ordner verschoben werden und der Tomcat gestartet werden.

cd webapps
wget http://mirrors.jenkins-ci.org/war/latest/jenkins.war

Danach im Browser http://localhost:8080/jenkins aufrufen. Sollte der Tomcat nach außen erreichbar sein, ist es zu empehlen von http auf https umzustellen.

Unlock Jenkins

Damit ihr euch initial in den Jenkins einloggen könnt, müsst ihr eine Datei öffnen und das dort vorhandene Passwort kopieren. Die Datei findet ihr in eurem JENKINS_HOME Verzeichnis unter secrets/initialAdminPassword. Sollte sich die Seite obwohl das richtige Password eingegeben wurde, wieder mit Unlock Jenkins melden - ist es zu empfehlen auf einen anderen Browser auszuweichen. So hat es z.B. mit der aktuellen Chrome-Beta Version bei nicht funktioniert, aber mit dem Firefox.

Customize Jenkins

jenkins2_step1 Ich würde “Install suggested plugins” empfehlen. Dort hat man alle wichtigen und benötigten Plugins enthalten. Wer möchte kann aber auch gerne die Plugins selbst auswählen, nur ist die Auswahl hier genauso groß wie für Jenkins 1.x. jenkins2_step2

Create First Admin User

Hier kann man nun einen neuen Admin User anlegen und auch ein neues Passwort setzten, damit wird das initial Passwort wertlos. Alternativ könnt ihr auch auf “Continue as admin” klicken, damit wird das erstellen des Admin Accounts abgebrochen und der User “admin” mit dem Passwort aus der initialAdminPassword Datei bleibt bestehen.

Complete

Damit ist der Jenkins eingerichtet. Das erstellen eines Jobs mit dem neuen Pipeline Feature werde ich in einem anderen Beitrag näher erläutern.

Spring Boot - autoreload

Wer bei Spring Boot auch die Autoreload funktion haben möchte, muss die dependencie devtools einbinden:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

dependencies {
compile(“org.springframework.boot:spring-boot-devtools”)
}

Dann wird bei jeder Änderung im Classpath, die Anwendung restartet. Weitere Einstellungsmöglichkeiten findet ihr unter http://docs.spring.io/spring-boot/docs/1.3.x-SNAPSHOT/reference/html/using-boot-devtools.html

Ionic - Anzeigen des Settings Menü GPS

Damit man mit Ionic dem User auch Anzeigen kann das die GPS Daten nicht vorhanden sind und er diese im Settings Menü ändern muss, braucht man die folgenden beiden Plugins cordova-plugin-request-location-accuracy cordova-diagnostic-plugin Mit diesen kann man abfrage ob GPS aktiviert ist und auch den Benutzer zum jeweiligen Menü des OS zu schicken. Damit ist es wie in einer normalen Android App möglich ein “Bitte aktivieren Sie Google Standortdienste” Fenster anzuzeigen.

Spring Boot - Externe Template Dateien verwenden

Spring Boot - Thymeleaf FileTemplateResolver

Wer eine Spring Boot Anwendung baut möchte vielleicht das ein Frontend Entwickler sich um die Thymeleaf Seiten kümmert. Damit aber Spring Boot nicht bei jeder Änderung neugestartet werden muss und der Entwickler einfach das vorhandene jar/war verwenden kann, muss man einen FileTemplateResolver hinzufügen. Spring Boot selbst liefert keine Implementierung des FileTemplateResolver, deswegen muss man ihn per @Configuration selbst hinzufügen. Wichtig ist auch das dieser mit @PostConstruct erzeugt wird. Wenn man die folgende Methode integriert hat kann man seine Anwendung mit -Dspring.thymeleaf.fileresolver.prefix=pathtotemplatefiles starten. Wichtig ist aber da man seine Konfigurationsdatei um den Eintrag “spring.thymeleaf.template-resolver-order=10” erweitert (yml: spring.thymeleaf.template-resolver-order: 10). Die folgende Java Klasse aktiviert einen FileTemplateResolver in Spring Boot welcher mit “spring.thymeleaf.fileresolver.**” Konfigurationen konfiguriert werden kann

Pleskbackup with Cronjob

Um ein nightly Backup von Plesk zu erstellen kann das command line Tool “pleskbackup” von Plesk verwendet werden. Dazu eine Datei mit dem Namen “backup.sh” erstellen und mit dem folgenden Inhalt:

#!/bin/bash
/opt/psa/bin/pleskbackup server –output-file=/pathtobackupfile/backupfilenightlyname.tgz

Danach dann unter Plesk >> Tools >> Geplante Aufgaben >> root >> Neue Aufgabe hinzufügen => als Aufruf sh /pathtofile/backup.sh eintragen