Installation
Three ways to get Nasnet Panel running, using Docker, the RouterOS install script, or the graphical installer.
Overview
Nasnet Panel ships as a single multi-arch container image that serves both the
JSON API and the web UI on one port. There are three supported ways to get it
running: plain Docker on any host, the install.sh script that deploys it into
a RouterOS container on the router itself, and a graphical installer for
Windows and macOS that does the same thing without a terminal.
Pick Docker if you already run containers somewhere on the LAN. Pick the script or the graphical installer if you want the panel to live on the MikroTik device it manages.
Before you start
- The panel must be able to reach your routers on the LAN.
- RouterOS v7 on the routers you intend to manage.
- For a router-hosted install: the
containerpackage installed and enabled, containerdevice-modeenabled, external storage (disk1/by default), at least 30 MB of free RAM, and anarm,arm64orx86_64board. - Enabling container
device-modefor the first time requires physical confirmation, meaning a short press of the reset/mode button, or a cold power cycle on boards without one. - For the script:
bash,curl,ssh,scpandsha256sum(orshasum) on the machine you run it from, plus the router reachable on ports 8291 and 22.
Steps
Docker
-
Run the image, mapping a host port onto the container’s port 80.
docker run -d \ --name nasnet \ -p 8080:80 \ --restart unless-stopped \ ghcr.io/nasnet-community/nasnet-panel:latest -
Open
http://localhost:8080. -
If the container needs to reach routers on your LAN directly, use host networking instead:
docker run -d --name nasnet --network=host --restart unless-stopped \ ghcr.io/nasnet-community/nasnet-panel:latestThe equivalent compose service:
services: nasnet: image: ghcr.io/nasnet-community/nasnet-panel:latest container_name: nasnet network_mode: host environment: PORT: 80 restart: unless-stopped
On the router, with install.sh
-
Run the script. Interactively it prompts for the router IP, user and password:
bash scripts/install.sh -
Or pass an env-style config file so it runs unattended:
cat > router.env <<'EOF' ROUTER_IP=192.168.88.1 ROUTER_USER=admin ROUTER_PASS=secret EOF bash scripts/install.sh --config router.env -
Wait for the health check. The script probes Winbox (8291) and SSH (22), checks the RouterOS version, architecture, free RAM and container support, downloads and verifies the container tar for the detected architecture, configures container networking, uploads the tar to
disk1/, starts the container, and polls/healthfor up to 120 seconds. -
Open
http://<router-ip>:8080/. If the baseline LAN step ran, the panel is athttp://192.168.10.1:8080/instead, so reconnect or renew your DHCP lease first.
To remove everything again:
bash scripts/install.sh --uninstall --config router.env
With the graphical installer
- Download
nasnet-panel-installer-windows-amd64.exeornasnet-panel-installer-macos-universal.dmgfrom the release you want. - Fill in Router IP or hostname, User and Password.
- Open Advanced options if you need to change Winbox port, SSH port, HTTP LAN port, HTTPS LAN port, or the Image source (Latest snapshot, Release tag, or a Local tar).
- Click Install and leave it running. If the router asks for physical confirmation of device-mode, the installer shows Physical confirmation required, so press the reset button or power-cycle the router, then Proceed.
Reference
install.sh flags
| Flag | What it does | Default |
|---|---|---|
--dry-run |
Prints every action it would take and changes nothing. | off |
--uninstall |
Removes the container, networking, NAT rules and uploaded tarball. | off |
--config <file> |
Reads ROUTER_IP, ROUTER_USER, ROUTER_PASS from an env-style file. |
None |
--version <tag> |
Release tag to install. | snapshot |
--image-tar <path> |
Uses a local tar instead of downloading a release asset. | None |
--lan-port <port> |
LAN-facing port for the dst-nat rule. | 8080 |
--no-lan-baseline |
Skips the baseline LAN setup. | off |
--no-rollback |
Leaves partial state in place on failure. | off |
-v, --verbose |
Verbose output. | off |
-h, --help |
Shows usage. | None |
Backend environment variables
| Variable | What it does | Default |
|---|---|---|
PORT |
TCP port the API and embedded SPA listen on. | 8080 in dev, 80 in the container |
HOST |
Bind address. | 0.0.0.0 |
ENVIRONMENT |
production disables dev-only routes such as the Swagger UI. |
development |
BACKEND_URL |
Build-time. Empty means the SPA uses relative URLs to its own origin. | empty |
SENTRY_DSN |
Build-time. Where the UI sends crash reports; set to an empty string to compile reporting out. | Nasnet project DSN |
Troubleshooting
The script stops on device-mode. RouterOS requires physical confirmation
the first time container device-mode is enabled. Press the reset/mode button
briefly, or unplug and replug the router, then run the script again.
The panel is unreachable after the script finishes. The baseline LAN step
moves the router’s LAN onto LANBridgeSplit at 192.168.10.1/24. Renew your
DHCP lease and try http://192.168.10.1:8080/.
The container starts and then dies. The router needs at least 30 MB of free
RAM for the panel. Check /system/resource/print and stop other containers.