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>
130 lines
4.4 KiB
Bash
Executable file
130 lines
4.4 KiB
Bash
Executable file
#!/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
|