XF Bot Guard

XF Bot Guard 1.4.1

No permission to download
Hi.

Are these warning anything to worry about and if so, how do I fix ?

Screenshot 2026-07-16 014709.webpScreenshot 2026-07-16 014723.webpScreenshot 2026-07-16 014731.webp

Dashboard is showing no data for some reason. Had to rebuild addon to fix one error I did find, which was the health check complaining of missing cron jobs, which the addon rebuild fixed that.

The server was offline (network related issue at datacentre) for about 3 hours on the 13th to 14th (23:00 to about 02:00). This may explain the Latest dashboard snapshot warning.
 
Update....

I ran the following crons...

Dashboard Snapshot - that fixed the last two warnings & dashboard data
Known Crawler Refresh - didn't fix second warning
MMDB Refresh - didn't fix first warning

Dashboard is now showing data.
 
Update....

I ran the following crons...

Dashboard Snapshot - that fixed the last two warnings & dashboard data
Known Crawler Refresh - didn't fix second warning
MMDB Refresh - didn't fix first warning

Dashboard is now showing data.

Hi, it seems you have cron issues. Are your crons automatically running? Either by activity based polling, or with a server crontab entry?
 
Cron is server crontab run and runs every 1 minute and there's no server errors in xenforo's admin panel (usually a red bar at top of panel on login).

I have checked that the cron is running without issue.
 
Just checked now and only one warning remains, which is the first one regarding the MMDB.

There is this in the Suppressed caught failures section tho...

