Lebensmittel entsorgen ist nicht schön, aber dennoch passiert es schnell, dass man etwas aus den Augen verliert, und das entsprechende Produkt dann soweit über dem Mindesthaltbarkeitsdatum liegt, dass man es besser nicht mehr verwendet.
Hat man den Kühlschrank meistens noch recht gut im Überblick, können Dinge im Vorratsschrank oder Keller, gemäß dem Motto, „aus den Augen aus dem Sinn“ schon eher mal in Vergessenheit geraten.
Hier hilft grocy. Hat man erst einmal alle Produkte eingegeben und Ihnen Barcodes zugeordnet, wie man sie auf fast jedem Produkt findet, und sie mit entsprechenden Mindesthaltbarkeitsdaten versehen, erhält man in Grocy eine gute übersichtliche Bestandsliste.

Jedoch kann Grocy auch noch viel mehr.
Grocy ist eine Open-Source-Software die bei der Haushaltsführung unterstützen soll. In ihr kann man Lebensmittel und andere Verbrauchsmaterialien komfortabel verwalten, aber ebenso regelmäßig anstehende Hausarbeiten/andere Aufgaben die im Haushalt anfallen.
Bestand: Nutzer können ihre Haushaltsvorräte (Lebensmittel und andere Verbrauchsgegenstände) in Grocy mit Mindesthaltbarkeitsdaten und Standorte eintragen. So hat man stets im Blick, was wo vorrätig ist und bis wann verbraucht sein sollte.
Einkaufszettel: Basierend auf dem aktuellen Vorrat, dem vorgegebenen Mindestbeständen und Rezepten kann Grocy Einkaufslisten generieren. Diese Listen können angepasst und beim Einkauf verwendet werden. Ist das Grocy via Internet erreichbar (z.B. über eine Portfreigabe oder einen Reversproxy, oder indem es auf einer vm läuft z.B. bei Hetzner), können die Einkaufsliste auch auf dem Handy verwaltet werden.
Rezepte: Grocy ermöglicht die Verwaltung von Rezepten und die Planung von Mahlzeiten. Dabei kann überprüft werden, ob die erforderlichen Zutaten vorrätig sind oder ob sie eingekauft werden müssen.
Speiseplan: Mit Grocy kann ein wochenbasierter Speiseplan erstellt werden,
Hausarbeiten: Hier können regelmäßg anfallende Aufgaben eingegeben und verwaltet werden, um z.B. nicht mehr zu vergessen die gelben Säche oder die grüne Tonne zur passenden Zeit an die Straße zu stellen
Aufgaben: Hier können andere Aufgaben verwaltet werden.
Batterien: Meint den Feldern nach eigentlich Akkus, hier kann hinterlegt werden welche Akkus/Batterien regelmäßig geladen werden müssen und wann dies am sinnvollsten erfolgen kann.
Ausstattung: Hier können zu technischen Geräten einfach auffindbar Notizen oder Anleitungen hinterlegt werden, um das Papierchaos und ggf. den Suchaufwand nach einer Garaniequittung, wenn man sie vorher entsprechend hinterlegt hat, zu reduzieren.
Kalender: Der Kalender zeigt alle hinterlegten Daten an, d.h. wann Lebensmittel ablaufen, welche Aufgaben wann fällig sind.
Ich widme der schönen Software daher hier eine kleine Artikelreihe:
1.technische Vorüberlegungen
1.1 Installation
1.2 Transportabsicherung
1.3 Problem: DNS-Rebind
1.4 Grundabsicherung via Hetzner Firewall, ufw, fail2ban (bei Betrieb als exposed Host oder anderweitig direkt erreichbar aus dem Internet)
2.Grundeinrichtung (erste Dateneingabe)
3.Nutzung im Alltag
4.Datensicherung
1.technische Vorüberlegungen
Es gibt Grocy in verschiedenen „Geschmacksrichtungen“. Es kann als Plugin des Home Assistant betrieben (https://www.home-assistant.io/ ) werden (grocy als Plugin Home Assistant = https://community.home-assistant.io/t/home-assistant-community-add-on-grocy/112422), als Programm unter Windows (Grocy Desktop für Android oder Windows=https://grocy.info/, eine deutsche Fassung der Seite ist hier erreichbar = https://grocy.info/de), als Applikation auf einer virtuellen Maschine bei einem Provider (z.B. Hetzner) oder zuhause auf einem R-Pi.
Je nachdem wie man die Softwar einsetzen will, sind eine Vorüberlegungen sinnvoll.
1.Soll Grocy aus dem Internet erreichbar sein oder von mehreren Personen verwendet werden, würde ich es nicht als Applikation auf nur einem Gerät installieren (egal ob Windows oder Android), sondern zentral auf einem Webserver laufen lassen.
2.Wie und wo werden die Daten in Grocy eingegeben?
2.1 Wo und auf welchen Geräten werden die Daten eingegeben (z.B. im Vorratskeller und in der Küche)? Werden Daten von mehreren Orten aus eingegeben scheint mir eine zentrale Installation sinnvoll.
2.1 Werden kritische Daten (Passwörter/Benutzernamen) über unsichere Verbindungswege übertragen (unverschlüsseltes WLAN, Internet). Dann ist es sinnvoll das Webinterface mit ssl abzusichern.
2.2 Soll der Zugriff über Geräte erfolgen, auf denen ich keine eigenen Zertifizierungsstellen hinterlegen kann? Dann ist es sinnvoll weltweit erreichbare Domains und offizielle Zertifikate zu verwenden.
3.Soll Grocy nachhaltig eingesetzt werden ist es überdies sinnvoll zumindest die wichtigsten Daten der Installation zu sichern. Sollte es dann einmal zu einem Fehler kommen, durch den die Datenbank nicht mehr lesbar nicht, verliert man nur die seit dem letzten Backup eingegebenen Daten.
4.Wieviele Benutzer sollen auf grocy zugreifen? Soll grocy an eine evtl. bestehende zentrale Benutzerverwaltung angebunden werden? (ldap-Support ist verfügbar)
5.Sollen Daten aus grocy in anderen Programmen verwendet werden (z.B. der Kalender mit den Terminen/Aufgaben), auch dann kann es sinnvoll sein, dass Grocy weltweit (oder wenigstens via VPN) erreichbar ist.
6.Wie wichtig ist die Verfügbarkeit des Grocy, wenn ich unterwegs bin?
Bei hoher Verfügbarkeit ist es sinnvoller Grocy auf einer kleinen VM in einem Rechenzentrum zu betreiben.
6.1Kann ich auf meinem Router/meiner Firewall eine Portweiterleitung einrichten?
6.2Bin ich mir evtl. damit verbundener Sicherheitsrisiken bewusst?
Meine Entscheidungen waren:
1.Grocy soll aus dem Internert erreichbar sein, damit ich bei Einkäufen stets die aktuelle Liste dabeihabe.
2.Grocy soll ssl verschlüsselt die Daten übertragen
2.1 Grocy soll aus dem lokalen Netz und via VPN erreichbar sein
3.Das Backup erfolgt via rsync
4.Es erfolgt keine Anbindung an eine zentrale Benutzerverwaltung
5.Es sollen Daten aus grocy in anderen Programmen verwendet werden (Termine/Ablaufdaten)
6.Das Testsystem kann ruhig lokal laufen, es braucht keine hohe Verfügbarkeit
6.1 Ja, Portweiterleitung ist kein Problem
6.2 Ja, in meinem Fall läuft das Grocy jedoch einsam in einem seperaten VLAN hinter der Lancom-Firewall. Es greift auf keine anderen Systeme zu. Das Backup wird von einem Server im Hauptnetz angestoßen, der via rsync die Daten „abholt“.
Ich habe mich bei den ersten Tests für einen R-Pi 5 entschieden, nach Abschluss der Testphase soll das System um einen Reversproxy (auf der Lancom Firewall) erweitert werden und in die DMZ umziehen. Alternativ wäre auch eine VM bei Hetzner denkbar.
Die folgende Anleitung basiert auf meiner durchgeführen Testinstallation. Die Ergänzungen für die Installation auf einer vm bei hetzner dienten der Verifizierung dieser Anleitung.
1.1 Grundinstallation
Ausgangspunkt der Installation ist ein Raspberry Pi OS (früher mal Raspbian), ssh ist aktiviert, ein ssh-Schlüssel für den Benutzer root ist hinterlegt, das Login via Passwort für root ist abgeschaltet, fail2ban läuft mit.
Als erstes installiere ich die fehlenden Pakete als root:
root@raspberrypi5:~# apt install php-sqlite3 php-gd php sqlite3 php-intl php-mbstring apache2 php-common libapache2-mod-php php-cli
und bereite danach die Software für den Webserver vor, d.h. hier konkret unnötige Verzeichnisse löschen
root@raspberrypi5:/# cd /var/www
root@raspberrypi5:/var/www# rm -rf html/
Da ich die Software später gern unter /var/www betreiben möchte,
Die aktuelle Version von Grocy herunterladen,
root@raspberrypi5:/var/www# wget -c "https://releases.grocy.info/latest"
entpacken,
root@raspberrypi5:/var/www# unzip latest
sowie die Dateirechte anpassen.
root@raspberrypi5:/var/www# chown www-data:www-data * -R
Danach bereite ich den Webserver vor, da die Übertragung de Daten zu grocy später verschlüsselt erfolgen soll, lege ich jetzt bereits einen DNS-Namen fest, über den der spätere Aufruf erfolgen soll.
Dazu lege ich, basierend auf der Datei „000-default.conf“ in /etc/apache2/sites-enabled# eine eigene Konfiguration an
root@raspberrypi5:/etc/apache2/sites-enabled# cp 000-default.conf grocy.home.bloy.at.conf
und passe diese entsprechend an
root@raspberrypi5:/etc/apache2/sites-enabled# nano grocy.home.bloy.at.conf
<VirtualHost *:80>
ServerName grocy.home.bloy.at
ServerAdmin patrick@bloy.at
DocumentRoot /var/www/public/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Als nächste aktiviere ich das PHP und das rewrite Modul.
root@raspberrypi5:/etc/apache2/sites-enabled# a2enmod rewrite php8.2
und konfiguriere Grocy.
Dazu erstelle ich erst eine Kopie der Beispielkonfigurationdatei am richtigen Ort
root@raspberrypi5:/etc/apache2/sites-enabled# cp -v /var/www# cp /var/www/config-dist.php /var/www/data/config.php
und editiere die Datei anschließend entsprechend meiner Wünschen:
root@raspberrypi5:/etc/apache2/sites-enabled# nano /var/www/data/config.php
Spracheinstellungen
// The directory name of one of the available localization folders
// in the „/localization“ directory (e.g. „en“ or „de“)
Setting(‚DEFAULT_LOCALE‘, ‚en‘);
ändere ich in ‚de‘
und passe die folgende Zeile an
Setting(‚BASE_URL‘, ‚http://192.168.11.216‚);
um das Deaktivieren des Rewrite zu deaktivieren. 😉
Setting(‚DISABLE_URL_REWRITING‘, FALSE);
Danach starte ich den Apache neu
root@raspberrypi5:/etc/apache2/sites-enabled# systemctl restart apache2
Ab jetzt sollte Grocy grundlegend einsatzbereit sein, der erste Aufruf erfolgt über http://192.168.11.216 .
Das Login erfolgt mit den Default Zugangsdaten. (admin/admin)
Dies Passwort sollte man ändern, besonders wann das System von extern erreichbar sein soll.
Als nächstes folgt nun die Transportabsicherung mit ssl (hier Let’s Encrypt).
Natürlich ist es auch möglich sich ein selbstsigniertes Zertifikat zu erzeugen oder eine andere Zertifizierungsstelle zu verwenden.
1.2 Transportabsicherung
Zuerst wieder das Installieren der notwendigen Pakete
root@raspberrypi5:/var/www# apt install python3-certbot-apache
Danach die Portweiterleitung entsprechend in Firewall oder Router einrichten und schon kann der Prozess zur Verifizierung und Zertifikatserstellung angestoßen werden:
root@raspberrypi5:/var/www# certbot
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter ‚c‘ to cancel): patrick@patrick2011
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: yes‘
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let’s Encrypt project and the non-profit organization that
develops Certbot? We’d like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
(Y)es/(N)o: yes
Account registered.
Which names would you like to activate HTTPS for?
We recommend selecting either all domains, or all domains in a VirtualHost/server block
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
1: grocy.home.bloy.at
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter ‚c‘ to cancel): 1
Requesting a certificate for home.bloy.at
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/grocy.home.bloy.at/fullchain.pem
Key is saved at: /etc/letsencrypt/live/grocy.home.bloy.at/privkey.pem
This certificate expires on 2024-10-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for home.bloy.at to /etc/apache2/sites-enabled/grocy.home.bloy.at-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://home.bloy.at
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Danach gilt es /var/www/data/config.php anzupassen
root@raspberrypi5:/etc/apache2/sites-enabled# nano /var/www/data/config.php
// The base URL of your installation,
// should be just „/“ when running directly under the root of a (sub)domain
// or for example „https://example.com/grocy“ when using a subdirectory
Setting(‚BASE_URL‘, ‚https://grocy.home.bloy.at‘);
Damit sollte die Grocy über die eingestellt Domain via https erreichbar sein.
1.3 Problem: DNS-Rebind
Bei mir trat nun jedoch das Problem auf, dass anstatt Grocy nur eine Fehlermeldung der FritzBox erschien: „Der DNS-Rebind-Schutz Ihrer FRITZ!Box hat Ihre Anfrage aus Sicherheitsgründen abgewiesen“ erschien, wenn ich das System aus dem lokalen Netz aufrief.
Das ist logisch versucht man doch eine interne Adresse über einen externe IP aufzurufen.
Die Lösung war über Manipulation des DNS-Records ihn intern direkt auf die Adresse des Raspery Pi zeigen zu lassen, indem man einen lokalen DNS-Server betreibt.
Meine Wahl fiel auf dnsmasq
Also wieder zuerst das notwendige Paket installieren
root@raspberrypi5:~# apt install dnsmasq
Danach schaue ich auf welchem Interface dnsmasq aktiv sein soll.
root@raspberrypi5:~# apt install dnsmasq
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 2c:cf:67:1c:97:21 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.216/24 brd 192.168.11.255 scope global dynamic noprefixroute eth0
valid_lft 2702sec preferred_lft 2702sec
inet6 fe80::c092:abf7:fa4e:42e5/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
link/ether 2c:cf:67:1c:97:22 brd ff:ff:ff:ff:ff:ff
Hier ist es eth0, und passe die Konfiguration in /etc/dnsmasq.conf entsprechend an, d.h. setzen des DNS-Eintrages und Deaktiveren der DHCP-Funktion.
root@raspberrypi5:~# nano /etc/dnsmasq.conf
# Add domains which you want to force to an IP address here.
# The example below send any host in double-click.net to a local
# web-server.
#address=/double-click.net/127.0.0.1
address=/home.bloy.at/192.168.11.216
# If you want dnsmasq to provide only DNS service on an interface,
# configure it as shown above, and then use the following line to
# disable DHCP and TFTP on it.
no-dhcp-interface= eth0
Abschließend noch dnsmasq aktivieren
root@raspberrypi5:~# systemctl enable dnsmasq
Danach ist es noch wichtig, den DNS-Server als DNS-Server bei den entsprechenden Clients als ersten DNS-Server einzutragen. Will man verhindern, dass man bei einem Ausfall des Raspery-Pi keine Webseiten mehr aufrufen kann, trägt man zur Sicherheit bei den Clients noch weitere DNS-Server ein.
1.4 Grundabsicherung via Hetzner Firewall, ufw, fail2ban (bei Betrieb als exposed Host oder anderweitig direkt erreichbar aus dem Internet)
Es schadet nicht ein System, das weltweit erreichbar ist, grundsätzlich etwas abzusichern. Bei einer lokalen Installation wird man grundsätzlich nur notwendige Ports nach außen durchreichen (http/https). Auf einer virtuellen Maschine halte ich es ähnlich, indem ich zuerst den Zugriff via ufw auf der Maschine beschränke, und zusätzlich noch den grundlegenden von Hetzner davor schalte. So kann ich, auch wenn ich keine feste Ip-Adresse habe, den Zugriff auf ssh bequem beschränken, ohne Gefahr zu laufen mich selbst „auszuschließen“, d.h. in diesem Fall, nur noch Zugriff über eine Hetzner Konsole zu haben, falls sich meine öffentlich IP einmal ändert.
Dazu nutze ich die Uncomplicated Firewall, kurz UFW. Zuerst wird das Programm wieder via apt installiert.
root@raspberrypi5:~# apt install ufw
Danach folgt die Konfiguration der Firewall
root@raspberrypi5:~# ufw allow http
root@raspberrypi5:~# ufw allow https
root@raspberrypi5:~# ufw allow ssh
Aktiviert wird die Firewall via
root@raspberrypi5:~# ufw enable
Nun noch schnell fail2ban installiert, damit das ssh Passwort nicht via Bruteforce einfach „erraten“ werden kann (oder die Logdateien nicht mit fehlgeschlagenen Loginversuchen überflutet werder).
root@raspberrypi5:~# ufw allow ssh
Persönlich setze ich noch den Paketfilter von Hetzner mit folgenden Regeln davor

Wobei ich ins Feld Quelle meine jeweilige aktuelle öffentliche IP-Adresse eintrage, von der aus ich zugreifen möchte.
Der Artikel wurde vor einiger Zeit geschrieben, seine Fortsetzung wird vermutlich im August erscheinen.
2.Grundeinrichtung (erste Dateneingabe)
2.1 inhaltlische Vorüberlegungen
3.Nutzung im Alltag
3.1 praktische Erweiterungen (https://github.com/Forceu/barcodebuddy)
4.Datensicherung
4.1 rsync
4.2 Hetzner