defmodule ToweropsWeb.HelpLive.Index do @moduledoc false use ToweropsWeb, :live_view alias Towerops.Accounts alias Towerops.Accounts.Scope alias Towerops.HTTP 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, t("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)} {:error, reason} -> {:noreply, socket |> assign(:password_generating, false) |> put_flash(:error, t("Failed to generate password: %{reason}", reason: 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 HTTP.get(__MODULE__, 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, format_request_error(error)} end end defp format_request_error(%_{} = error), do: Exception.message(error) defp format_request_error(error), do: inspect(error) 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"""
Learn how to use Towerops to monitor your network infrastructure
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:
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.
Like LibreNMS, discover and monitor network devices via SNMP with support for multi-vendor equipment, interface statistics, and topology mapping.
Like Icinga2/Nagios, configure flexible monitoring checks with customizable thresholds and alert conditions for any metric or device state.
Like PagerDuty, manage incidents with intelligent alerting, escalation policies, and notification routing to keep your team informed.
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.
Towerops is a network monitoring platform that helps you keep track of your network devices, monitor their health, and get alerts when issues occur.
Sites represent physical or logical locations where your network devices are located. If you manage multiple locations, start by creating a site for your office, data center, or any location where you have equipment.
Navigate to <.code>Sites → <.code>Add Site
Sites are disabled by default and can be enabled later in <.link patch={~p"/help?section=settings"} class="underline hover:text-gray-700 dark:hover:text-gray-300" > Organization Settings → General tab.
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
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.
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 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.
Consider enabling sites if you:
You can skip enabling sites if you:
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.
When sites are enabled, devices can be organized into sites, and credentials (SNMP communities, usernames, passwords) can be set at three levels:
Default credentials that apply to all devices across all sites in your organization.
Override organization defaults for all devices at a specific site. Useful when different locations have different network configurations.
Override organization or site credentials for a specific device. Useful for devices with unique configurations.
Go to <.code>Settings → <.code>Organization and scroll to the "Site Organization" section.
Check the box for "Use sites to organize devices" and save your settings.
Navigate to <.code>Sites → <.code>Add Site to create your first site. Give it a descriptive name like "Main Office" or "Dallas Datacenter".
When creating or editing devices, you can now assign them to specific sites. The site selector will appear in the device form.
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.
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.
| Location | IPv4 Address | IPv6 Address |
|---|---|---|
| DFW (Dallas-Fort Worth) | 144.202.64.79 | 2001:19f0:6401:0af2:5400:05ff:fee7:1bfb |
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.
Remote pollers are lightweight Docker containers that run on your network to monitor devices that aren't accessible from the public internet — behind firewalls, on private networks, or at remote locations. They use minimal resources (1 CPU core, 512 MB RAM) and auto-update themselves via Watchtower. Just deploy a <.code>docker-compose.yml and you're done.
Remote pollers can run on any system that supports Docker Compose, including:
Minimum requirements: 1 CPU core, 512 MB RAM, and network access to your devices
Navigate to the <.code>Agents page in Towerops and create a new agent token. This token authenticates your remote poller with the Towerops platform.
When you create a new agent on the <.code>Agents page, Towerops will show you a ready-to-use <.code>docker-compose.yml with your agent token pre-filled. It looks like this:
<%= raw(~S[services:
towerops-agent:
image: ghcr.io/towerops-app/towerops-agent:latest
container_name: towerops-agent
restart: unless-stopped
environment:
- TOWEROPS_API_URL=https://app.towerops.net/
- TOWEROPS_AGENT_TOKEN=your-token-here
labels:
- "com.centurylinklabs.watchtower.enable=true"
- "com.centurylinklabs.watchtower.scope=towerops"
watchtower:
image: containrrr/watchtower:latest
container_name: towerops-watchtower
restart: unless-stopped
environment:
- WATCHTOWER_POLL_INTERVAL=43200
- WATCHTOWER_LABEL_ENABLE=true
- WATCHTOWER_SCOPE=towerops
- WATCHTOWER_CLEANUP=true
volumes:
- /var/run/docker.sock:/var/run/docker.sock]) %>
The agent is lightweight — it uses minimal CPU and memory. Watchtower is included to automatically update the agent every 12 hours, so you never have to think about it.
Copy the <.code>docker-compose.yml to your server and run:
docker compose up -d
That's it. The agent will connect to Towerops within seconds and start polling your local devices. You'll see it come online on the Agents page.
You can assign devices to your remote poller in several ways:
Devices assigned to a remote poller will be monitored from your local network instead of from the cloud.
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.
You can view the status of your remote pollers on the Agents page. The page shows:
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.
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.
Graphs are available throughout Towerops wherever metrics are displayed:
All graphs support multiple time ranges for analyzing trends at different scales:
Recent activity with high detail
Half-day trends and patterns
Business day overview
Full day of activity
Weekly trends and patterns
Monthly overview and capacity planning
Live mode provides real-time sensor monitoring with data updating every second. This is perfect for:
Navigate to any device and click on a metric graph (CPU, Memory, Temperature, Traffic, etc.)
The Live button has a distinctive green gradient style and will pulse when active
The graph will start updating every second with fresh data. A pulsing green indicator shows that live polling is active.
Click any other time range button to stop live polling and view historical data
Real-time CPU load and utilization
RAM utilization percentage
Device and component temperatures
Power supply voltages
Disk usage and capacity
Sessions, connections, and counts
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.
When viewing aggregate metrics (like "Temperature" for all sensors), the graph automatically displays all sensors of that type with different colors for easy comparison.
Historical graphs (non-live) display the maximum and minimum values for the selected time range at the bottom of the chart for quick reference.
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.
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.
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.
Organization Settings is the central hub for configuring your Towerops organization. Access it from the main navigation under <.code>Organization Settings. The settings page uses a tabbed interface to organize different configuration areas.
The General tab lets you manage basic organization properties:
Configure organization-wide SNMP defaults used for device polling:
SNMP credentials follow a hierarchy: Device > Site > Organization. Device-level settings take the highest priority, followed by site-level, then organization-level defaults. This lets you set sensible defaults while overriding for specific locations or devices.
Use the Force Apply button to push the organization's SNMP settings to all devices, overriding any device or site-level customizations.
Configure organization-wide SSH credentials for MikroTik device monitoring. This tab is only accessible to superusers. See the <.link patch={~p"/help?section=mikrotik"} class="underline hover:text-blue-900 dark:hover:text-blue-200 text-blue-700 dark:text-blue-300" > MikroTik section for detailed setup instructions.
Manage remote poller (agent) assignments for your organization:
Use the Force Apply button to push the default agent assignment to all devices, overriding any device or site-level agent selections.
Connect Towerops with third-party services. See the <.link patch={~p"/help?section=integrations"} class="underline hover:text-blue-900 dark:hover:text-blue-200 text-blue-700 dark:text-blue-300" > Integrations section for full details on available integrations and how to configure them.
Integrations allow you to connect Towerops with third-party services to enrich your monitoring data, sync subscriber information, and streamline your workflow. Configure integrations from <.code>Organization Settings → <.code>Integrations tab.
Preseem is a Quality of Experience (QoE) monitoring platform designed for WISPs and broadband providers. The Preseem integration syncs subscriber and access point QoE data into Towerops, giving you a unified view of network health alongside device monitoring.
Log in to your Preseem dashboard and generate an API key from your account settings.
Navigate to <.code>Organization Settings → <.code>Integrations tab. Enter your Preseem API key and configure the sync interval.
Use the Test Connection button to verify your API key is valid and Towerops can reach the Preseem API.
Preseem data is synced automatically on a periodic schedule based on your configured sync interval. You can also trigger a manual sync at any time from the integration settings.
Gaiia is a billing and subscriber management platform. The Gaiia integration syncs subscriber data, service plans, and entity mappings into Towerops, enabling you to correlate network issues with specific customers and services.
Navigate to <.code>Organization Settings → <.code>Integrations tab and enter your Gaiia API credentials.
Configure a webhook in your Gaiia account pointing to the webhook URL provided in the integration settings. Webhooks enable real-time updates when subscriber data changes in Gaiia.
After the initial sync, review the entity mapping to ensure Gaiia subscribers are correctly matched to Towerops devices. Use the reconciliation tools to resolve any mismatches.
Gaiia data is synced through two mechanisms: automatic periodic syncs pull the full dataset on a schedule, while real-time webhooks push individual changes as they happen in Gaiia. This ensures your data stays current without excessive API calls.
PagerDuty is an incident management and on-call alerting platform. The PagerDuty integration provides 2-way alert sync — when a device goes down in Towerops, a PagerDuty incident is automatically triggered. Acknowledging or resolving the alert in Towerops updates the PagerDuty incident as well.
In PagerDuty, go to <.code>Services → select your service → <.code>Integrations tab → <.code>Add Integration → choose <.code>Events API v2. Copy the <.code>Integration Key (routing key).
Navigate to <.code>Organization Settings → <.code>Integrations tab → click <.code>Configure on PagerDuty. Paste your integration key and test the connection.
Unlike other integrations, PagerDuty is event-driven — there is no periodic sync. Alerts are sent to PagerDuty in real time as they occur. No polling or sync interval is needed.
Every integration includes a Test Connection button that validates your credentials and confirms Towerops can communicate with the external service before saving.
The Integrations tab shows the last sync time, sync status, and any errors for each configured integration.
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.
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.
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.
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.
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 %>
⚠️ 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
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 |
After creating the read-only user, configure SSH credentials in Towerops:
Navigate to <.code>Organization Settings → <.code>MikroTik tab to set default SSH credentials for all MikroTik devices in your organization.
Navigate to <.code>Sites → select a site → <.code>Edit to override credentials for all devices at a specific location.
When editing a MikroTik device, you can specify unique SSH credentials that override organization and site defaults.
Network Insights provides proactive observations about your network health, gathered automatically from all connected data sources.
Towerops continuously analyzes data from SNMP polling, Preseem, Gaiia, and other integrations to surface actionable findings. Insights are categorized by source, urgency, and type so you can focus on what matters.
Use the filter bar to narrow insights by status (active/dismissed), source (Preseem, Gaiia, SNMP, system), and urgency level. Each insight shows affected devices as clickable links so you can drill directly into the device detail page.
Dismiss insights you've reviewed to keep the active list clean. Bulk actions let you select multiple insights at once.
Tip: Insights run on a nightly schedule. Connect your Gaiia and Preseem integrations in <.link navigate={~p"/help?section=integrations"} class="underline"> Organization Settings to get the most comprehensive insights.
The Network Map provides a geographic view of your sites on an interactive map. Sites with latitude and longitude coordinates are displayed as markers that you can click to view details.
Each site can have an address and/or latitude/longitude coordinates. You can set these in two ways:
Address-to-coordinate conversion requires a Google Maps Geocoding API key. Your administrator sets this as the
GOOGLE_MAPS_API_KEY
environment variable on the server. The map display itself uses OpenStreetMap and requires no API key.
API tokens allow external applications and scripts to authenticate with the Towerops REST and GraphQL APIs. Each token is scoped to an organization and can be managed from your user settings.
Include the token in the
Authorization
header:
Authorization: Bearer your-api-token-here
See also: <.link navigate={~p"/help?section=rest-api"} class="underline">REST API and <.link navigate={~p"/help?section=graphql-api"} class="underline"> GraphQL API for endpoint documentation.
The Towerops REST API provides programmatic access to your monitoring data. All endpoints are under
/api/v1/
and require a valid API token.
<%= raw("curl -H \"Authorization: Bearer YOUR_TOKEN\" \\\n https://app.towerops.net/api/v1/devices") %>
All responses use
{raw("{\"data\": ...}")}
format. Results are scoped to the organization associated with your API token.
Full reference: REST API Documentation → — complete endpoint reference with request/response examples.
The GraphQL API lets you query exactly the data you need in a single request. The endpoint is
POST /api/graphql
and uses the same API token authentication as the REST API.
<%= raw("curl -X POST https://app.towerops.net/api/graphql \\\n -H \"Authorization: Bearer YOUR_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"query\": \"{ devices { id name ipAddress status } }\"}'") %>
Full reference: GraphQL API Documentation → — complete schema reference with query examples and variable usage.
The requested help section could not be found.