Code:
Count: 62
Last seen: Jul 16, 2026 at 1:14 PM
Feature area: IP geolocation (ip_geolocation)
Diagnostic target: Health check (health_check)
Catch site: upload/src/addons/Zee/BotGuard/Service/MmdbResourceManager.php:refresh#catch1)
Exception: RuntimeException (/<path to forum>/src/addons/Zee/BotGuard/Service/MmdbResourceManager.php:268
Message: MMDB manifest returned unexpected HTTP status 403. (78c4af0cabc3e8f4e16d2e7c5348eccf6b0fd309ea5dbc6833cb08e6dbaeb3d9)

Stack trace:
RuntimeException: MMDB manifest returned unexpected HTTP status 403.
Thrown at /<path to forum>/src/addons/Zee/BotGuard/Service/MmdbResourceManager.php:268
#0 /<path to forum>/src/addons/Zee/BotGuard/Service/MmdbResourceManager.php(77): Zee\BotGuard\Service\MmdbResourceManager->refresh(Object(Zee\BotGuard\Service\CronRunBudget))
#1 /<path to forum>/src/addons/Zee/BotGuard/Cron/MmdbRefresh.php(33): Zee\BotGuard\Service\MmdbResourceManager->refreshIfDue(false, Object(Zee\BotGuard\Service\CronRunBudget))
#2 /<path to forum>/src/addons/Zee/BotGuard/Service/HealthCriticalMaintenance.php(236): Zee\BotGuard\Cron\MmdbRefresh::Zee\BotGuard\Cron\{closure}()
#3 /<path to forum>/src/addons/Zee/BotGuard/Cron/MmdbRefresh.php(31): Zee\BotGuard\Service\HealthCriticalMaintenance->runTrackedTask('...', Object(Closure), '...', Object(Zee\BotGuard\Service\CronRunBudget))
#4 /<path to forum>/src/addons/Zee/BotGuard/Service/CronExecutionGuard.php(62): Zee\BotGuard\Cron\MmdbRefresh::Zee\BotGuard\Cron\{closure}()
#5 /<path to forum>/src/addons/Zee/BotGuard/Cron/MmdbRefresh.php(26): Zee\BotGuard\Service\CronExecutionGuard->run(Object(XF\Entity\CronEntry), '...', Object(Closure))
#6 /<path to forum>/src/XF/Job/Cron.php(41): Zee\BotGuard\Cron\MmdbRefresh::run(Object(XF\Entity\CronEntry))
#7 /<path to forum>/src/XF/Job/Manager.php(275): XF\Job\Cron->run(8.0)
#8 /<path to forum>/src/XF/Job/Manager.php(205): XF\Job\Manager->runJobInternal(Array, 8.0)
#9 /<path to forum>/src/XF/Job/Manager.php(89): XF\Job\Manager->runJobEntry(Array, 8.0)
#10 /<path to forum>/src/XF/Cli/Command/RunJobs.php(58): XF\Job\Manager->runQueue(false, 8)
#11 /<path to forum>/src/vendor/symfony/console/Command/Command.php(298): XF\Cli\Command\RunJobs->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#12 /<path to forum>/src/vendor/symfony/console/Application.php(1040): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#13 /<path to forum>/src/vendor/symfony/console/Application.php(301): Symfony\Component\Console\Application->doRunCommand(Object(XF\Cli\Command\RunJobs), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#14 /<path to forum>/src/vendor/symfony/console/Application.php(171): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#15 /<path to forum>/src/XF/Cli/Runner.php(115): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
#16 /<path to forum>/cmd.php(17): XF\Cli\Runner->run()
#17 {main}
 
I have checked and the /internal-data/zee/botguard/mmdb exists on server and contains the following...

Screenshot 2026-07-16 135422.webp

geo-index folder also has the following...

Screenshot 2026-07-16 135707.webp
 
XF Bot Guard — MMDB refresh fails with HTTP 403 (Cloudflare Managed Challenge)

The MMDB manifest refresh has never succeeded since installation (last_success: 0). Every request to https://thestockexchange.com.au/zee/dist/mmdb/manifest.json returns HTTP 403 with a Cloudflare Managed Challenge (cf-mitigated: challenge).

The block is on the entire domain — not just the MMDB endpoint. I tested from two different IPs (server + local machine), with three different User-Agents (default curl, XF-BotGuard/1.4.0, and Firefox), and every path (/, /zee/dist/mmdb/,
/zee/dist/mmdb/manifest.json) returns the same "Just a moment..." interstitial page. It is not IP-specific.

The problem is that Cloudflare's Managed Challenge requires JavaScript execution, which server-to-server HTTP clients (curl, PHP) cannot perform. The endpoint is currently unsuitable for automated downloads.

Could you add a Cloudflare WAF bypass rule for the /zee/dist/mmdb/* path, or move the MMDB distribution to an endpoint without a Managed Challenge? Local paths and permissions are all correct — the only issue is the Cloudflare challenge on your side.

status.json:

Code:
{
     "v": 1,
     "status": "error",
     "last_checked": 1784212872,
     "last_success": 0,
     "last_error": "MMDB manifest returned unexpected HTTP status 403.",
     "manifest_etag": "",
     "manifest_last_modified": "",
     "manifest_generated_at": "",
     "not_modified": false,
     "files": [],
     "geo_index": {
         "cache_warm_cursor": {
             "fingerprint": "",
             "position": 0,
             "page": 0
         },
         "cache_warmed_at": 1784211829,
         "cache_warmed_pages": 0
     }
 }

Response headers (curl as www-data, with XF-BotGuard User-Agent):

Code:
HTTP/2 403
 date: Thu, 16 Jul 2026 14:59:08 GMT
 content-type: text/html; charset=UTF-8
 content-length: 5580
 cf-mitigated: challenge
 server: cloudflare
 cf-ray: a1c1de7c6d46236c-TXL
 server-timing: chlray;desc="a1c1de7c6d46236c"

Response body (first line):

Code:
<!DOCTYPE html><html lang="en-US"><head><title>Just a moment...</title>

Request detail (curl -v):

Code:
> GET /zee/dist/mmdb/manifest.json HTTP/2

 │ Host: thestockexchange.com.au
 │ User-Agent: XF-BotGuard/1.4.0
 │ Accept: /
 │ X-BotGuard-BoardUrl: https://flippermarkt.de/forum

 < HTTP/2 403
 < cf-mitigated: challenge
 
OK. Is this correct ?
This seems to make no sense if this is the Cloudflare config for your forum. There is no incoming request from that URL - you download something from there, triggered via the cron job. So it is an outgoing request that does not even go through Cloudflare. Which seems to be blocked by a 403 on the page of @zeeb0t . So this rule is unnecessary.
 
I can confirm that since setting up the Cloudflare WAF bypass rule, MMDB updates are now working again. Last update was successful at 16:24 today. So this rule is needed on sites that are using Cloudflare and this addon.

I know it's a outgoing request but I was advised above to setup a cloudflare waf bypass rule and I followed the instructions on screen.
 
Last edited:
I was advised above to setup a cloudflare waf bypass rule and I followed the instructions on screen.
In case you refer to that:

Could you add a Cloudflare WAF bypass rule for the /zee/dist/mmdb/* path, or move the MMDB distribution to an endpoint without a Managed Challenge?

This was targeted at @zeebot, as far as I understand it.
I can confirm that since setting up the Cloudflare WAF bypass rule, MMDB updates are now working again. Last update was successful at 16:24 today. So this rule is needed on sites that are using Cloudflare.
Probably rather a coincidence than the cause.
 
The cloudflare waf rule comment was intended toward me. If it worked for you after setting that, that seems a strange coincidence.

In any event, I already have a skip rule in Cloudflare for the mmdb paths. I will investigate today how this is possible. Its rule #1 and skips everything. Or is supposed to, anyway.
 
@zeeb0t with cf waf rule, did you tick skip rate limiting rules and skip managed rules

As if rate limit isn't ticked it would explain why mmdb updates stopped from July 10th.

Do you want me to remove rule in my cf and test mmdb refresh?
 
Do you want me to remove rule in my cf and test mmdb refresh?

Your rule shouldn't really match anything on your end, so you can remove it. It was directed toward myself.

I checked the Cloudflare rule, and this is my fault. It was working to skip all rules etc. but I had matched on the XF-Bot-Guard user agent from prior to the latest release, which changed the user-agent value. Doh!

I just updated the rule and all requests are now serving 200 responses again. All installs will automatically repair / catch up... there will be nothing more to do but give it a couple hours :)
 
Two new warnings in Health Check...

Known crawler sources
  • 12 enabled sources / 12 refreshed successfully / 2,973 ranges
  • Last-known-good ranges are still retained, but one or more recent refresh attempts failed: Applebot (failed due to it's SSL cert has expired)
Reverse DNS hosting scoring
  • Enabled / 26 cached rows / 0 confirmed hosting matches / 1 recent resolver errors / 0 stale pending
  • Recent resolver errors are present. Requests fail open, and resolver errors are cached only briefly.
Will these resolve themselves in time ?
 
Two new warnings in Health Check...

Known crawler sources
  • 12 enabled sources / 12 refreshed successfully / 2,973 ranges
  • Last-known-good ranges are still retained, but one or more recent refresh attempts failed: Applebot
Reverse DNS hosting scoring
  • Enabled / 26 cached rows / 0 confirmed hosting matches / 1 recent resolver errors / 0 stale pending
  • Recent resolver errors are present. Requests fail open, and resolver errors are cached only briefly.
Will these resolve themselves in time ?

These are transient reports/warnings. They generally clear themselves over time. It just means in the last attempt, some data wasn't returned from outside hosts to refresh the stored values. It continues to use the already stored values in the meantime.
 
Back
Top Bottom