# 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 tzdata 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 schedule.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_SCHEDULE=/data/scheduled.json \ ANNOUNCER_CONFIG=/data/config.toml \ ANNOUNCER_PORT=8090 EXPOSE 8090 CMD ["python", "announcer.py", "--host", "0.0.0.0"]