# Installation

> Three ways to get Nasnet Panel running, using Docker, the RouterOS install script, or the graphical installer.

Source: https://joinnasnet.com/en/guides/nasnet-panel/install/
Last updated: 2026-08-14

---

## 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 `container` package installed and enabled,
  container `device-mode` enabled, external storage (`disk1/` by default), at
  least 30 MB of free RAM, and an `arm`, `arm64` or `x86_64` board.
- Enabling container `device-mode` for 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`, `scp` and `sha256sum` (or `shasum`) on
  the machine you run it from, plus the router reachable on ports 8291 and 22.

## Steps

### Docker

1. Run the image, mapping a host port onto the container's port 80.

   ```bash
   docker run -d \
     --name nasnet \
     -p 8080:80 \
     --restart unless-stopped \
     ghcr.io/nasnet-community/nasnet-panel:latest
   ```

2. Open `http://localhost:8080`.
3. If the container needs to reach routers on your LAN directly, use host
   networking instead:

   ```bash
   docker run -d --name nasnet --network=host --restart unless-stopped \
     ghcr.io/nasnet-community/nasnet-panel:latest
   ```

   The equivalent compose service:

   ```yaml
   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`

1. Run the script. Interactively it prompts for the router IP, user and
   password:

   ```bash
   bash scripts/install.sh
   ```

2. Or pass an env-style config file so it runs unattended:

   ```bash
   cat > router.env <<'EOF'
   ROUTER_IP=192.168.88.1
   ROUTER_USER=admin
   ROUTER_PASS=secret
   EOF
   bash scripts/install.sh --config router.env
   ```

3. 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 `/health` for up to 120 seconds.
4. Open `http://<router-ip>:8080/`. If the baseline LAN step ran, the panel is
   at `http://192.168.10.1:8080/` instead, so reconnect or renew your DHCP lease
   first.

To remove everything again:

```bash
bash scripts/install.sh --uninstall --config router.env
```

### With the graphical installer

1. Download `nasnet-panel-installer-windows-amd64.exe` or
   `nasnet-panel-installer-macos-universal.dmg` from the release you want.
2. Fill in **Router IP or hostname**, **User** and **Password**.
3. 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**).
4. 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.

## Related

- [First run](/en/guides/nasnet-panel/first-run/)
- [Adding a router](/en/guides/nasnet-panel/add-router/)
- [Updates](/en/guides/nasnet-panel/updates/)
