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>
This commit is contained in:
parent
6aaa98d8b1
commit
6c1253f54c
7 changed files with 372 additions and 177 deletions
38
Dockerfile
38
Dockerfile
|
|
@ -1,23 +1,20 @@
|
|||
# Testbilde for announcer. Ikke ment for produksjon – på en ekte maskin
|
||||
# kjører appen nativt med install.sh, fordi lyden skal ut på maskinens egen
|
||||
# lydutgang og det er vondt å få til gjennom et containerlag.
|
||||
# Announcer kjøres i Docker på klienten som er koblet til høyttaleranlegget.
|
||||
#
|
||||
# Her er poenget å kunne prøve innlogging (PIN, JWT, OIDC) uten å røre
|
||||
# tjenesten som kjører, og uten sudo eller brannmurendringer.
|
||||
# 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 trengs av edge_pcm() og av egne jinglefiler. pw-play/paplay er bare
|
||||
# nyttig hvis vertens PipeWire-socket monteres inn; uten den feiler selve
|
||||
# avspillingen, men resten av appen virker.
|
||||
# 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 curl \
|
||||
&& (apt-get install -y --no-install-recommends pipewire-bin pulseaudio-utils || true) \
|
||||
&& 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
|
||||
|
||||
# Venv utenfor /app: /app er et bind-mount av repoet, og en .venv bygget her
|
||||
# ville ellers overskrevet den verten bruker til den kjørende tjenesten.
|
||||
ENV UV_PROJECT_ENVIRONMENT=/opt/venv \
|
||||
UV_COMPILE_BYTECODE=1 \
|
||||
PATH=/opt/venv/bin:$PATH \
|
||||
|
|
@ -25,7 +22,20 @@ ENV UV_PROJECT_ENVIRONMENT=/opt/venv \
|
|||
|
||||
WORKDIR /app
|
||||
COPY pyproject.toml uv.lock ./
|
||||
RUN uv sync --frozen
|
||||
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", "--port", "8090"]
|
||||
CMD ["python", "announcer.py", "--host", "0.0.0.0"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue