Zum Inhalt

Setup

Vollständiger Einrichtungsprozess des Raspberry Pi als headless Dev-Workstation — von der OS-Installation bis zum einsatzbereiten System.

1. Betriebssystem

Raspberry Pi OS Lite (64-bit / Trixie)

Installation via Raspberry Pi Imager

  1. Raspberry Pi Imager starten
  2. Choose Device → Raspberry Pi 4
  3. Choose OS → Raspberry Pi OS Lite (64-bit)
  4. Choose Storage → USB-SSD (nicht SD-Karte)
  5. Settings (vor Write):
    • SSH aktivieren, Hostname setzen
    • User + Passwort konfigurieren
    • Locale: de_DE.UTF-8, Timezone: Europe/Berlin
  6. Write → SSD an blauen USB-3.0-Port → Boot

Erste Schritte nach Boot

sudo apt update && sudo apt upgrade -y
sudo raspi-config
# → Advanced Options → Expand Filesystem
sudo reboot

2. Headless-Optimierungen

Da der Pi ausschließlich headless betrieben wird, werden ressourcenintensive Subsysteme deaktiviert.

GPU-Speicher reduzieren

Der GPU-Speicher wird auf das Minimum von 16 MB gesetzt — ohne Display-Output wird der GPU-Block nicht gebraucht. Das gibt ca. 60 MB RAM zurück.

# In /boot/firmware/config.txt einfügen:
gpu_mem=16

Bluetooth deaktivieren

Bluetooth wird nicht verwendet und belegt CPU und RAM.

# In /boot/firmware/config.txt einfügen:
dtoverlay=disable-bt
sudo systemctl disable hciuart bluetooth

Swap (zram)

zram ist auf Raspberry Pi OS standardmäßig aktiv und stellt 2 GB komprimierten Swap im RAM bereit. Bei 4 GB physischem RAM reicht das aus — kein zusätzlicher Swap-Partition oder Swap-File nötig.

swapon --show
zramctl

HDMI deaktivieren (optional, spart ~30 mA)

sudo nano /etc/rc.local
# Vor exit 0 einfügen:
/usr/bin/tvservice -o

Alle custom Einträge für /boot/firmware/config.txt sind im Repo unter boot/config-additions.txt als Referenz dokumentiert.

3. SSH-Härtung

Die SSH-Konfiguration blockiert alle Login-Methoden außer Key-Auth und beschränkt den Zugang auf den User robin.

# Config aus dem Repo anwenden
sudo cp ssh/sshd_hardening.conf /etc/ssh/sshd_config.d/hardening.conf
sudo sshd -t            # Syntax prüfen
sudo systemctl restart ssh

Wichtig: Erst sicherstellen, dass SSH-Key-Login funktioniert, bevor PasswordAuthentication no aktiv wird.

Aktive Einstellungen:

  • Root-Login deaktiviert (PermitRootLogin no)
  • Nur Key-basierte Authentifizierung (PasswordAuthentication no)
  • Nur User robin erlaubt (AllowUsers robin)
  • Max. 3 Login-Versuche (MaxAuthTries 3)
  • X11-Forwarding deaktiviert

4. Basis-Pakete

sudo apt install -y \
  git curl wget htop jq tree \
  ripgrep fd-find shellcheck shfmt \
  tmux unzip build-essential \
  libssl-dev libffi-dev python3-dev \
  pkg-config cmake

fd-find heißt auf Debian fdfind. Ein Alias macht es transparent:

echo 'alias fd=fdfind' >> ~/.bashrc

5. Security: Automatische Updates

Automatische Security-Updates für Debian Trixie über unattended-upgrades.

sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades

Konfiguration in /etc/apt/apt.conf.d/50unattended-upgrades:

Unattended-Upgrade::Origins-Pattern {
    "origin=Debian,codename=${distro_codename}-security,label=Debian-Security";
};

Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Mail "root";
# Prüfen
sudo unattended-upgrades --dry-run --debug

6. Dotfiles: Bootstrap

Das Repo enthält ein idempotentes Bootstrap-Skript, das alle Konfigurationsdateien per Symlink an die richtigen Stellen legt.

git clone git@github.com:SWATPeaceKeeper/claude-pi.git ~/repos/claude-pi
cd ~/repos/claude-pi

# Dry run — zeigt was passieren würde, ändert nichts
./bootstrap.sh -n

# Symlinks erstellen (sichert bestehende Dateien als .bak)
./bootstrap.sh

Was das Skript tut:

  • Erstellt ~/bin/ und symlinkt update-devtools
  • Symlinkt Claude Code Configs nach ~/.claude/
  • Symlinkt ~/.gitconfig und ~/.tmux.conf
  • Fügt eine Source-Zeile in .bashrc für bash/bashrc_custom.sh ein
  • Sichert bestehende Dateien vorher als .bak

Nach dem Bootstrap:

source ~/.bashrc
ls -la ~/.claude/settings.json ~/bin/update-devtools

7. Git-Konfiguration

Die Git-Config wird über das Repo verwaltet (git/gitconfig~/.gitconfig via bootstrap.sh). Der GitHub-CLI-basierte Credential-Helper ermöglicht passwortlosen Push ohne gespeicherte Tokens.

[user]
    name = Robin Werner
    email = kontakt@robinwerner.de
[init]
    defaultBranch = main
[credential "https://github.com"]
    helper = !/usr/bin/gh auth git-credential

Nach dem Bootstrap GitHub CLI authentifizieren:

gh auth login
# → Browser-basierter OAuth-Flow

8. Wöchentlicher Cronjob

Das update-devtools-Skript läuft wöchentlich per Cronjob. Die Referenz-Datei liegt im Repo unter cron/update-devtools.cron.

# Cronjob installieren
crontab -l 2>/dev/null | cat - cron/update-devtools.cron | crontab -

# Prüfen
crontab -l

# Log ansehen
tail -f ~/log/update-devtools.log

Der Cronjob läuft Sonntag um 03:00 Uhr.

Wichtige Pfade

Pfad Inhalt
/boot/firmware/config.txt Pi Hardware-Konfiguration
/etc/ssh/sshd_config.d/hardening.conf SSH-Härtung
~/.bashrc Bash-Konfiguration (sources bashrc_custom.sh)
~/repos/claude-pi/ Dotfiles-Repo
~/bin/ Eigene Skripte
~/log/ Log-Dateien (update-devtools)