Embed UI in binary (fix 404 when web/ missing from WorkingDirectory). Document logs and troubleshooting.

Made-with: Cursor
This commit is contained in:
Луценко Андрей Анатольевич
2026-04-10 12:28:53 +10:00
parent e25e068515
commit 659b76f1cf
4 changed files with 24 additions and 2 deletions
+16 -1
View File
@@ -15,7 +15,7 @@
- `GET /api/scans/{id}/lldp` - LLDP соседи (если устройство отдает LLDP-MIB по SNMP). - `GET /api/scans/{id}/lldp` - LLDP соседи (если устройство отдает LLDP-MIB по SNMP).
- `GET /api/scans/{id}/links` - базовые связи из LLDP с попыткой сопоставления по `remote_sys_name`. - `GET /api/scans/{id}/links` - базовые связи из LLDP с попыткой сопоставления по `remote_sys_name`.
- `GET /api/scans/{id}/topology` - граф `nodes/edges` для визуализации. - `GET /api/scans/{id}/topology` - граф `nodes/edges` для визуализации.
- `GET /` - простая UI-страница для просмотра топологии. - `GET /` — UI для просмотра топологии (страница встроена в бинарник через `embed`, каталог `internal/webui/`; **не зависит** от `WorkingDirectory` и папки `web/` рядом с процессом).
- Валидация CIDR и exclude IP. - Валидация CIDR и exclude IP.
- Два backend-хранилища: in-memory и PostgreSQL. - Два backend-хранилища: in-memory и PostgreSQL.
- После создания scan запускается фоновый discovery с обновлением статуса и прогресса. - После создания scan запускается фоновый discovery с обновлением статуса и прогресса.
@@ -230,6 +230,21 @@ sudo systemctl enable --now nettopo-go
systemctl status 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 ## Размещение за IIS на Windows
- Запускать `nettopo-server.exe` как Windows Service. - Запускать `nettopo-server.exe` как Windows Service.
+2 -1
View File
@@ -8,6 +8,7 @@ import (
"time" "time"
"nettopo-go/internal/scans" "nettopo-go/internal/scans"
"nettopo-go/internal/webui"
) )
type Handler struct { type Handler struct {
@@ -54,7 +55,7 @@ func NewHandler(store scans.Store, run *scans.Runner) *Handler {
func (h *Handler) Routes() http.Handler { func (h *Handler) Routes() http.Handler {
mux := http.NewServeMux() mux := http.NewServeMux()
webFS := http.FileServer(http.Dir("web")) webFS := http.FileServer(http.FS(webui.FS))
mux.Handle("GET /", webFS) mux.Handle("GET /", webFS)
mux.Handle("GET /web/", http.StripPrefix("/web/", webFS)) mux.Handle("GET /web/", http.StripPrefix("/web/", webFS))
mux.HandleFunc("GET /health", h.health) mux.HandleFunc("GET /health", h.health)
+6
View File
@@ -0,0 +1,6 @@
package webui
import "embed"
//go:embed index.html
var FS embed.FS