announcer/install.sh
Kent f191fb2b90 Døp om sg-announcer til announcer
Appen var navngitt etter Sauda Gathering, men det er ingenting
arrangementsspesifikt i selve koden. Navnet står igjen i tjenesten,
install.sh og pyproject.

- install.sh skriver nå announcer.service, og rydder bort en gammel
  sg-announcer.service først. Uten det slåss to enheter om port 8090
  når skriptet kjøres på en maskin som har den gamle.
- Enhetsfila får chmod 600; PIN-en står i klartekst i den.
- src/sg_announcer/ er slettet. Det var en uv-init-stub som bare printet
  «Hello from sg-announcer!», pekt på av [project.scripts], og som ingen
  har kalt noen gang.
- [tool.uv] package = false: appen er løse .py-filer som kjøres på plass,
  ikke en pakke. Uten den vil uv sync bygge et wheel og klage på at
  announcer/__init__.py mangler.

Repoet i Forgejo og mappa er døpt om tilsvarende.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-08 15:42:36 +02:00

130 lines
4.4 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# Installerer Announcer på en Debian/Ubuntu-maskin (testet mot Linux Mint).
#
# git clone https://git.1x1.no/kent/announcer.git
# cd announcer && ./install.sh
#
# Kjør som vanlig bruker (ikke sudo); skriptet spør om passord der det trengs.
# Valgfritt: ANNOUNCER_PIN=1234 ./install.sh -> sida krever PIN
# ANNOUNCER_PORT=8090 ./install.sh -> annen port
# Kan kjøres på nytt; da oppdateres avhengigheter og tjenesten startes om.
set -euo pipefail
if [[ $EUID -eq 0 ]]; then
echo "Kjør som vanlig bruker, ikke root/sudo." >&2
exit 1
fi
APP="announcer"
OLD_APP="sg-announcer" # het dette før; enheten ryddes bort nedenfor
REPO_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PORT="${ANNOUNCER_PORT:-8090}"
PIN="${ANNOUNCER_PIN:-}"
UNIT_DIR="$HOME/.config/systemd/user"
UNIT="$UNIT_DIR/$APP.service"
step() { printf '\n\033[1m==> %s\033[0m\n' "$*"; }
step "Systempakker (apt)"
sudo apt-get update -qq
sudo apt-get install -y -qq git curl ca-certificates ffmpeg pulseaudio-utils
# pw-play finnes i pipewire-bin på Mint 22 / Ubuntu 24.04. På eldre (PulseAudio)
# faller appen tilbake til paplay, så dette er ikke kritisk.
sudo apt-get install -y -qq pipewire-bin 2>/dev/null || true
step "uv (Python-pakkehåndterer)"
if command -v uv >/dev/null 2>&1; then
UV="$(command -v uv)"
elif [[ -x "$HOME/.local/bin/uv" ]]; then
UV="$HOME/.local/bin/uv"
else
curl -LsSf https://astral.sh/uv/install.sh | sh
UV="$HOME/.local/bin/uv"
fi
echo "uv: $UV ($("$UV" --version))"
step "Python 3.13 og avhengigheter"
cd "$REPO_DIR"
"$UV" sync
mkdir -p cache chimes voices
step "Laster ned Piper-stemmene (lokal reserve, ca. 600 MB, kun første gang)"
"$UV" run python -c "import logging, announcer; logging.basicConfig(level=logging.INFO, format='%(message)s'); announcer.ensure_voices()"
step "Rydder bort gammel tjeneste"
# Tjenesten het sg-announcer før. Uten dette slåss to enheter om porten.
if [[ -f "$UNIT_DIR/$OLD_APP.service" ]]; then
systemctl --user disable --now "$OLD_APP" >/dev/null 2>&1 || true
rm -f "$UNIT_DIR/$OLD_APP.service"
echo "fjernet $OLD_APP.service"
else
echo "ingenting å rydde."
fi
step "systemd-brukertjeneste"
mkdir -p "$UNIT_DIR"
{
cat <<UNIT
[Unit]
Description=Announcer – TTS-utrop på høyttaleranlegget
After=pipewire.service pulseaudio.service
[Service]
WorkingDirectory=$REPO_DIR
ExecStart=$UV run announcer.py
Environment=ANNOUNCER_PORT=$PORT
UNIT
if [[ -n "$PIN" ]]; then
echo "Environment=ANNOUNCER_PIN=$PIN"
else
echo "# Environment=ANNOUNCER_PIN=1234"
fi
cat <<'UNIT'
# Environment=ANNOUNCER_SINK=alsa_output.xxx
Restart=on-failure
RestartSec=3
[Install]
WantedBy=default.target
UNIT
} > "$UNIT"
chmod 600 "$UNIT" # PIN står i klartekst her
systemctl --user daemon-reload
systemctl --user enable --now "$APP"
systemctl --user restart "$APP"
step "Brannmur"
if ip link show wt0 >/dev/null 2>&1; then
# NetBird er installert: slipp inn kun via VPN-grensesnittet, blokker alt annet.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow in on wt0 to any port 22 proto tcp comment "ssh via netbird"
sudo ufw allow in on wt0 to any port 22022 proto tcp comment "netbird ssh-server"
sudo ufw allow in on wt0 to any port "$PORT" proto tcp comment "$APP via netbird"
sudo ufw delete allow "$PORT/tcp" >/dev/null 2>&1 || true
sudo ufw --force enable
echo "ufw aktiv: port $PORT, 22 og 22022 er åpne kun på wt0 (NetBird)."
echo "Vil du også nå sida fra lokalt LAN uten VPN:"
echo " sudo ufw allow from <lan-subnett> to any port $PORT proto tcp"
elif sudo ufw status 2>/dev/null | grep -q "Status: active"; then
sudo ufw allow "$PORT/tcp" comment "$APP"
else
echo "ufw er ikke aktiv, ingen regel nødvendig."
fi
sleep 2
IP="$(hostname -I 2>/dev/null | awk '{print $1}')"
step "Ferdig"
systemctl --user --no-pager status "$APP" | head -5 || true
cat <<MSG
Åpne http://${IP:-<denne-maskinens-ip>}:$PORT fra hva som helst på nettet.
Tips for en laptop på arrangementet:
- Lyden spilles i din innloggede økt, så maskinen må være logget inn.
Slå på automatisk innlogging (Innstillinger -> Påloggingsvindu).
- Hindre at den sover med lokket igjen:
sudo sed -i 's/^#\?HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf
sudo systemctl restart systemd-logind
- Logg: journalctl --user -u $APP -f
MSG