defmodule ToweropsWeb.HelpLive.Index do @moduledoc false use ToweropsWeb, :live_view alias Towerops.Accounts alias Towerops.Accounts.Scope alias Towerops.Organizations @impl true def mount(_params, session, socket) do # Check if user is logged in via session current_user = get_current_user(socket, session) is_authenticated = !is_nil(current_user) # Load user's default organization if authenticated current_organization = if current_user do case Organizations.list_user_organizations(current_user.id) do [first_org | _] -> first_org [] -> nil end end # Build current_scope if authenticated current_scope = if current_user do current_user |> Scope.for_user() |> Scope.put_organization(current_organization) end socket = socket |> assign(:page_title, "Help") |> assign(:current_user, current_user) |> assign(:is_authenticated, is_authenticated) |> assign(:current_scope, current_scope) |> assign(:timezone, if(current_user, do: current_user.timezone, else: "UTC")) |> assign(:generated_password, nil) |> assign(:password_generating, false) # Generate initial password if connected?(socket) do send(self(), :fetch_random_password) end {:ok, socket} end @impl true def handle_params(params, _url, socket) do section = Map.get(params, "section", "about") socket = socket |> assign(:active_section, section) |> assign(:generated_password, nil) |> assign(:password_generating, false) {:noreply, socket} end @impl true def handle_event("generate_password", _params, socket) do socket = assign(socket, :password_generating, true) send(self(), :fetch_random_password) {:noreply, socket} end @impl true def handle_info(:fetch_random_password, socket) do case generate_random_password() do {:ok, password} -> {:noreply, socket |> assign(:generated_password, password) |> assign(:password_generating, false) |> put_flash(:info, "Password generated successfully from random.org")} {:error, reason} -> {:noreply, socket |> assign(:password_generating, false) |> put_flash(:error, "Failed to generate password: #{reason}")} end end defp generate_random_password do # Generate a 24-character truly random password from random.org # Format: uppercase, lowercase, and digits url = "https://www.random.org/strings/?num=1&len=24&digits=on&upperalpha=on&loweralpha=on&unique=on&format=plain&rnd=new" case Req.get(url) do {:ok, %{status: 200, body: body}} -> password = String.trim(body) {:ok, password} {:ok, %{status: status}} -> {:error, "random.org returned status #{status}"} {:error, error} -> {:error, Exception.message(error)} end end defp get_current_user(socket, session) do # Try to get current_user from socket assigns (if already set by on_mount) with nil <- Map.get(socket.assigns, :current_user), token when not is_nil(token) <- session["user_token"], {user, _authenticated_at} <- Accounts.get_user_by_session_token(token) do user else %Towerops.Accounts.User{} = user -> user _ -> nil end end slot :inner_block, required: true defp code(assigns) do ~H""" {render_slot(@inner_block)} """ end attr :active_section, :string, required: true attr :generated_password, :string, default: nil attr :password_generating, :boolean, default: false defp help_content(assigns) do ~H"""

Help & Documentation

Learn how to use Towerops to monitor your network infrastructure

<%= case @active_section do %> <% "about" -> %>

About Towerops

Towerops is a modern network monitoring and management platform designed to provide comprehensive visibility into your network infrastructure. It came out of a need to simplify network monitoring and alerting while running a wireless ISP.

Our promise to you:

  • No random marketing emails or sign up for our newsletter popups.
  • No trackers EVER, no external libraries used.
  • No ads or sponsored content.
  • No data collection or sharing.
  • Our remote agent is fully open source and ONLY collects monitoring jobs from the server and WILL NEVER allow us to access any part of your internal network.

Think of Towerops as combining the best of LibreNMS, Icinga2/Nagios, and PagerDuty into a single, unified platform. You get deep network device monitoring with SNMP auto-discovery, flexible health checks and alerting, and intelligent incident management—all with a modern interface that makes complex monitoring workflows simple and accessible.

Towerops is not and has no plans to be a replacement for a full WISP/network billing system.

Network Monitoring

Like LibreNMS, discover and monitor network devices via SNMP with support for multi-vendor equipment, interface statistics, and topology mapping.

Health Checks & Alerting

Like Icinga2/Nagios, configure flexible monitoring checks with customizable thresholds and alert conditions for any metric or device state.

Incident Management

Like PagerDuty, manage incidents with intelligent alerting, escalation policies, and notification routing to keep your team informed.

<.icon name="hero-information-circle" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Ready to get started? Check out the <.link patch={~p"/help?section=getting-started"} class="underline hover:text-blue-900 dark:hover:text-blue-200" > Getting Started guide to begin monitoring your network infrastructure.

<% "getting-started" -> %>

Getting Started with Towerops

Towerops is a network monitoring platform that helps you keep track of your network devices, monitor their health, and get alerts when issues occur.

Quick Start Guide

1

