mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 13:34:40 +00:00
020a6b114a
Container/native startup died silently on any missing file/service. Now: constants.py - self-healing runtime layout at import: - create missing dirs (log dir, LOGSTORE, GRAPHICS_PATH, MUSIC_FOLDER) - seed missing state files from the repo templates shipped next to constants.py (settings/system_gpt/pamiec/pamiec_muzyki/accident_log), falling back to safe empty JSON; existing files are NEVER overwritten bot.py: - log to stdout too, so 'docker logs' finally shows the crash reason - missing Discord token = loud sys.exit with mount/env instructions (was: silent return -> container crash-loop with empty logs) - every cog loads independently (one broken cog = skipped with traceback, bot continues) - musician/librarian cogs are health-gated: enabled only when the service answers HTTP; a watchdog re-checks every 5 min and enables them the moment the service comes alive (no restart needed); tree re-synced - on_ready reconnects no longer re-load extensions requirements_conan.txt + Dockerfile.bot: aiomcrcon (Python <=3.11 only) moved to best-effort extras so the 3.13 image builds clean and the conanjurer cog stays dormant without it. DOCKER_PROXMOX.md: startup model (core vs gated cogs) + crash-loop troubleshooting incl. the 'disappearing files' checklist (nothing in the stack deletes host files; bind mount = live state). Verified: fresh-volume seeding creates dirs+templates, existing files untouched, missing-token exits with FATAL message, health-gating logic (stub-based runpy tests). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
65 lines
2.4 KiB
Docker
65 lines
2.4 KiB
Docker
# 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 requirements_conan.txt ./
|
|
RUN pip install --no-cache-dir --upgrade pip \
|
|
&& pip install --no-cache-dir -r requirements_bot.txt
|
|
# Best-effort Conan bridge extras: aiomcrcon supports Python <= 3.11 only, so
|
|
# on this 3.13 image the install fails harmlessly and the conanjurer cog stays
|
|
# dormant (its imports are guarded).
|
|
RUN pip install --no-cache-dir -r requirements_conan.txt \
|
|
|| echo "conan extras skipped - conanjurer cog will stay dormant"
|
|
|
|
# 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"]
|