setup directories sh hinzugefügt

michael 2025-09-10 10:07:02 +02:00
parent 8fdc01616d
commit af2a1f0847

200
setup-directories-sh.md Normal file

@ -0,0 +1,200 @@
# setup-directories.sh
**Verzeichnisstruktur für furt automatisch erstellen**
## Getestet unter
- OpenBSD 7.7
- Debian 12
- Arch Linux
## Zweck des Scripts
Das `setup-directories.sh` Script erstellt die komplette Verzeichnisstruktur für furt mit korrekten betriebssystem-spezifischen Pfaden und Berechtigungen. Es behandelt Config-Verzeichnisse, Share-Dateien, Log-Verzeichnisse und PID-Files konsistent zwischen verschiedenen Systemen.
Das Script eliminiert manuelles Erstellen von Verzeichnissen und stellt sicher dass furt alle benötigten Pfade mit korrekten Berechtigungen zur Verfügung hat.
## Wie das Script funktioniert
Das Script erkennt das Betriebssystem und wählt die passenden Standard-Pfade:
```bash
if [ "$(uname)" = "OpenBSD" ]; then
CONFIG_DIR="/usr/local/etc/furt"
USER="_furt"
GROUP="_furt"
else
CONFIG_DIR="/etc/furt"
USER="furt"
GROUP="furt"
fi
```
Anschließend werden alle Verzeichnisse erstellt und kritische Pfade erhalten die richtigen Berechtigungen:
```bash
mkdir -p "$CONFIG_DIR"
mkdir -p /usr/local/share/furt
mkdir -p /var/log/furt
mkdir -p /var/run/furt
chown "$USER:$GROUP" /var/log/furt
chown "$USER:$GROUP" /var/run/furt
```
Das `mkdir -p` Flag sorgt dafür dass auch Parent-Verzeichnisse erstellt werden falls sie nicht existieren. Das macht das Script robust gegen verschiedene Ausgangszustände.
## Betriebssystem-Philosophien verstehen
Die verschiedenen Verzeichnisstrukturen spiegeln unterschiedliche System-Philosophien wider:
### BSD-Ansatz (OpenBSD)
BSD-Systeme bevorzugen `/usr/local/` für Software die nicht Teil des Base-Systems ist. Diese klare Trennung zwischen System (`/etc`) und Third-Party (`/usr/local/etc`) verhindert Konflikte bei System-Updates.
```bash
# OpenBSD Pfade
CONFIG_DIR="/usr/local/etc/furt"
USER="_furt"
```
Die `/usr/local/`-Hierarchie bleibt bei System-Updates unberührt und Software-Installationen überleben Betriebssystem-Upgrades ohne Probleme.
### Linux-Ansatz (Debian, Arch, etc.)
Linux-Distributionen nutzen meist `/etc` für alle Konfigurationsdateien unabhängig von der Installationsquelle. Package-Manager koordinieren zwischen verschiedenen Software-Quellen.
```bash
# Linux Pfade
CONFIG_DIR="/etc/furt"
USER="furt"
```
Diese Konvention macht alle Konfiguration zentral auffindbar und integriert sich nahtlos in bestehende Admin-Workflows.
## Verzeichnis-Zwecke verstehen
Jedes erstellte Verzeichnis hat einen spezifischen Zweck in der furt-Architektur:
**Config-Verzeichnis:** Enthält `furt.conf` und service-spezifische Konfigurationsdateien. Root-owned, world-readable für Transparenz.
**Share-Verzeichnis:** `/usr/local/share/furt` speichert Lua-Module, Templates und statische Ressourcen. Cross-platform-Pfad für portierbare Installations.
**Log-Verzeichnis:** `/var/log/furt` gehört dem furt-User für Write-Zugriff. Structured Logging ohne Root-Rechte.
**PID-Verzeichnis:** `/var/run/furt` für Process-ID-Files und Unix-Sockets. Service-owned für sichere IPC.
## Berechtigungs-Strategie
Das Script implementiert das Principle of Least Privilege:
```bash
chown "$USER:$GROUP" /var/log/furt
chown "$USER:$GROUP" /var/run/furt
```
Nur Verzeichnisse die Write-Zugriff benötigen werden dem Service-User übertragen. Config- und Share-Verzeichnisse bleiben Root-owned weil furt dort nur lesen muss.
Diese Strategie minimiert Schäden bei möglichen Service-Kompromittierungen - furt kann keine System-Konfiguration oder andere Services beeinflussen.
## Script praktisch nutzen
### Standard-Installation
```bash
# Nach setup-user.sh ausführen
sudo ./scripts/setup-directories.sh
```
Ausgabe bestätigt die erstellte Struktur:
```
Created directories:
Config: /usr/local/etc/furt
Share: /usr/local/share/furt
Logs: /var/log/furt (owned by _furt)
PID: /var/run/furt (owned by _furt)
```
### Als Teil der orchestrierten Installation
```bash
./install.sh
# [INFO] Phase 2: Creating directory structure... OK
```
Das Orchestrator-Script ruft `setup-directories.sh` nach der Benutzer-Erstellung auf damit die `chown`-Operationen funktionieren.
### Development-Setup
```bash
# Verzeichnisse für lokale Tests vorbereiten
sudo ./scripts/setup-directories.sh
# ... furt entwickeln und testen ...
```
## Installation validieren
Nach der Script-Ausführung kannst du die Verzeichnisstruktur prüfen:
```bash
# Verzeichnisse existieren?
ls -la /usr/local/etc/furt/
ls -la /var/log/furt/
ls -la /var/run/furt/
# Berechtigungen korrekt?
stat -c "%U:%G %a %n" /var/log/furt
stat -c "%U:%G %a %n" /var/run/furt
```
Korrekte Ausgabe zeigt Service-User-Ownership:
```
_furt:_furt 755 /var/log/furt
_furt:_furt 755 /var/run/furt
```
## Troubleshooting
### "Permission denied" bei chown
```
chown: /var/log/furt: Operation not permitted
```
Das Script benötigt Root-Rechte für Ownership-Änderungen:
```bash
sudo ./scripts/setup-directories.sh # Linux
doas ./scripts/setup-directories.sh # OpenBSD
```
### "No such user" Fehler
```
chown: invalid user: 'furt'
```
Das `setup-user.sh` Script muss vor `setup-directories.sh` ausgeführt werden:
```bash
sudo ./scripts/setup-user.sh # Erst Benutzer erstellen
sudo ./scripts/setup-directories.sh # Dann Verzeichnisse
```
### Verzeichnisse bereits vorhanden
Das Script überschreibt keine bestehenden Verzeichnisse aber ändert Berechtigungen. Bei manuell erstellten Verzeichnissen mit falschen Permissions wird das korrigiert.
### Falsche Config-Pfade
Wenn furt die Konfiguration nicht findet, prüfe die Pfad-Erkennung:
```bash
uname # Sollte "OpenBSD" oder "Linux" zurückgeben
```
## Script erweitern
### Zusätzliche Verzeichnisse
```bash
# Service-spezifische Verzeichnisse hinzufügen
mkdir -p /var/lib/furt/cache
mkdir -p /var/lib/furt/sessions
chown "$USER:$GROUP" /var/lib/furt/cache
chown "$USER:$GROUP" /var/lib/furt/sessions
```
### Custom Config-Pfade
```bash
# Unterstützung für alternative Installations-Prefixes
PREFIX="${PREFIX:-/usr/local}"
CONFIG_DIR="$PREFIX/etc/furt"
SHARE_DIR="$PREFIX/share/furt"
```
Das `setup-directories.sh` Script schafft eine konsistente, sichere Verzeichnisstruktur die sich nahtlos in verschiedene Betriebssysteme integriert und dabei bewährte Admin-Praktiken respektiert.