SkillAgentSearch skills...

WatchYourPorts

Open ports inventory for local servers. Exports data to InfluxDB2/Grafana

Install / Use

/learn @aceberg/WatchYourPorts
About this skill

Quality Score

0/100

Category

Operations

Supported Platforms

Universal

README

Main-Docker Go Report Card Maintainability Docker Image Size (latest semver)

<h1><a href="https://github.com/aceberg/watchyourports"> <img src="https://raw.githubusercontent.com/aceberg/watchyourports/main/assets/logo.png" width="35" /> </a>WatchYourPorts</h1>

Open ports inventory for local servers. Exports data to InfluxDB2/Grafana

Screenshot

<details> <summary>More screenshots</summary> <img src="https://raw.githubusercontent.com/aceberg/WatchYourPorts/main/assets/Screenshot2.png"> <img src="https://raw.githubusercontent.com/aceberg/WatchYourPorts/main/assets/Screenshot3.png"> </details>

Quick start

docker run --name wyp \
-e "TZ=Asia/Novosibirsk" \
-v ~/.dockerdata/WatchYourPorts:/data/WatchYourPorts \
-p 8853:8853 \
aceberg/watchyourports

Or use docker-compose.yml

Auth

You can limit access to WYP with ForAuth. Here is an example: docker-compose-auth.yml
Also, SSO tools like Authelia should work.

Import ports from Docker

  1. Run docker-export.sh on a server, where Docker is installed. $ADDR is IP or domain name of the server, without http(s):// prefix. It will be used to ping ports.
./docker-export.sh $ADDR
  1. Paste the output to hosts.yaml file in WatchYourPorts config dir
  2. You can add as many servers to hosts.yaml, as you want

Config

Configuration can be done through config.yaml file or GUI, or environment variables

| Variable | Description | Default | | -------- | ----------- | ------- | | HOST | Listen address | 0.0.0.0 | | PORT | Port for web GUI | 8853 | | THEME | Any theme name from https://bootswatch.com in lowercase or additional | grass | | COLOR | Background color: light or dark | dark | | TIMEOUT | How often watched ports are scanned (minutes) | 10 | | HIST_TRIM | How many port states are saved in memory and displayed | 90 | | TZ | Set your timezone for correct time | "" |

InfluxDB2 config

This config matches Grafana's config for InfluxDB data source

| Variable | Description | Default | Example | | -------- | ----------- | ------- | ------- | | INFLUX_ENABLE | Enable export to InfluxDB2 | false | true | | INFLUX_SKIP_TLS | Skip TLS Verify | false | true | | INFLUX_ADDR | Address:port of InfluxDB2 server | | https://192.168.2.3:8086/ | | INFLUX_BUCKET | InfluxDB2 bucket | | test | | INFLUX_ORG | InfluxDB2 org | | home | | INFLUX_TOKEN | Secret token, generated by InfluxDB2 | | |

Options

| Key | Description | Default | | -------- | ----------- | ------- | | -d | Path to config dir | /data/WatchYourPorts | | -n | Path to local JS and Themes (node-bootstrap) | "" |

Local network only

By default, this app pulls themes, icons and fonts from the internet. But, in some cases, it may be useful to have an independent from global network setup. I created a separate image with all necessary modules and fonts.

docker run --name node-bootstrap       \
    -v ~/.dockerdata/icons:/app/icons  \ # For local images
    -p 8850:8850                       \
    aceberg/node-bootstrap
docker run --name wyp \
    -v ~/.dockerdata/WatchYourPorts:/data/WatchYourPorts \
    -p 8853:8853 \
    aceberg/watchyourports -n "http://$YOUR_IP:8850"

Or use docker-compose

API

GET /api/all

Returns all data about saved addresses in json.

<details> <summary>Response example</summary>
{
    "192.168.2.2": {
        "Name": "SomeAddrName",
        "Addr": "192.168.2.2",
        "PortMap": {},  // All saved ports will be here
        "Total": 0,
        "Watching": 0,
        "Online": 0,
        "Offline": 0
    },
}
</details><br>
GET /api/history

All history data from memory.

<details> <summary>Response example</summary>
{
"192.168.2.3:8849": {
        "Name": "OS",
        "Addr": "192.168.2.3",
        "Port": 8849,
        "PortName": "MiniBoard",
        "State": [
            {
                "Date": "2024-06-28 22:42:45",
                "State": true
            },
            {
                "Date": "2024-06-28 22:52:45",
                "State": true
            }
        ],
        "NowState": true
    },
}
</details><br>
GET /api/port/:addr

Returns current PortMap for addr.

<details> <summary>Request example</summary>
curl http://0.0.0.0:8853/api/port/192.168.2.2
</details> <details> <summary>Response example</summary>
{
    "8850": {
        "Name": "node-bootstrap",
        "Port": 8850,
        "State": true,
        "Watch": true
    },
    "8851": {
        "Name": "Exercise Diary",
        "Port": 8851,
        "State": true,
        "Watch": true
    },

}
</details><br>
GET /api/port/:addr/:port

Gets state of one port

<details> <summary>Request example</summary>
curl http://0.0.0.0:8853/api/port/192.168.2.2/8844
</details> <details> <summary>Response example</summary>
{
    "Name": "git-syr",
    "Port": 8844,
    "State": true,
    "Watch": true
}
</details><br>

Thanks

Related Skills

View on GitHub
GitHub Stars198
CategoryOperations
Updated3d ago
Forks11

Languages

Go

Security Score

100/100

Audited on Mar 18, 2026

No findings