Work top-down: process running → Telegram answers → DAPNET /test → calendars ON → events in /refresh.
| Symptom | Likely cause | What to do |
|---|---|---|
| Immediate exit, missing env | Empty .env or unset required vars |
Copy .env.example, fill all required fields. |
| Error about Fernet / key | ENCRYPTION_KEY missing or not a valid Fernet key |
Generate a new key with the Python one-liner in Configuration. If users already exist, a new key cannot decrypt old passwords. |
JobQueue is not available |
Installed python-telegram-bot without extra |
pip install -e . from this repo (pulls python-telegram-bot[job-queue]). |
| Python version error | Older than 3.12 | Install 3.12+ or use Docker. |
Conflict: terminated by other getUpdates |
Two processes use the same TELEGRAM_BOT_TOKEN |
Stop the other container/systemd unit/laptop running the same bot. |
Docker: docker compose logs bot. Python: watch the terminal.
/token on your bot).@username and tap Start.message and callback_query updates.ADMIN_TELEGRAM_IDS./help shows what you are allowed to see.@username) is in ADMIN_TELEGRAM_IDS./start to the bot./register actually finished (they got “Registration submitted”)./, length 3–20.DAPNET_DEFAULT_SERVER, usually Germany).Spain-only callsigns: ask the operator to set DAPNET_DEFAULT_SERVER=es or create the subscriber on the Germany core too. See Limitations.
The bot could not list calendars.
https://cloud.example.org). The bot appends /remote.php/dav if needed./status must say approved./calendars — at least one calendar ON. New calendars default to OFF./refresh — do events appear in the next 14 days?/rics — at least one RIC ON, or no RIC rows (fallback = your callsign). All-OFF means DAPNET send is skipped./test — if this fails, calendars are not the problem (core, TX groups, operator password, or destinations)./timezone — all-day events fire at 09:00 that zone./reminders — you may be waiting for T-60 while expecting an immediate page; use /test.all./server must be the network your pager actually listens to./test rejected by DAPNETThe reply includes the HTTP status and a short body.
DAPNET_PASSWORD or callsign in .env (operator credentials).POST /calls.By design, if DAPNET fails and Telegram works, the offset is not retried on DAPNET. The Telegram text will say the page could not be sent. Fix DAPNET (/test, groups, core, destinations) before the next event.
Sync is every 10 minutes by default. Use /refresh. Events outside FETCH_EVENT_WINDOW_DAYS (14) are not fetched.
Cancelled events are ignored. Calendar still OFF? Enable it.
Default grace is 30 minutes. Due times older than that are skipped. There is no catch-up of a full weekend outage. Lower/higher: MISFIRE_GRACE_MINUTES.
ENCRYPTION_KEY does not match the key used when the user registered. Restore the old key or ask users to /register again (same callsign stays approved).
Background sync could not read Nextcloud. App password rotated? URL changed? User should /register with new credentials.
DATABASE_URL must stay under ./data so the bind mount ./data:/app/data holds bot.db. A path like /tmp/bot.db dies with the container.
/users is incompleteThe command lists at most 50 rows. Query SQLite as operator if you have more.
pip install -e ".[dev]"
pytest
Need Python 3.12+ and network-free unit tests (they should not call live DAPNET).