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>
41 lines
1.5 KiB
Docker
41 lines
1.5 KiB
Docker
# 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"]
|