Raspberry Pi als PaaS - Part 1
PaaS -
Platform as a ServiceDoelstelling
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.
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 bydokku, allows you dogit pushdeployments 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:
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
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.
ngrok http 80ngrok tcp 22
Om Ngrok bij het opstarten te starten, kunnen we gebruik maken van pm2 een process manager gemaakt in NodeJs. Dit kan ook met Systemd gemaakt worden. vim touch /lib/systemd/system/ngrok.service
De service configureer je als volgt:
[Unit]Description=NgrokAfter=multi-user.target[Service]Type=simpleExecStart=/usr/bin/ngrok start -config /home/pi/.ngrok2/ngrok.yml --allRestart=on-abort[Install]WantedBy=multi-user.target
Nadien start je de service op:
systemctl daemon-reloadsudo systemctl enable ngrok.servicesudo 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:
Ander interessante blogposts die ik tegen kwam tijdens m'n onderzoek: