Dienstag, 25. Februar 2020

Raspberrypi 2 als Docker Host

Raspberry PI 2 als Docker Host verwenden

Wer kommt denn auf so eine Idee mag der ein oder andere sagen, ich finds einfach interessant es auszuprobieren. Folgende Grundvoraussetzungen lege ich fest.
  • Raspberry PI 2 Modell
  • 32 Gb SD Card
  • raspbian buster
  • nur die notwendigsten Pakete nachinstallieren
  • eine SSD am USB Port
  • übertakten was geht, aber zuerst default
  • es sollte der cloudserver container funktionieren
  • Erreichbar über Ethernet mit einer statischen IP

Grundinstallation

Raspian Image runterladen, mit dd auf eine SD kopieren und dann nochmal mounten und folgende Dinge vorbereiten, damit der Rapsberry gleich nach dem ersten Start per Ethernet am Netz ist
  • eine leere ssh Datei in /boot positionieren
  • den hostname in /etc/hostname anpassen
  • die statische IP in /etc/dhcpcd.conf eintragen

Nach dem ersten Start

  • ssh login mittels pi und raspberry
  • passwort von pi ändern
  • ssh-keygen damit SSH Keys generiert werden
  • eigenen public key in ~/.ssh/authorized_keys eintragen
  • sudo apt update && sudo apt -y upgrade

Docker installieren

So jetzt zur eigentlichen Docker Installation, folgende Pakete habe ich dafür nachinstalliert.
  • sudo apt install vim vim-syntax-docker docker-compose docker.io 
Damit man mit dem User pi auch docker ohne sudo bedienen kann noch den User pi zur Gruppe docker hinzufügen
  •  sudo usermod -G docker pi
Damit muss man sich entweder neu einloggen oder mit dem Befehl newgrp docker die aktuelle Session aktualisieren.

Die SSD mit einbauen

Die SSD habe ich schon mittels XFS formatiert auf dieser sollen dann die eigentlichen Daten des Containers aber auch die Docker Images liegen, damit diese schneller arbeiten. Normalerweise liegen alle Files von Docker unter /var/lib/docker und damit auf der SD Karte, und die ist gegen die SSD richtig lahm, auch denn der Raspberry PI 2 nur USB 2.0 kann.
  • sudo systemctl stop docker.service
  • sudo mkdir /data
  • sudo mount /dev/sda1 /data
  • sudo mv /var/lib/docker /data
  • sudo ln -s /data/docker /var/lib
  • sudo systemctl start docker.service
Danach ist z.B. das Image bauen um einiges schneller.

Cloudserver Image bauen

Den Cloudserver gibt es nicht für die armv7 Architektur, daher muss man sich das Image aus dem git repository selbst bauen.
  • git clone https://github.com/scality/S3.git
  • cd S3
  • docker build --label cloudserver .
Das hat jetzt bei mir rund 10 Minuten gedauert

real 10m51.271s
user 0m2.531s
sys 0m0.811s


Cloudserver starten
zum starten des Images verwende ich folgendes Skript

#!/bin/bash
# die beiden nachfolgenden Werte sind nicht die ich verwendet habe
ACCESS_ID="845c339e-9a86-fff2-964c-2613b10902d8"
ACCESS_KEY="464492933asdase08b75c56bb3f99d3e43b52148e598a776d6e89e9139763e243"
DATA_DIR="/data/s3/data"
META_DIR="/data/s3/metadata"
docker run -d \
    --name cloudserver \
    -p 8000:8000 \
    -e SCALITY_ACCESS_KEY_ID=$ACCESS_ID \
    -e SCALITY_SECRET_ACCESS_KEY=$ACCESS_KEY \
    -v $DATA_DIR:/usr/src/app/localData \
    -v $META_DIR:/usr/src/app/localMetadata \
    -e ENDPOINT=docker.messner.click \
    -e REMOTE_MANAGEMENT_DISABLE=1 \
    -e S3BACKEND=file \
    cloudserver


Damit das funktioniert habe ich noch folgendes davor gemacht.
  • mkdir /data/s3
  • mkdir /data/s3/data
  • mkdir /data/s3/metadata
  • uuidgen -> das erzeugt die ACCESS_ID
  • openssl rand -hex 32 -> das erzeigt den ACCESS_KEY

Overclocking

Als erstes einfach über raspi-config das Overclocking auf high setzen und den Raspberry neu starten. Ich probier dann einfach nochmal das Image from scratch zu bauen.

