#!/usr/bin/env bash # Baut grotti__.deb (auf dem Zielsystem oder arm64-Container). # Aufruf aus dem Repo-Root: bash packaging/build-deb.sh set -euo pipefail ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$ROOT" if ! command -v dpkg-deb >/dev/null 2>&1; then echo "dpkg-deb fehlt — bitte auf Debian/Raspberry Pi OS bauen." >&2 exit 1 fi VERSION="$(python3 -c "from grotti.version import __version__; print(__version__)")" ARCH="$(dpkg --print-architecture)" PKG="grotti_${VERSION}_${ARCH}" DIST="$ROOT/packaging/dist" STAGE="$DIST/$PKG" rm -rf "$STAGE" mkdir -p "$STAGE/DEBIAN" \ "$STAGE/usr/lib/grotti" \ "$STAGE/usr/bin" \ "$STAGE/etc/grotti" \ "$STAGE/lib/systemd/system" \ "$STAGE/usr/share/grotti" \ "$STAGE/usr/share/doc/grotti" \ "$STAGE/var/lib/grotti/data/eingang" \ "$STAGE/var/lib/grotti/slice" rsync -a --delete \ --exclude '__pycache__' --exclude '*.pyc' --exclude '.pytest_cache' \ "$ROOT/grotti/" "$STAGE/usr/lib/grotti/grotti/" rsync -a --delete \ --exclude '__pycache__' --exclude '*.pyc' \ "$ROOT/web/" "$STAGE/usr/lib/grotti/web/" cp "$ROOT/server.py" "$STAGE/usr/lib/grotti/server.py" cp "$ROOT/requirements.txt" "$STAGE/usr/lib/grotti/requirements.txt" cp "$ROOT/config.example.json" "$STAGE/usr/lib/grotti/config.example.json" mkdir -p "$STAGE/usr/lib/grotti/scripts" cp "$ROOT/scripts/pfade_umziehen.py" "$STAGE/usr/lib/grotti/scripts/pfade_umziehen.py" # Symlink-Pfad für die Anleitung mkdir -p "$STAGE/opt/grotti" ln -sfn /usr/lib/grotti/scripts "$STAGE/opt/grotti/scripts" ln -sfn /usr/lib/grotti/venv "$STAGE/opt/grotti/venv" echo '[]' > "$STAGE/usr/lib/grotti/drucker.json" cp "$ROOT/packaging/config.pi.json" "$STAGE/usr/share/grotti/config.pi.json" cp "$ROOT/packaging/config.pi.json" "$STAGE/etc/grotti/config.json" cp "$ROOT/packaging/grotti.service" "$STAGE/lib/systemd/system/grotti.service" cp "$ROOT/docs/Anleitung-Installation-Pi.md" "$STAGE/usr/share/doc/grotti/" cp "$ROOT/CHANGELOG.md" "$STAGE/usr/share/doc/grotti/changelog" gzip -9 -f "$STAGE/usr/share/doc/grotti/changelog" cat > "$STAGE/usr/bin/grotti" <<'EOF' #!/bin/sh export GROTTI_CONFIG="${GROTTI_CONFIG:-/etc/grotti/config.json}" exec /usr/lib/grotti/venv/bin/python /usr/lib/grotti/server.py "$@" EOF chmod 755 "$STAGE/usr/bin/grotti" python3 -m venv "$STAGE/usr/lib/grotti/venv" "$STAGE/usr/lib/grotti/venv/bin/pip" install --upgrade pip wheel "$STAGE/usr/lib/grotti/venv/bin/pip" install -r "$ROOT/requirements.txt" SIZE_KB="$(du -sk "$STAGE" | awk '{print $1}')" cat > "$STAGE/DEBIAN/control" < Depends: python3 (>= 3.11), python3-venv, postgresql, adduser Installed-Size: ${SIZE_KB} Homepage: https://git.gundel.dev/dg/grotti Description: Farm-Manager für Moonraker-Drucker (Kobra 3 / S1) Grotti steuert eine 3D-Drucker-Farm über Moonraker: Wand, Warteschlange, Material, Abläufe und Protokoll. PostgreSQL wird lokal mit eingerichtet. EOF cp "$ROOT/packaging/debian/conffiles" "$STAGE/DEBIAN/conffiles" for script in postinst prerm postrm; do cp "$ROOT/packaging/debian/$script" "$STAGE/DEBIAN/$script" chmod 755 "$STAGE/DEBIAN/$script" done dpkg-deb --root-owner-group --build "$STAGE" "$DIST/${PKG}.deb" echo "Gebaut: $DIST/${PKG}.deb" echo "Install: sudo apt install ./packaging/dist/${PKG}.deb" echo "Logs: journalctl -u grotti -f"