debian/control, postinst, prerm, postrm — standard dpkg package lifecycle debian/files/opt/dupfinder/dupfinder-setup.sh — interactive setup: checks Docker, detects NVIDIA GPU, prompts for photos/data paths, writes docker-compose.override.yml with GPU reservation if present, pulls image from registry (builds from source as fallback) debian/files/usr/local/bin/dupfinder — CLI wrapper: setup / start / stop / restart / status / logs / open / update debian/files/etc/systemd/system/dupfinder.service — systemd unit, guards against starting before setup has run debian/build-deb.sh — builds .deb and uploads to Gitea package registry; prints the exact apt sources.list line on success Install on any Debian/Ubuntu machine: echo "deb [trusted=yes] http://192.168.1.64:3000/api/packages/tocmo0nlord/debian bookworm main" \ | sudo tee /etc/apt/sources.list.d/dupfinder.list sudo apt update && sudo apt install dupfinder sudo dupfinder setup Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
82 lines
2.4 KiB
Bash
82 lines
2.4 KiB
Bash
#!/bin/bash
|
|
# DupFinder CLI wrapper
|
|
CONF_FILE="/etc/dupfinder.conf"
|
|
COMPOSE_DIR="/opt/dupfinder"
|
|
COMPOSE_YML="$COMPOSE_DIR/docker-compose.yml"
|
|
OVERRIDE_YML="$COMPOSE_DIR/docker-compose.override.yml"
|
|
|
|
[[ -f "$CONF_FILE" ]] && source "$CONF_FILE"
|
|
: "${APP_PORT:=8765}"
|
|
|
|
_compose() {
|
|
docker compose -f "$COMPOSE_YML" -f "$OVERRIDE_YML" "$@"
|
|
}
|
|
|
|
_require_conf() {
|
|
if [[ ! -f "$CONF_FILE" ]]; then
|
|
echo "DupFinder is not configured. Run: sudo dupfinder setup"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
case "${1:-help}" in
|
|
setup)
|
|
exec bash /opt/dupfinder/dupfinder-setup.sh
|
|
;;
|
|
start)
|
|
_require_conf
|
|
sudo systemctl start dupfinder.service
|
|
echo "DupFinder started — http://localhost:$APP_PORT"
|
|
;;
|
|
stop)
|
|
sudo systemctl stop dupfinder.service
|
|
echo "DupFinder stopped."
|
|
;;
|
|
restart)
|
|
_require_conf
|
|
sudo systemctl restart dupfinder.service
|
|
echo "DupFinder restarted — http://localhost:$APP_PORT"
|
|
;;
|
|
status)
|
|
systemctl status dupfinder.service --no-pager
|
|
;;
|
|
logs)
|
|
_compose logs -f --tail=100
|
|
;;
|
|
open)
|
|
_require_conf
|
|
# Wait for service to be ready then open browser
|
|
for i in $(seq 1 15); do
|
|
curl -sf "http://localhost:$APP_PORT/" -o /dev/null && break
|
|
sleep 1
|
|
done
|
|
xdg-open "http://localhost:$APP_PORT" 2>/dev/null || \
|
|
echo "Open in browser: http://localhost:$APP_PORT"
|
|
;;
|
|
update)
|
|
_require_conf
|
|
echo "Pulling latest image..."
|
|
docker pull tocmo0nlord/dupfinder:latest
|
|
sudo systemctl restart dupfinder.service
|
|
echo "Updated and restarted."
|
|
;;
|
|
uninstall)
|
|
echo "To fully remove DupFinder: sudo apt remove dupfinder"
|
|
echo "To also remove data: sudo apt purge dupfinder"
|
|
;;
|
|
help|--help|-h|*)
|
|
echo "Usage: dupfinder <command>"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " setup Configure photos path, data path, pull image"
|
|
echo " start Start the service"
|
|
echo " stop Stop the service"
|
|
echo " restart Restart the service"
|
|
echo " status Show systemd service status"
|
|
echo " logs Tail container logs"
|
|
echo " open Open in browser"
|
|
echo " update Pull latest image and restart"
|
|
echo " uninstall Show removal instructions"
|
|
;;
|
|
esac
|