mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 21:38:38 +00:00
fix: make bot startup resilient (self-healing state, gated cogs, loud failures)
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>
This commit is contained in:
@@ -96,8 +96,47 @@ docker compose -f docker/compose.bot.yaml up -d --build
|
||||
docker logs -f conjurer-bot
|
||||
```
|
||||
|
||||
Look for `Loading … module done` for each cog, `Loading conanjurer commands
|
||||
module done`, and `All systems: operational`.
|
||||
Look for `Extension loaded: …` for each cog and `All systems: operational`.
|
||||
|
||||
### 1e. Startup model: core cogs vs service-gated cogs
|
||||
|
||||
The bot **always** starts with the cogs that depend on nothing but itself
|
||||
(administration, AI, other, latex, voice, conanjurer). Cogs that need a
|
||||
sibling service are **health-gated**:
|
||||
|
||||
| Group | Cogs | Enabled when |
|
||||
|-------|------|--------------|
|
||||
| musician | `music_commands`, `radio_commands`, `file_search_commands` | `GET {FILE_SERVICE}/mp3` answers |
|
||||
| librarian | `librarian_commands` | librarian answers HTTP at all |
|
||||
|
||||
When a service is down its cogs stay disabled (commands simply don't exist)
|
||||
and the log says so. A watchdog re-checks every 5 minutes and enables the
|
||||
cogs the moment the service starts answering — no bot restart needed.
|
||||
A single broken cog (missing pip package, bad import) is skipped with a full
|
||||
traceback in the log; it never takes the whole bot down.
|
||||
|
||||
### 1f. Troubleshooting a crash-looping container
|
||||
|
||||
`docker logs conjurer-bot` now shows the real reason (the bot logs to stdout
|
||||
as well as the rotating file). The most common cases:
|
||||
|
||||
- **`FATAL: Discord token missing`** — the secrets mount is missing/empty or
|
||||
`CONJURER_NETRC_FILE` points elsewhere. Check:
|
||||
`docker inspect -f '{{json .Mounts}}' conjurer-bot | jq` and
|
||||
`docker exec conjurer-bot ls -la /secrets/` (after a manual
|
||||
`docker run … sleep infinity` if it crash-loops too fast).
|
||||
- **Missing state files** — not fatal anymore: missing dirs are created and
|
||||
missing JSON state is seeded from the repo templates baked into the image
|
||||
(existing files are never overwritten). Fix the mount at your leisure.
|
||||
|
||||
**About files "disappearing" from `/srv/conjurer/...`:** nothing in this stack
|
||||
deletes host files — the entrypoint and the bot only ever *create* missing
|
||||
files. With a bind mount, `/srv/conjurer/data` **is** the live state (not an
|
||||
installation staging area): don't delete it after a successful install.
|
||||
If files vanished, the usual suspects are `docker compose down -v` (only
|
||||
affects *named* volumes, not binds), a re-provisioned VM, or copying the files
|
||||
to a different path than the one in the compose `volumes:` line — verify with
|
||||
`docker inspect -f '{{json .Mounts}}' conjurer-bot`.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user