Uups - Netzteil ist zu schwach, ich bekomme im dmesg undevoltage Meldungen, also muss ich den Test wohl verschieben.

Sonntag, 23. Februar 2020

Docker container restart policy ändern

Docker Container Restart Policy ändern

Meist ist in den Beschreibungen drinnen wie man mit docker run einen Container so enstellt, dass er automatisch mit docker startet, aber wie macht man das bei einem bereits gestarteten Container macht, insbesondere wenn man ihn nicht neu starten will, habe ich hier beschrieben.

Zuerst schaut man sich die Config des Containers mit docker inspect cloudserver an, dabei ist der Abschnitt Restart Policy wichtig

            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            }


Also ist bei dem Container nichts gesetzt, das ändere ich mit

docker container update --restart "unless-stopped" cloudserver

und shau mir die Config danach noch einmal an

            "RestartPolicy": {
                "Name": "unless-stopped",
                "MaximumRetryCount": 0
            }


Probe dann mit einem Restart des Hosts.

Disable WIFi and Bluetooth auf einem Rapsberrypi 4

Disable WIFI and BT on Raspberrypi in raspbian

Für manche Projekte braucht man einfach kein WIFI und bei BT, bei mir verwende ich den Raspberrypi 4 mit raspbian drauf als docker host am Ethernet. Mit den zwei Einträgen in der /boot/config.txt kann man beie Module deativieren (deaktivieren ist vielleicht nicht ganz richtig, zumindest werden die Treiber nicht geladen)

# disable WIFI and BT on this server
dtoverlay=disable-wifi
dtoverlay=disable-bt




Donnerstag, 20. Februar 2020

Chromium Snap in Ubuntu 19.10 und Flash

Flashplugin in Chromium Snap in Ubuntu 19.10 aktivieren

Und plötzlich nach dem letzten Update geht das Flashplugin im Chromium nicht mehr. Ja, ich weiß, Flash sollte schon seit Jahren nicht mehr benutzt werden, aber das interessiert anscheinend einige Hersteller von Businesssoftware nicht. Zumindest bei zwei wichtigen Applikationen in meinem Beruf komme ich um Flash nicht umhin.
Also Update gemacht - Flash funktioniert nicht, auch wenn ich es erlaube.

cd ~
find /usr -name libpepflashplayer.so
mkdir snap/chromium/current/.local/lib/
 cp /usr/lib/adobe-flashplugin/libpepflashplayer.so snap/chromium/current/.local/lib/
rm snap/chromium/current/.local/lib/libflashplayer.so 


Die Anleitung hae ich von der Seite https://help.ubuntu.com/stable/ubuntu-help/net-install-flash.html.en - gaanz am Ende der Seite

Dienstag, 11. Februar 2020

Raspberry mit OpenWRT und ZTE MF833V

Raspberry mit OpenWRT und LTE Modem

Bei Hofer das ZTE MF833V gekauft, SIM rein und am Laptop mal ausprobiert das Ding generiert über USB eine Netzwerkschnittstelle, einfach einzurichten - am Laptop.

Am OpenWRT muss man noch was nachinstallieren.

opkg install usb-modeswitch kmod-usb-net-cdc-ether
Danach in luci bei interfaces auf add interface, und es ist eine USB Ethernet Schnittstelle vorhanden, bei advanced settings in die WAN Firewall gruppe geben.

Das Interface am USB Modem hat die IP Adresse 192.168.0.1, man sollte com lokalen LAN auf die Webseite zugreifen können.

Der OpenWRT erhält eine dynamische IP im 192.168.0.0 Netzwerk.

Im Lokalen Netzwerk sollte das Netz 192.168.0.0/24 nicht verwendet werden, sonst bekommt man Routing Probleme.

Raspian Buster Headless mit WLAN

Raspbian Buster Headless mit WLAN

Das Image runterladen und auf eine SD brennen, danach nochmal am Laptop einstecken damit die SD nun gemounted wird (ich hab linux da geht das ganz enfach).

anonymous@ws00007999:~/Downloads$ sudo dd if=2019-09-26-raspbian-buster-lite.img of=/dev/mmcblk0 bs=1M
[sudo] Passwort für mesznera:
2144+0 Datensätze ein
2144+0 Datensätze aus
2248146944 Bytes (2,2 GB, 2,1 GiB) kopiert, 190,292 s, 11,8 MB/s
 
anonymous@ws00007999:~/Downloads$ sudo sync

Am /boot Filesystem eine leere ssh Datei anlegen, das startet den SSH Server.

touch ssh

