<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Services%2FOmada</id>
	<title>Services/Omada - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Services%2FOmada"/>
	<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Services/Omada&amp;action=history"/>
	<updated>2026-07-06T07:04:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.wilsoz.com/index.php?title=Services/Omada&amp;diff=14&amp;oldid=prev</id>
		<title>Wikibot: Migrated from services/OMADA.md</title>
		<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Services/Omada&amp;diff=14&amp;oldid=prev"/>
		<updated>2026-07-05T18:16:20Z</updated>

		<summary type="html">&lt;p&gt;Migrated from services/OMADA.md&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;As of: 2026-07-05 — migrated from `services/OMADA.md`&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= TP-Link Omada Controller =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 6.1 (mbentley/omada-controller)  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; ✅ CRITICAL INFRASTRUCTURE — Network controller for all APs  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Last Updated:&amp;#039;&amp;#039;&amp;#039; 2026-05-11&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Quick Reference ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Item&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Container&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| omada-controller (mbentley/omada-controller:6.1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Compose&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;/library/omada-app/docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Data&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;/library/omada-app/data/&amp;lt;/code&amp;gt; (505MB)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Logs&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;/library/omada-app/logs/&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Network&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| host mode (required for AP discovery via multicast)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;UI Port&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 8043 (HTTPS), 8188 (HTTP)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Memory&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| ~1.5GB (expected for MongoDB + Java controller)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Restart Policy&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| unless-stopped&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Health Check&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| healthy (docker ps shows status)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== What It Controls ==&lt;br /&gt;
&lt;br /&gt;
Omada is the &amp;#039;&amp;#039;&amp;#039;centralized management platform&amp;#039;&amp;#039;&amp;#039; for TP-Link enterprise WiFi:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;EAP610&amp;#039;&amp;#039;&amp;#039; (or other managed APs) — firmware updates, channel optimization, roaming&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Network policies&amp;#039;&amp;#039;&amp;#039; — SSID config, authentication, bandwidth limits&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Analytics&amp;#039;&amp;#039;&amp;#039; — traffic, client health, interference detection&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Auto-HA&amp;#039;&amp;#039;&amp;#039; (if configured) — automatic failover between controllers&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Loss of Omada = Manual AP management only&amp;#039;&amp;#039;&amp;#039; — devices will continue operating on last-known config, but no remote control.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Backup &amp;amp; Recovery ==&lt;br /&gt;
&lt;br /&gt;
=== Current Backup Status ===&lt;br /&gt;
✅ &amp;#039;&amp;#039;&amp;#039;Included in daily restic backup&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Path: &amp;lt;code&amp;gt;/data/omada&amp;lt;/code&amp;gt; in backup scope (docker-compose.yml line 37)&lt;br /&gt;
* Data persists in: &amp;lt;code&amp;gt;/library/omada-app/data/&amp;lt;/code&amp;gt; (MongoDB + config)&lt;br /&gt;
* Size: ~505MB (small, incremental backups efficient)&lt;br /&gt;
* Database: embedded MongoDB (not separate container)&lt;br /&gt;
&lt;br /&gt;
=== Restore Procedure ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Single service restore (controller crashed):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Stop the container&lt;br /&gt;
docker compose -f /library/omada-app/docker-compose.yml down&lt;br /&gt;
&lt;br /&gt;
# 2. Restore data from latest snapshot&lt;br /&gt;
docker exec restic-backup sh -c \&lt;br /&gt;
  &amp;#039;export RESTIC_REPOSITORY=$HETZNER_REPO; export RESTIC_PASSWORD=$HETZNER_PASSWORD; \&lt;br /&gt;
   restic restore latest --target /tmp/restore --include /data/omada&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# 3. Copy restored data&lt;br /&gt;
