802e98d3a3
ci / rust (push) Successful in 1m13s
android / android (push) Failing after 1m42s
ci / web (push) Successful in 27s
ci / bench (push) Successful in 1m50s
decky / build-publish (push) Successful in 11s
deb / build-publish (push) Failing after 2m38s
apple / swift (push) Successful in 54s
ci / docs-site (push) Successful in 32s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 4s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 2m57s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 4s
flatpak / build-publish (push) Failing after 2s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 2m33s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 5m20s
docker / deploy-docs (push) Successful in 17s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 5m11s
The punktfunk-web management console (pairing + status) shipped only via apt. Extend it to the other HOST packaging methods, mirroring the Debian punktfunk-web .deb (flatpak is the client, correctly excluded): - rpm/punktfunk.spec: new noarch `punktfunk-web` subpackage (the .output bundle + a /usr/bin/punktfunk-web-server node launcher + both systemd --user units + web-init.sh + web.env.example), gated behind `%bcond_with web`. OFF by default because building the Nitro/Node SSR bundle needs `bun`, which a plain rpmbuild / COPR mock chroot lacks. Host package weak-Recommends punktfunk-web. - ci/fedora-rpm.Dockerfile: install bun (+ unzip) so the CI builder can build the console. - rpm.yml: build `PF_WITH_WEB=1` (Prep bootstraps bun to stay green pre-image-rebuild); the publish loop already globs the new noarch rpm into the registry. build-rpm.sh: `--with web` when PF_WITH_WEB=1. - bootc/Containerfile: install from the Gitea RPM registry (which carries punktfunk-web) instead of COPR — `dnf5 install punktfunk punktfunk-web`. - arch/PKGBUILD: opt-in `punktfunk-web` split member (PF_WITH_WEB=1 appends it + bun) so a default makepkg still builds host+client with no JS tooling — matching the spec's bcond. - docs: packaging/README, rpm/README, copr/README (the no-bun caveat), bazzite/README (Path B rewritten COPR→Gitea registry), arch/README — enable + journal-password steps. Reviewed across methods by an adversarial multi-agent pass (rpm/ci/arch/bootc/consistency lenses, each blocking finding 3x-verified); fixed the two it confirmed real — the Arch bun-mandatory regression (now opt-in) and the stale COPR wording in bazzite Path B. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
127 lines
6.2 KiB
Markdown
127 lines
6.2 KiB
Markdown
# Packaging punktfunk for Fedora / Bazzite
|
|
|
|
The punktfunk host is Linux-only and links system FFmpeg (NVENC), PipeWire, Opus and
|
|
the NVIDIA driver. This directory packages it for the **Fedora Atomic / Bazzite** world
|
|
(rpm-ostree + bootc), where most of those deps are already present.
|
|
|
|
> 👉 **Ubuntu/Debian hosts** install via `apt` from Gitea's package registry — see
|
|
> [`debian/README.md`](debian/README.md) (`apt update && apt upgrade` for new builds).
|
|
|
|
> 👉 **End-to-end Bazzite setup walkthrough** (install → udev/group → `host.env` → service →
|
|
> firewall → verify → troubleshooting): [`bazzite/README.md`](bazzite/README.md). This file is the
|
|
> higher-level packaging rationale.
|
|
|
|
```
|
|
packaging/
|
|
rpm/punktfunk.spec # the RPM (builds punktfunk-host from source with cargo)
|
|
bazzite/host.env # gamescope-default config for a Bazzite appliance
|
|
bazzite/README.md # step-by-step Bazzite setup guide
|
|
bootc/Containerfile # bake punktfunk into a Bazzite-based atomic image
|
|
copr/ # COPR build-from-SCM settings
|
|
```
|
|
|
|
## What's needed beyond base Fedora
|
|
|
|
| Dependency | Where it comes from |
|
|
|---|---|
|
|
| `ffmpeg-libs` with **NVENC** | **RPM Fusion nonfree** (`ffmpeg`, not `ffmpeg-free`) |
|
|
| NVIDIA driver (`libnvidia-encode`, `libEGL_nvidia`) | Bazzite **-nvidia** images ship it; plain Fedora: `akmod-nvidia` + `xorg-x11-drv-nvidia-cuda` |
|
|
| gamescope, PipeWire, wireplumber | **Bazzite ships these**; plain Fedora: `dnf install gamescope pipewire wireplumber` |
|
|
| `opus`, `libei` | Fedora base / updates |
|
|
|
|
On **Bazzite** the only genuinely new runtime bits are `ffmpeg-libs` (RPM Fusion) + `opus` +
|
|
`libei` — the rest of the stack is already there. The default backend is **gamescope**
|
|
(`packaging/bazzite/host.env`), which the host spawns headless per session — no desktop login.
|
|
|
|
## Option A — Gitea RPM registry (recommended; per-host, `rpm-ostree`)
|
|
|
|
The host's RPM is published to **unom's self-hosted Gitea RPM registry** (CI builds it on every
|
|
push), mirroring the [Debian/apt](debian/README.md) setup. Add one repo file, install, and track
|
|
updates with `rpm-ostree upgrade` — no COPR account needed. Full guide: [`rpm/README.md`](rpm/README.md).
|
|
|
|
```sh
|
|
# unsigned pkgs + Gitea-signed metadata → repo_gpgcheck=1, gpgcheck=0 (see rpm/README.md)
|
|
sudo tee /etc/yum.repos.d/punktfunk.repo >/dev/null <<'REPO'
|
|
[gitea-unom-bazzite]
|
|
name=punktfunk (unom, Bazzite)
|
|
baseurl=https://git.unom.io/api/packages/unom/rpm/bazzite
|
|
enabled=1
|
|
gpgcheck=0
|
|
repo_gpgcheck=1
|
|
gpgkey=https://git.unom.io/api/packages/unom/rpm/repository.key
|
|
REPO
|
|
rpm-ostree install punktfunk && systemctl reboot
|
|
# updates: rpm-ostree upgrade && systemctl reboot
|
|
```
|
|
|
|
## Option B — COPR (per-host, `rpm-ostree install`)
|
|
|
|
1. Create a COPR project, enable **build-from-SCM** pointing at this repo, spec path
|
|
`packaging/rpm/punktfunk.spec` (see `copr/README.md`). Under *External Repositories* add
|
|
RPM Fusion nonfree so `ffmpeg-devel` resolves at build time.
|
|
2. On the Bazzite host:
|
|
```sh
|
|
# RPM Fusion (for the NVENC ffmpeg) — usually already enabled on Bazzite
|
|
rpm-ostree install \
|
|
https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
|
|
https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
|
|
# enable the COPR + install punktfunk
|
|
sudo wget -O /etc/yum.repos.d/_copr_punktfunk.repo \
|
|
https://copr.fedorainfracloud.org/coprs/enricobuehler/punktfunk/repo/fedora-$(rpm -E %fedora)/
|
|
rpm-ostree install punktfunk
|
|
systemctl reboot
|
|
```
|
|
|
|
## Option B — bootc (image-based, atomic)
|
|
|
|
Layer punktfunk into a Bazzite image once, then rebase any number of hosts onto it — no
|
|
per-host drift. See `bootc/Containerfile`:
|
|
```sh
|
|
podman build -t ghcr.io/<you>/bazzite-punktfunk -f packaging/bootc/Containerfile .
|
|
podman push ghcr.io/<you>/bazzite-punktfunk
|
|
# on the target:
|
|
sudo bootc switch ghcr.io/<you>/bazzite-punktfunk && systemctl reboot
|
|
```
|
|
|
|
## First-run setup (either option)
|
|
|
|
```sh
|
|
ujust add-user-to-input-group # virtual gamepads need /dev/uinput (then re-login).
|
|
# On Bazzite use ujust, NOT `usermod -aG input` (atomic OS — it won't stick).
|
|
mkdir -p ~/.config/punktfunk
|
|
cp /usr/share/punktfunk/host.env.bazzite ~/.config/punktfunk/host.env # edit (gamescope app, etc.)
|
|
systemctl --user enable --now punktfunk-host
|
|
|
|
# Management web console (pairing + status) — pulled in by default (the host RPM Recommends it;
|
|
# `--no-install-recommends` / headless-only boxes can skip it). Enable it and read the login password:
|
|
systemctl --user enable --now punktfunk-web
|
|
journalctl --user -u punktfunk-web-init | sed -n 's/.*password generated: //p' # then open http://<host-ip>:3000
|
|
```
|
|
|
|
Pair a stock Moonlight client (mDNS-discovered), or connect the native punktfunk/1 client — via the
|
|
web console at `http://<host-ip>:3000` or directly.
|
|
|
|
> ⚠️ **COPR caveat:** COPR's mock chroot has no `bun`, so a COPR build produces only
|
|
> `punktfunk` + `punktfunk-client` — **not** `punktfunk-web`. For the console on a COPR/bootc host,
|
|
> install from the **Gitea RPM registry** (Option A — it carries `punktfunk-web`), which is also why
|
|
> `bootc/Containerfile` installs from there rather than COPR.
|
|
|
|
## Why not Flatpak (for the HOST)?
|
|
|
|
The host needs unsandboxed access the zero-copy NVENC path, `/dev/uinput`, the PipeWire
|
|
graph and the compositor's privileged protocols — a Flatpak sandbox fights all of these.
|
|
An RPM (or the bootc layer) installs into the host system where those just work.
|
|
|
|
> 👉 The **client** is a different story — it IS shipped as a Flatpak (the only viable
|
|
> Steam Deck install path: SteamOS `/usr` is read-only and lacks `libadwaita`/`libSDL3`). See
|
|
> [`flatpak/README.md`](flatpak/README.md). The client sandbox only needs the GPU render node,
|
|
> Wayland, PipeWire audio, the network and hidraw — all expressible as finish-args.
|
|
|
|
## Building the SRPM/RPM locally (Fedora only)
|
|
|
|
```sh
|
|
git archive --format=tar.gz --prefix=punktfunk-0.0.1/ -o ~/rpmbuild/SOURCES/punktfunk-0.0.1.tar.gz HEAD
|
|
rpmbuild -ba packaging/rpm/punktfunk.spec # needs the BuildRequires from the spec
|
|
```
|
|
(Not buildable on Debian/Ubuntu — use a Fedora toolbox/container or COPR.)
|