Create a Site

Sites represent physical or logical locations where your network devices are located. Start by creating a site for your office, data center, or any location where you have equipment.

Navigate to <.code>Sites → <.code>Add Site

2

Add Your First Device

Add network devices like routers, switches, access points, or servers. You'll need the device's IP address or hostname, and SNMP community string (for SNMP-enabled devices).

Navigate to <.code>Devices → <.code>Add Device

3

View Device Metrics

Click on any device to view real-time metrics including CPU usage, memory, temperature, interface traffic, and more. Explore the different tabs to see network topology, port status, and historical performance data.

<.icon name="hero-light-bulb" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Pro Tip

For devices behind firewalls or in remote locations, you can deploy a remote poller to monitor devices locally without exposing them to the internet. See the <.link patch={~p"/help?section=agents"} class="underline hover:text-blue-900 dark:hover:text-blue-200" > Remote Pollers section for more information.

<% "sites" -> %>

Sites

Sites are an optional organizational feature that lets you group devices by physical or logical locations such as offices, datacenters, customer locations, or network zones. Sites are disabled by default to keep things simple for single-location deployments.

When to Enable Sites

Consider enabling sites if you:

  • Manage multiple physical locations - Offices, datacenters, retail stores, etc.
  • Want to group credentials by location - Different SNMP communities or credentials per site
  • Need location-based monitoring - Assign different remote pollers to different sites
  • Organize by customer or department - Logical groupings for multi-tenant or large networks

When to Skip Sites

You can skip enabling sites if you:

  • Have a single location - All devices in one office or datacenter
  • Want a simpler setup - Devices belong directly to your organization without extra grouping
  • Don't need location-based credentials - Organization-level credentials work for all devices
<.icon name="hero-information-circle" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Note

Sites are optional and disabled by default. You can start without sites and enable them later if your needs change. When sites are disabled, all devices belong directly to your organization.

How Sites Work

When sites are enabled, devices can be organized into sites, and credentials (SNMP communities, usernames, passwords) can be set at three levels:

1. Organization Level

Default credentials that apply to all devices across all sites in your organization.

2. Site Level (when sites enabled)

Override organization defaults for all devices at a specific site. Useful when different locations have different network configurations.

3. Device Level

Override organization or site credentials for a specific device. Useful for devices with unique configurations.

Enabling Sites

1

Navigate to Organization Settings

Go to <.code>Settings → <.code>Organization and scroll to the "Site Organization" section.

2

Enable the "Use Sites" Toggle

Check the box for "Use sites to organize devices" and save your settings.

3

Create Your First Site

Navigate to <.code>Sites → <.code>Add Site to create your first site. Give it a descriptive name like "Main Office" or "Dallas Datacenter".

4

Assign Devices to Sites

When creating or editing devices, you can now assign them to specific sites. The site selector will appear in the device form.

<.icon name="hero-exclamation-triangle" class="h-5 w-5 text-yellow-600 dark:text-yellow-400 flex-shrink-0 mt-0.5" />

Disabling Sites

If you disable sites after enabling them, all devices will be removed from their sites and assigned directly to the organization. Site assignments will be lost, but devices will remain in your organization and continue to be monitored.

<% "cloud-pollers" -> %>

Cloud Pollers

If you have publicly reachable devices, they will be automatically polled from one of our cloud pollers unless overridden by your settings. Our cloud infrastructure monitors your devices without requiring any additional setup or agent installation.

Active Cloud Pollers

Location IPv4 Address IPv6 Address
DFW (Dallas-Fort Worth) 144.202.64.79 2001:19f0:6401:0af2:5400:05ff:fee7:1bfb
<.icon name="hero-information-circle" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Firewall Configuration

If your devices are behind a firewall, make sure to allow SNMP traffic (UDP port 161) and ICMP (for ping monitoring) from these IP addresses. For devices not accessible from the public internet, consider using a <.link patch={~p"/help?section=agents"} class="underline hover:text-blue-900 dark:hover:text-blue-200" > Remote Poller instead.

<% "agents" -> %>

Remote Pollers

Remote pollers allow you to monitor devices that are not accessible from the public internet, such as devices behind firewalls, in private networks, or at remote locations. A remote poller runs on your network and securely communicates with Towerops to poll your devices locally.

Requirements

Remote pollers can run on any system that supports Docker Compose, including:

  • Linux servers (Ubuntu, Debian, CentOS, RHEL, etc.)
  • Windows Server with Docker Desktop
  • macOS with Docker Desktop
  • Raspberry Pi or other ARM-based systems
  • Virtual machines (VMware, Hyper-V, Proxmox, etc.)

Minimum requirements: 1 CPU core, 512 MB RAM, and network access to your devices

Getting Started

1

Create an Agent Token

Navigate to the <.code>Agents page in Towerops and create a new agent token. This token authenticates your remote poller with the Towerops platform.

