diff --git a/backend/build_deb.sh b/backend/build_deb.sh index 69c257c..0e7fc63 100644 --- a/backend/build_deb.sh +++ b/backend/build_deb.sh @@ -22,6 +22,7 @@ DESCRIPTION_LONG="${DEB_DESCRIPTION_LONG:-${DESCRIPTION_LONG:-}}" OUT_DIR="$SCRIPT_DIR/dist" BIN_PATH="$OUT_DIR/nsfwapp-linux-amd64" OUT_FILE="$OUT_DIR/${PACKAGE_NAME}_${ARCH}.deb" +ML_REQUIREMENTS_PATH="$SCRIPT_DIR/ml/requirements-ml.txt" CLEAN_BUILD_DIR=0 if [ -n "${DEB_BUILD_DIR:-}" ]; then @@ -58,6 +59,7 @@ fail() { [ -n "$DESCRIPTION_LONG" ] || fail "DESCRIPTION_LONG fehlt im Build-Manifest." command -v dpkg-deb >/dev/null 2>&1 || fail "dpkg-deb fehlt. Installiere es mit: sudo apt install -y dpkg-dev" +[ -f "$ML_REQUIREMENTS_PATH" ] || fail "ML-Requirements nicht gefunden: $ML_REQUIREMENTS_PATH" mkdir -p "$OUT_DIR" @@ -88,6 +90,7 @@ mkdir -p \ chmod 0755 "$PKG_ROOT" "$PKG_ROOT/DEBIAN" install -m 0755 "$BIN_PATH" "$PKG_ROOT/opt/nsfwapp/nsfwapp" +install -m 0644 "$ML_REQUIREMENTS_PATH" "$PKG_ROOT/opt/nsfwapp/requirements-ml.txt" 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 @@ -109,6 +112,59 @@ if [ ! -f "$runtime_bin" ] || ! cmp -s "$install_dir/nsfwapp" "$runtime_bin"; th mv "$tmp" "$runtime_bin" fi +setup_ml_python() { + if [ "${NSFWAPP_SKIP_ML_SETUP:-0}" = "1" ]; then + return 0 + fi + if [ -n "${AI_SERVER_PYTHON:-}" ]; then + return 0 + fi + + requirements_file="$install_dir/requirements-ml.txt" + if [ ! -f "$requirements_file" ]; then + return 0 + fi + + venv_dir="${NSFWAPP_ML_VENV:-$app_dir/ml-venv}" + venv_python="$venv_dir/bin/python" + requirements_marker="$venv_dir/.requirements-ml.txt" + setup_log="$app_dir/ml-setup.log" + + if [ ! -x "$venv_python" ]; then + echo "Erstelle Python-ML-Umgebung: $venv_dir" >&2 + if ! python3 -m venv "$venv_dir" >>"$setup_log" 2>&1; then + return 1 + fi + fi + + if [ ! -f "$requirements_marker" ] || ! cmp -s "$requirements_file" "$requirements_marker"; then + echo "Installiere Python-ML-Pakete. Details: $setup_log" >&2 + if command -v notify-send >/dev/null 2>&1; then + notify-send "NSFW App" "ML-Python-Pakete werden installiert. Das kann beim ersten Start dauern." || true + fi + if ! "$venv_python" -m pip install --upgrade pip >>"$setup_log" 2>&1; then + return 1 + fi + if ! "$venv_python" -m pip install -r "$requirements_file" >>"$setup_log" 2>&1; then + return 1 + fi + if ! cp "$requirements_file" "$requirements_marker"; then + return 1 + fi + fi + + AI_SERVER_PYTHON="$venv_python" + export AI_SERVER_PYTHON + return 0 +} + +if ! setup_ml_python; then + echo "Warnung: ML-Python-Umgebung konnte nicht vorbereitet werden. Details: $app_dir/ml-setup.log" >&2 + if command -v notify-send >/dev/null 2>&1; then + notify-send "NSFW App" "ML-Python-Umgebung konnte nicht vorbereitet werden. Siehe ml-setup.log." || true + fi +fi + cd "$app_dir" exec "$runtime_bin" "$@" EOF @@ -262,7 +318,9 @@ User-Daten: Wichtige Laufzeitprogramme: ffmpeg/ffprobe muessen fuer Recording, Teaser, Analyse und Videofunktionen verfuegbar sein. SQLite ist die Standard-Datenbank. pg_dump/pg_restore werden nur fuer Postgres-Backup und Restore benoetigt. - Der AI-Server braucht Python und die benoetigten Python-Pakete deiner ML-Umgebung. + Der Launcher erstellt beim ersten Start automatisch ${NSFWAPP_HOME:-$HOME/nsfwapp}/ml-venv + und installiert die mitgelieferte requirements-ml.txt. Details stehen in ml-setup.log. + Setze AI_SERVER_PYTHON, wenn du eine eigene Python-Umgebung verwenden willst. EOF cat >"$PKG_ROOT/DEBIAN/control" <