{"id":37390277,"url":"https://github.com/verifiedjoseph/intruder-alert","last_synced_at":"2026-01-26T18:01:36.576Z","repository":{"id":189942611,"uuid":"681621653","full_name":"VerifiedJoseph/intruder-alert","owner":"VerifiedJoseph","description":"Self-hosted event dashboard for Fail2ban","archived":false,"fork":false,"pushed_at":"2026-01-12T03:38:47.000Z","size":9343,"stargazers_count":28,"open_issues_count":4,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-16T16:32:31.841Z","etag":null,"topics":["dashboard","docker-image","fail2ban","fail2ban-dashboard","php","self-hosted"],"latest_commit_sha":null,"homepage":"https://verifiedjoseph.github.io/intruder-alert/demo/","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VerifiedJoseph.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-08-22T12:05:35.000Z","updated_at":"2026-01-01T12:53:45.000Z","dependencies_parsed_at":"2023-08-22T15:51:27.155Z","dependency_job_id":"24faee2a-1cb3-43e0-9882-db32fd5c7001","html_url":"https://github.com/VerifiedJoseph/intruder-alert","commit_stats":null,"previous_names":["verifiedjoseph/intruder-alert"],"tags_count":61,"template":false,"template_full_name":null,"purl":"pkg:github/VerifiedJoseph/intruder-alert","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VerifiedJoseph%2Fintruder-alert","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VerifiedJoseph%2Fintruder-alert/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VerifiedJoseph%2Fintruder-alert/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VerifiedJoseph%2Fintruder-alert/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VerifiedJoseph","download_url":"https://codeload.github.com/VerifiedJoseph/intruder-alert/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VerifiedJoseph%2Fintruder-alert/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28784093,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T13:55:28.044Z","status":"ssl_error","status_checked_at":"2026-01-26T13:55:26.068Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dashboard","docker-image","fail2ban","fail2ban-dashboard","php","self-hosted"],"created_at":"2026-01-16T05:29:35.188Z","updated_at":"2026-01-26T18:01:36.570Z","avatar_url":"https://github.com/VerifiedJoseph.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Intruder Alert\n\n[![Latest Version](https://img.shields.io/github/release/VerifiedJoseph/intruder-alert.svg?style=flat-square)](https://github.com/VerifiedJoseph/intruder-alert/releases/latest)\n[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](LICENSE)\n[![Codecov](https://img.shields.io/codecov/c/github/VerifiedJoseph/intruder-alert?style=flat-square)](https://app.codecov.io/gh/VerifiedJoseph/intruder-alert/)\n\nIntruder Alert is a self-hosted event dashboard for [Fail2ban](https://github.com/fail2ban/fail2ban).\n\n![screenshot](screenshots/screenshot_readme.png)\n\n[More screenshots](./docs/screenshots.md)\n\n## Demo\n\nA demo is [available](https://verifiedjoseph.github.io/intruder-alert/demo/) and is built from the latest commit on the `main` brach.\n\n## Installation\n\n### docker-compose\n\n\u003cdetails\u003e\n\u003csummary\u003eShow/hide details\u003c/summary\u003e\n\n```yaml\nversion: '3'\n\nservices:\n  app:\n    image: ghcr.io/verifiedjoseph/intruder-alert:1.22.9\n    container_name: intruder-alert\n    environment:\n      - IA_TIMEZONE=Europe/London\n      - IA_SYSTEM_LOG_TIMEZONE=UTC\n      - IA_MAXMIND_LICENSE_KEY=\n      - IA_LOG_FOLDER=/app/backend/data/logs\n    volumes:\n      - path/to/fail2ban.log:/app/backend/data/logs/fail2ban.log:ro\n      - path/to/fail2ban.log.1:/app/backend/data/logs/fail2ban.log.1:ro\n      - path/to/fail2ban.log.2.gz:/app/backend/data/logs/fail2ban.log.2.gz:ro\n      - path/to/fail2ban.log.3.gz:/app/backend/data/logs/fail2ban.log.3.gz:ro\n      - path/to/fail2ban.log.4.gz:/app/backend/data/logs/fail2ban.log.4.gz:ro\n    ports:\n      - '127.0.0.1:8080:8080'\n```\n\n\u003c/details\u003e\n\n### Manually\n\n\u003cdetails\u003e\n\u003csummary\u003eShow/hide install details\u003c/summary\u003e\n\n1) Download the [latest release](https://github.com/VerifiedJoseph/intruder-alert/releases/latest) to your web server and extract the zip archive.\n\n2) Configure the application using `backend/config.php` copied from [`backend/config.example.php`](backend/config.example.php).\n\n\t```\n\tcp backend/config.example.php backend/config.php\n\t```\n\n3) Create a scheduled task with cron (below) or similar that runs `backend\\cron.php` at least once an hour.\n\n\t```\n\t0 1 * * * php path/to/intruder-alert/backend/cron.php\n\t```\n\n**Notes**\n\nThe backend folder does not need to be reachable in the browser and access should blocked. \n\nThe scheduled task needs to run as root or a user with permission to read the fail2ban logs.\n\u003c/details\u003e\n\n## Configuration\n\nEnvironment variables are used to adjust the configuration.\n\n| Name                     | Type      | Description                                                                                              |\n| ------------------------ | --------- | -------------------------------------------------------------------------------------------------------- |\n| `IA_LOG_PATHS`           | `string`  | Comma separated list of Fail2ban log files.                                                              |\n| `IA_LOG_FOLDER`          | `string`  | Path of the Fail2ban logs folder. \u003cbr\u003e Ignored when `IA_LOG_PATHS` is set.                               |\n| `IA_MAXMIND_LICENSE_KEY` | `string`  | MaxMind license key for GeoLite2 database downloads.                                                     |\n| `IA_ASN_DATABASE`        | `string`  | Path of the GeoLite2 ASN database file. \u003cbr\u003e Ignored when `IA_MAXMIND_LICENSE_KEY` is set.               |\n| `IA_COUNTRY_DATABASE`    | `string`  | Path of the GeoLite2 Country database file. \u003cbr\u003e Ignored when `IA_MAXMIND_LICENSE_KEY` is set.           |\n| `IA_TIMEZONE`            | `string`  | Timezone to use in the dashboard. ([php docs](https://www.php.net/manual/en/timezones.php))              |\n| `IA_SYSTEM_LOG_TIMEZONE` | `string`  | Timezone of fail2ban logs. Required when using the docker image.\u003cbr\u003eUse the timezone of the host system. |\n| `IA_VERBOSE`             | `boolean` | Enable additional logging for debugging.                                                                 |\n| `IA_DASH_CHARTS`         | `boolean` | Enable/disable dashboard charts. \u003cbr\u003e (optional, charts are enabled by default)                          |\n| `IA_DASH_UPDATES`        | `boolean` | Enable/disable automatically updating the dashboard with new events. (optional, updates are enabled by default) |\n| `IA_DASH_DAEMON_LOG`     | `boolean` | Enable/disable displaying daemon log in the dashboard. \u003cbr\u003e (optional, log viewer is enabled by default) |\n| `IA_DASH_DEFAULT_CHART`  | `string`  | Override default chart displayed in the dashboard. Optional. \u003cbr\u003e Supported values: `24hours`, `48hours`, `14days`, `30days` |\n| `IA_DASH_PAGE_SIZE`      | `int`     | Override default table page size in the dashboard. Optional. \u003cbr\u003e Supported values: `25`, `50`, `100`, `200`, `500` |\n\n### GeoLite2 databases\n\nGeoLite2 databases will be automatically downloaded and updated if a [MaxMind license key](https://support.maxmind.com/hc/en-us/articles/4407111582235-Generate-a-License-Key) is set with `IA_MAXMIND_LICENSE_KEY`.\n\nAlternatively, the databases can be manually [downloaded](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data?lang=en) and set using the environment variables `IA_ASN_DATABASE` and `IA_COUNTRY_DATABASE`.\n\n## Development\n\nClone the repository.\n\n```\ngit clone https://github.com/VerifiedJoseph/intruder-alert\n```\n\nInstall PHP dependencies with composer.\n\n```\ncomposer install\n```\n\nInstall JavaScript dependencies with npm.\n\n```\nnpm install\n```\n\nStart [esbuild](https://esbuild.github.io/) watcher\n\n```\nnpm run watch\n```\n\n### Commands\n\n\u003cdetails\u003e\n\u003csummary\u003eShow/hide commands\u003c/summary\u003e\n\nLint code:\n```\ncomposer lint\nnpm run lint\n```\n\nFix code:\n```\ncomposer fix\nnpm run fix\n```\n\nBuild code:\n```\nnpm run build\n```\n\nLive code build:\n```\nnpm run watch\n```\n\nTest code:\n```\ncomposer test\n```\n\n\u003c/details\u003e\n\n## Dependencies\n\n- PHP\n\t- [`geoip2/geoip2`](https://github.com/maxmind/GeoIP2-php)\n- JavaScript\n\t- [Chart.js](https://github.com/chartjs/Chart.js/)\n\t- [Spacetime](https://github.com/spencermountain/spacetime)\n\n## Requirements\n\n- PHP \u003e= 8.3\n- Composer\n- Node.js \u003e= 22.0 (development only)\n\n## Changelog\n\nAll notable changes to this project are documented in the [CHANGELOG](CHANGELOG.md).\n\n## License\n\nMIT License. Please see [LICENSE](LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverifiedjoseph%2Fintruder-alert","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fverifiedjoseph%2Fintruder-alert","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverifiedjoseph%2Fintruder-alert/lists"}