Update deployment docs and media library UI

This commit is contained in:
ShukeBta
2026-05-28 17:32:55 +08:00
parent 68a5a1e3c0
commit b5f1f1954e
33 changed files with 1667 additions and 874 deletions
+74
View File
@@ -0,0 +1,74 @@
param(
[int]$Port = 18080,
[string]$HostAddress = "0.0.0.0",
[string]$DataDir = "",
[string]$CacheDir = "",
[switch]$SkipBuild,
[switch]$Foreground
)
$ErrorActionPreference = "Stop"
$Root = Resolve-Path (Join-Path $PSScriptRoot "..")
if (-not $DataDir) { $DataDir = Join-Path $Root "data" }
if (-not $CacheDir) { $CacheDir = Join-Path $Root "cache" }
$WebDir = Join-Path $Root "web\dist"
$BinDir = Join-Path $Root "bin"
$Exe = Join-Path $BinDir "mediastation-go.exe"
$PidFile = Join-Path $Root ".mediastation.pid"
$LogDir = Join-Path $Root "logs"
$OutLog = Join-Path $LogDir "mediastation.out.log"
$ErrLog = Join-Path $LogDir "mediastation.err.log"
New-Item -ItemType Directory -Force -Path $DataDir, $CacheDir, $BinDir, $LogDir | Out-Null
if (-not $SkipBuild) {
Write-Host "[1/3] Building frontend"
Push-Location (Join-Path $Root "web")
npm ci
npm run build
Pop-Location
Write-Host "[2/3] Building server"
Push-Location $Root
$env:CGO_ENABLED = "0"
go build -trimpath -ldflags="-s -w" -o $Exe ./cmd/server
Pop-Location
} else {
Write-Host "[1/3] Build skipped"
}
if (Test-Path $PidFile) {
$oldPid = 0
$pidText = Get-Content $PidFile -Raw
if ([int]::TryParse($pidText.Trim(), [ref]$oldPid)) {
$oldProc = Get-Process -Id $oldPid -ErrorAction SilentlyContinue
if ($oldProc) {
Write-Host "[3/3] Stopping old process $oldPid"
Stop-Process -Id $oldPid -Force
Start-Sleep -Seconds 1
}
}
}
$env:MEDIASTATION_APP_HOST = $HostAddress
$env:MEDIASTATION_APP_PORT = "$Port"
$env:MEDIASTATION_APP_DATA_DIR = $DataDir
$env:MEDIASTATION_APP_WEB_DIR = $WebDir
$env:MEDIASTATION_DATABASE_DB_PATH = (Join-Path $DataDir "mediastation.db")
$env:MEDIASTATION_CACHE_CACHE_DIR = $CacheDir
Write-Host "[3/3] Starting MediaStationGo on http://$HostAddress`:$Port"
if ($Foreground) {
& $Exe
} else {
$proc = Start-Process -FilePath $Exe `
-WorkingDirectory $Root `
-WindowStyle Hidden `
-RedirectStandardOutput $OutLog `
-RedirectStandardError $ErrLog `
-PassThru
$proc.Id | Set-Content $PidFile
Start-Sleep -Seconds 2
Invoke-WebRequest -UseBasicParsing -Uri "http://127.0.0.1:$Port/api/health" -TimeoutSec 10 | Out-Null
Write-Host "Started. PID=$($proc.Id), logs=$OutLog / $ErrLog"
}
+78
View File
@@ -0,0 +1,78 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PORT="${PORT:-18080}"
HOST="${HOST:-0.0.0.0}"
DATA_DIR="${DATA_DIR:-$ROOT_DIR/data}"
CACHE_DIR="${CACHE_DIR:-$ROOT_DIR/cache}"
WEB_DIR="${WEB_DIR:-$ROOT_DIR/web/dist}"
BIN_DIR="${BIN_DIR:-$ROOT_DIR/bin}"
BIN_PATH="${BIN_PATH:-$BIN_DIR/mediastation-go}"
PID_FILE="${PID_FILE:-$ROOT_DIR/.mediastation.pid}"
LOG_FILE="${LOG_FILE:-$ROOT_DIR/logs/mediastation.log}"
SKIP_BUILD="${SKIP_BUILD:-0}"
DETACH="${DETACH:-1}"
usage() {
cat <<EOF
MediaStationGo one-click deploy
Usage:
PORT=18080 DATA_DIR=/opt/mediastation/data ./scripts/deploy.sh
Environment:
PORT HTTP port, default 18080
HOST Listen host, default 0.0.0.0
DATA_DIR Persistent data directory, default ./data
CACHE_DIR Cache directory, default ./cache
WEB_DIR Built frontend directory, default ./web/dist
SKIP_BUILD 1 to skip npm/go build
DETACH 1 to run in background, 0 to run in foreground
EOF
}
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
usage
exit 0
fi
mkdir -p "$DATA_DIR" "$CACHE_DIR" "$BIN_DIR" "$(dirname "$LOG_FILE")"
if [[ "$SKIP_BUILD" != "1" ]]; then
echo "[1/3] Building frontend"
(cd "$ROOT_DIR/web" && npm ci && npm run build)
echo "[2/3] Building server"
(cd "$ROOT_DIR" && CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o "$BIN_PATH" ./cmd/server)
else
echo "[1/3] Build skipped"
fi
if [[ -f "$PID_FILE" ]]; then
old_pid="$(cat "$PID_FILE" || true)"
if [[ -n "$old_pid" ]] && kill -0 "$old_pid" 2>/dev/null; then
echo "[3/3] Stopping old process $old_pid"
kill "$old_pid" || true
sleep 1
fi
fi
export MEDIASTATION_APP_HOST="$HOST"
export MEDIASTATION_APP_PORT="$PORT"
export MEDIASTATION_APP_DATA_DIR="$DATA_DIR"
export MEDIASTATION_APP_WEB_DIR="$WEB_DIR"
export MEDIASTATION_DATABASE_DB_PATH="$DATA_DIR/mediastation.db"
export MEDIASTATION_CACHE_CACHE_DIR="$CACHE_DIR"
echo "[3/3] Starting MediaStationGo on http://$HOST:$PORT"
if [[ "$DETACH" == "1" ]]; then
nohup "$BIN_PATH" >>"$LOG_FILE" 2>&1 &
echo $! > "$PID_FILE"
sleep 2
if command -v curl >/dev/null 2>&1; then
curl -fsS "http://127.0.0.1:$PORT/api/health" >/dev/null
fi
echo "Started. PID=$(cat "$PID_FILE"), log=$LOG_FILE"
else
exec "$BIN_PATH"
fi
+33
View File
@@ -0,0 +1,33 @@
param(
[string]$Image = "ghcr.io/shukebta/mediastation-go",
[string]$Tag = "latest",
[string]$Platforms = "linux/amd64,linux/arm64",
[switch]$Load
)
$ErrorActionPreference = "Stop"
$Builder = "mediastation-builder"
docker buildx inspect $Builder *> $null
if ($LASTEXITCODE -ne 0) {
docker buildx create --name $Builder --use | Out-Null
} else {
docker buildx use $Builder | Out-Null
}
$args = @(
"buildx", "build",
"--platform", $Platforms,
"-t", "$Image`:$Tag"
)
if ($Load) {
$args += "--load"
} else {
$args += "--push"
}
$args += "."
Write-Host "Building $Image`:$Tag for $Platforms"
docker @args
+31
View File
@@ -0,0 +1,31 @@
#!/usr/bin/env bash
set -euo pipefail
IMAGE="${IMAGE:-ghcr.io/shukebta/mediastation-go}"
TAG="${TAG:-latest}"
PLATFORMS="${PLATFORMS:-linux/amd64,linux/arm64}"
PUSH="${PUSH:-1}"
BUILDER="${BUILDER:-mediastation-builder}"
if ! docker buildx inspect "$BUILDER" >/dev/null 2>&1; then
docker buildx create --name "$BUILDER" --use >/dev/null
else
docker buildx use "$BUILDER" >/dev/null
fi
args=(
buildx build
--platform "$PLATFORMS"
-t "$IMAGE:$TAG"
)
if [[ "$PUSH" == "1" ]]; then
args+=(--push)
else
args+=(--load)
fi
args+=(.)
echo "Building $IMAGE:$TAG for $PLATFORMS"
docker "${args[@]}"