2

Get Docker Compose Configuration

On the Agents page, add a new remote agent. Copy the <.code>docker-compose.yml file contents from the agent details, which includes your authentication token pre-configured.

3

Deploy the Remote Poller

Transfer the <.code>docker-compose.yml file to your server and run:

docker compose up -d

The remote poller will start automatically and connect to Towerops.

4

Assign Devices to Remote Poller

You can assign devices to your remote poller in several ways:

  • Per Organization: Set a default agent for all devices in your organization
  • Per Site: Set a default agent for all devices at a specific site
  • Per Device: Select the remote poller when creating or editing individual devices

Devices assigned to a remote poller will be monitored from your local network instead of from the cloud.

<.icon name="hero-shield-check" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Security Note

Remote pollers use secure WebSocket connections to communicate with Towerops. Your agent token is encrypted and should be kept confidential. The remote poller only needs outbound HTTPS access (port 443) to connect to Towerops - no inbound ports need to be opened on your firewall.

Managing Remote Pollers

You can view the status of your remote pollers on the Agents page. The page shows:

  • Last connection time
  • Number of devices assigned to each poller
  • Connection status (online/offline)
<.icon name="hero-exclamation-triangle" class="h-5 w-5 text-yellow-600 dark:text-yellow-400 flex-shrink-0 mt-0.5" />

Important

If a remote poller goes offline, devices assigned to it will not be monitored until the poller comes back online. Consider setting up monitoring alerts for your remote pollers to be notified if they disconnect.

<% "graphs" -> %>

Graphs & Live Polling

Towerops provides powerful visualization capabilities for all monitored metrics. Every sensor, interface, and metric can be viewed as a time-series graph with multiple time ranges and a real-time live polling mode for instant feedback.

Accessing Graphs

Graphs are available throughout Towerops wherever metrics are displayed:

  • Device Overview: Click any metric tile (CPU, Memory, Temperature, etc.) to view its graph
  • Sensors Tab: Click the graph icon next to any sensor reading
  • Interfaces Tab: Click the graph icon next to any interface to view traffic graphs
  • Storage Tab: Click any storage volume to view usage over time

Time Ranges

All graphs support multiple time ranges for analyzing trends at different scales:

1 Hour

Recent activity with high detail

6 Hours

Half-day trends and patterns

12 Hours

Business day overview

24 Hours (Default)

Full day of activity

7 Days

Weekly trends and patterns

30 Days

Monthly overview and capacity planning

Live Polling Mode

Live mode provides real-time sensor monitoring with data updating every second. This is perfect for:

  • Testing configuration changes and seeing immediate effects
  • Monitoring system load during maintenance or upgrades
  • Watching temperature changes during thermal testing
  • Observing traffic patterns during load testing
  • Real-time troubleshooting of performance issues
<.icon name="hero-signal" class="h-5 w-5 text-green-600 dark:text-green-400 flex-shrink-0 mt-0.5" />

How Live Mode Works

  • Polls sensors directly via SNMP every 1 second
  • Displays a rolling 5-minute window (300 data points)
  • Updates chart in real-time as new data arrives
  • Automatically stops when you switch to another time range
  • Works with remote pollers - polling happens on the agent

Using Live Mode

1

Open Any Graph

Navigate to any device and click on a metric graph (CPU, Memory, Temperature, Traffic, etc.)

2

Click the "Live" Button

The Live button has a distinctive green gradient style and will pulse when active

3

Watch Real-Time Updates

The graph will start updating every second with fresh data. A pulsing green indicator shows that live polling is active.

4

Switch Back to Historical Data

Click any other time range button to stop live polling and view historical data

Supported Metrics in Live Mode

<.icon name="hero-cpu-chip" class="h-4 w-4 text-blue-500" /> CPU / Processors

Real-time CPU load and utilization

<.icon name="hero-circle-stack" class="h-4 w-4 text-blue-500" /> Memory Usage

RAM utilization percentage

<.icon name="hero-fire" class="h-4 w-4 text-orange-500" /> Temperature

Device and component temperatures

<.icon name="hero-bolt" class="h-4 w-4 text-yellow-500" /> Voltage

Power supply voltages

<.icon name="hero-server-stack" class="h-4 w-4 text-purple-500" /> Storage

Disk usage and capacity

<.icon name="hero-hashtag" class="h-4 w-4 text-green-500" /> Custom Metrics

Sessions, connections, and counts

<.icon name="hero-information-circle" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Note About Traffic Graphs

Live mode is currently only available for sensor metrics (CPU, memory, temperature, etc.). Interface traffic graphs use historical data only, as traffic calculations require comparing multiple SNMP polls over time.

Tips for Using Graphs

Multiple Sensors on One Graph

