flybrain/infra/bin/flystage-launch
acamilo 660c3cf00d
Some checks failed
ci / node 22 (test + typecheck) (push) Has been cancelled
ci / rust stable (cargo test --workspace --release) (push) Has been cancelled
ci / infra/tests/lint.sh (push) Has been cancelled
ci / playwright apps/stage (allowed to fail) (push) Has been cancelled
flybrain v0.4.0: public tree (history retained privately)
2026-09-21 15:09:46 +00:00

75 lines
3.9 KiB
Bash
Executable file

#!/usr/bin/env bash
# infra/bin/flystage-launch — flystage.service's ExecStart.
#
# Reads config/chromium-flags (one flag per line, '#' comments and blank
# lines stripped) and execs Chromium against the built stage page.
# Pulled out of the unit file itself (rather than an inline `/bin/sh -c`
# with escaped `tr "\n" " "`) so the flag-loading logic is plain,
# testable shell instead of relying on systemd's own backslash-escaping
# of Exec= lines. docs/design/infra.md section 3.
set -euo pipefail
# Flag profile (docs/design/gpu.md section 3). Three of them:
#
# default the MVP and production configuration: config/chromium-flags,
# --disable-gpu, 2D canvas on Skia's CPU raster, the paper fly.
# gpu config/chromium-flags.gpu. SPIKE-ONLY and, measured, NOT
# sufficient on its own: on Xvfb it gets no GL at all. Kept because
# it is the browser half of option (d) and the thing `vgl` is the
# delta against. See that file's header.
# vgl config/chromium-flags.vgl AND `vglrun -d egl0` around Chromium —
# VirtualGL's EGL back end, gpu.md section 3 option (d). Measured
# passing on the dev container (infra/docs/virtualgl-spike.md): hardware WebGL
# from the Quadro, the 3D fly at 30+ fps, 0.32 core cheaper than the
# paper fly, x11grab untouched. Needs VirtualGL installed in the
# container (02-base.sh, VIRTUALGL_VERSION) and GPU=1.
#
# An unknown profile is a hard error, not a silent fall back to the default: a
# typo in FLY_CHROMIUM_PROFILE must not quietly broadcast with a flag set
# nobody chose.
#
# Note for anyone overriding this from a systemd drop-in: you cannot. systemd
# applies EnvironmentFile= after Environment=, so /etc/fly/fly.env's
# FLY_CHROMIUM_PROFILE beats an `Environment=FLY_CHROMIUM_PROFILE=` in a
# drop-in (caught the hard way during the spike). Set CHROMIUM_PROFILE in
# infra/env/example.env and re-run 05-deploy.sh, or set CHROMIUM_FLAGS_FILE, which
# fly.env does not write.
: "${FLY_CHROMIUM_PROFILE:=default}"
# Command prefix. Empty for every profile but `vgl`, so the exec line below is
# the same one it always was when nothing is wrapping Chromium.
launch_prefix=()
case "$FLY_CHROMIUM_PROFILE" in
default) : "${CHROMIUM_FLAGS_FILE:=/etc/fly/chromium-flags}" ;;
gpu) : "${CHROMIUM_FLAGS_FILE:=/etc/fly/chromium-flags.gpu}" ;;
vgl)
: "${CHROMIUM_FLAGS_FILE:=/etc/fly/chromium-flags.vgl}"
# -d egl0 is the EGL *device* back end, not a display: VirtualGL
# enumerates EGL devices itself and egl0 is the first one, which on
# The host is the Quadro RTX 4000 (`eglinfo -e`, then `eglinfo egl0 -B`,
# both from /opt/VirtualGL/bin — confirm after any driver change, since
# a second EGL device would renumber them; the Mesa llvmpipe device
# sorts after the NVIDIA one here).
[ -x /usr/bin/vglrun ] || {
echo "flystage-launch: FLY_CHROMIUM_PROFILE=vgl but /usr/bin/vglrun is missing." \
"Install VirtualGL in this container (infra/02-base.sh with GPU=1 and VIRTUALGL_VERSION set)." >&2
exit 3
}
launch_prefix=(/usr/bin/vglrun -d "${VGL_DEVICE:-egl0}")
;;
*)
echo "flystage-launch: FLY_CHROMIUM_PROFILE must be 'default', 'gpu' or 'vgl', got '$FLY_CHROMIUM_PROFILE'" >&2
exit 2
;;
esac
# `?mode=live` is part of the default, not just of flystage.service's own
# Environment=STAGE_URL: the page's mode parameter defaults to `player`, which
# replays a fixture, so a bare http://127.0.0.1:7402/ broadcasts a recording
# that is indistinguishable from a live stream. Neither path may silently do
# that.
: "${STAGE_URL:=http://127.0.0.1:7402/?mode=live}"
[ -r "$CHROMIUM_FLAGS_FILE" ] || { echo "flystage-launch: cannot read $CHROMIUM_FLAGS_FILE" >&2; exit 1; }
mapfile -t flags < <(grep -vE '^\s*(#.*)?$' "$CHROMIUM_FLAGS_FILE")
exec "${launch_prefix[@]}" /usr/bin/chromium "${flags[@]}" "$STAGE_URL"