sudo cp -r /tmp/restore/data/omada /library/omada-app/data.restored&lt;br /&gt;
sudo rm -rf /library/omada-app/data&lt;br /&gt;
sudo mv /library/omada-app/data.restored /library/omada-app/data&lt;br /&gt;
sudo chown -R 508:508 /library/omada-app/data&lt;br /&gt;
&lt;br /&gt;
# 4. Restart&lt;br /&gt;
docker compose -f /library/omada-app/docker-compose.yml up -d&lt;br /&gt;
&lt;br /&gt;
# 5. Verify health&lt;br /&gt;
docker ps | grep omada-controller  # should show &amp;quot;healthy&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Full Disaster Recovery ===&lt;br /&gt;
If hardware is lost, Omada config is recoverable via:&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;MongoDB backup&amp;#039;&amp;#039;&amp;#039; in &amp;lt;code&amp;gt;/library/omada-app/data/&amp;lt;/code&amp;gt; — restores all device configs, SSIDs, policies&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Re-adopt APs&amp;#039;&amp;#039;&amp;#039; — once controller is back, press reset button on each AP, it rejoins the controller&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Fabric IP recovery&amp;#039;&amp;#039;&amp;#039; — if you have Omada Fabric configured, endpoints will auto-rejoin after controller restart&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Memory Pressure ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Why 1.5GB?&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Omada bundles &amp;#039;&amp;#039;&amp;#039;MongoDB 5.0&amp;#039;&amp;#039;&amp;#039; for config storage&lt;br /&gt;
* Java-based controller (OpenJDK 11+)&lt;br /&gt;
* Holds all device telemetry, client sessions, audit logs in memory&lt;br /&gt;
* Normal for enterprise controller this size&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;This is expected and required&amp;#039;&amp;#039;&amp;#039; — memory is justified by critical infrastructure role.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Key Ports ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Port&lt;br /&gt;
! Protocol&lt;br /&gt;
! Purpose&lt;br /&gt;
|-&lt;br /&gt;
| 8043&lt;br /&gt;
| HTTPS&lt;br /&gt;
| Web UI + API (admin.omada.local)&lt;br /&gt;
|-&lt;br /&gt;
| 8188&lt;br /&gt;
| HTTP&lt;br /&gt;
| Portal (auto-redirects to HTTPS)&lt;br /&gt;
|-&lt;br /&gt;
| 29810-29820&lt;br /&gt;
| TCP&lt;br /&gt;
| Device communication (APs, switches)&lt;br /&gt;
|-&lt;br /&gt;
| 27001-27999&lt;br /&gt;
| TCP&lt;br /&gt;
| MongoDB internal replication&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Operational Checks ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify controller is healthy:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Check container status&lt;br /&gt;
docker ps | grep omada-controller&lt;br /&gt;
&lt;br /&gt;
# Check web UI (if SSH tunneled to port 8043)&lt;br /&gt;
curl -k https://localhost:8043/login  # should respond with login page&lt;br /&gt;
&lt;br /&gt;
# Monitor memory (expect 1.5GB)&lt;br /&gt;
docker stats omada-controller&lt;br /&gt;
&lt;br /&gt;
# View recent logs&lt;br /&gt;
docker logs --tail=50 omada-controller | grep -E &amp;quot;ERROR|WARN|Exception&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Verify APs are connected:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Open https://admin.omada.local:8043 (or via Tailscale if remote)&lt;br /&gt;
# Go to &amp;#039;&amp;#039;&amp;#039;Devices&amp;#039;&amp;#039;&amp;#039; — should show all EAP610 APs as &amp;quot;Connected&amp;quot;&lt;br /&gt;
# If AP shows &amp;quot;Disconnected&amp;quot;, check:&lt;br /&gt;
** AP has network connectivity (ping it)&lt;br /&gt;
** AP is on same LAN or can reach controller IP:29810&lt;br /&gt;
** Controller logs for adoption errors: &amp;lt;code&amp;gt;docker logs omada-controller | grep adopt&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Upgrade Path ==&lt;br /&gt;
&lt;br /&gt;
Current: &amp;#039;&amp;#039;&amp;#039;6.1&amp;#039;&amp;#039;&amp;#039; (latest as of 2026-05-11)&lt;br /&gt;
&lt;br /&gt;
Watchtower (if enabled for this image) will auto-update. If manual:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /library/omada-app&lt;br /&gt;
docker compose pull &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Caution:&amp;#039;&amp;#039;&amp;#039; Always backup before upgrading (restic snapshot is enough).&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Known Issues / Gotchas ==&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Host network mode required&amp;#039;&amp;#039;&amp;#039; — Omada needs raw access to network broadcasts for AP discovery. Cannot use bridge networking.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;MongoDB locked on restart&amp;#039;&amp;#039;&amp;#039; — If controller crashes mid-operation, MongoDB lock file may persist. Container entrypoint handles cleanup, but if stuck: &amp;lt;code&amp;gt;rm /library/omada-app/data/db/mongod.lock&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Fabric timeout during big config changes&amp;#039;&amp;#039;&amp;#039; — if Fabric mesh is configured, topology recalculation can take 2-5 minutes. Don&amp;#039;t panic if APs briefly disconnect.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;TZ environment variable&amp;#039;&amp;#039;&amp;#039; — set to &amp;lt;code&amp;gt;America/Chicago&amp;lt;/code&amp;gt; for CST. Check via UI: Settings → General. If wrong, logs won&amp;#039;t align with system time.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Documentation References ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Omada API:&amp;#039;&amp;#039;&amp;#039; https://documenter.getpostman.com/view/6114396 (community Postman docs)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TP-Link Omada SDN:&amp;#039;&amp;#039;&amp;#039; https://www.tp-link.com/en/business/omada-sdn-controller/ (official)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Docker image:&amp;#039;&amp;#039;&amp;#039; https://hub.docker.com/r/mbentley/omada-controller (custom image, better Linux support than official)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Alerting ==&lt;br /&gt;
&lt;br /&gt;
Should monitor for:&lt;br /&gt;
* ✅ Container health check (Uptime Kuma can ping :8043)&lt;br /&gt;
* ✅ Memory spike (&amp;gt;2GB = investigate, might indicate memory leak)&lt;br /&gt;
* ✅ AP disconnects (if &amp;gt;50% offline, controller may be hung)&lt;br /&gt;
&lt;br /&gt;
Current monitoring: None configured (add to Uptime Kuma if needed)&lt;br /&gt;
&lt;br /&gt;
Suggested: Create http monitor for https://localhost:8043/login returning 200 status&lt;/div&gt;</summary>
		<author><name>Wikibot</name></author>
	</entry>
</feed>