Gilles.is

/Today/20201113-Vandaag-13-November-2020

Toggle Light


By Gilles Trenson
this is a 3 minutes read
39 paragraphs

Vandaag 13 November 2020

Raspberry Pi als PaaS - Part 1

PaaS - Platform as a Service

Doelstelling

Ik had het idee om een Zettlekasten1 systeem op te zetten die zowel te bereiken was m'n laptop als op m'n iOS devices. Bovendien voorzie ik mijn notities van Frontmatter en heb ik het doel om een Gatsby aan te maken om m'n notities ook beschikbaar te maken op het web.

Op mijn iPad heb ik Working Copy en Editorial geinstalleerd. Deze zouden me toe moeten laten om ook op de iPad m'n Zettlekasten systeem uit te bouwen. Editorial laat toe om custom scripts te schrijven in Python om bijvoorbeeld een Today note aan te maken, of om afbeeldingen in te voegen. Om ongestoord notities te kunnen aanmaken op zowel de iPad als m'n laptop, zou ik een Git version control systeem opzetten op de Raspberry Pi.

Uitwerking

Raspberry Pi

Op Github kwam ik twee interessante projecten tegen. In het verleden ging ik al even aan de slag met Dokku, een PaaS implementatie op basis van Docker Containers. Op zich een interessante oplossing, maar al snel bleek het minder interessant voor de Raspberry Pi. Veel Docker images zijn niet gecompileerd voor een ARM processor. Een andere uitwerking, Piku biedt een antwoord op deze tekortkomingen.

piku, inspired by dokku, allows you do git push deployments to your own servers.

Enerzijds wens ik mijn notities openbaar en toegankelijk te maken en anderzijds wens ik een eenvoudige manier te voorzien om notities te synchroniseren tussen verschillende apparaten. Eingelijk bestaat m'n oplossing dus uit twee verschillende projecten:

  1. Zettlekasten - Git repository om notities centraal op te slaan en uit te wisselen tussen de verschillende apparaten
  2. Gatsby blog - Git repository die periodiek of bij een update van de Zettlekasten een statische GatsbyA cool plugin website aanmaakt.

Het eerste deelproject kan een bare Git repository zijn op de Raspberry Pi. Hoe dan ook moet de Raspberry Pi opereren als een git server. Ik koos er voor om GitLab community edition te installeren. Installatie

Open netwerk Raspberry Pi

Om van buitenaf de Git repository te bereiken moet de Raspberry Pi te bereiken zijn van buitenaf. Het IP adres van de Pi is variabel. Om de Pi bereikbaar te maken dacht ik direct aan een service zoals noip.com, een zogenaamde Dynamic DNS service.

Een installatiegids voor de NoIP DUC Dynamic Update Client vind je terug op hun website. Na de installatie configureer je de poorten die je wenst open te zetten voor het ip-adres van je Pi.

Een bijkomend probleem die ik heb is dat de router geen Port Forwarding toe laat. Dit probleem kan opgelost worden door een VPN op te zetten naar een server met een statisch ip-adres. Hiervoor heb je een VPS of Vertial Private Server nodig zoals Amazon EC2. De VPS treedt op als host terwijl de Raspberry Pi de client is. Eén mogelijke uitwerking wordt hier beschreven. Voorbeeld van een VPS is Vultr wat je 2.5 euro per maand kost - zie tip.

Ngrok kan ook ingezet worden om http services of ssh te delen. Met de gratie versie wordt wel telkens een nieuw adres aangemaakt wanneer je ngrok start.

vim touch /lib/systemd/system/ngrok.service

De service configureer je als volgt:

[Unit]
Description=Ngrok
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/ngrok start -config /home/pi/.ngrok2/ngrok.yml --all
Restart=on-abort
[Install]
WantedBy=multi-user.target

Nadien start je de service op:

systemctl daemon-reload
sudo systemctl enable ngrok.service
sudo systemctl start ngrok.service

Om de url op te halen waarop de tunnel actief is, kun je het volgende gebruiken, dit met jq dat je kan downloaden via sudo apt-get install jq:

curl --silent http://127.0.0.1:4040/api/tunnels | jq '.tunnels[0].public_url'

Om enkel het ip-adres te bekomen van het Ngrok endpoint.

curl --silent http://127.0.0.1:4040/api/tunnels | jq '.tunnels[0].public_url' | xargs host | awk '/has address/ { print $4 ; exit }'

UPDATE: Maak gebruik van telebit om je SSH tunnel open te zetten. Het gebruik is heel gelijkaardig aan Ngrok, maar het is gratis + vaste domeinnaam!

Telebit wordt geïnstalleerd in je gebruikersfolder, maar ik heb het verzet zodat het gemakkelijk bruikbaar wordt:

sudo mv ~/telebit /usr/bin/telebit

Nu gebruik je telebit ssh auto om een SSH tunnel op te zetten of telebit http 80 om de webserver op poort 80 open te zetten naar het web.

De website is te bereiken via sharp-snake-13.telebit.io. Verbinding maken via ssh doe je als volgt:

ssh -o ProxyCommand='openssl s_client -connect %h:443 -servername %h -quiet' [email protected]

Interessante blogpost

Ander interessante blogposts die ik tegen kwam tijdens m'n onderzoek:


  1. Een Zettlekasten in het Duits vertaal je simpelweg tot een Fichebak. De Zettlekasten method is geïnspireerd op de werkwijze die Niklas Luhmann hanteerde doorheen zijn leven - zie zettelkasten.de voor meer informatie.