nsfwapp/backend/build_deb.sh
2026-06-23 12:43:01 +02:00

316 lines
7.6 KiB
Bash

#!/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)"
OUT_DIR="$SCRIPT_DIR/dist"
BIN_PATH="$OUT_DIR/nsfwapp-linux-amd64"
OUT_FILE="$OUT_DIR/${PACKAGE_NAME}_${VERSION}_${ARCH}.deb"
CLEAN_BUILD_DIR=0
if [ -n "${DEB_BUILD_DIR:-}" ]; then
BUILD_DIR="$DEB_BUILD_DIR"
rm -rf "$BUILD_DIR"
mkdir -p "$BUILD_DIR"
else
BUILD_DIR="$(mktemp -d "${TMPDIR:-/tmp}/${PACKAGE_NAME}.deb-build.XXXXXX")"
CLEAN_BUILD_DIR=1
fi
PKG_ROOT="$BUILD_DIR/root"
cleanup() {
if [ "$CLEAN_BUILD_DIR" = "1" ]; then
rm -rf "$BUILD_DIR"
fi
}
trap cleanup EXIT
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"
mkdir -p "$OUT_DIR"
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"
chmod 0755 "$OUT_DIR/nsfwapp-linux-amd64" 2>/dev/null || true
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"
chmod 0755 "$PKG_ROOT" "$PKG_ROOT/DEBIAN"
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/bin/nsfwapp-open-data" <<'EOF'
#!/usr/bin/env sh
set -eu
data_home="${XDG_DATA_HOME:-$HOME/.local/share}"
app_dir="$data_home/nsfwapp"
mkdir -p "$app_dir"
if command -v xdg-open >/dev/null 2>&1; then
xdg-open "$app_dir" >/dev/null 2>&1 || true
fi
EOF
chmod 0755 "$PKG_ROOT/usr/bin/nsfwapp-open-data"
cat >"$PKG_ROOT/usr/bin/nsfwapp-open-log" <<'EOF'
#!/usr/bin/env sh
set -eu
data_home="${XDG_DATA_HOME:-$HOME/.local/share}"
app_dir="$data_home/nsfwapp"
log_file="$app_dir/recorder.log"
mkdir -p "$app_dir"
[ -f "$log_file" ] || : >"$log_file"
if command -v xdg-open >/dev/null 2>&1; then
xdg-open "$log_file" >/dev/null 2>&1 || true
fi
EOF
chmod 0755 "$PKG_ROOT/usr/bin/nsfwapp-open-log"
cat >"$PKG_ROOT/usr/bin/nsfwapp-stop" <<'EOF'
#!/usr/bin/env sh
set -eu
data_home="${XDG_DATA_HOME:-$HOME/.local/share}"
runtime_bin="$data_home/nsfwapp/nsfwapp"
install_bin="/opt/nsfwapp/nsfwapp"
pids=""
if command -v pgrep >/dev/null 2>&1; then
for pattern in "$runtime_bin" "$install_bin"; do
found="$(pgrep -f "$pattern" 2>/dev/null || true)"
if [ -n "$found" ]; then
pids="$pids $found"
fi
done
fi
if [ -z "$(echo "$pids" | tr -d '[:space:]')" ]; then
if command -v notify-send >/dev/null 2>&1; then
notify-send "NSFW App" "Die Anwendung läuft nicht." || true
fi
exit 0
fi
for pid in $pids; do
kill -TERM "$pid" 2>/dev/null || true
done
sleep 1
still_running=0
for pid in $pids; do
if kill -0 "$pid" 2>/dev/null; then
still_running=1
fi
done
if command -v notify-send >/dev/null 2>&1; then
if [ "$still_running" = "1" ]; then
notify-send "NSFW App" "Beenden wurde angefordert." || true
else
notify-send "NSFW App" "Anwendung beendet." || true
fi
fi
EOF
chmod 0755 "$PKG_ROOT/usr/bin/nsfwapp-stop"
cat >"$PKG_ROOT/usr/share/applications/nsfwapp.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=$APP_TITLE
Comment=Recorder Backend starten
Exec=nsfwapp-open
Icon=/usr/share/pixmaps/nsfwapp.ico
Terminal=false
Categories=AudioVideo;Video;
Actions=OpenFrontend;OpenData;OpenLog;Stop;
StartupNotify=false
[Desktop Action OpenFrontend]
Name=Frontend öffnen
Exec=nsfwapp-open
[Desktop Action OpenData]
Name=Datenordner öffnen
Exec=nsfwapp-open-data
[Desktop Action OpenLog]
Name=Log öffnen
Exec=nsfwapp-open-log
[Desktop Action Stop]
Name=Beenden
Exec=nsfwapp-stop
EOF
cat >"$PKG_ROOT/usr/share/applications/nsfwapp-stop.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=$APP_TITLE beenden
Comment=Recorder Backend beenden
Exec=nsfwapp-stop
Icon=/usr/share/pixmaps/nsfwapp.ico
Terminal=false
Categories=AudioVideo;Video;
Keywords=stop;quit;exit;beenden;
StartupNotify=false
EOF
cat >"$PKG_ROOT/usr/share/doc/nsfwapp/README.Debian" <<'EOF'
NSFW App fuer Debian
====================
Start:
nsfwapp
Beenden:
nsfwapp-stop
Desktop:
Der Launcher "NSFW App" startet das Backend und oeffnet https://localhost:9999.
Per Rechtsklick auf "NSFW App" gibt es Aktionen fuer Frontend, Datenordner,
Log und Beenden, sofern die Desktop-Umgebung Desktop Actions anzeigt.
Der Launcher "NSFW App beenden" beendet das Backend.
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" <<EOF
Package: $PACKAGE_NAME
Version: $VERSION
Section: video
Priority: optional
Architecture: $ARCH
Maintainer: Local Build <local@example.invalid>
Depends: ca-certificates, ffmpeg, python3, xdg-utils, libnotify-bin, procps
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"
dpkg-deb --root-owner-group --build "$PKG_ROOT" "$OUT_FILE"
echo
echo "Debian-Paket erzeugt:"
echo " $OUT_FILE"
echo
echo "Build-Artefakte:"
echo " $OUT_DIR/nsfwapp-linux-amd64"
if [ -f "$OUT_DIR/nsfwapp.exe" ]; then
echo " $OUT_DIR/nsfwapp.exe"
fi
echo
echo "Installieren:"
echo " sudo apt install ./dist/$(basename "$OUT_FILE")"