# Собственный спам-фильтр

Spam Scanner работает на вашем сервере и оставляет почту там. Модель классификатора входит в пакет, нет ни телеметрии, ни проверки обновлений, а по умолчанию он отправляет только DNS-запрос об имени хоста каждой ссылки.


## Что покидает сервер

По умолчанию только имена хостов из ссылок в письме. Они проверяются на фильтрующих резолверах Cloudflare (1.1.1.2 и 1.1.1.3) обычными DNS-запросами, и никакая часть письма или его адресов не отправляется. `--no-cloudflare` отключает и это.

Любая другая проверка, которая использует сеть, выключена, пока вы её не включите:

| Проверка              | Включается           | Что отправляет                                        |
| --------------------- | -------------------- | ----------------------------------------------------- |
| SPF, DKIM, DMARC, ARC | `--auth`             | DNS-запросы о записях отправителя                     |
| DNS-списки блокировки | `--dnsbl`, `--uribl` | IP-адрес клиента и домены ссылок, в виде DNS-запросов |
| ClamAV                | `--clamav`           | Вложения, вашему собственному clamd                   |
| Языковая модель       | `--llm`              | Краткое содержание письма, на указанный вами сервер   |

Проверки не записываются в журнал и не сохраняются. [Безопасность и конфиденциальность](https://spamscanner.net/ru/docs/security/)


## Установка на сервер

```sh
npm install --global spamscanner
```

Или отдельный исполняемый файл со встроенными Node.js и моделью:

```sh
curl -fsSL https://github.com/spamscanner/spamscanner/releases/latest/download/install.sh | bash
```

Скрипт установки перед установкой сверяет файл с `SHA256SUMS` релиза, а у каждого файла есть подписанная аттестация происхождения сборки, которую проверяет `gh attestation verify`. Файлы есть для Linux (x64 и arm64), macOS и Windows. Файлам для Linux нужна glibc, поэтому на Alpine устанавливайте через npm. [Начало работы](https://spamscanner.net/ru/docs/getting-started/)

Проверки обновлений нет. Чтобы обновиться, снова запустите команду установки: обе команды ставят последний релиз.


## Запуск как служба

Серверы milter, HTTP, TCP и spamd слушают 127.0.0.1, если `--host` не указывает иное. Запускайте их от непривилегированного пользователя, например под systemd:

```ini
[Service]
ExecStart=/usr/local/bin/spamscanner milter --port 7831 --auth --subject-tag [SPAM]
User=spamscanner
Group=spamscanner
Restart=on-failure
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
```

[Полный юнит и его настройка](https://spamscanner.net/ru/docs/postfix/#1-run-the-milter) приведены в руководстве по Postfix. Ни один из серверов не поддерживает TLS, поэтому для доступа с другой машины используйте частную сеть, SSH-туннель или обратный прокси с TLS.


## Подключение почтового сервера

| Почтовый сервер                    | Команда                                 | Порт |
| ---------------------------------- | --------------------------------------- | ---- |
| Postfix или Sendmail               | `spamscanner milter`                    | 7831 |
| Postfix, никогда не отклоняя почту | `spamscanner filter`, контентный фильтр | нет  |
| Exim, Haraka или spamc             | `spamscanner spamd`                     | 783  |
| Всё, что умеет HTTP                | `spamscanner http`                      | 7832 |
| Простой TCP-клиент                 | `spamscanner server`                    | 7830 |
| Почтовый сервер на Node.js         | `import SpamScanner from 'spamscanner'` | нет  |

Серверы могут добавлять к письму заголовки `X-Spam-Flag`, `X-Spam-Score` и `X-Spam-Status`, а библиотека возвращает оценку и каждый сработавший тест. Руководства: [спам-фильтр для Postfix](https://spamscanner.net/ru/postfix-spam-filter/), [другие почтовые серверы](https://spamscanner.net/ru/docs/mail-servers/) и [HTTP API](https://spamscanner.net/ru/docs/http-api/).


## Языковые модели локально

Языковая модель необязательна и читает только спорные случаи: явный спам и явный ham до неё не доходят. С Ollama она работает на том же сервере, так что ни одно письмо его не покидает:

```sh
ollama pull qwen3.5:4b
spamscanner milter --llm ollama --llm-model qwen3.5:4b
```

`qwen3.5:4b` работает на CPU. При облачном провайдере персональные данные удаляются из письма перед отправкой. [Языковые модели](https://spamscanner.net/ru/docs/llm/)


## Обучение на своей почте

Встроенная модель обучена на открытых наборах данных. Модель, обученная на почте, которую получает ваш сервер, работает лучше и остаётся на этом сервере:

```sh
spamscanner train --spam ~/Maildir/.Junk --ham ~/Maildir/cur --out /var/lib/spamscanner/model.json
SPAMSCANNER_MODEL=/var/lib/spamscanner/model.json spamscanner milter
```

Файл модели хранит хешированные счётчики признаков, а не слова или текст писем. [Обучение](https://spamscanner.net/ru/docs/training/)


## Требования

Node.js 18 или новее на Linux, macOS или Windows, а с отдельным исполняемым файлом ничего. ClamAV и Ollama необязательны и работают как отдельные службы.