Am / unter /etc/wpa_supplicant eine wpa_supplicant.conf anlegen, in etwa:

country=AT
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="irgendeineSID"
    psk="sowasvongeheim"
}


Danach das Ding einfach starten, vielleicht beim Router mitschauen welche IP der raspberry bekommt und dann den Login probieren.

Wenn der raspberry nicht ans Netz geht, bleibt nicht anderes übrig als auf der SD die Logfiles unter /var/log zu untersuchen. 

MQTT Server mosquitto auf OpenWRT installieren

 MQTT Server am OpenWRT

Für meine IOT habe ich mit einen mosquitto Server auf meinem OpenWRT Router nachinstalliert, dazu auch noch ein Plugin für collectd das statistische Daten vom OpenWRT Router über MQTT verschickt.

opkg install mosquitto
opgk install collectd
opkg install collectd-mod-ping
opkg install collectd-mod-mqtt
opkg install collectd-mod-load

direkt über VPN hat vom ESP nicht funktioniert, deshalb zuerst auf den OpenWRT, dann als Bridge weiter

Brigde ist ziemlich easy in der mosquitto.conf

zum ausprobieren einfach ein einem Terminal ein Subscriber starten

mosquitto_sub -h 192.x.x.3 -t "#"

und in einem anderen einen Publisher
 mosquitto_pub -h 192.x.x.3 -t "som/topic" -m "some_message" 

Die some_message sollte beim Subscriber sichtbar sein.
In dem Beispiel habe ich Security nicht beachtet, jeder aus dem internen LAN kann den MQTT Server erreichen.
 

Samstag, 8. Februar 2020

Docker Images und Container aufräumen

Docker Images und Container aufräumen

Nach einiger Zeit sollte man alte Container und Zwischenimages entfernen um Platz am docker host frei zu bekomme.

Die benötigten Container sollte vor diesem Schritt alle laufen. Dazu verwendet man folgende Befehle.

pi@docker:~ $ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
7c9633c39fdb5279d997e4297d839b62de9e85cfe7c209622c4e6cf09db42f41
9056bacdc968963f8a659b47df6e9f69c70883e2c82ba6c482847f62ae1ae521
53da0935a55d0dfaa1fbd64dbfd7bacc2074b94b377908edf7fa39d0e7833f61
a5b06a8fbc57c20d8f221de0194e1c8d56f190b2be4b5fcc97dc170c0ae76ade
b6ffa7f91fec84b5c0847c802f712d2afb4ab89866d6241f15e5065c7162fba3
48b4128445a2ac8130acd93cf56dc9d2d7da7e9509bc181a9aba21ac9af3d17f
c05271c11ae3daf6712aec5be49a6d75540d1326d99cca9f546ec4fa04a90cff
a6337962cedb07aba8f1684791111faf80c975ef8e5c107333743665824911a2
48cc6ea418c0ca2781f2a0412fe524a64eca2ea7bc3a5a9d715e0c0c279a8512

Total reclaimed space: 159.3MB



und anschließend die Images

pi@docker:~ $ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:d0f4d88581ca101cc6a1b68d608f0013ba8b4f7e2384e39545c632cde59a9454
deleted: sha256:ad81b267e96ac7d255ad7dc634ad3e2d26a7738207d652743f02bcc8cab29333
deleted: sha256:fde3d359b89833896dc01442e910bfb4ae06973eb5b4b6fb1da74a8876cc4276
deleted: sha256:f42cff5b5ec22ec82201e30c77724a73d017292315f9184965b3217296effebc
deleted: sha256:79fc19398748c61113ae9bb96008a92d43c9c7ceb539807244704f53aa8d8707
deleted: sha256:51e4fae07fb8b26cdad0ec3e32a37f15f7a03a80e558a29e024899f5a7badc76
...

sha256:658ed93a9c797a04162e28e56a6923e9d8f33e8283a7e74135018e0eed89707b
deleted: sha256:25dfd9da901de564ce1e843fa9b3bff6b495e798c0dbd80450c4620ba41b8805
deleted: sha256:d7a487af9f946299aacb853c8a0db6f0853a45663f34fb60dc22ac769f85c506
untagged: graphiteapp/graphite-statsd@sha256:b5d360c70a1de7e703b72e822f89fa853c99f972193b146ea7b5e981cf5bcf6a
deleted: sha256:5881ff30f9a57993a8f5e9540f43e2590b5c363f3f943316f20133c1e387cf73
deleted: sha256:2b92e4595dc1e32ded5cb90dc917e2b513292559abf78a8451c9cea836a493fd
deleted: sha256:5946270a64248d9aa5dd6717bc8368b77d68c99edc09671e138d8a09e6881e9e
deleted: sha256:f32d301e6e7d5122e3e0005a58bcc642bce10c0447638477005273b26e8d401d
deleted: sha256:77cae8ab23bf486355d1b3191259705374f4a11d483b24964d2f729dd8c076a0

