# Daily AI Log Summary A lightweight, automated tool that analyzes system logs—specifically optimized for **Postfix** and **Dovecot** mail servers—extracts key security and operational facts, and generates a concise daily summary using a local AI model (Ollama). ## Features - **Structured Log Analysis**: Deterministically extracts facts from `journalctl` logs (Postfix/postscreen rejections, Dovecot logins, relay abuse, SPF/DKIM anomalies, etc.). - **AI Summarization**: Uses Ollama (e.g., `llama3.2:1b`) to synthesize raw facts into a readable daily report. - **Repeat Offender Tracking**: Persistently tracks suspicious IPs across multiple days to identify long-term probing. - **Automated Emailing**: Sends the summary and raw facts via SMTP. - **Dockerized**: Easy deployment with a minimal footprint. - **Systemd Integration**: Includes an example unit for robust "always-on" operation. ## How It Works 1. **Fetch**: Retrieves yesterday's logs for a specific systemd unit using `journalctl`. 2. **Analyze**: Python regex-based extraction identifies successful logins, authentication failures, blocked relay attempts, and more. 3. **Track**: Suspicious IPs are stored in a persistent state file. If an IP appears on multiple days, it's flagged as a "repeat offender." 4. **Summarize**: Raw facts are fed to a local Ollama instance with a specific system prompt to generate a concise narrative. 5. **Report**: An email is sent to the administrator with the AI summary and the full list of extracted facts. ## Prerequisites - **Docker**: For running the analyzer. - **Ollama**: A running Ollama instance (locally or accessible via network). - **Systemd Journals**: The host must use systemd journals (the container mounts these as read-only). ## Ollama Setup This tool requires an Ollama server to handle the AI summarization. ### 1. Install Ollama If you don't have Ollama installed, you can install it on Linux with: ```bash curl -fsSL https://ollama.com/install.sh | sh ``` Alternatively, you can run Ollama as a Docker container: ```bash docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama ``` ### 2. Select and Pull a Model The script defaults to `llama3.2:1b`, which is lightweight and fast for this task. You must pull the model before the script can use it: ```bash ollama pull llama3.2:1b ``` You can choose other models (like `llama3`, `mistral`, `gemma`) by pulling them and updating the `OLLAMA_MODEL` variable in your `.env` file. ### 3. Run the Server If installed natively, Ollama usually starts automatically as a systemd service. You can check its status: ```bash systemctl status ollama ``` If you need to run it manually: ```bash ollama serve ``` ## Setup 1. **Clone the repository**: ```bash git clone https://github.com/youruser/daily-ai-summary.git cd daily-ai-summary ``` 2. **Configure Environment**: Copy `.env.example` to `.env` (or whatever path you'll use in your systemd unit) and fill in your details: ```bash cp .env.example .env nano .env ``` *Key variables to set:* `REPORT_TO_EMAIL`, `REPORT_FROM_EMAIL`, `SMTP_SERVER`, `OLLAMA_API_URL`. 3. **Build the Docker Image**: ```bash docker build -t daily-ai-summary . ``` ## Running ### Manual Test Run You can run the container manually to verify your configuration: ```bash docker run --rm \ --network=host \ --env-file=.env \ -v /var/log/journal:/var/log/journal:ro \ -v /run/log/journal:/run/log/journal:ro \ -v /etc/machine-id:/etc/machine-id:ro \ -v $(pwd)/data:/data \ daily-ai-summary ``` *Note: Ensure `RUN_NOW=true` is set in your `.env` for an immediate run.* ### Production Deployment (Systemd) 1. Adjust `systemd-daily-ai-summary.service.example` with your actual paths (e.g., where your `.env` and `data` folder live). 2. Copy the service file: ```bash sudo cp systemd-daily-ai-summary.service.example /etc/systemd/system/daily-ai-summary.service ``` 3. Enable and start: ```bash sudo systemctl daemon-reload sudo systemctl enable daily-ai-summary sudo systemctl start daily-ai-summary ``` ## Configuration | Variable | Default | Description | | :--- | :--- | :--- | | `OLLAMA_API_URL` | `http://localhost:11434/api/generate` | URL to your Ollama API. | | `OLLAMA_MODEL` | `llama3.2:1b` | The model to use for summarization. | | `REPORT_TO_EMAIL` | - | Recipient of the daily report. | | `JOURNAL_UNIT` | `mailserver` | The systemd unit name to analyze. | | `TRUSTED_LOGIN_NETWORKS` | `10.0.0.0/24` | CIDR ranges that won't be flagged as "untrusted" logins. | | `REPORT_TIME` | `08:00` | When to run the daily report (24h format). | | `RUN_NOW` | `false` | If `true`, runs the analysis immediately on startup. | | `DEBUG` | `false` | Enable verbose logging. | ## Troubleshooting - **Journal Access**: Ensure the user running Docker has permissions to read `/var/log/journal`. On many systems, this means being in the `systemd-journal` group. - **Ollama Connectivity**: If Ollama is running on the host, the container needs `--network=host` to reach `localhost:11434`. - **State Persistence**: If "repeat offenders" aren't being tracked across restarts, verify the `/data` mount is writable and correctly mapped in the systemd unit. - **No Logs Found**: Check that `JOURNAL_UNIT` matches the exact name of the systemd service you want to monitor (e.g., `postfix.service` or `dovecot.service`). ## License MIT