diff --git a/README.md b/README.md index 3e92b60..620909f 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ - `GET /api/scans/{id}/lldp` - LLDP соседи (если устройство отдает LLDP-MIB по SNMP). - `GET /api/scans/{id}/links` - базовые связи из LLDP с попыткой сопоставления по `remote_sys_name`. - `GET /api/scans/{id}/topology` - граф `nodes/edges` для визуализации. -- `GET /` - простая UI-страница для просмотра топологии. +- `GET /` — UI для просмотра топологии (страница встроена в бинарник через `embed`, каталог `internal/webui/`; **не зависит** от `WorkingDirectory` и папки `web/` рядом с процессом). - Валидация CIDR и exclude IP. - Два backend-хранилища: in-memory и PostgreSQL. - После создания scan запускается фоновый discovery с обновлением статуса и прогресса. @@ -230,6 +230,21 @@ sudo systemctl enable --now nettopo-go systemctl status nettopo-go ``` +### Логи (systemd) + +Сервер пишет в **стандартный лог** пакета `log` (stderr): старт, выбранное хранилище, фатальные ошибки БД. Просмотр: + +```bash +journalctl -u nettopo-go -f +journalctl -u nettopo-go -n 100 --no-pager +``` + +Отдельного файла логов приложение **не создаёт**; при необходимости перенаправьте вывод unit-а в файл через `StandardOutput=` / `StandardError=` в override. + +### Если в браузере `404 page not found` на `/` + +Раньше UI отдавался из каталога `web/` относительно **текущей рабочей директории** процесса; при `WorkingDirectory=/opt/nettopo-go` без этой папки корень сайта давал 404. Сейчас UI **вшит в бинарник** — после обновления до актуального коммита пересоберите сервер (`go build ...`) и перезапустите сервис. Проверка API: `curl -s http://127.0.0.1:8080/health` должен вернуть JSON `{"status":"ok",...}`. + ## Размещение за IIS на Windows - Запускать `nettopo-server.exe` как Windows Service. diff --git a/internal/api/handler.go b/internal/api/handler.go index 106e9dc..2685f16 100644 --- a/internal/api/handler.go +++ b/internal/api/handler.go @@ -8,6 +8,7 @@ import ( "time" "nettopo-go/internal/scans" + "nettopo-go/internal/webui" ) type Handler struct { @@ -54,7 +55,7 @@ func NewHandler(store scans.Store, run *scans.Runner) *Handler { func (h *Handler) Routes() http.Handler { mux := http.NewServeMux() - webFS := http.FileServer(http.Dir("web")) + webFS := http.FileServer(http.FS(webui.FS)) mux.Handle("GET /", webFS) mux.Handle("GET /web/", http.StripPrefix("/web/", webFS)) mux.HandleFunc("GET /health", h.health) diff --git a/internal/webui/embed.go b/internal/webui/embed.go new file mode 100644 index 0000000..511b46c --- /dev/null +++ b/internal/webui/embed.go @@ -0,0 +1,6 @@ +package webui + +import "embed" + +//go:embed index.html +var FS embed.FS diff --git a/web/index.html b/internal/webui/index.html similarity index 100% rename from web/index.html rename to internal/webui/index.html