diff --git a/.gitignore b/.gitignore index 7daec9a..555abaf 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,7 @@ backend/generated backend/web/dist backend/data/pending-autostart/__global__.json backend/.gocache +backend/.gocache-build +backend/.gocache-linux +backend/.deb-build +backend/dist diff --git a/backend/build.bat b/backend/build.bat index 7c8fbd8..7c9887b 100644 --- a/backend/build.bat +++ b/backend/build.bat @@ -45,6 +45,7 @@ echo. echo Build erfolgreich. echo Windows: nsfwapp.exe echo Debian: nsfwapp-linux-amd64 +echo Debian-Paket: build_deb.bat goto end :error diff --git a/backend/build_deb.bat b/backend/build_deb.bat new file mode 100644 index 0000000..04896a5 --- /dev/null +++ b/backend/build_deb.bat @@ -0,0 +1,43 @@ +@echo off +setlocal + +cd /d "%~dp0" + +echo Baue Debian Application Package via WSL... + +where wsl >nul 2>nul +if errorlevel 1 goto wsl_missing + +set "WSL_CWD=" +for /f "delims=" %%i in ('wsl wslpath -a "%CD%" 2^>nul') do set "WSL_CWD=%%i" +if "%WSL_CWD%"=="" goto wsl_path_error +if not "%WSL_CWD:~0,1%"=="/" goto wsl_missing + +wsl bash -lc "cd ""%WSL_CWD%"" && bash ./build_deb.sh" +if errorlevel 1 goto error + +echo. +echo Debian-Paket erfolgreich gebaut. +goto end + +:wsl_missing +echo. +echo Debian-Paket-Build braucht eine installierte WSL-Linux-Distribution. +echo Einmalig installieren, z.B.: +echo wsl --install -d Debian +exit /b 1 + +:wsl_path_error +echo. +echo WSL-Pfad konnte nicht aus dem Windows-Pfad erzeugt werden: +echo %CD% +exit /b 1 + +:error +echo. +echo Debian-Paket-Build fehlgeschlagen. +exit /b 1 + +:end +endlocal +exit /b 0 diff --git a/backend/build_deb.sh b/backend/build_deb.sh new file mode 100644 index 0000000..5942639 --- /dev/null +++ b/backend/build_deb.sh @@ -0,0 +1,173 @@ +#!/usr/bin/env bash +set -euo pipefail + +PACKAGE_NAME="${DEB_PACKAGE_NAME:-nsfwapp}" +APP_TITLE="${DEB_APP_TITLE:-NSFW App}" +VERSION="${DEB_VERSION:-0.1.0}" +ARCH="${DEB_ARCH:-amd64}" + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +BIN_PATH="$SCRIPT_DIR/nsfwapp-linux-amd64" +BUILD_DIR="$SCRIPT_DIR/.deb-build" +PKG_ROOT="$BUILD_DIR/root" +OUT_DIR="$SCRIPT_DIR/dist" +OUT_FILE="$OUT_DIR/${PACKAGE_NAME}_${VERSION}_${ARCH}.deb" + +fail() { + echo "Fehler: $*" >&2 + exit 1 +} + +command -v dpkg-deb >/dev/null 2>&1 || fail "dpkg-deb fehlt. Installiere es mit: sudo apt install -y dpkg-dev" + +if [ ! -f "$BIN_PATH" ] || [ "${DEB_SKIP_REBUILD:-0}" != "1" ]; then + command -v go >/dev/null 2>&1 || fail "go fehlt. Installiere Go oder baue zuerst mit build.bat." + command -v gcc >/dev/null 2>&1 || fail "gcc fehlt. Installiere: sudo apt install -y build-essential" + command -v pkg-config >/dev/null 2>&1 || fail "pkg-config fehlt. Installiere: sudo apt install -y pkg-config" + + echo "Baue Linux-Binary..." + mkdir -p "$SCRIPT_DIR/.gocache-linux" + ( + cd "$SCRIPT_DIR" + GOOS=linux GOARCH=amd64 CGO_ENABLED=1 GOCACHE="$SCRIPT_DIR/.gocache-linux" go build -o "$BIN_PATH" + ) +fi + +[ -f "$BIN_PATH" ] || fail "Linux-Binary nicht gefunden: $BIN_PATH" + +rm -rf "$BUILD_DIR" +mkdir -p \ + "$PKG_ROOT/DEBIAN" \ + "$PKG_ROOT/opt/nsfwapp" \ + "$PKG_ROOT/usr/bin" \ + "$PKG_ROOT/usr/share/applications" \ + "$PKG_ROOT/usr/share/doc/nsfwapp" \ + "$PKG_ROOT/usr/share/pixmaps" + +install -m 0755 "$BIN_PATH" "$PKG_ROOT/opt/nsfwapp/nsfwapp" +if [ -f "$SCRIPT_DIR/assets/img/tray.ico" ]; then + install -m 0644 "$SCRIPT_DIR/assets/img/tray.ico" "$PKG_ROOT/usr/share/pixmaps/nsfwapp.ico" +fi + +cat >"$PKG_ROOT/usr/bin/nsfwapp" <<'EOF' +#!/usr/bin/env sh +set -eu + +install_dir="/opt/nsfwapp" +data_home="${XDG_DATA_HOME:-$HOME/.local/share}" +app_dir="$data_home/nsfwapp" +runtime_bin="$app_dir/nsfwapp" + +mkdir -p "$app_dir" + +if [ ! -f "$runtime_bin" ] || ! cmp -s "$install_dir/nsfwapp" "$runtime_bin"; then + tmp="$app_dir/.nsfwapp.tmp.$$" + cp "$install_dir/nsfwapp" "$tmp" + chmod 0755 "$tmp" + mv "$tmp" "$runtime_bin" +fi + +cd "$app_dir" +exec "$runtime_bin" "$@" +EOF +chmod 0755 "$PKG_ROOT/usr/bin/nsfwapp" + +cat >"$PKG_ROOT/usr/bin/nsfwapp-open" <<'EOF' +#!/usr/bin/env sh +set -eu + +url="${NSFWAPP_URL:-https://localhost:9999}" + +nohup nsfwapp >/dev/null 2>&1 & + +if command -v xdg-open >/dev/null 2>&1; then + ( + sleep 2 + xdg-open "$url" >/dev/null 2>&1 || true + ) & +fi +EOF +chmod 0755 "$PKG_ROOT/usr/bin/nsfwapp-open" + +cat >"$PKG_ROOT/usr/share/applications/nsfwapp.desktop" <"$PKG_ROOT/usr/share/doc/nsfwapp/README.Debian" <<'EOF' +NSFW App fuer Debian +==================== + +Start: + nsfwapp + +Desktop: + Der Launcher "NSFW App" startet das Backend und oeffnet https://localhost:9999. + +User-Daten: + Die installierte Binary liegt unter /opt/nsfwapp/nsfwapp. + Beim Start wird sie nach ${XDG_DATA_HOME:-$HOME/.local/share}/nsfwapp/nsfwapp kopiert + und von dort ausgefuehrt. Dadurch bleiben recorder.log, recorder_settings.json, + generated/ und eine optionale externe .env im User-Bereich. + +Optionale Konfiguration: + Lege eine .env neben die Runtime-Binary, z.B.: + ~/.local/share/nsfwapp/.env + +Wichtige Laufzeitprogramme: + ffmpeg/ffprobe muessen fuer Recording, Teaser, Analyse und Videofunktionen verfuegbar sein. + Der AI-Server braucht Python und die benoetigten Python-Pakete deiner ML-Umgebung. +EOF + +cat >"$PKG_ROOT/DEBIAN/control" < +Depends: ca-certificates, ffmpeg, python3, xdg-utils, libnotify-bin +Description: NSFW recorder backend and web UI + Local Debian package for the NSFW recorder backend with embedded web UI and ML assets. +EOF + +cat >"$PKG_ROOT/DEBIAN/postinst" <<'EOF' +#!/usr/bin/env sh +set -e + +if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database /usr/share/applications >/dev/null 2>&1 || true +fi + +exit 0 +EOF +chmod 0755 "$PKG_ROOT/DEBIAN/postinst" + +cat >"$PKG_ROOT/DEBIAN/postrm" <<'EOF' +#!/usr/bin/env sh +set -e + +if command -v update-desktop-database >/dev/null 2>&1; then + update-desktop-database /usr/share/applications >/dev/null 2>&1 || true +fi + +exit 0 +EOF +chmod 0755 "$PKG_ROOT/DEBIAN/postrm" + +mkdir -p "$OUT_DIR" +dpkg-deb --build "$PKG_ROOT" "$OUT_FILE" + +echo +echo "Debian-Paket erzeugt:" +echo " $OUT_FILE" +echo +echo "Installieren:" +echo " sudo apt install ./dist/$(basename "$OUT_FILE")" diff --git a/backend/nsfwapp.exe b/backend/nsfwapp.exe index 502583c..a2ddeed 100644 Binary files a/backend/nsfwapp.exe and b/backend/nsfwapp.exe differ