PHPackages                             mapik/watcher-nms - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. mapik/watcher-nms

ActiveProject[Utility &amp; Helpers](/categories/utility)

mapik/watcher-nms
=================

Watcher NMS

4.0.0(1mo ago)637AGPL-3.0-or-laterPHPPHP &gt;=8.2CI passing

Since Nov 4Pushed 3w ago1 watchersCompare

[ Source](https://github.com/Mapiiik/Watcher-NMS)[ Packagist](https://packagist.org/packages/mapik/watcher-nms)[ Docs](https://github.com/Mapiiik/Watcher-NMS)[ RSS](/packages/mapik-watcher-nms/feed)WikiDiscussions 4.x Synced today

READMEChangelog (10)Dependencies (38)Versions (78)Used By (0)

Watcher NMS
===========

[](#watcher-nms)

[![PHPStan](https://camo.githubusercontent.com/fff00cebb924e124a7335e6bd8ca8f8cf38869463c1654eff45d0939f1f21c57/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6c6576656c253230382d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](https://github.com/phpstan/phpstan)

Network Management System for ISPs, built on [CakePHP](https://github.com/cakephp/cakephp).

Description
-----------

[](#description)

- Inventory of access points, network devices, electricity-meter readings, …
- RouterOS device auto-registration via SNMP — devices identify themselves through the [Watcher Agent](https://github.com/Mapiiik/Watcher-Agent), which reads them over SNMP and pushes the inventory here; the matching device-type profile is then applied automatically.
- Optional checks for radio interference with Czech weather radar stations.

RouterOS device integration
---------------------------

[](#routeros-device-integration)

RouterOS device provisioning runs through the [Watcher Agent](https://github.com/Mapiiik/Watcher-Agent) — a small on-site service that can reach customer-edge devices the NMS cannot talk to directly. The agent reads the device over SNMP, pushes the inventory to this NMS, and returns the generated configuration script back to the device.

Configure a scheduler on the RouterOS device to fetch and run the script from the agent. The URL embeds the device-type identifier and the device's serial number; the agent verifies the serial over SNMP and the NMS returns the appropriate script response.

```
/tool fetch url=( \
    "https://agent.watcher.domain/provision/routeros/{device-type-identifier}/" \
        . [/system routerboard get serial-number] \
        . "/\?token=***" \
    ) dst-path=watcher-config.rsc
/import watcher-config.rsc
:delay 5
/file remove watcher-config.rsc

```

The `?token=***` must match the agent's `AGENT_ROUTEROS_QUERY_TOKEN`, and the device's source IP must fall within the agent's `AGENT_ROUTEROS_ALLOW_CIDRS`allowlist (see the [Watcher Agent](https://github.com/Mapiiik/Watcher-Agent)configuration).

To also update the admin password (derived from the serial number and the system‑wide salt), enable this option for the device type in the web UI and ensure the script is imported after fetching.

The currently generated password for each device is shown on its detail page.

Otherwise the script only logs the provisioning status and performs no changes.

Requirements
------------

[](#requirements)

- PHP 8.2 or newer
- PostgreSQL
- Redis
- [Watcher Agent](https://github.com/Mapiiik/Watcher-Agent) — required only for SNMP reads and RouterOS provisioning. It is a separate service (run it in Docker, even on the same host; it supports the PROXY protocol behind a load balancer). The NMS no longer talks SNMP directly, so the PHP `snmp` extension is no longer needed.

The Docker Compose stack below provides PostgreSQL and Redis out of the box, so on a fresh host you only need Docker.

Installation
------------

[](#installation)

Two install paths are supported. Docker Compose is recommended.

### Option A — Docker Compose (recommended)

[](#option-a--docker-compose-recommended)

```
git clone https://github.com/Mapiiik/Watcher-NMS.git
cd Watcher-NMS
cp config/.env.example config/.env
# edit config/.env — set APP_NAME and any integration URLs / API keys
docker compose -f compose.production.yaml up -d
```

The production image runs `composer run-script migrations` and rebuilds the schema cache automatically on container start, so the app is reachable at `http://localhost` (and `https://localhost` with a self-signed cert) once the container is healthy. Set `SERVER_NAME` in the compose environment to a real domain to enable Let's Encrypt issuance via the bundled `acme.sh`.

### Option B — Bare-metal (host nginx + PHP-FPM, FrankenPHP, …)

[](#option-b--bare-metal-host-nginx--php-fpm-frankenphp-)

For hosts already running their own PHP webserver:

```
git clone https://github.com/Mapiiik/Watcher-NMS.git
cd Watcher-NMS
composer install --no-dev
cp config/.env.example config/.env
# edit config/.env — at minimum DATABASE_URL and CACHE_*_URL

composer run-script migrations
composer run-script schema-cache
```

Point your webserver's document root at the `webroot/` directory. SNMP polling and RouterOS provisioning are handled by the separate [Watcher Agent](https://github.com/Mapiiik/Watcher-Agent), so no PHP `snmp`extension is required here.

Configuration
-------------

[](#configuration)

Runtime settings live in `config/.env` (or are passed in as environment variables — see the `environment:` blocks in the compose files for the keys read at boot). Common groups:

- **Database / cache:** `DATABASE_URL`, `CACHE_*_URL`
- **Server:** `APP_NAME` (used as cache prefix), `SERVER_NAME` (domain for ACME / TLS in the production image)
- **Geocoding:** the app uses Google Maps via `geocoder-php/google-maps-provider`; configure the key in `config/app_local.php` (or your environment file).

### Customizing the compose stack

[](#customizing-the-compose-stack)

If `compose.production.yaml` doesn't fit your environment, copy it to `compose.yaml` and customize there — `compose.yaml` is git-ignored, so `git pull` won't overwrite your changes.

```
cp compose.production.yaml compose.yaml
# edit compose.yaml as needed
docker compose up -d
```

Typical reasons to override: pointing services at infrastructure already running on the host (e.g. an existing PostgreSQL instance, external Redis, reverse proxy), removing bundled containers you don't need, or tweaking volumes / networks.

Development
-----------

[](#development)

Two compose files target local development:

- `compose.dev-frankenphp.yaml` — FrankenPHP (HTTP/1.1, HTTP/2, HTTP/3)
- `compose.dev-nginx.yaml` — classic nginx + PHP-FPM

Both bind-mount the working tree into the container and place `vendor/`, `tmp/`, `logs/`, plus the PostgreSQL data directory and Redis data on tmpfs — fast iteration and disposable state, but everything in those paths is lost when the stack is torn down.

```
docker compose -f compose.dev-frankenphp.yaml up
```

The Postgres and Redis ports are exposed to the host (`5432`, `6379`) so you can connect with local clients while the stack is running.

License
-------

[](#license)

Watcher NMS is licensed under the GNU Affero General Public License v3.0. Copyright (c) 2026 Martin Patočka.

### What this means

[](#what-this-means)

You are free to use, modify and run this software. If you modify it and make it available to others (including as a network service), you must also make your modifications available under the same license.

###  Health Score

52

—

FairBetter than 96% of packages

Maintenance95

Actively maintained with recent releases

Popularity12

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity78

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~22 days

Recently: every ~38 days

Total

78

Last Release

2d ago

Major Versions

1.10.4 → 2.0.02023-02-21

2.x-dev → 3.0.0-RC12023-09-27

3.x-dev → 4.0.0-RC12026-05-30

PHP version history (4 changes)1.0.0PHP &gt;=7.2

1.6.0-beta1PHP &gt;=7.4

3.0.0-RC1PHP &gt;=8.1

4.0.0-RC1PHP &gt;=8.2

### Community

Maintainers

![](https://www.gravatar.com/avatar/0328bf415a424d611eb990a0cfde9e65fa4566f9225da6f24e7f5e3f7e4a6518?d=identicon)[Mapiiik](/maintainers/Mapiiik)

---

Top Contributors

[![Mapiiik](https://avatars.githubusercontent.com/u/45870742?v=4)](https://github.com/Mapiiik "Mapiiik (893 commits)")

---

Tags

access-pointscakephpcontacts-managementdocker-composeelectricity-readingsgoogle-mapsip-address-managementispnmsphpradio-linksrouteroswisp

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/mapik-watcher-nms/health.svg)

```
[![Health](https://phpackages.com/badges/mapik-watcher-nms/health.svg)](https://phpackages.com/packages/mapik-watcher-nms)
```

###  Alternatives

[bedita/manager

BEdita Manager - official admin webapp for BEdita4 API

131.2k](/packages/bedita-manager)[cakephp/debug_kit

CakePHP Debug Kit

86314.7M171](/packages/cakephp-debug-kit)[toin0u/geocoder-laravel

Geocoder Service Provider for Laravel

7615.4M17](/packages/toin0u-geocoder-laravel)[civicrm/civicrm-core

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

751291.4k43](/packages/civicrm-civicrm-core)[dereuromark/cakephp-tools

A CakePHP plugin containing lots of useful and reusable tools

3361.0M51](/packages/dereuromark-cakephp-tools)[brianhenryie/strauss

Prefixes dependencies namespaces so they are unique to your plugin

190438.1k36](/packages/brianhenryie-strauss)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
