NetProbe - веб-панель мониторинга открытых портов: TCP и UDP, расписание проверок, история изменений и уведомления в Telegram, MAX, E-mail, Zabbix и Syslog. Всё состояние - один файл SQLite внутри тома, рядом с приложением ничего ставить не нужно.
Ниже - установка одним контейнером, первый вход, настройка расписания и оповещений, обновление и резервные копии.

Результаты сканирования: только адреса из расписания, новые порты подсвечены, закрытые обведены пунктиром.
Что понадобится
- Docker 20.10+ (или Docker Desktop) на любом хосте:
linux/amd64,linux/arm64,linux/arm/v7(Raspberry Pi). - Свободный порт (по умолчанию 5000).
- Доступ в интернет только для загрузки образа - дальше приложение работает локально.
Первый вход
Логин: admin Пароль: admin123
Пароль по умолчанию создаётся только при пустой базе. Сразу после входа:
- Откройте «Настройки → Пользователи» и смените пароль
admin. - Создайте пользователей с ролями: Администратор, Специалист ИБ (всё, кроме раздела «Пользователи»), Пользователь (просмотр и проверка одного IP).
- Перед публикацией наружу задайте свой
SECRET_KEY- это ключ сессий и CSRF.
Установка через docker compose (рекомендуется)
Создайте папку /opt/netprobe, в ней файл docker-compose.yml:
services:
netprobe:
image: ruiiru/netprobe:latest
container_name: netprobe
ports:
- "5000:5000"
environment:
- SECRET_KEY=change-me-in-production
- TZ=Europe/Moscow
volumes:
- netprobe_data:/app/data
restart: unless-stopped
volumes:
netprobe_data:
Запуск:
docker compose up -d
Через 10 - 20 секунд откройте http://IP-хоста:5000.
Установка одной командой
docker run -d --name netprobe \
-p 5000:5000 \
-e SECRET_KEY=change-me-in-production \
-e TZ=Europe/Moscow \
-v netprobe_data:/app/data \
--restart unless-stopped \
ruiiru/netprobe:latest
Порт меняется левой частью проброса: -p 8080:5000. Внутри контейнера приложение всегда слушает 5000.
Первое расписание
- «Расписание → Добавить».
- Укажите адрес, диапазон или подсеть (до 4096 адресов, маска не меньше
/20). - Перечислите порты TCP и UDP (до 2000 значений), выберите интервал.
- Сохраните - первое сканирование стартует сразу.
На главной появляются только адреса из расписаний: убрали расписание - ушли и строки. Новые порты подсвечиваются, закрытые обведены пунктиром, а уведомление приходит только на новый порт - первый скан адреса сообщений не создаёт.

Расписание: адрес или подсеть, порты TCP и UDP, интервал проверки.
Разовая проверка
Страница /quick проверяет адрес, диапазон или подсеть прямо сейчас и не пишет результат в базу - удобно, чтобы убедиться в доступности или в наборе портов до настройки расписания. Ограничение - 20000 проверок за запуск (QUICK_MAX_CHECKS).

Оповещения
«Настройки → Оповещения»: канал (Telegram, MAX, E-mail, Zabbix, Syslog), типы событий (открытие и/или закрытие) и язык сообщений. Кнопка «Проверить» отправляет тестовое сообщение.
Токены и пароли SMTP хранятся в базе, а не в переменных окружения, - их не нужно переписывать при обновлении контейнера.

События: открытые и закрытые порты с датой и комментарием адреса.
HTTPS через Traefik
Контейнер слушает обычный HTTP на 5000, TLS и домен настраиваются на стороне reverse-proxy. Пример меток:
services:
netprobe:
image: ruiiru/netprobe:latest
container_name: netprobe-web
restart: unless-stopped
environment:
- SECRET_KEY=${SECRET_KEY}
- TZ=${TZ:-Europe/Moscow}
volumes:
- netprobe_data:/app/data
networks: [traefik]
labels:
- "traefik.enable=true"
- "traefik.docker.network=${TRAEFIK_NETWORK}"
- "traefik.http.routers.netprobe.rule=Host(`${NETPROBE_DOMAIN}`)"
- "traefik.http.routers.netprobe.entrypoints=websecure"
- "traefik.http.routers.netprobe.tls.certresolver=letsencrypt"
- "traefik.http.services.netprobe.loadbalancer.server.port=5000"
volumes:
netprobe_data:
networks:
traefik:
external: true
name: ${TRAEFIK_NETWORK}
Сеть должна существовать заранее: docker network create traefik.
Обновление
docker pull ruiiru/netprobe:latest
docker compose up -d
Или без compose: docker restart netprobe после docker pull. Схема базы обновляется автоматически при старте - миграции запускать не нужно. Для воспроизводимых установок фиксируйте тег-хеш коммита вместо latest.
Резервная копия
Всё состояние - файл /app/data/port_scanner.db в томе netprobe_data.
# бэкап
docker cp netprobe:/app/data/port_scanner.db ./port_scanner-$(date +%F).db
# восстановление
docker cp ./port_scanner-2026-11-13.db netprobe:/app/data/port_scanner.db
docker restart netprobe
Переменные окружения
Обязательны только две, остальные - тонкая настройка сканера.
| Переменная | По умолчанию | Описание |
|---|---|---|
SECRET_KEY |
change-me-in-production | ключ сессий и CSRF |
TZ |
Europe/Moscow | часовой пояс контейнера |
DB_NAME |
/app/data/port_scanner.db | путь к SQLite |
SCAN_WORKERS |
200 | потоков сканирования |
SOCKET_TIMEOUT |
1.2 | таймаут TCP-проверки, сек |
UDP_ENABLED |
1 | 0 - отключить UDP |
Полный список - в README проекта.
Что важно знать
- Планировщик работает внутри процесса: остановили контейнер - автосканы не идут.
- UDP подтверждается только ответом службы. Syslog/514 и DHCP/67 по broadcast остаются «закрытыми».
- Встроенной авторизации достаточно для внутренней сети; наружу выставляйте через reverse-proxy с HTTPS.
- Сканируйте только те адреса, на которые есть разрешение, - приложение это не проверяет.
Ссылки
- Docker Hub: ruiiru/netprobe
- Исходный код: github.com/ratnikov-d/NetProbe
- Лицензия MIT