Total reclaimed space: 926.3MB


Hat bei mir auch 1GB gebracht.

Docker mariadb für raspberrypi

Docker mariadb für raspberrypi

Das offizielle Repository hat kein Image für den raspberrypi, also selbst eines machen. Geht ganz einfach, haben wir gleich

pi@docker:~ $ git clone https://github.com/docker-library/mariadb.git
Cloning into 'mariadb'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 1324 (delta 17), reused 21 (delta 12), pack-reused 1296
Receiving objects: 100% (1324/1324), 252.13 KiB | 952.00 KiB/s, done.
Resolving deltas: 100% (619/619), done.
pi@docker:~ $ cd mariadb/
pi@docker:~/mariadb $ ls
10.1  10.2  10.3  10.4  docker-entrypoint.sh  Dockerfile.template  generate-stackbrew-library.sh  LICENSE  README.md  update.sh
pi@docker:~/mariadb $ cp Dockerfile.template Dockerfile
pi@docker:~/mariadb $ vim Dockerfile





Danach machen wir das Image, haben wir gleich ... !!ACHTUNG!!

Da wwar das haben wir gleich, und alles wird komplizierter.

Das git kann man am raspberrypi leider nicht direkt nutzen, weil es ein mariadb Repository hinzufügt, und dieses Repository leider keine Binary Packages für raspberrypi hat. Also schlägt die Installation von mariadb-server fehl.

Eigentlich ist es mir aber egal, wenn ich nicht die top aktuelle mariab hab, ich bin mit der stock Ubuntu Version auch zufrieden, da nehm ich am liebsten die LTS 18.04

Also eine Kopie des 10.1 Verzeichnisses im mariadb directory angelegt, dann das Dockerfile angepasst.

pi@docker:~ $ diff mariadb/10.1/Dockerfile mariadb/stock/Dockerfile
79c79
< ENV MARIADB_VERSION 1:10.1.44+maria-1~bionic
---
> ENV MARIADB_VERSION 1:10.1.44-0ubuntu0.18.04.1
81,91d80
< # (https://downloads.mariadb.org/mariadb/+releases/)
<
< RUN set -e;\
<     echo "deb http://ftp.osuosl.org/pub/mariadb/repo/$MARIADB_MAJOR/ubuntu bionic main" > /etc/apt/sources.list.d/mariadb.list; \
<     { \
<         echo 'Package: *'; \
<         echo 'Pin: release o=MariaDB'; \
<         echo 'Pin-Priority: 999'; \
<     } > /etc/apt/preferences.d/mariadb
< # add repository pinning to make sure dependencies from this MariaDB repo are preferred over Debian dependencies
< #  libmariadbclient18 : Depends: libmysqlclient18 (= 5.5.42+maria-1~wheezy) but 5.5.43-0+deb7u1 is to be installed
102,104c91
<         "mariadb-server=$MARIADB_VERSION" \
< # mariadb-backup is installed at the same time so that `mysql-common` is only installed once from just mariadb repos
<         mariadb-backup-10.1 \
---
>         mariadb-server \


dann mit

docker build -t mariadb mariadb/stock

erzeugt, hat funktioniert. Sagte ja: "haben wir gleich"

Dann noch ein Startscript run_mariadb.sh

#!/bin/bash
docker run \
    --name mariadb \
    -v /data/mariadb/mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=sagichnicht \
    -d mariadb:latest


und das ganze kann losgehen mit

./run_mariadb.sh

Docker Image updaten

Docker Image updaten

Ich habe seit einiger ein Zeit Docker image für den S3 cloudserver laufen, ich wollte heute mal probieren wie man ein Docker Image updated.

Der Container ist gestartet

pi@docker:~/S3 $ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
81d295a09a05        15ef9ede3b46        "/usr/src/app/docker…"   4 weeks ago         Up 4 weeks          0.0.0.0:8000->8000/tcp   cloudserve


Ich hab das Image selbst aus dem git gebaut, weil es für raspberrpy kein Image gibt. zuerst aktualisier ich ddas git repository

