Spaces:
Sleeping
Sleeping
| param( | |
| [string] $SpaceName = "sub2api", | |
| [string] $Owner = "", | |
| [switch] $Private | |
| ) | |
| $ErrorActionPreference = "Stop" | |
| if (-not $env:HF_TOKEN) { | |
| throw "Set HF_TOKEN first. Example: `$env:HF_TOKEN = 'hf_xxx'" | |
| } | |
| $root = Resolve-Path (Join-Path $PSScriptRoot "..") | |
| Set-Location $root | |
| $requiredFiles = @( | |
| "Dockerfile", | |
| "sub2api-hf-rootfs.tar", | |
| "start-space.sh", | |
| "README.md", | |
| "PUBLIC_USAGE.md", | |
| "ADMIN_SETUP.md", | |
| ".env.example", | |
| ".gitattributes", | |
| ".gitignore", | |
| "package.json", | |
| "scripts/check-supabase.mjs", | |
| "scripts/generate-secrets.ps1", | |
| "scripts/deploy-hf-space.ps1" | |
| ) | |
| foreach ($file in $requiredFiles) { | |
| if (-not (Test-Path -LiteralPath (Join-Path $root $file))) { | |
| throw "Missing deployment file: $file" | |
| } | |
| } | |
| $headers = @{ Authorization = "Bearer $env:HF_TOKEN" } | |
| $whoami = Invoke-RestMethod -Uri "https://huggingface.co/api/whoami-v2" -Headers $headers -Method GET | |
| if (-not $Owner) { | |
| $Owner = $whoami.name | |
| } | |
| $repoId = "$Owner/$SpaceName" | |
| $createBody = @{ | |
| name = $SpaceName | |
| type = "space" | |
| sdk = "docker" | |
| private = [bool] $Private | |
| } | |
| if ($Owner -ne $whoami.name) { | |
| $createBody.organization = $Owner | |
| } | |
| try { | |
| Invoke-RestMethod ` | |
| -Uri "https://huggingface.co/api/repos/create" ` | |
| -Headers ($headers + @{ "Content-Type" = "application/json" }) ` | |
| -Method POST ` | |
| -Body ($createBody | ConvertTo-Json -Depth 5) | Out-Null | |
| Write-Host "Created Hugging Face Space: $repoId" | |
| } catch { | |
| $statusCode = $null | |
| if ($_.Exception.Response) { | |
| $statusCode = [int] $_.Exception.Response.StatusCode | |
| } | |
| if ($statusCode -eq 409) { | |
| Write-Host "Space already exists, continuing: $repoId" | |
| } else { | |
| throw | |
| } | |
| } | |
| git lfs install | |
| git add ` | |
| Dockerfile ` | |
| sub2api-hf-rootfs.tar ` | |
| start-space.sh ` | |
| README.md ` | |
| PUBLIC_USAGE.md ` | |
| ADMIN_SETUP.md ` | |
| .env.example ` | |
| .gitattributes ` | |
| .gitignore ` | |
| package.json ` | |
| scripts/check-supabase.mjs ` | |
| scripts/generate-secrets.ps1 ` | |
| scripts/deploy-hf-space.ps1 | |
| $hasCommit = $true | |
| git rev-parse --verify HEAD *> $null | |
| if ($LASTEXITCODE -ne 0) { | |
| $hasCommit = $false | |
| } | |
| $hasStagedChanges = $false | |
| git diff --cached --quiet | |
| if ($LASTEXITCODE -ne 0) { | |
| $hasStagedChanges = $true | |
| } | |
| if ($hasStagedChanges) { | |
| git commit -m "Deploy sub2api rootfs tar on HF Space" | |
| } elseif (-not $hasCommit) { | |
| throw "No files were staged and the repository has no commits. Check git status." | |
| } else { | |
| Write-Host "No new local files to commit." | |
| } | |
| $pushUrl = "https://hf_user:$($env:HF_TOKEN)@huggingface.co/spaces/$repoId" | |
| git push $pushUrl HEAD:main | |
| Write-Host "" | |
| Write-Host "Deployment files pushed. Space page:" | |
| Write-Host "https://huggingface.co/spaces/$repoId" | |
| Write-Host "" | |
| Write-Host "Public app URL after build:" | |
| Write-Host "https://$($Owner)-$($SpaceName).hf.space" | |
| Write-Host "" | |
| Write-Host "Next: configure Space Settings -> Variables and secrets, then restart the Space." | |