When viewing aggregate metrics (like "Temperature" for all sensors), the graph automatically displays all sensors of that type with different colors for easy comparison.

Max and Min Values

Historical graphs (non-live) display the maximum and minimum values for the selected time range at the bottom of the chart for quick reference.

Traffic Graph Direction

Interface traffic graphs show outbound traffic as positive values (above zero) and inbound traffic as negative values (below zero) for easy visualization of bidirectional flow.

Automatic Unit Scaling

Traffic graphs automatically scale units (bps, Kbps, Mbps, Gbps) based on the data range for optimal readability. Hover over data points to see exact values.

<.icon name="hero-light-bulb" class="h-5 w-5 text-yellow-600 dark:text-yellow-400 flex-shrink-0 mt-0.5" />

Performance Tip

Live polling makes direct SNMP requests every second. While this provides instant feedback, keeping many live graphs open simultaneously may impact device performance. Use live mode for troubleshooting and testing, then switch back to historical ranges for routine monitoring.

<% "mikrotik" -> %>

MikroTik Configuration

Towerops supports read-only monitoring of MikroTik RouterOS devices via SSH. In addition to SNMP polling, SSH access allows Towerops to retrieve detailed system information and create configuration backups of your MikroTik devices for disaster recovery and audit purposes.

<.icon name="hero-information-circle" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Read-Only Access

Towerops currently operates in read-only mode for MikroTik devices. Configuration changes, reboots, and other administrative actions are not supported. This ensures your device configurations remain unchanged by monitoring operations.

<.icon name="hero-server" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Cloud or Agent-Based Connections

Both SNMP polling and SSH connections to MikroTik devices can be performed from either Towerops cloud infrastructure or your remote poller (agent). For publicly accessible devices, cloud polling is the simplest option. For devices on private networks or when you prefer to keep SSH credentials on your local network, deploy a remote poller. The device assignment determines which poller handles both SNMP and SSH operations.

Security Best Practices

For security purposes, it is strongly recommended to create a dedicated read-only user account for Towerops rather than using an administrator account. This follows the principle of least privilege and minimizes potential security risks. Even though Towerops only performs read-only operations, limiting the account permissions provides defense in depth.

Creating a Read-Only User

Connect to your MikroTik device via SSH or terminal and execute the following commands to create a read-only user named <.code>towerops:

Step 1: Create a new user group with read-only permissions

/user group add name=readonly policy=ssh,read,test,api

Step 2: Create the monitoring user with a strong password

/user add name=towerops password={if @generated_password, do: @generated_password, else: "YOUR_STRONG_PASSWORD"} group=readonly <%= if @generated_password do %> <% end %>
<.button type="button" phx-click="generate_password" disabled={@password_generating} > <%= if @password_generating do %> <.icon name="hero-arrow-path" class="h-4 w-4 mr-1 animate-spin" /> Generating... <% else %> <.icon name="hero-sparkles" class="h-4 w-4 mr-1" /> Regenerate Random Password <% end %> <%= if @generated_password do %>

⚠️ This truly random password from random.org will only be shown once!

<% end %>

Step 3: Verify the user was created successfully

/user print detail where name=towerops

Permissions Explained

The <.code>readonly group includes the following permissions. Note that while these permissions are granted to the user account, Towerops only performs read operations and does not make any configuration changes:

Permission Description
ssh Allow SSH access to the device
read Allow viewing configuration and status (read-only)
test Allow executing diagnostic commands (ping, traceroute, etc.)
api Allow API access for automated monitoring
<.icon name="hero-information-circle" class="h-5 w-5 text-blue-600 dark:text-blue-400 flex-shrink-0 mt-0.5" />

Important Notes

  • The read-only user cannot modify device configuration
  • No write, reboot, or sensitive permissions are granted
  • Use a strong, unique password for the monitoring account
  • Consider restricting SSH access by source IP if possible

Configuring in Towerops

After creating the read-only user, configure SSH credentials in Towerops:

Organization-Level Configuration

Navigate to <.code>Settings → <.code>Organization to set default SSH credentials for all MikroTik devices in your organization.

Site-Level Configuration

Navigate to <.code>Sites → select a site → <.code>Edit to override credentials for all devices at a specific location.

Device-Level Configuration

When editing a MikroTik device, you can specify unique SSH credentials that override organization and site defaults.

<.icon name="hero-shield-check" class="h-5 w-5 text-yellow-600 dark:text-yellow-400 flex-shrink-0 mt-0.5" />

Security Recommendations

  • Always use SSL/TLS for SSH connections (API-SSL on port 8729)
  • Store credentials at the organization or site level when possible
  • Rotate passwords periodically following your security policies
  • Monitor access logs for unauthorized SSH connection attempts
  • Consider using SSH keys instead of passwords (if supported by your setup)
<% _ -> %>

Section Not Found

The requested help section could not be found.

<% end %>
""" end end