diff --git a/.gitignore b/.gitignore
index bfcb278..0da1aab 100644
--- a/.gitignore
+++ b/.gitignore
@@ -80,4 +80,7 @@ Thumbs.db
# Scripts
# ----------------------------
deploy-ripster.sh
-build-handbrake-nvdec.sh
\ No newline at end of file
+build-handbrake-nvdec.sh
+gitea-setup.sh
+gitea_install.sh
+/scripts/
diff --git a/backend/package-lock.json b/backend/package-lock.json
index 9578e5e..4d24aab 100644
--- a/backend/package-lock.json
+++ b/backend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ripster-backend",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ripster-backend",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"dependencies": {
"cors": "^2.8.5",
"dotenv": "^16.4.7",
diff --git a/backend/package.json b/backend/package.json
index 59c56e9..b127d8d 100644
--- a/backend/package.json
+++ b/backend/package.json
@@ -1,6 +1,6 @@
{
"name": "ripster-backend",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"private": true,
"type": "commonjs",
"scripts": {
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 55a434d..e34ced8 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ripster-frontend",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ripster-frontend",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"dependencies": {
"primeicons": "^7.0.0",
"primereact": "^10.9.2",
diff --git a/frontend/package.json b/frontend/package.json
index 4e673c1..3c73d16 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "ripster-frontend",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"private": true,
"type": "module",
"scripts": {
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index 5ce7702..c9366b1 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -9,6 +9,7 @@ import HistoryPage from './pages/HistoryPage';
import DatabasePage from './pages/DatabasePage';
function App() {
+ const appVersion = __APP_VERSION__;
const [pipeline, setPipeline] = useState({ state: 'IDLE', progress: 0, context: {} });
const [hardwareMonitoring, setHardwareMonitoring] = useState(null);
const [lastDiscEvent, setLastDiscEvent] = useState(null);
@@ -115,7 +116,12 @@ function App() {
Ripster
-
Disc Ripping Control Center
+
+
Disc Ripping Control Center
+
+ v{appVersion}
+
+
diff --git a/frontend/src/styles/app.css b/frontend/src/styles/app.css
index f3da2f4..8ec7762 100644
--- a/frontend/src/styles/app.css
+++ b/frontend/src/styles/app.css
@@ -142,6 +142,28 @@ body {
letter-spacing: 0.02em;
}
+.brand-meta {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 0.45rem;
+}
+
+.app-version {
+ display: inline-flex;
+ align-items: center;
+ min-height: 1.35rem;
+ padding: 0.1rem 0.45rem;
+ border: 1px solid rgba(58, 29, 18, 0.18);
+ border-radius: 999px;
+ background: rgba(255, 250, 240, 0.45);
+ color: rgba(58, 29, 18, 0.72);
+ font-size: 0.72rem;
+ font-weight: 600;
+ letter-spacing: 0.03em;
+ white-space: nowrap;
+}
+
.nav-buttons {
display: flex;
gap: 0.5rem;
@@ -2530,6 +2552,10 @@ body {
font-size: 0.82rem;
}
+ .app-version {
+ font-size: 0.68rem;
+ }
+
.metadata-grid,
.device-meta,
.hardware-monitor-grid,
diff --git a/frontend/vite.config.js b/frontend/vite.config.js
index 10fe1b4..6d46048 100644
--- a/frontend/vite.config.js
+++ b/frontend/vite.config.js
@@ -1,6 +1,8 @@
+import { readFileSync } from 'node:fs';
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
+const appPackage = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
const publicOrigin = (process.env.VITE_PUBLIC_ORIGIN || '').trim();
const parsedAllowedHosts = (process.env.VITE_ALLOWED_HOSTS || '')
.split(',')
@@ -24,6 +26,9 @@ if (publicOrigin) {
export default defineConfig({
plugins: [react()],
+ define: {
+ __APP_VERSION__: JSON.stringify(appPackage.version)
+ },
server: {
host: '0.0.0.0',
port: 5173,
diff --git a/gitea_setup.sh b/gitea_setup.sh
new file mode 100755
index 0000000..a0ef667
--- /dev/null
+++ b/gitea_setup.sh
@@ -0,0 +1,152 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+GITEA_BASE="https://git.d-razz.de"
+REPO_OWNER="michael"
+REPO_NAME="ripster"
+BRANCHES_API_URL="${GITEA_BASE}/api/v1/repos/${REPO_OWNER}/${REPO_NAME}/branches?limit=50"
+
+usage() {
+ cat <<'EOF'
+Verwendung:
+ bash setup.sh [Optionen]
+
+Optionen (wie install.sh):
+ --branch
Branch direkt setzen (ohne Auswahlmenue)
+ --dir Installationsverzeichnis
+ --user Systembenutzer fuer den Dienst
+ --port Backend-Port
+ --host Hostname/IP fuer die Weboberflaeche
+ --no-makemkv MakeMKV-Installation ueberspringen
+ --no-handbrake HandBrake-Installation ueberspringen
+ --no-nginx Nginx-Einrichtung ueberspringen
+ --reinstall Vorhandene Installation aktualisieren
+ -h, --help Hilfe anzeigen
+EOF
+}
+
+SELECTED_BRANCH=""
+FORWARDED_ARGS=()
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ --branch)
+ [[ $# -ge 2 ]] || { echo "Fehlender Wert fuer --branch" >&2; exit 1; }
+ SELECTED_BRANCH="$2"
+ shift 2
+ ;;
+ --dir|--user|--port|--host)
+ [[ $# -ge 2 ]] || { echo "Fehlender Wert fuer $1" >&2; exit 1; }
+ FORWARDED_ARGS+=("$1" "$2")
+ shift 2
+ ;;
+ --no-makemkv|--no-handbrake|--no-nginx|--reinstall)
+ FORWARDED_ARGS+=("$1")
+ shift
+ ;;
+ -h|--help)
+ usage
+ exit 0
+ ;;
+ *)
+ echo "Unbekannter Parameter: $1" >&2
+ usage >&2
+ exit 1
+ ;;
+ esac
+done
+
+fetch_url() {
+ local url="$1"
+
+ if command -v curl >/dev/null 2>&1; then
+ curl -fsSL "$url"
+ return
+ fi
+
+ if command -v wget >/dev/null 2>&1; then
+ wget -qO- "$url"
+ return
+ fi
+
+ echo "Weder curl noch wget gefunden. Bitte eines davon installieren." >&2
+ exit 1
+}
+
+download_file() {
+ local url="$1"
+ local target="$2"
+ fetch_url "$url" > "$target"
+}
+
+select_branch() {
+ local branches_json
+ local -a branches
+ local selection
+
+ branches_json="$(fetch_url "$BRANCHES_API_URL")"
+ mapfile -t branches < <(
+ printf '%s\n' "$branches_json" \
+ | grep -oE '"name"[[:space:]]*:[[:space:]]*"[^"]+"' \
+ | sed -E 's/"name"[[:space:]]*:[[:space:]]*"([^"]+)"/\1/'
+ )
+
+ if [[ ${#branches[@]} -eq 0 ]]; then
+ echo "Keine Branches gefunden oder API-Antwort ungültig." >&2
+ exit 1
+ fi
+
+ if [[ -n "$SELECTED_BRANCH" ]]; then
+ local found=false
+ for branch in "${branches[@]}"; do
+ if [[ "$branch" == "$SELECTED_BRANCH" ]]; then
+ found=true
+ break
+ fi
+ done
+ if [[ "$found" == false ]]; then
+ echo "Branch '$SELECTED_BRANCH' nicht gefunden." >&2
+ exit 1
+ fi
+ return
+ fi
+
+ if [[ ! -t 0 ]]; then
+ echo "Kein interaktives Terminal für die Branch-Auswahl verfügbar." >&2
+ exit 1
+ fi
+
+ echo "Verfügbare Branches:"
+ for i in "${!branches[@]}"; do
+ printf " %2d) %s\n" "$((i + 1))" "${branches[$i]}"
+ done
+
+ while true; do
+ read -r -p "Bitte Branch auswählen [1-${#branches[@]}]: " selection
+ if [[ "$selection" =~ ^[0-9]+$ ]] && (( selection >= 1 && selection <= ${#branches[@]} )); then
+ SELECTED_BRANCH="${branches[$((selection - 1))]}"
+ return
+ fi
+ echo "Ungültige Auswahl."
+ done
+}
+
+select_branch
+
+SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd -P)"
+INSTALL_SCRIPT="${SCRIPT_DIR}/gitea_install.sh"
+
+if [[ ! -f "$INSTALL_SCRIPT" ]]; then
+ echo "gitea_install.sh nicht gefunden in $SCRIPT_DIR" >&2
+ exit 1
+fi
+
+if [[ $EUID -eq 0 ]]; then
+ bash "$INSTALL_SCRIPT" --branch "$SELECTED_BRANCH" "${FORWARDED_ARGS[@]}"
+else
+ if ! command -v sudo >/dev/null 2>&1; then
+ echo "sudo nicht gefunden. Bitte als root ausführen." >&2
+ exit 1
+ fi
+ sudo bash "$INSTALL_SCRIPT" --branch "$SELECTED_BRANCH" "${FORWARDED_ARGS[@]}"
+fi
diff --git a/package-lock.json b/package-lock.json
index b76bd25..b0e4215 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "ripster",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ripster",
- "version": "1.0.0",
+ "version": "0.9.0-1",
"devDependencies": {
"concurrently": "^9.1.2"
}
diff --git a/package.json b/package.json
index b1d917b..aea8bc8 100644
--- a/package.json
+++ b/package.json
@@ -1,13 +1,14 @@
{
"name": "ripster",
"private": true,
- "version": "1.0.0",
+ "version": "0.9.0-1",
"scripts": {
"dev": "concurrently \"npm run dev --prefix backend\" \"npm run dev --prefix frontend\"",
"dev:backend": "npm run dev --prefix backend",
"dev:frontend": "npm run dev --prefix frontend",
"start": "npm run start --prefix backend",
- "build:frontend": "npm run build --prefix frontend"
+ "build:frontend": "npm run build --prefix frontend",
+ "release:interactive": "bash ./scripts/release.sh"
},
"devDependencies": {
"concurrently": "^9.1.2"