From d0fe37033c32eb192e12780361e8857509a028f3 Mon Sep 17 00:00:00 2001 From: Arian Nasr Date: Tue, 7 Apr 2026 02:43:39 -0400 Subject: [PATCH] deb build framework --- README.md | 22 ++++++++++++++++++++++ debian/changelog | 6 ++++++ debian/control | 17 +++++++++++++++++ debian/navidrome-uploader.dirs | 7 +++++++ debian/navidrome-uploader.install | 9 +++++++++ debian/navidrome-uploader.postinst | 22 ++++++++++++++++++++++ debian/navidrome-uploader.postrm | 14 ++++++++++++++ debian/navidrome-uploader.preinst | 10 ++++++++++ debian/navidrome-uploader.prerm | 14 ++++++++++++++ debian/rules | 10 ++++++++++ debian/source/format | 2 ++ release/build-deb.sh | 9 +++++++++ 12 files changed, 142 insertions(+) create mode 100644 README.md create mode 100644 debian/changelog create mode 100644 debian/control create mode 100644 debian/navidrome-uploader.dirs create mode 100644 debian/navidrome-uploader.install create mode 100644 debian/navidrome-uploader.postinst create mode 100644 debian/navidrome-uploader.postrm create mode 100644 debian/navidrome-uploader.preinst create mode 100644 debian/navidrome-uploader.prerm create mode 100644 debian/rules create mode 100644 debian/source/format create mode 100644 release/build-deb.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..535f0fc --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# navidrome-uploader + +Small Flask app that uploads audio files to a Navidrome music folder. + +## Debian packaging + +Debian packaging files are in `debian/`. + +The package installs: +- app code in `/opt/navidrome-uploader` +- environment file in `/etc/default/navidrome-uploader/.env` +- systemd unit in `/lib/systemd/system/navidrome-uploader.service` +- Python dependencies in `/opt/navidrome-uploader/venv` during `postinst` + +### Build a `.deb` + +```sh +./release/build-deb.sh +``` + +The resulting package is written to the parent directory of the project. + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..7e868a1 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,6 @@ +navidrome-uploader (0.1.0) unstable; urgency=medium + + * Add Debian packaging with systemd service integration and venv setup. + + -- Arian Nasr Tue, 07 Apr 2026 12:00:00 +0000 + diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..9e99e1a --- /dev/null +++ b/debian/control @@ -0,0 +1,17 @@ +Source: navidrome-uploader +Section: web +Priority: optional +Maintainer: Arian Nasr +Build-Depends: debhelper-compat (= 13) +Standards-Version: 4.7.0 +Rules-Requires-Root: no + +Package: navidrome-uploader +Architecture: all +Depends: ${misc:Depends}, adduser, python3, python3-pip, python3-venv +Description: Lightweight web uploader for Navidrome music libraries + Flask application that provides a drag-and-drop web interface for uploading + audio files into a Navidrome music directory. The package installs a + hardened systemd service and manages Python dependencies in a dedicated venv + under /opt/navidrome-uploader. + diff --git a/debian/navidrome-uploader.dirs b/debian/navidrome-uploader.dirs new file mode 100644 index 0000000..7048a1d --- /dev/null +++ b/debian/navidrome-uploader.dirs @@ -0,0 +1,7 @@ +opt/navidrome-uploader +opt/navidrome-uploader/templates +opt/navidrome-uploader/static +opt/navidrome-uploader/static/css +opt/navidrome-uploader/static/js +etc/default/navidrome-uploader + diff --git a/debian/navidrome-uploader.install b/debian/navidrome-uploader.install new file mode 100644 index 0000000..4697981 --- /dev/null +++ b/debian/navidrome-uploader.install @@ -0,0 +1,9 @@ +main.py opt/navidrome-uploader/ +gunicorn.conf.py opt/navidrome-uploader/ +requirements.txt opt/navidrome-uploader/ +.env.example opt/navidrome-uploader/ +templates/* opt/navidrome-uploader/templates/ +static/css/* opt/navidrome-uploader/static/css/ +static/js/* opt/navidrome-uploader/static/js/ +contrib/navidrome-uploader.service lib/systemd/system/ + diff --git a/debian/navidrome-uploader.postinst b/debian/navidrome-uploader.postinst new file mode 100644 index 0000000..2740e26 --- /dev/null +++ b/debian/navidrome-uploader.postinst @@ -0,0 +1,22 @@ +#!/bin/sh +set -e + +APP_DIR="/opt/navidrome-uploader" +VENV_DIR="${APP_DIR}/venv" + +case "$1" in + configure) + python3 -m venv "${VENV_DIR}" + "${VENV_DIR}/bin/pip" install --no-cache-dir --upgrade pip + "${VENV_DIR}/bin/pip" install --no-cache-dir -r "${APP_DIR}/requirements.txt" + + if command -v systemctl > /dev/null 2>&1; then + systemctl daemon-reload || true + systemctl enable navidrome-uploader.service || true + systemctl restart navidrome-uploader.service || true + fi + ;; +esac + +exit 0 + diff --git a/debian/navidrome-uploader.postrm b/debian/navidrome-uploader.postrm new file mode 100644 index 0000000..0f2570e --- /dev/null +++ b/debian/navidrome-uploader.postrm @@ -0,0 +1,14 @@ +#!/bin/sh +set -e + +if command -v systemctl > /dev/null 2>&1; then + systemctl daemon-reload || true +fi + +if [ "$1" = "purge" ]; then + rm -rf /etc/default/navidrome-uploader + rm -rf /opt/navidrome-uploader/venv +fi + +exit 0 + diff --git a/debian/navidrome-uploader.preinst b/debian/navidrome-uploader.preinst new file mode 100644 index 0000000..37929b4 --- /dev/null +++ b/debian/navidrome-uploader.preinst @@ -0,0 +1,10 @@ +#!/bin/sh +set -e + +if ! getent passwd navidrome-uploader > /dev/null 2>&1; then + printf "Creating navidrome-uploader user\n" + useradd --system --shell /usr/sbin/nologin --user-group navidrome-uploader +fi + +exit 0 + diff --git a/debian/navidrome-uploader.prerm b/debian/navidrome-uploader.prerm new file mode 100644 index 0000000..653d5b6 --- /dev/null +++ b/debian/navidrome-uploader.prerm @@ -0,0 +1,14 @@ +#!/bin/sh +set -e + +case "$1" in + remove|deconfigure) + if command -v systemctl > /dev/null 2>&1; then + systemctl stop navidrome-uploader.service || true + systemctl disable navidrome-uploader.service || true + fi + ;; +esac + +exit 0 + diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000..dedc208 --- /dev/null +++ b/debian/rules @@ -0,0 +1,10 @@ +#!/usr/bin/make -f + +%: + dh $@ + +override_dh_install: + dh_install + install -d debian/navidrome-uploader/etc/default/navidrome-uploader + install -m 0640 .env.example debian/navidrome-uploader/etc/default/navidrome-uploader/.env + diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..435dd71 --- /dev/null +++ b/debian/source/format @@ -0,0 +1,2 @@ +3.0 (native) + diff --git a/release/build-deb.sh b/release/build-deb.sh new file mode 100644 index 0000000..07ff073 --- /dev/null +++ b/release/build-deb.sh @@ -0,0 +1,9 @@ +#!/bin/sh +set -eu + +SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" +PROJECT_ROOT="$(CDPATH= cd -- "${SCRIPT_DIR}/.." && pwd)" + +cd "${PROJECT_ROOT}" +dpkg-buildpackage -us -uc -b +