Så da jeg kom over Andrew Schmelyhuns ping-prosjekt, bestemte jeg meg for å sette opp noe lignende selv.

Litt om termiske skrivere#

Før jeg går inn på hva jeg har fiklet med, synes jeg det er verdt å si litt om hvorfor termiske skrivere er så kule!

Teknologien ble først tatt i bruk på 1930-tallet i medisinske apparater – de tidligste EKG-maskinene brukte varmesensitivt papir for å tegne opp hjerterytmer.

Det store gjennombruddet kom i 1965 da ingeniøren Jack Kilby hos Texas Instruments – samme mann som senere vant Nobelprisen i fysikk for å ha oppfunnet integrerte kretser – patenterte et termisk skriverhode. I 1969 kom Texas Instruments med Silent 700, den første kommersielle maskinen som brukte termisk printing. Den fikk navnet sitt av en god grunn: ingen støy, ingen blekkpatron, ingen bevegelige deler.

Det er nettopp det som gjør teknologien kul. Papiret er belagt med en kjemisk coating som reagerer på varme. Skriverhodet inneholder hundrevis av bittesmå varmeelementer som aktiveres presist, og der varmen treffer papiret, reagerer belegget og farges mørkt. Ingen blekk, ingen toner, ingen bånd – bare varme og kjemi.

Siden 1970-tallet har termiske skrivere vært overalt – kassaapparater, billettsystemer, faksapparater, parkeringsautomater og kortterminaler. Teknologien er billig, rask og krever minimalt vedlikehold. Akkurat derfor er den så utbredt. Og akkurat derfor er den kul å leke med hjemme.

Hva er dette egentlig?#

Enkelt forklart: du går til ping.almenningdata.no, skriver inn en melding, trykker send – og noen sekunder senere skrives meldingen ut på en kvitteringsskriver her hos meg.

Hva trenger du?#

  • En kvitteringsskriver som støtter ESC/POS (eldre Epson-modeller fungerer fint)
  • En Raspberry Pi – jeg brukte en gammel Pi 3 modell b
  • Docker
  • En Cloudflare-konto (gratis)

Slik satte jeg det opp#

1. Raspberry Pi OS#

Jeg flashet Raspberry Pi OS Lite (64-bit) til et SD-kort med Raspberry Pi Imager. Under flashing konfigurerte jeg WiFi, SSH og brukernavn direkte i Imager – så jeg slapp å koble til skjerm og tastatur.

2. Docker#

Etter at Pi-en var oppe installerte jeg Docker:

curl -sSL https://get.docker.com | sh
sudo usermod -aG docker $USER

3. Appen#

Jeg klonet Andrew sitt repo og tilpasset navnet i kontrolleren:

git clone https://github.com/aschmelyun/ping-receipt.git
cd ping-receipt

Siden repoet ikke inkluderer en .env-fil eller kjører composer install i Dockerfilen, måtte jeg oppdatere Dockerfile litt:

FROM php:8.2

ADD ./ /srv/

WORKDIR /srv

RUN apt-get -y update \
    && apt-get install -y libicu-dev curl unzip nodejs npm \
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer install --no-dev --optimize-autoloader
RUN npm install && npm run build
RUN usermod -a -G lp root

USER root
EXPOSE 8000
CMD php artisan serve --host 0.0.0.0 --port 8000

Jeg genererte en APP_KEY og la den inn i .env:

cp .env.example .env
docker run --rm php:8.2 php -r "echo 'base64:' . base64_encode(random_bytes(32)) . PHP_EOL;"
# Lim inn nøkkelen i .env under APP_KEY=

Så satte jeg tidssone i config/app.php:

'timezone' => 'Europe/Oslo',

Og oppdaterte start.sh så containeren starter automatisk og har tilgang til skriveren:

#!/bin/bash
docker run -d \
  --restart unless-stopped \
  --privileged \
  -e TZ=Europe/Oslo \
  -v $(pwd)/database/database.sqlite:/srv/database/database.sqlite \
  -v /dev/usb/lp0:/dev/usb/lp0 \
  -p 8000:8000 \
  ping-app:latest

Bygg og start:

touch database/database.sqlite
docker build -t ping-app:latest .
./start.sh
docker exec $(docker ps -q) php artisan migrate --force

4. Cloudflare Tunnel#

For å gjøre tjenesten tilgjengelig fra internett uten å åpne porter i ruteren brukte jeg Cloudflare Tunnel. Jeg flyttet DNS for almenningdata.no til Cloudflare (nameserverne endres hos domeneregistraren, selve domenet beholdes der det er), og satte opp en tunnel på Pi-en:

cloudflared tunnel login
cloudflared tunnel create ping-rune
cloudflared tunnel route dns ping-rune ping.almenningdata.no

Konfigurasjonsfil i /etc/cloudflared/config.yml:

tunnel: <tunnel-id>
credentials-file: /etc/cloudflared/<tunnel-id>.json

ingress:
  - hostname: ping.almenningdata.no
    service: http://localhost:8000
  - service: http_status:404

Installer som systemd-tjeneste:

sudo cloudflared service install
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

Resultat#

Nå kjører alt automatisk. Pi-en starter Docker-containeren og Cloudflare Tunnel ved oppstart, og ping.almenningdata.no er tilgjengelig hele tiden.

!Image Description