From db06028e6ece6007feaa60a96f491fde6c9c0e25 Mon Sep 17 00:00:00 2001 From: ponzischeme89 Date: Wed, 27 May 2026 07:45:13 +1200 Subject: [PATCH] Deployment script --- deploy.ps1 | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 deploy.ps1 diff --git a/deploy.ps1 b/deploy.ps1 new file mode 100644 index 0000000..660bfec --- /dev/null +++ b/deploy.ps1 @@ -0,0 +1,99 @@ +<# +Deploy embycovers to an Asustor NAS over SSH/SCP from Windows PowerShell. + +Prerequisites on your Windows machine: +- OpenSSH Client installed. Test with: ssh -V +- SSH enabled on the Asustor NAS. +- Docker / Docker Compose available on the Asustor NAS. + +Example: +.\deploy.ps1 -NasHost MATT-NAS -NasUser admin -EmbyUrl http://192.168.1.50:8096 -EmbyApiKey abcdef123456 +#> + +param( + [Parameter(Mandatory = $true)] + [string]$NasHost, + + [Parameter(Mandatory = $true)] + [string]$NasUser, + + [string]$RemoteAppDir = "/share/Docker/embycovers", + + [Parameter(Mandatory = $true)] + [string]$EmbyUrl, + + [Parameter(Mandatory = $true)] + [string]$EmbyApiKey, + + [int]$HostPort = 8500 +) + +$ErrorActionPreference = "Stop" + +function Require-Command($Name) { + if (-not (Get-Command $Name -ErrorAction SilentlyContinue)) { + throw "$Name was not found. Install or enable it first." + } +} + +Require-Command ssh +Require-Command scp + +$LocalDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$Remote = "$NasUser@$NasHost" + +Write-Host "Deploying embycovers to ${Remote}:$RemoteAppDir" +Write-Host "Emby URL: $EmbyUrl" +Write-Host "Host port: $HostPort" + +ssh $Remote @" +set -e +mkdir -p '$RemoteAppDir' '$RemoteAppDir/output' '$RemoteAppDir/cache' '$RemoteAppDir/static/studios' '$RemoteAppDir/templates' +"@ + +# Copy top-level project files. +scp ` + "$LocalDir/app.py" ` + "$LocalDir/Dockerfile" ` + "$LocalDir/docker-compose.yml" ` + "$LocalDir/requirements.txt" ` + "${Remote}:$RemoteAppDir/" + +# Copy templates and static assets recursively. +scp -r "$LocalDir/templates/." "${Remote}:$RemoteAppDir/templates/" +scp -r "$LocalDir/static/." "${Remote}:$RemoteAppDir/static/" + +# Copy any loose logo images that live at the repo root. +$LogoFiles = Get-ChildItem -Path $LocalDir -File | + Where-Object { $_.Extension -in @('.png','.jpg','.jpeg') } +if ($LogoFiles) { + $LogoArgs = $LogoFiles | ForEach-Object { "`"$($_.FullName)`"" } + $ScpCmd = "scp $($LogoArgs -join ' ') `"${Remote}:$RemoteAppDir/`"" + Invoke-Expression $ScpCmd +} + +# Patch docker-compose.yml on the NAS with the supplied Emby settings, then build & run. +$RemoteCommands = @" +set -e +cd '$RemoteAppDir' + +# Patch compose env vars and host port from deployment parameters. +sed -i "s#EMBY_URL=.*#EMBY_URL=$EmbyUrl#g" docker-compose.yml +sed -i "s#EMBY_API_KEY=.*#EMBY_API_KEY=$EmbyApiKey#g" docker-compose.yml +sed -i "s#\"8500:8500\"#\"$HostPort:8500\"#g" docker-compose.yml + +if command -v docker-compose >/dev/null 2>&1; then + docker-compose build + docker-compose up -d +else + docker compose build + docker compose up -d +fi +"@ + +ssh $Remote $RemoteCommands + +Write-Host "Deployment complete." +Write-Host "App should be reachable at: http://${NasHost}:$HostPort" +Write-Host "To view logs:" +Write-Host " ssh $Remote 'cd $RemoteAppDir && docker compose logs -f'"