From d0fe37033c32eb192e12780361e8857509a028f3 Mon Sep 17 00:00:00 2001 From: Arian Nasr Date: Tue, 7 Apr 2026 02:43:39 -0400 Subject: [PATCH 1/6] 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 + From ebe75427af9073662e1d567ad900cafd5cf6f591 Mon Sep 17 00:00:00 2001 From: Arian Nasr Date: Tue, 7 Apr 2026 02:49:01 -0400 Subject: [PATCH 2/6] change default .env bind address --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 1fa44db..129d179 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,3 @@ NAVIDROME_MUSIC_FOLDER="/opt/navidrome/music" -BIND_ADDRESS="192.168.2.24" +BIND_ADDRESS="0.0.0.0" BIND_PORT="5001" \ No newline at end of file From 210fb30059ae5daa6f40f57e449c63057e65cb94 Mon Sep 17 00:00:00 2001 From: Arian Nasr Date: Tue, 7 Apr 2026 03:20:40 -0400 Subject: [PATCH 3/6] test framework for deb building --- .gitignore | 1 + debian/changelog | 2 +- debian/control | 9 ++------- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index a9de651..1678ef0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ setup.sh navidrome-upload.service .idea/ .env +/README.md \ No newline at end of file diff --git a/debian/changelog b/debian/changelog index 7e868a1..6a3822e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,5 +2,5 @@ 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 + -- Arian Nasr Tue, 07 Apr 2026 12:00:00 +0000 diff --git a/debian/control b/debian/control index 9e99e1a..55938f2 100644 --- a/debian/control +++ b/debian/control @@ -1,7 +1,7 @@ Source: navidrome-uploader Section: web Priority: optional -Maintainer: Arian Nasr +Maintainer: Arian Nasr Build-Depends: debhelper-compat (= 13) Standards-Version: 4.7.0 Rules-Requires-Root: no @@ -9,9 +9,4 @@ 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. - +Description: Navidrome Web Upload Utility \ No newline at end of file From 822c3941fd8e6e1daf4ae9ddf6d7dd1f257b983a Mon Sep 17 00:00:00 2001 From: Arian Nasr Date: Tue, 7 Apr 2026 03:22:25 -0400 Subject: [PATCH 4/6] remove README.md --- README.md | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 README.md diff --git a/README.md b/README.md deleted file mode 100644 index 535f0fc..0000000 --- a/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# 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. - From 399544dc50b5357d0e74ebb8017acd589435817c Mon Sep 17 00:00:00 2001 From: Arian Nasr Date: Wed, 8 Apr 2026 05:51:54 -0400 Subject: [PATCH 5/6] remove unused dependency --- debian/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/control b/debian/control index 55938f2..1c96f4b 100644 --- a/debian/control +++ b/debian/control @@ -8,5 +8,5 @@ Rules-Requires-Root: no Package: navidrome-uploader Architecture: all -Depends: ${misc:Depends}, adduser, python3, python3-pip, python3-venv +Depends: ${misc:Depends}, adduser, python3, python3-venv Description: Navidrome Web Upload Utility \ No newline at end of file From 8adbb87fc35feccaea463d735cbb88f5caca4ede Mon Sep 17 00:00:00 2001 From: Arian Nasr Date: Wed, 8 Apr 2026 23:06:38 -0400 Subject: [PATCH 6/6] add navidrome music dir to service readwritepaths --- contrib/navidrome-uploader.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/navidrome-uploader.service b/contrib/navidrome-uploader.service index 034017c..c441c0b 100644 --- a/contrib/navidrome-uploader.service +++ b/contrib/navidrome-uploader.service @@ -20,7 +20,7 @@ AmbientCapabilities= ProtectSystem=strict ProtectHome=yes PrivateTmp=yes -ReadWritePaths=/opt/navidrome-uploader +ReadWritePaths=/opt/navidrome-uploader /opt/navidrome/music InaccessiblePaths=/boot /mnt /media PrivateDevices=yes