CouchDB mit Docker auf dem Raspberry Pi installieren

CouchDB mit Docker auf dem Raspberry Pi installieren

CouchDB gehört zur Familie der NoSQL-Datenbanken. Sämtliche Kommunikation findet über eine HTTP-Schnittstelle statt. Dadurch kann die Datenbank in nahezu jeder Programmiersprache und auf jeder Plattform angesprochen werden – im einfachsten Falle genügt ein HTTP-Client wie wget oder curl, um mit der Datenbank zu kommunizieren.

Auf dem beliebten Einplatinencomputer Raspberry Pi lässt sich CouchDB ebenfalls verwenden. Auch hier wird die Software zunehmend in Containern bereitgestellt. Die von Desktops und Servern bekannten Vorteile bestehen auch hier. Primär geht es um die einfache und strikte Trennung der Anwendungen, ohne tief ins Betriebssystem einzugreifen. Wer CouchDB auf dem Raspberry Pi benutzen möchte, sollte daher über den Einsatz von Docker nachdenken. Vor allem auf den neueren Raspberry Pi Modellen macht dies Sinn. Da sie deutlich leistungsstärker sind (bis zu 8GB RAM beim 4er Modell), lässt sich tendenziell auch mehr Software darauf installieren.

Dockerfile für CouchDB erstellen

Zwar existiert ein offizielles Docker-Image für CouchDB im Hub. Doch es gibt leider bislang noch keine Builds für armv7l. Diese Generation wird auf dem Raspberry Pi 3 Model B Rev 1.2 verwendet. Doch man muss deswegen nicht auf die Verwendung von CouchDB mit Docker verzichten: Nach der Installation einiger Abhängigkeiten lässt sich der Quellcode herunterladen und selbst kompilieren. Selbst auf einem älteren Raspberry Pi 3 ist dies relativ schnell erledigt. Abhängigkeiten zu (externen) Paketquellen werden vermieden.

Zunächst legen wir daher folgendes Dockerfile an. Es empfiehlt sich, zunächst einen Ordner zu erstellen, in dem alle Dateien abgelegt werden.

# https://www.balena.io/docs/reference/base-images/base-images/#notes
FROM balenalib/raspberrypi3:buster
RUN apt-get update \
  && apt-get install -y wget

RUN wget -q http://packages.erlang-solutions.com/debian/erlang_solutions.asc \
  && apt-key add erlang_solutions.asc \
  && apt-get update \
  && rm erlang_solutions.asc

RUN apt-get --no-install-recommends -y install build-essential \
  pkg-config erlang libicu-dev \
  libmozjs185-dev libcurl4-openssl-dev

WORKDIR /opt
RUN wget -O ./couchdb.tar.gz https://downloads.apache.org/couchdb/source/2.3.1/apache-couchdb-2.3.1.tar.gz \
  && mkdir couchdb \
  && tar xfvz couchdb.tar.gz -C couchdb --strip-components=1 \
  && rm couchdb.tar.gz

WORKDIR /opt/couchdb
RUN ./configure
RUN make release

# Listen on all interfaces for docker-compose nat
RUN sed -i 's/;bind_address = 127.0.0.1/bind_address = 0.0.0.0/g' rel/couchdb/etc/local.ini
RUN apt-get remove -y wget build-essential pkg-config erlang libicu-dev libmozjs185-dev libcurl4-openssl-dev

ENTRYPOINT ["/opt/couchdb/rel/couchdb/bin/couchdb"]

# Ressources
# https://github.com/jguillod/couchdb-on-raspberry-pi
# https://andyfelong.com/2019/07/couchdb-2-1-on-raspberry-pi-raspbian-stretch/

Docker-Compose Datei anlegen

Theoretisch könnte man einen einzelnen CouchDB-Container auch mit docker run starten. Es empfiehlt sich jedoch, stattdessen eine docker-compose.yml Datei anzulegen. Schon alleine für die Integration von Anwendungen. Im Regelfall wird man die Datenbank nicht alleine betreiben. Sondern zusammen mit einer Anwendung, die sie nutzt.

In diesem Beispiel wird die Datei docker-compose.yml auf der gleichen Ebene angelegt:

version: '2.4'

volumes:
  couchdb-data:

services:
  couchdb:
    build:
      context: . 
    mem_limit: 256MB
    restart: always
    volumes:
      - couchdb-data:/opt/couchdb/rel/couchdb/data
    ports:
      - 5984:5984

Darin legen wir fest, dass unser zuvor erstelltes Dockerfile als Basis genutzt wird. Darüber hinaus wird der Arbeitsspeicher begrenzt. Vor allem auf älteren RPI-Versionen mit weniger RAM ist dies unbedingt zu empfehlen.

Ferner legen wir ein Volume namens couchdb-data an. Dies ist wichtig, um den Inhalt der Datenbank dauerhaft zu speichern. Ohne Volume wäre der Inhalt flüchtig, was man bei einer Datenbank naturgemäß vermeiden möchte. Schlussendlich wird ein Portmapping für 5984 angelegt. Dies ist der Standard-HTTP Port für CouchDB.

Nun kann das Image gebaut und der Container gestartet werden:

docker-compose up --build -d

Beim ersten Start wird dies aufgrund der Erstellung des Image etwas dauern. Nach einiger Zeit lässt sich die Web-Schnittstelle über http://rpi-host:5984 aufrufen. Das ebenfalls webbasierte Adminstorinterface ist unter http://rpi-host:5984/_utils zu finden.

Verbesserungen für den Produktivbetrieb

Das obige Beispiel zeigt, wie einfach ein POC-Image zur Bereitstellung von CouchDB auf dem Raspberry Pi (oder auch jeder Linux-Distribution mit entsprechendem x86 Base-Image) durchgeführt werden kann. Für den Produktivbetrieb sollten jedoch zumindest ein paar grundlegende Anpassungen vorgenommen werden. Primär dienen diese zur Absicherung der Installation.

Beispielsweise läuft die Datenbank als Root-Benutzer. Zwar im Container und nicht auf dem Host. Dennoch sind diese Rechte nicht notwendig. Es sollte daher ein nicht-priviligierter Benutzer eingerichtet werden, der die Datenbank startet.

Wie bei jeder anderen Datenbank ist das Einrichten der Authentifizierung sinnvoll und wichtig. Vor allem dann, wenn diese nach außen hin erreicht werden kann. Dies ist hier der Fall, da der Port auf die Netzwerkschnittstelle des Raspberry Pi weitergereicht wird. Zwar bedeutet dies nicht zwingend eine Erreichbarkeit über das Internet. Im Regelfall ist der Dienst damit nur im Internen Netzwerk erreichbar, das zusätzlich durch eine Firewall im Router nach außen abgeschottet wird. Dennoch sollte man auch hier nicht komplett auf Authentifizierungsmaßnahmen verzichten. Sonst hat ein Angreifer sofort vollen Zugriff, sobald die Firewall durchbrochen wurde.

Leave a Reply