NetSmartApp is a panel with local services for Developers and small Company
2.4K
Manage DNS, DHCP, NTP, directory services, Kerberos, mail, monitoring, and WireGuard or AmneziaWG from one self-hosted web panel.
NetSmartApp is designed for small organizations, MSPs, private networks, development labs, and self-hosted environments. It runs as a Docker Compose stack with MySQL and persistent storage.
Use this overview to understand the deployment. Follow the first-run guide for public DNS, HTTPS, firewall rules, first login, licence registration, AmneziaWG, mail, backups, and updates.
Pin the release for repeatable deployments:
docker pull ssiroos/netsmartapp:1.0.12
ssiroos/netsmartapp:latest is also available, but it is a floating tag and can change.
| Use | Price | Requirement |
|---|---|---|
| Personal, non-commercial use by an individual | Free | Registration is optional |
| Commercial or company use | USD $99 per registered service domain, per year | Every registered NetSmartApp service domain requires an active annual licence |
Purchase commercial licences at https://licence.pwaapps.com/.
If a licence expires, core services such as DNS, DHCP, NTP, directory, Kerberos, mail, VPN, and monitoring continue to operate. The deployment must still be renewed to remain legally licensed. The AI Assistant and PWAApps integrations, including SecurityBox, ChaparKhoneh, and PWA AI Relay, are disabled until renewal.
NET_ADMIN/dev/net/tun for the AmneziaWG userspace fallbackDocker Desktop on Windows or macOS is suitable for evaluation. It does not provide the same production DHCP, routing, and host-network behavior as native Linux.
Create .env with unique values:
MYSQL_ROOT_PASSWORD=replace-with-a-long-random-root-password
MYSQL_DATABASE=netsmart_db
MYSQL_USER=netsmart_user
MYSQL_PASSWORD=replace-with-a-long-random-database-password
MYSQL_HOST_PORT=3307
NETSMART_HTTP_BIND=127.0.0.1
NETSMART_HTTP_PORT=8080
WIREGUARD_ENDPOINT_HOST=vpn.example.com
SNMP_COMMUNITY=replace-with-a-private-random-community
Use 127.0.0.1 for the panel backend when Nginx or Apache provides HTTPS on the same host. Use 0.0.0.0 only for direct access from a trusted network protected by a firewall.
Enable and persist IPv4 forwarding before using WireGuard or AmneziaWG:
sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-netsmart-vpn.conf
sudo sysctl --system
services:
mysql:
image: mysql:8.4
container_name: netsmart-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE:-netsmart_db}
MYSQL_USER: ${MYSQL_USER:-netsmart_user}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
ports:
- "127.0.0.1:${MYSQL_HOST_PORT:-3307}:3306"
volumes:
- ./mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u$$MYSQL_USER -p$$MYSQL_PASSWORD"]
interval: 10s
timeout: 5s
retries: 12
netsmart:
image: ssiroos/netsmartapp:1.0.12
container_name: netsmart-app
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
depends_on:
mysql:
condition: service_healthy
environment:
ASPNETCORE_ENVIRONMENT: Production
ASPNETCORE_URLS: "http://${NETSMART_HTTP_BIND:-127.0.0.1}:${NETSMART_HTTP_PORT:-8080}"
ConnectionStrings__DefaultConnection: "Server=127.0.0.1;Port=${MYSQL_HOST_PORT:-3307};Database=${MYSQL_DATABASE:-netsmart_db};User ID=${MYSQL_USER:-netsmart_user};Password=${MYSQL_PASSWORD};AllowUserVariables=true"
DefaultAdmin__Username: sa
DefaultAdmin__Password: sa123456
WG_QUICK_USERSPACE_IMPLEMENTATION: amneziawg-go
WireGuard__Enabled: "false"
WireGuard__EndpointHost: ${WIREGUARD_ENDPOINT_HOST:-vpn.example.com}
WireGuard__EnableNat: "true"
WireGuard__NatInterface: auto
volumes:
- ./certs:/app/certs
- netsmart_app_logs:/app/logs
- netsmart_data_protection_keys:/app/data-protection-keys
- netsmart_wireguard_config:/app/wireguard
volumes:
netsmart_app_logs:
netsmart_data_protection_keys:
netsmart_wireguard_config:
Start and inspect:
mkdir -p certs
docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=200 netsmart
A fresh database creates:
Username: sa
Password: sa123456
NetSmartApp immediately requires a new password. Complete this step before enabling services. Never keep sa123456 on a running installation.
Then:
Use separate names because the services use different protocols:
| Purpose | Example |
|---|---|
| HTTPS administration panel | panel.example.com |
| WireGuard or AmneziaWG | vpn.example.com |
| DNS over HTTPS | dns.example.com |
mail.example.com |
Point the required A records to the server. Do not publish AAAA unless IPv6 is fully configured. Keep VPN and mail names in DNS-only mode if the DNS provider offers an HTTP proxy.
Place the panel behind Nginx or Apache with a valid HTTPS certificate. Open NetSmartApp through its final HTTPS name before commercial registration because that hostname becomes the registered service domain. Follow the domain setup guide for exact DNS, proxy, certificate, and firewall steps.
The built-in LDAP-style directory is not an Active Directory domain controller. Use the optional Samba AD profile for Windows domain join and a unified Windows-compatible identity domain.
Open only the services you enable.
| Service | Port | Recommended scope |
|---|---|---|
| HTTPS panel and optional DoH | 443/tcp | Administrators or intended clients |
| HTTP certificate issuance | 80/tcp | Public when HTTPS is used |
| DNS | 53/tcp, 53/udp | LAN or intended DNS clients |
| DHCP | 67/udp | LAN only |
| Kerberos | 88/tcp, 88/udp | Trusted networks |
| NTP | 123/udp | Normally trusted networks |
| SNMP | 161/udp | Monitoring network only |
| LDAP | 389/tcp | Trusted networks only |
25, 465, 587, 110, 143/tcp | Only required mail clients and servers | |
| WireGuard or AmneziaWG | 51820/udp | VPN clients |
| MySQL | 3307/tcp | Loopback only |
| Panel backend | 8080/tcp | Loopback behind the reverse proxy |
| Ollama | 11434/tcp | Loopback only |
vpn.example.com to the server.51820 in cloud and host firewalls.10.8.0.2/32.Client configurations contain private keys. Store and transfer them securely.
Back up MySQL, data-protection keys, VPN configuration, TLS certificates, DKIM keys, external configuration, and optional Samba AD volumes together. Test restoration on an isolated host.
For an update, review release notes, back up, change the pinned tag when necessary, and run:
docker compose pull netsmart
docker compose up -d --force-recreate netsmart
docker compose ps
docker compose logs --tail=200 netsmart
Verify login, health, enabled services, VPN handshakes, DNS, and mail after updating.
docker compose logs --tail=200 netsmartContent type
Image
Digest
sha256:d94a9cb2f…
Size
143.3 MB
Last updated
about 21 hours ago
docker pull ssiroos/netsmartapp