announcer/Dockerfile
Kent 6c1253f54c Docker er driftsformen, ikke bare en testrigg
Announcer skal kjøre standalone på klienten som er koblet til anlegget, i
Docker – aldri på utviklingsmaskina. install.sh installerte nativt med apt
og uv, og det passer ikke lenger.

- install.sh er nå en Docker-bootstrap: installerer Docker om den mangler,
  lager .env med riktig bruker-ID og portbinding, oppretter data/, bygger,
  starter, og setter ufw. Den rydder også bort gamle native enheter, både
  announcer.service og sg-announcer.service.
- Dockerfile kopierer koden inn istedenfor å låne den fra et bind-mount, så
  det som kjører i drift er uavhengig av hva som ligger i mappa.
- Alt som skal overleve en ny container ligger i data/ på verten. Bind-mount
  og ikke navngitt volum, med vilje: da kan man lese
  data/logs/announcements.jsonl og slippe egne jingler i data/chimes/ uten å
  gå inn i containeren, og eierskapet følger brukeren istedenfor root.
- Testriggen er flyttet til compose.test.yaml, med eget prosjektnavn, så den
  ikke kan forveksles med eller forstyrre drift.

Lyden ut av containeren krever tre ting, og de er dokumentert i AGENTS.md:
hele XDG_RUNTIME_DIR montert inn (ikke bare pipewire-socketen – PulseAudio
trenger pulse/native og en cookie i samme mappe, og da virker begge
lydservere), user: PUID:PGID lik eieren av socketen, og en innlogget grafisk
økt. Containeren starter ved boot, altså før innlogging, så avspilling feiler
til noen logger inn – det retter seg selv, siden player_cmd() slås opp per
melding. Verifisert: lyden spiller fra driftscontaineren.

Brannmuren er den viktige endringen fra nativ tid. Dockers publiserte porter
settes opp i nat-tabellen, før ufws regler, så en ufw-regel på porten gjør
ingenting. Tilgangen styres nå av BIND_IP i .env, og install.sh setter den til
NetBird-adressen når wt0 finnes. ufw settes fortsatt for ssh, men er ikke
involvert i tilgangen til announcer.

Testriggen bindes nå til 127.0.0.1. Den sto med PIN 1234 publisert på
0.0.0.0, og gikk altså forbi ufw ut på LAN-et.

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

41 lines
1.5 KiB
Docker
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.

# Announcer kjøres i Docker på klienten som er koblet til høyttaleranlegget.
#
# Lyden er det som gjør bildet litt uvanlig: containeren må nå vertens
# lydserver. Det løses i compose.yaml ved å montere inn vertens
# XDG_RUNTIME_DIR og kjøre som samme bruker-ID som eier socketen – ikke her.
FROM python:3.13-slim
# ffmpeg: edge_pcm() dekoder MP3 med den, og egne jinglefiler normaliseres
# med den. pipewire-bin gir pw-play, pulseaudio-utils gir paplay; koden
# velger selv hvilken som finnes (player_cmd()), så begge lydservere virker.
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ffmpeg ca-certificates pipewire-bin pulseaudio-utils \
&& rm -rf /var/lib/apt/lists/*
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
ENV UV_PROJECT_ENVIRONMENT=/opt/venv \
UV_COMPILE_BYTECODE=1 \
PATH=/opt/venv/bin:$PATH \
PYTHONUNBUFFERED=1
WORKDIR /app
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
# Koden sist, så avhengighetslaget gjenbrukes når bare appen endres.
COPY announcer.py auth.py config.py index.html ./
# Alt som skal overleve en ny container ligger under /data, som monteres
# inn fra verten. Stemmene er ~670 MB og lastes ned ved første oppstart.
ENV ANNOUNCER_VOICES=/data/voices \
ANNOUNCER_CACHE=/data/cache \
ANNOUNCER_CHIMES=/data/chimes \
ANNOUNCER_LOG=/data/logs/announcements.jsonl \
ANNOUNCER_STATE=/data/instance \
ANNOUNCER_CONFIG=/data/config.toml \
ANNOUNCER_PORT=8090
EXPOSE 8090
CMD ["python", "announcer.py", "--host", "0.0.0.0"]