Files
Anthias/website/layouts/_default/get-started.html
Viktor Petersson 7f8bbe43d7 feat(install): generic-arm64 best-effort support (Armbian SBCs) (#2879)
* feat(install): generic-arm64 best-effort support (Armbian on Rock Pi, Orange Pi, …)

Wires up a `generic-arm64` device_type so the installer recognises any
aarch64 host that isn't a Raspberry Pi and runs the same Anthias stack
on it. Closes #2849 (Tier 1).

* `bin/install.sh::set_device_type` + `bin/upgrade_containers.sh` get
  an `aarch64` fallback branch, INTRO_MESSAGE / unsupported-message
  copy refreshed, raspberry-pi-tagged ansible tasks skipped on
  generic-arm64 (same as x86), vchiq strip extended.
* ansible: validated set in `site.yml`, `docker_arch_by_device_type`
  gains `generic-arm64: arm64`. `docker-buildx-plugin` added to the
  apt-install list — required for MODE=build with `--platform=`
  Dockerfiles, harmless on pull-mode boards. Pre-existing host_agent
  service unit hardcoded `~/installer_venv/bin/python` (an ephemeral
  tmpdir post-#2843); split into a persistent `~/.anthias-venv` that
  ansible syncs before installing the unit.
* image_builder: `generic-arm64` build target, Qt6 + cage + wayland
  like x86; `va-driver-all` deliberately *not* shipped — Rockchip /
  Allwinner / Amlogic mainline hwdec goes through V4L2 M2M /
  request API, not VAAPI, so mesa-va-drivers would be dead weight.
* viewer: `start_viewer.sh` reuses the x86 cage path for
  generic-arm64; `media_player.py` routes generic-arm64 to MPV (the
  `device_helper.get_device_type()` fallback returns 'pi1' on
  non-Pi aarch64 hosts, so the proxy needs the DEVICE_TYPE env
  override that pi4-64 already uses). New test added.
* host_agent: `SUPPORTED_INTERFACES` gains `end` prefix —
  Rockchip GMAC etc. surface as `end0` on systemd predictable
  naming, which was previously filtered out, leaving the splash
  page stuck on "Detecting network…".
* CI: docker-build matrix + mirror-latest-tags publish
  `latest-generic-arm64` alongside the existing per-board tags.
* Docs: README, marketing site supported-hardware table, and FAQ
  get a plain-language "Yes, on a best-effort basis" entry that
  spells out the software-decode trade-off, the SoCs known to work
  well (RK3399 / RK35xx / Allwinner H6 / Amlogic GXBB-GXL-GXM /
  S905X3), and the boards to avoid (Allwinner H616 / H618). Per-SoC
  hardware decode (`rkmpp`, `cedrus`, `meson-vdec`) is the planned
  Tier-2 follow-up.

Validated end-to-end on a Rock Pi 4B (Armbian trixie, RK3399, 1GB
RAM) via build-on-device: install completes, web UI reachable, all
four asset types (image, H.264 1080p60, H.265 1080p60, webpage)
cycle through the viewer cleanly, mpv pure-decode benchmark shows
0 dropped frames over the full 60s of each clip.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(ansible-lint): pair become with become_user on .anthias-venv sync task

ansible-lint's partial-become rule fires on `become_user:` without a
matching `become:` at the same level, even when the play-level become
already covers it. Explicit pairing keeps lint quiet without changing
runtime behaviour.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix: address Copilot review feedback on generic-arm64 PR

- ansible: drop `creates:` guard on the runtime venv sync — `uv sync`
  is idempotent (sub-second resolver check when nothing changed), so
  re-running unconditionally means dependency updates from a
  pyproject.toml / uv.lock change actually land on upgrade instead of
  silently skipping. Idempotency surfaced via `changed_when` keyed on
  uv's `+/-/~` package-action prefix so steady-state runs stay `ok`.
- ansible: rework docker-buildx-plugin comment to justify the
  install on its own merits (any MODE=build run needs it because of
  `FROM --platform=$BUILDPLATFORM` in Dockerfiles) rather than tying
  it to generic-arm64 lacking published tags — that explanation
  becomes stale the moment this PR merges and CI publishes them.
- viewer: `get_alsa_audio_device()` short-circuits on
  `DEVICE_TYPE=generic-arm64` before the Pi-firmware dispatch, since
  the Rock Pi / Orange Pi / Banana Pi class of board has none of the
  `vc4hdmi*` or `Headphones` ALSA cards. Defers to ALSA's `default`
  device; operators with a non-standard sink can override via
  `~/.asoundrc` (already bind-mounted into the viewer container).
- tests: new assertions that generic-arm64 routes mpv through
  `--vo=gpu --gpu-context=wayland` and `--audio-device=alsa/default`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(website): disambiguate Debian release codenames in supported-hardware copy

Copilot flagged the previous wording — "running Raspberry Pi OS, Debian, or
Armbian (Trixie or Bookworm)" — as misleading: the parenthetical reads as
if Raspberry Pi OS and Armbian are themselves "Trixie or Bookworm", but
those are Debian codenames, and Armbian builds can also be Ubuntu-based.
Split the sentence so the codenames are tied explicitly to Debian.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(ansible): derive is_raspberry_pi from device_type, not architecture

Copilot caught that the `is_raspberry_pi` helper in docker.yml was
defined as `ansible_architecture in ['aarch64', 'armv7l', 'armv6l']`,
which is also true on generic-arm64 (Rock Pi / Orange Pi / …). That
silently applied the Pi-only `gpio` group to non-Pi SBCs.

device_type is the authoritative discriminator and is validated
upstream in ansible/site.yml's pre_tasks, so use it directly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* refactor: rename device_type generic-arm64 → arm64 (parallel to x86)

Per review feedback: `generic-arm64` was the original working name for
the new aarch64 non-Pi fallback. `arm64` is shorter and parallels `x86`
— both are architecture-generic device_types that catch any host
without a board-specific image, sitting alongside the per-board labels
(pi2 / pi3 / pi4-64 / pi5). User-facing prose still says "generic
64-bit ARM" or "Armbian on Rock Pi / Orange Pi / …" for context.

Mechanical s/generic-arm64/arm64/ across install scripts, ansible,
image_builder, viewer / start_viewer, host_agent, tests, CI matrix,
mirror-latest-tags, Dockerfile.viewer.j2, README.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* review polish on arm64 PR

- viewer: get_alsa_audio_device's arm64 short-circuit now logs the
  registered ALSA cards (from /proc/asound/cards — aplay isn't in
  the viewer image) once per process when DEVICE_TYPE=arm64, so an
  operator reporting "no HDMI audio" carries enough breadcrumbs in
  journalctl alone to pick the right ~/.asoundrc override.
- ansible: rewrite the docker-buildx-plugin size claim — 15 MB
  download / 67 MB extracted, from the deb metadata on arm64.
- viewer: MediaPlayerProxy.get_instance comment block split into a
  two-bullet rationale, calling out the pi4-64 and arm64 cases
  separately so a future reader doesn't mistake the lead sentence
  for "pi4-64-only".
- install.sh / upgrade_containers.sh: spell out that the aarch64
  catch-all in set_device_type is intentional — a future Pi model
  whose model string drifts past the regexes lands here too,
  trading software decode + no Pi-boot tweaks for a louder fail.
- README + FAQ: tighten the Plymouth caveat from "few seconds of
  black" to "kernel boot log scrolls until the viewer takes over",
  which is what actually happens on most U-Boot ARM SBCs.
- ansible: rename the docker.yml var from `is_raspberry_pi` to
  `device_is_pi` now that it's derived from device_type rather
  than `ansible_architecture`, so the name matches what it does.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs: narrow arm64 support to Debian-based Armbian (call out Ubuntu)

Copilot flagged that "Armbian" in the new docs is ambiguous —
Armbian builds come in both Debian-based (Bookworm/Trixie) and
Ubuntu-based (Jammy/Noble) flavours. The installer's ansible role
wires Docker's apt repo under
download.docker.com/linux/debian/{{ ansible_distribution_release }},
which 404s on the Ubuntu codenames, so an Ubuntu-Armbian user
following the current docs would hit a broken install at the very
first `apt update`.

Narrowing the wording in README, the marketing site's
supported-hardware blurb, and the FAQ to "Debian-based Armbian" so
users pick the right image. Extending the installer/playbook to
handle Ubuntu-based Armbian is a separate follow-up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 10:05:52 +01:00

140 lines
9.2 KiB
HTML

{{ define "main" }}
<header class="bg-brand-dark py-16 md:py-20 px-6 md:px-12 lg:px-20">
<div class="max-w-7xl mx-auto">
<h1 class="text-white text-4xl md:text-5xl font-extrabold tracking-tight">Get Started</h1>
<p class="text-white/60 text-lg mt-4 max-w-xl">Choose the installation method that works best for your hardware and setup.</p>
</div>
</header>
<section class="bg-white py-16 lg:py-24 px-6 md:px-12 lg:px-20">
<div class="max-w-3xl mx-auto">
<div class="border border-black/10 rounded-lg p-6 md:p-8">
<div class="flex items-start gap-4">
<div class="step-number bg-brand-yellow text-brand-dark">1</div>
<div>
<h2 class="text-xl font-bold">Install with one command</h2>
<p class="text-zinc-500 mt-2 leading-relaxed">On a fresh Raspberry Pi OS Lite or Debian installation, run:</p>
<div class="mt-4 bg-brand-dark rounded-lg p-5">
<code class="text-brand-yellow font-mono text-sm md:text-base break-all">bash &lt;(curl -sL https://install-anthias.srly.io)</code>
</div>
<p class="text-zinc-400 text-sm mt-3">The installer will set up Docker, pull the container images, and start Anthias. This takes around 10&ndash;15 minutes depending on your hardware and network speed.</p>
</div>
</div>
</div>
<div class="border border-black/10 rounded-lg p-6 md:p-8 mt-6">
<div class="flex items-start gap-4">
<div class="step-number bg-brand-yellow text-brand-dark">2</div>
<div>
<h2 class="text-xl font-bold">Open the dashboard</h2>
<p class="text-zinc-500 mt-2 leading-relaxed">Once the installation completes, open a browser and navigate to your device's IP address. The Anthias web dashboard will be ready at port 80.</p>
</div>
</div>
</div>
<div class="border border-black/10 rounded-lg p-6 md:p-8 mt-6">
<div class="flex items-start gap-4">
<div class="step-number bg-brand-yellow text-brand-dark">3</div>
<div>
<h2 class="text-xl font-bold">Add your content</h2>
<p class="text-zinc-500 mt-2 leading-relaxed">Upload images and videos, or add URLs to web pages. Set a schedule for each asset, and Anthias takes care of the rest.</p>
</div>
</div>
</div>
</div>
</section>
<section class="bg-bg-light py-16 lg:py-24 px-6 md:px-12 lg:px-20">
<div class="max-w-3xl mx-auto">
<h2 class="text-2xl font-bold">Alternative installation methods</h2>
<div class="mt-8 space-y-6">
<div class="bg-white border border-black/10 rounded-lg p-6">
<h3 class="text-lg font-bold">Raspberry Pi Imager</h3>
<p class="text-zinc-500 mt-2 text-sm leading-relaxed">The quickest path for supported Raspberry Pi models. Open <a class="text-brand-purple no-underline hover:underline" href="https://www.raspberrypi.com/software/" target="_blank" rel="noopener">Raspberry Pi Imager</a> and find Anthias under <strong>Other specific-purpose OS</strong>. Flash the SD card and boot.</p>
<p class="text-zinc-400 text-xs mt-2">Pi 5 images are not yet available in the Imager. Use the command-line installer or disk images instead.</p>
</div>
<div class="bg-white border border-black/10 rounded-lg p-6">
<h3 class="text-lg font-bold">Pre-built disk images</h3>
<p class="text-zinc-500 mt-2 text-sm leading-relaxed">Download a disk image from the <a class="text-brand-purple no-underline hover:underline" href="https://github.com/Screenly/Anthias/releases/latest" target="_blank" rel="noopener">latest GitHub release</a> and flash it to an SD card with Raspberry Pi Imager or balenaEtcher. Images are compressed with Zstandard (.zst).</p>
</div>
<div class="bg-white border border-black/10 rounded-lg p-6">
<h3 class="text-lg font-bold">balenaHub</h3>
<p class="text-zinc-500 mt-2 text-sm leading-relaxed">For a fully managed device experience with automatic over-the-air updates. Find Anthias images on <a class="text-brand-purple no-underline hover:underline" href="https://hub.balena.io/fleets-for-good" target="_blank" rel="noopener">balenaHub Fleets for Good</a> for Pi 2 through Pi 5.</p>
</div>
</div>
</div>
</section>
<section class="bg-white py-16 lg:py-24 px-6 md:px-12 lg:px-20">
<div class="max-w-3xl mx-auto">
<h2 id="supported-hardware" class="text-2xl font-bold">Supported hardware</h2>
<p class="text-zinc-500 mt-2">Anthias runs on Raspberry Pi single-board computers, 64-bit x86 PCs, and 64-bit ARM single-board computers (Rock Pi, Orange Pi, Banana Pi and similar via Armbian). Supported on Raspberry Pi OS, Debian (Trixie or Bookworm), and the corresponding Armbian builds.</p>
<div class="mt-6 overflow-x-auto">
<table class="w-full text-sm">
<thead>
<tr class="border-b border-black/10">
<th class="text-left py-3 pr-4 font-semibold">Device</th>
<th class="text-left py-3 pr-4 font-semibold">Architecture</th>
<th class="text-left py-3 font-semibold">Status</th>
</tr>
</thead>
<tbody class="text-zinc-600">
<tr class="border-b border-black/5">
<td class="py-3 pr-4">Raspberry Pi 5 Model B</td>
<td class="py-3 pr-4">64-bit</td>
<td class="py-3"><span class="text-green-700 font-medium">Recommended</span></td>
</tr>
<tr class="border-b border-black/5">
<td class="py-3 pr-4">Raspberry Pi 4 Model B</td>
<td class="py-3 pr-4">64-bit</td>
<td class="py-3"><span class="text-green-700 font-medium">Recommended</span></td>
</tr>
<tr class="border-b border-black/5">
<td class="py-3 pr-4">Raspberry Pi 3 Model B+</td>
<td class="py-3 pr-4">64-bit</td>
<td class="py-3"><span class="text-zinc-400">Maintenance</span></td>
</tr>
<tr class="border-b border-black/5">
<td class="py-3 pr-4">Raspberry Pi 3 Model B</td>
<td class="py-3 pr-4">64-bit</td>
<td class="py-3"><span class="text-zinc-400">Maintenance</span></td>
</tr>
<tr class="border-b border-black/5">
<td class="py-3 pr-4">Raspberry Pi 2 Model B</td>
<td class="py-3 pr-4">32-bit</td>
<td class="py-3"><span class="text-zinc-400">Maintenance</span></td>
</tr>
<tr class="border-b border-black/5">
<td class="py-3 pr-4">x86 PC (NUC or similar)</td>
<td class="py-3 pr-4">64-bit</td>
<td class="py-3"><span class="text-green-700 font-medium">Recommended</span></td>
</tr>
<tr>
<td class="py-3 pr-4">Generic 64-bit ARM SBC (Rock Pi, Orange Pi, Banana Pi&hellip;)</td>
<td class="py-3 pr-4">64-bit</td>
<td class="py-3"><span class="text-amber-600 font-medium">Best-effort</span></td>
</tr>
</tbody>
</table>
<p class="text-zinc-500 text-sm mt-4 leading-relaxed">Generic 64-bit ARM SBCs run the same Anthias stack on <strong>Debian-based Armbian</strong> (Bookworm / Trixie) with software video decode. Ubuntu-based Armbian builds aren&rsquo;t supported &mdash; the installer wires up the Debian Docker apt repository, so Ubuntu releases fail at &ldquo;apt update&rdquo;. Hardware video decode varies per SoC and isn&rsquo;t wired up out of the box &mdash; expect software decode (smooth at 720p, stutter-prone at 1080p, CPU-heavy at 4K). Per-SoC hardware decode is a follow-up; see <a class="text-brand-purple no-underline hover:underline" href="https://github.com/Screenly/Anthias/issues/2849" target="_blank" rel="noopener">issue #2849</a>.</p>
</div>
</div>
</section>
<section class="bg-brand-dark py-16 lg:py-24 px-6 md:px-12 lg:px-20">
<div class="max-w-7xl mx-auto text-center">
<h2 class="text-white text-3xl lg:text-4xl font-extrabold tracking-tight">Need help?</h2>
<p class="text-white/50 mt-4 text-lg max-w-lg mx-auto">Check the documentation, ask on the forum, or file an issue on GitHub.</p>
<div class="flex flex-wrap justify-center gap-4 mt-8">
<a class="btn-secondary" href="/docs/">Documentation</a>
<a class="btn-secondary" href="https://forums.screenly.io" target="_blank" rel="noopener">Forum</a>
<a class="btn-secondary" href="https://github.com/Screenly/Anthias/issues" target="_blank" rel="noopener">Report an Issue</a>
</div>
</div>
</section>
{{ end }}