# Conjurer main Discord bot. # Build from the repository root: # docker build -f docker/Dockerfile.bot -t conjurer-bot . FROM python:3.13-trixie # System dependencies: # ffmpeg - audio download/convert (yt_dlp) and Discord voice # libopus0 - Discord voice (PyNaCl / discord-ext-voice-recv) # poppler-utils - pdf2image (librarian/latex previews) # git - required by the git+https entry in requirements # build-essential - native wheels (PyNaCl etc.) RUN apt-get update && apt-get install -y --no-install-recommends \ ffmpeg \ libopus0 \ poppler-utils \ git \ build-essential \ curl \ ca-certificates \ python3-dev \ build-essential \ portaudio19-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # Optional: Tectonic for the $latex command. Remove this layer if unused. RUN curl -fsSL https://drop-sh.fullyjustified.net | sh \ && mv tectonic /usr/local/bin/tectonic \ || echo "tectonic not installed - the LaTeX feature will be disabled" COPY requirements_bot.txt ./ RUN pip install --no-cache-dir --upgrade pip \ && pip install --no-cache-dir -r requirements_bot.txt # Vendored forks take import precedence over the pip packages of the same name, # because /app (the script dir) is first on sys.path when running `python bot.py`. COPY yt_dlp ./yt_dlp COPY spotify_dl ./spotify_dl # Bot sources + default config/asset templates. Runtime state (conversation # history etc.) is read from the mounted /data volume via CONJURER_DATA_DIR, # so these committed copies only act as first-run fallbacks. COPY *.py ./ COPY settings.json system_gpt_settings.json accident_log.json pamiec.json pamiec_muzyki.json ./ COPY fuckery.jpg willowisp.png wod_beacon.jpg ./ COPY docker/entrypoint.bot.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENV PYTHONUNBUFFERED=1 \ CONJURER_DATA_DIR=/data \ CONJURER_DISCORD_HOST=0.0.0.0 \ CONJURER_DISCORD_PORT=5000 VOLUME ["/data"] EXPOSE 5000 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["python", "bot.py"]