pi@docker:~/S3 $ git pull
remote: Enumerating objects: 202, done.
remote: Counting objects: 100% (202/202), done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 269 (delta 193), reused 198 (delta 192), pack-reused 67
Receiving objects: 100% (269/269), 99.52 KiB | 613.00 KiB/s, done.
Resolving deltas: 100% (206/206), completed with 79 local objects.
From https://github.com/scality/S3
   4332d0a1..fdcbd315  development/8.2                                                      -> origin/development/8.2
 * [new branch]        bugfix/S3C-2502-vault-req-ip-header                                  -> origin/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        bugfix/S3C-2503-allow-multiple-same-email-address-ACLs-in-single-req -> origin/bugfix/S3C-2503-allow-multiple-same-email-address-ACLs-in-single-req
 * [new branch]        bugfix/S3C-2544-diff-acct-metrics                                    -> origin/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        bugfix/setup-maven-https-repo                                        -> origin/bugfix/setup-maven-https-repo
   9c524ca9..396f100a  development/7.4                                                      -> origin/development/7.4
   6f0b50a9..8117dd02  development/7.6                                                      -> origin/development/7.6
 * [new branch]        development/7.7                                                      -> origin/development/7.7
   16b65ed2..6b4671b2  development/8.1                                                      -> origin/development/8.1
 * [new branch]        exp/exposeCountItems                                                 -> origin/exp/exposeCountItems
 * [new branch]        exp/perfMetadata                                                     -> origin/exp/perfMetadata
   dfff880a..1b7aa4f7  hotfix/7.4.5                                                         -> origin/hotfix/7.4.5
 * [new branch]        stabilization/7.6.0                                                  -> origin/stabilization/7.6.0
 * [new branch]        w/7.6/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/7.6/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/7.6/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/7.6/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        w/7.7/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/7.7/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/7.7/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/7.7/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        w/8.1/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/8.1/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/8.1/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/8.1/bugfix/S3C-2544-diff-acct-metrics
 * [new branch]        w/8.2/bugfix/S3C-2502-vault-req-ip-header                            -> origin/w/8.2/bugfix/S3C-2502-vault-req-ip-header
 * [new branch]        w/8.2/bugfix/S3C-2544-diff-acct-metrics                              -> origin/w/8.2/bugfix/S3C-2544-diff-acct-metrics
 * [new tag]           7.6.0.0_rc1                                                          -> 7.6.0.0_rc1
 * [new tag]           7.4.5.1                                                              -> 7.4.5.1
Updating 4332d0a1..fdcbd315
Fast-forward
 .dockerignore                                       |   3 +-
 Dockerfile                                          |   7 +-
 eve/main.yml                                        |   5 ++
 lib/kms/utilities.js                                |   2 +-
 lib/utilities/aclUtils.js                           |  13 ++--
 package.json                                        |   4 +-
 tests/functional/aws-node-sdk/test/bucket/putAcl.js |  19 +++++
 tests/functional/jaws/pom.xml                       |   4 +-
 tests/unit/api/bucketPutACL.js                      |  44 +++++++++++
 yarn.lock                                           | 451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------
 10 files changed, 364 insertions(+), 188 deletions(-)


Aha, neue Commits. Dann lese ich mir genau durch was geändert wurde (ist gelogen ich will hier nur mal probieren wie man den Container aktualisiert)

ich baue ein neues Image

docker build -t cloudserver .
< es folgt sehr viel Output, den ich hier nicht reinschreibe >

ich stoppe den laufenden Container

git stop cloudserver

ich lösche den Container - und jetzt stellt sich wohl jeder die Frage ob wohl alle Daten auf einer persistent Storage sind.

git rm cloudserver

ich starte den Container wieder, dazu habe ich ein kurzen Bash Script.

cloudserver_run.sh

in dem Bashscript stehen alle Startparameter drinnen.
Danach ein kleines Skript gestartet, das den S3 Server testet - haut hin

Montag, 3. Februar 2020

Be warned,

'Haben wir gleich' is a german phrase often IT system engineers use if they think this problem is done in a couple of moments, and the solution is trivial.

Often this type of problem appears to be harder than thought, catastrophic and desastrous. The amount of time used to solve this problem will be exponentially larger than initially planed, and the IT system engineer is near loosing his mind about this case.

So in german never use this sentence, it will bring you bad luck.

Speaking of own experience in IT

OpenWRT 19 und ein Edimax USB WLAN Adapter

Ich kam gerade in die Verlegenheit einen Rapsberry B+ (das erste Modell) als Open-WRT Router für Outdoor neu zu installieren und wollte dabe...