Was habe ich heute gebaut?
Warum soll mein LinkedIn-Banner ein statisches Bild sein, das ich manuell hochlade? Das kann Linux besser. Also habe ich ein vollautomatisches Branding-System gebaut, das meinen Banner alle 10 Minuten mit aktuellem Datum und Uhrzeit aktualisiert – vollständig auf Basis von Open Source Tools.
Das Ergebnis seht ihr hier – der Zeitstempel unten rechts zeigt wann das Script zuletzt gelaufen ist:

⏱ Dieser Banner aktualisiert sich automatisch alle 10 Minuten via Cron
Die Tools
| Tool | Wozu? |
|---|---|
| Inkscape | SVG-Design erstellen und Platzhalter einbauen |
| Bash | Das Herzstück – das Automatisierungs-Script |
| sed | Platzhalter in der SVG-Datei ersetzen |
| cron | Zeitgesteuerte Ausführung alle 10 Minuten |
| lftp | Automatischer FTP-Upload auf den Webserver |
| CachyOS Linux | Mein Betriebssystem – worauf sonst? |
Wie funktioniert das System?
↓
Bash-Script ersetzt $(DAY) $(MONTH) $(YEAR) $(HOUR) $(MINUTE)
↓
Inkscape exportiert PNG (1584×396px)
↓
lftp lädt Banner automatisch auf tuxhs.de hoch
↓
Cron wiederholt das alle 10 Minuten 🔄
Die Projektstruktur
├── TUX-RENDER.sh ← Das Herzstück: Bash-Script v3.0.0
└── TUXPLAYER_LOGO_LINKIN.svg ← SVG-Vorlage mit Platzhaltern
~/Schreibtisch/
└── TUX_LINKEDIN_AKTUELL.png ← Fertiges Banner (auto-aktualisiert)
~/logs/
└── tux-render.log ← Vollständiges Protokoll
~/.credentials/
└── tuxhs-ftp.conf ← FTP-Zugangsdaten (chmod 600)
Schritt 1 – SVG-Template in Inkscape
In Inkscape habe ich das Banner-Design erstellt und spezielle Platzhalter eingefügt:
$(DAY).$(MONTH).$(YEAR) – $(HOUR):$(MINUTE)
<!– Copyright –>
© $(YEAR) Heiko Schäfer
Die LinkedIn-Banner-Maße sind 1584 × 396 Pixel. Wichtig: Links genug Platz für das Profilbild lassen!
Schritt 2 – Das Bash-Script TUX-RENDER.sh
# TUX-RENDER.sh v3.0.0 – TUXPLAYER Branding Automatisierung
SVG_IN=“/home/heiko/scripts/tools/branding/TUXPLAYER_LOGO_LINKIN.svg“
PNG_OUT=“$(xdg-user-dir DESKTOP)/TUX_LINKEDIN_AKTUELL.png“
CREDENTIALS=“/home/heiko/.credentials/tuxhs-ftp.conf“
# Zeitdaten holen
DAY=$(date +%d); MON=$(date +%m); YEAR=$(date +%Y)
HOUR=$(date +%H); MINUTE=$(date +%M)
# Platzhalter ersetzen via sed
sed „s/\$(DAY)/$DAY/g;s/\$(MONTH)/$MON/g;s/\$(YEAR)/$YEAR/g;
s/\$(HOUR)/$HOUR/g;s/\$(MINUTE)/$MINUTE/g“ „$SVG_IN“ > /tmp/temp.svg
# PNG exportieren (LinkedIn: 1584x396px)
inkscape –export-type=“png“ –export-filename=“$PNG_OUT“ \
–export-width=1584 –export-height=396 /tmp/temp.svg
# Auf Server hochladen
source „$CREDENTIALS“
lftp -u „$FTP_USER“,“$FTP_PASSWORD“ „$FTP_HOST“ <<EOF
put „$PNG_OUT“ -o www/assets/branding/TUX_BANNER.png
bye
EOF
Schritt 3 – Cron-Automatisierung
EDITOR=nano crontab -e
# Diese Zeile einfügen:
*/10 * * * * /home/heiko/scripts/tools/branding/TUX-RENDER.sh
# Cron-Daemon aktivieren (CachyOS/Arch):
sudo systemctl enable –now cronie
Häufige Fehler und Lösungen
⚠ Backslash-Bug in Bash
Leerzeichen nach einem \ bricht die Zeile und produziert seltsame Fehler. Lösung: Alles in eine Zeile schreiben.
⚠ Cronie nicht aktiv
Der Cron-Daemon war nach der Installation nicht automatisch gestartet. sudo systemctl enable --now cronie löst das Problem.
⚠ Fish Shell vs Bash
Fish versteht keine Bash-Syntax. Scripts immer mit #!/bin/bash im Header und Alias auf bash /pfad/script.sh setzen.
Ergebnis – live unter
Der aktuelle Banner ist immer abrufbar unter:
https://tuxhs.de/assets/branding/TUX_BANNER.png
Einfach neu laden – der Zeitstempel unten rechts zeigt ob der Cron läuft. 😄
Fazit
Dieses System wurde Schritt für Schritt debuggt, verstanden und selbst eingerichtet. Mit freundlicher Unterstützung von Claude AI als Sparringspartner – aber die Idee, der Ehrgeiz und die Umsetzung: das war ich. Das ist echte Linux-Automatisierung. 🐧🤘
