Skip to content

feat(unraid): publish container to GHCR and add Community Applications app - #253

Merged
thcp merged 7 commits into
mainfrom
feat/unraid-community-app
Jul 10, 2026
Merged

feat(unraid): publish container to GHCR and add Community Applications app#253
thcp merged 7 commits into
mainfrom
feat/unraid-community-app

Conversation

@thcp

@thcp thcp commented Jul 10, 2026

Copy link
Copy Markdown
Collaborator

What

Makes StemDeck installable on Unraid via Community Applications (CA), and publishes the server container to GHCR so any self-hosted deployment can pull it.

No application code changes: the existing server container (build/Dockerfile) already runs the same FastAPI app. This is purely distribution.

Changes

  • .github/workflows/docker-publish.yml - builds build/Dockerfile and pushes ghcr.io/stemdeckapp/stemdeck on release: published (and manual workflow_dispatch). linux/amd64, GHCR login via GITHUB_TOKEN, action SHAs pinned.
  • templates/stemdeck.xml - Unraid Docker template: port 8000, /app/jobs + /cache volumes mapped to appdata, STEMDECK_PERSIST_LIBRARY=1 default, optional NVIDIA runtime vars, 1024x1024 icon from desktop/src-tauri/icons/icon.png.
  • ca_profile.xml (repo root) - author profile read by the CA submission scan.
  • README.md - GHCR docker run snippet + an Unraid install subsection.

Why one image covers CPU and GPU

The image keeps the default Linux x86_64 torch wheel, which is the CUDA build (the desktop tarballs swap it to CPU in scripts/linux/make-portable.sh, but the container does not). _detect_device() in app/core/config.py auto-selects CUDA when torch.cuda.is_available(). So the same image runs on CPU by default and uses the GPU when started with --runtime=nvidia.

Validation

  • xmllint --noout passes on both XML files.
  • Workflow YAML parses.
  • License is Apache 2.0 (OSI-approved), satisfying CA's root-license requirement.

Manual follow-ups (not in this PR)

  1. Make the GHCR package public once after the first publish (org package settings), so Unraid can pull anonymously.
  2. Optionally create an Unraid forum support thread and point Support/Forum at it (currently GitHub issues).
  3. Submit at ca.unraid.net/submit and clear the live scan.

Known limitation

RTX 50-series (Blackwell / sm_120) may fall back to CPU: torch 2.6 + cu124 predates sm_120, and the project pins away from torch 2.7+ due to the torchaudio writer removal. Noted in the template Overview.

thcp added 7 commits July 10, 2026 21:31
…s template

- add docker-publish workflow: build build/Dockerfile and push
  ghcr.io/stemdeckapp/stemdeck on release + manual dispatch (linux/amd64)
- add templates/stemdeck.xml: Unraid Docker template (port 8000,
  /app/jobs + /cache volumes, persistent library default, optional NVIDIA
  runtime vars)
- add ca_profile.xml at repo root for the CA submission scan
- document the GHCR image and Unraid install in README

The published image keeps the default Linux x86_64 (CUDA) torch wheel, so a
single image runs on CPU by default and uses the GPU when started with
--runtime=nvidia; _detect_device() auto-selects CUDA.
Drop the workflow_dispatch version input and compute it with git describe
(hatch-vcs style) so manual builds carry a real dev version. Fetch full
history + tags on checkout so git describe resolves.
Add a push trigger on main so every merge builds and pushes
ghcr.io/stemdeckapp/stemdeck:edge. :edge never moves :latest, which stays
reserved for stable releases.
Align DEFAULT_PORT (app/core/settings.py) and the desktop launcher's
configured_port() fallback (desktop/src-tauri/src/main.rs) from 8080 to 8000
so every path -- container, run.sh, and desktop -- shares one default. Update
the settings comment and the port-default test accordingly.
@thcp
thcp marked this pull request as ready for review July 10, 2026 21:00
@thcp
thcp merged commit ce86e8a into main Jul 10, 2026
8 checks passed
@thcp
thcp deleted the feat/unraid-community-app branch July 10, 2026 21:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant