{"id":6895,"date":"2020-07-31T18:06:59","date_gmt":"2020-07-31T16:06:59","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=6895"},"modified":"2022-12-11T16:46:14","modified_gmt":"2022-12-11T14:46:14","slug":"couchdb-mit-docker-auf-dem-raspberry-pi-installieren","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/couchdb-mit-docker-auf-dem-raspberry-pi-installieren\/","title":{"rendered":"CouchDB mit Docker auf dem Raspberry Pi installieren"},"content":{"rendered":"<p>CouchDB geh\u00f6rt zur Familie der NoSQL-Datenbanken. S\u00e4mtliche Kommunikation findet \u00fcber eine HTTP-Schnittstelle statt. Dadurch kann die Datenbank in nahezu jeder Programmiersprache und auf jeder Plattform angesprochen werden &#8211; im einfachsten Falle gen\u00fcgt ein HTTP-Client wie wget oder curl, um mit der Datenbank zu kommunizieren. <\/p>\n<p>Auf dem beliebten Einplatinencomputer Raspberry Pi l\u00e4sst sich CouchDB ebenfalls verwenden. Auch hier wird die Software zunehmend in Containern bereitgestellt. Die von Desktops und Servern bekannten Vorteile bestehen auch hier. Prim\u00e4r geht es um die einfache und strikte Trennung der Anwendungen, ohne tief ins Betriebssystem einzugreifen. Wer CouchDB auf dem Raspberry Pi benutzen m\u00f6chte, sollte daher \u00fcber den Einsatz von Docker nachdenken. Vor allem auf den neueren Raspberry Pi Modellen macht dies Sinn. Da sie deutlich leistungsst\u00e4rker sind (bis zu 8GB RAM beim 4er Modell), l\u00e4sst sich tendenziell auch mehr Software darauf installieren. <\/p>\n<h2 class=\"wp-block-heading\">Dockerfile f\u00fcr CouchDB erstellen<\/h2>\n<p>Zwar existiert ein offizielles Docker-Image f\u00fcr CouchDB im Hub. Doch es gibt leider bislang noch keine Builds f\u00fcr <strong>armv7l<\/strong>. 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\u00e4ngigkeiten l\u00e4sst sich der Quellcode herunterladen und selbst kompilieren. Selbst auf einem \u00e4lteren Raspberry Pi 3 ist dies relativ schnell erledigt. Abh\u00e4ngigkeiten zu (externen) Paketquellen werden vermieden.<\/p>\n<p>Zun\u00e4chst legen wir daher folgendes <strong>Dockerfile<\/strong> an. Es empfiehlt sich, zun\u00e4chst einen Ordner zu erstellen, in dem alle Dateien abgelegt werden.<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\"># https:\/\/www.balena.io\/docs\/reference\/base-images\/base-images\/#notes\nFROM balenalib\/raspberrypi3:buster\nRUN apt-get update \\\n  &amp;&amp; apt-get install -y wget\n\nRUN wget -q http:\/\/packages.erlang-solutions.com\/debian\/erlang_solutions.asc \\\n  &amp;&amp; apt-key add erlang_solutions.asc \\\n  &amp;&amp; apt-get update \\\n  &amp;&amp; rm erlang_solutions.asc\n\nRUN apt-get --no-install-recommends -y install build-essential \\\n  pkg-config erlang libicu-dev \\\n  libmozjs185-dev libcurl4-openssl-dev\n\nWORKDIR \/opt\nRUN wget -O .\/couchdb.tar.gz https:\/\/downloads.apache.org\/couchdb\/source\/2.3.1\/apache-couchdb-2.3.1.tar.gz \\\n  &amp;&amp; mkdir couchdb \\\n  &amp;&amp; tar xfvz couchdb.tar.gz -C couchdb --strip-components=1 \\\n  &amp;&amp; rm couchdb.tar.gz\n\nWORKDIR \/opt\/couchdb\nRUN .\/configure\nRUN make release\n\n# Listen on all interfaces for docker-compose nat\nRUN sed -i &#039;s\/;bind_address = 127.0.0.1\/bind_address = 0.0.0.0\/g&#039; rel\/couchdb\/etc\/local.ini\nRUN apt-get remove -y wget build-essential pkg-config erlang libicu-dev libmozjs185-dev libcurl4-openssl-dev\n\nENTRYPOINT [&quot;\/opt\/couchdb\/rel\/couchdb\/bin\/couchdb&quot;]\n\n# Ressources\n# https:\/\/github.com\/jguillod\/couchdb-on-raspberry-pi\n# https:\/\/andyfelong.com\/2019\/07\/couchdb-2-1-on-raspberry-pi-raspbian-stretch\/\n<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Docker-Compose Datei anlegen<\/h2>\n<p>Theoretisch k\u00f6nnte man einen einzelnen CouchDB-Container auch mit <strong>docker run<\/strong> starten. Es empfiehlt sich jedoch, stattdessen eine <strong>docker-compose.yml<\/strong> Datei anzulegen. Schon alleine f\u00fcr die Integration von Anwendungen. Im Regelfall wird man die Datenbank nicht alleine betreiben. Sondern zusammen mit einer Anwendung, die sie nutzt.<\/p>\n<p>In diesem Beispiel wird die Datei <strong>docker-compose.yml<\/strong> auf der gleichen Ebene angelegt:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nversion: &#039;2.4&#039;\n\nvolumes:\n  couchdb-data:\n\nservices:\n  couchdb:\n    build:\n      context: . \n    mem_limit: 256MB\n    restart: always\n    volumes:\n      - couchdb-data:\/opt\/couchdb\/rel\/couchdb\/data\n    ports:\n      - 5984:5984\n<\/pre>\n<\/div>\n<p>Darin legen wir fest, dass unser zuvor erstelltes <strong>Dockerfile<\/strong> als Basis genutzt wird. Dar\u00fcber hinaus wird der Arbeitsspeicher begrenzt. Vor allem auf \u00e4lteren RPI-Versionen mit weniger RAM ist dies unbedingt zu empfehlen. <\/p>\n<p>Ferner legen wir ein Volume namens <strong>couchdb-data<\/strong> an. Dies ist wichtig, um den Inhalt der Datenbank dauerhaft zu speichern. Ohne Volume w\u00e4re der Inhalt fl\u00fcchtig, was man bei einer Datenbank naturgem\u00e4\u00df vermeiden m\u00f6chte. Schlussendlich wird ein Portmapping f\u00fcr 5984 angelegt. Dies ist der Standard-HTTP Port f\u00fcr CouchDB.<\/p>\n<p>Nun kann das Image gebaut und der Container gestartet werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">docker-compose up --build -d<\/code><\/pre>\n<p>Beim ersten Start wird dies aufgrund der Erstellung des Image etwas dauern. Nach einiger Zeit l\u00e4sst sich die Web-Schnittstelle \u00fcber <strong>http:\/\/rpi-host:5984<\/strong> aufrufen. Das ebenfalls webbasierte Adminstorinterface ist  unter <strong>http:\/\/rpi-host:5984\/_utils<\/strong> zu finden.<\/p>\n<h2 class=\"wp-block-heading\">Verbesserungen f\u00fcr den Produktivbetrieb<\/h2>\n<p>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\u00fchrt werden kann. F\u00fcr den Produktivbetrieb sollten jedoch zumindest ein paar grundlegende Anpassungen vorgenommen werden. Prim\u00e4r dienen diese zur Absicherung der Installation.<\/p>\n<p>Beispielsweise l\u00e4uft 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.<\/p>\n<p>Wie bei jeder anderen Datenbank ist das Einrichten der Authentifizierung sinnvoll und wichtig. Vor allem dann, wenn diese nach au\u00dfen 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 \u00fcber das Internet. Im Regelfall ist der Dienst damit <em>nur<\/em> im Internen Netzwerk erreichbar, das zus\u00e4tzlich durch eine Firewall im Router nach au\u00dfen abgeschottet wird. Dennoch sollte man auch hier nicht komplett auf Authentifizierungsma\u00dfnahmen verzichten. Sonst hat ein Angreifer sofort vollen Zugriff, sobald die Firewall durchbrochen wurde.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>CouchDB geh\u00f6rt zur Familie der NoSQL-Datenbanken. S\u00e4mtliche Kommunikation findet \u00fcber eine HTTP-Schnittstelle statt. Dadurch kann die Datenbank in nahezu jeder Programmiersprache und auf jeder Plattform angesprochen werden &#8211; im einfachsten Falle gen\u00fcgt ein HTTP-Client wie wget oder curl, um mit der Datenbank zu kommunizieren. Auf dem beliebten Einplatinencomputer Raspberry Pi l\u00e4sst sich CouchDB ebenfalls verwenden. &#8230;<\/p>\n","protected":false},"author":5,"featured_media":6907,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[883,671],"tags":[770,497,822,639],"class_list":["post-6895","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker-containertechnologie","category-raspberry-pi","tag-couchdb","tag-docker","tag-nosql","tag-raspberry-pi"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=6895"}],"version-history":[{"count":4,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6895\/revisions"}],"predecessor-version":[{"id":6908,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/6895\/revisions\/6908"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/6907"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=6895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=6895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=6895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}