Andrey Lutsenko 43cb339605 Add scan queue execution and listing endpoint.
Run scans in background with progress/status updates and store scan metrics in memory or PostgreSQL.

Made-with: Cursor
2026-04-09 21:49:38 +10:00

nettopo-go

Минимальный старт проекта сетового инвентаризатора и топологии на Go без Docker.

Что уже есть

  • GET /health - проверка состояния API.
  • POST /api/scans - создание задания скана.
  • GET /api/scans - список сканов.
  • GET /api/scans/{id} - просмотр созданного задания.
  • Валидация CIDR и exclude IP.
  • Два backend-хранилища: in-memory и PostgreSQL.
  • После создания scan запускается фоновый discovery с обновлением статуса и прогресса.

Требования

  • Go 1.22+

Проверка версии:

go version

Запуск локально

  1. Перейдите в проект:
cd nettopo-go
  1. Скопируйте переменные окружения:
cp .env.example .env
  1. Запустите API:
HTTP_ADDR=:8080 go run ./cmd/server

По умолчанию используется STORE_BACKEND=memory.

PostgreSQL без Docker

Вариант A: macOS (Homebrew)

brew install postgresql@16
brew services start postgresql@16
createdb nettopo
createuser nettopo
psql -d postgres -c "alter user nettopo with password 'nettopo';"
psql -d postgres -c "grant all privileges on database nettopo to nettopo;"

Вариант B: Ubuntu/Debian

sudo apt update
sudo apt install -y postgresql postgresql-contrib
sudo -u postgres psql -c "create user nettopo with password 'nettopo';"
sudo -u postgres psql -c "create database nettopo owner nettopo;"

Вариант C: Windows

  • Установить PostgreSQL через официальный installer.
  • Создать БД nettopo и пользователя nettopo (через pgAdmin или psql).

Запуск API с PostgreSQL

export STORE_BACKEND=postgres
export DB_DSN='postgres://nettopo:nettopo@localhost:5432/nettopo?sslmode=disable'
export RUN_MIGRATIONS=true
go run ./cmd/server

При первом запуске автоматически применится миграция scan_jobs.

Быстрая проверка API

Проверка health:

curl -s http://localhost:8080/health

Создать scan:

curl -s -X POST http://localhost:8080/api/scans \
  -H "Content-Type: application/json" \
  -d '{
    "name":"Office scan",
    "cidrs":["192.168.1.0/24"],
    "exclude_ips":["192.168.1.1"],
    "options":{
      "ping_timeout_ms":700,
      "ping_retries":1,
      "max_parallel_hosts":128,
      "port_scan_enabled":true,
      "ports":[22,80,443,161]
    }
  }'

Получить scan по id:

curl -s http://localhost:8080/api/scans/<scan_id>

Получить список scan jobs:

curl -s http://localhost:8080/api/scans?limit=20

В ответе у scan есть:

  • status: queued, running, done, failed
  • progress: 0..100
  • stats.hosts_total, stats.hosts_up

Запуск как сервис на Linux (systemd)

  1. Собрать бинарник:
go build -o nettopo-server ./cmd/server
  1. Скопировать unit-файл:
sudo cp deploy/nettopo-go.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now nettopo-go
  1. Проверить статус:
systemctl status nettopo-go

Размещение за IIS на Windows

  • Запускать nettopo-server.exe как Windows Service.
  • На IIS настроить Reverse Proxy к http://localhost:8080.
  • Требуются URL Rewrite + ARR.

Шаблон web.config лежит в deploy/web.config.example.

S
Description
No description provided
Readme 194 KiB
Languages
Go 59.9%
HTML 40.1%