- Portfolio management (MOMO, IBKR personal, IBKR Yanhua)
- Stock holdings with transaction history (buy/sell)
- Weekly AI report generation
- Real-time price cache via Finnhub API
- Dashboard with tree view and performance charts
- REST API with AI-friendly batch update endpoint
- Management command for scheduled report generation
For大哥's personal investment advisor system.
- Rewrite nginxmon/geo.py to use maxminddb + DB-IP City Lite MMDB
(https://cdn.jsdelivr.net/npm/dbip-city-lite/dbip-city-lite.mmdb.gz)
instead of ip-api.com HTTP API — eliminates all network timeouts and
rate-limit issues; lookups are now sub-millisecond in-process
- Keep _lookup_batch() signature unchanged so routermon receiver
requires no changes
- MMDB downloaded on first use (lazy) and refreshed monthly via
APScheduler; reader cached module-level (thread-safe for reads)
- Add management command: manage.py download_geo_db
- Update k8s init container to download MMDB on first deploy if absent
- Add maxminddb==3.1.1 dependency
CC BY 4.0 — DB-IP (https://db-ip.com)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Stop sending further API requests mid-batch once the backoff is
triggered, saving remaining missing IPs as empty placeholders
immediately instead of waiting for them to timeout one-by-one.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
After _GEO_MISS_THRESHOLD (2) consecutive large all-empty API responses,
assume ip-api.com is unreachable and enter a 5-minute backoff.
During backoff all missing IPs are immediately saved as empty IPGeoCache
placeholders so they are not re-queued. Resets automatically when the
backoff expires and any result is returned.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add WanGeoStatsView (api/wan/geo/) returning country choropleth +
bubble data for WAN source IPs using IPGeoCache lat/lon
- Add wanGeoMap (420px) in dashboard between ports chart and live table:
red colour scale by country, rose bubbles sized by attempt count,
top-5 country legend
- Rewrite _geo_worker_loop to drain up to 200 queue items per cycle,
bulk DB cache check, batch API calls (100 IPs per request) instead
of 1 request per IP — fixes ip-api.com timeout pile-up under scan
volumes
- Add _geo_skip in-memory set: IPs that return no geo data get an
empty IPGeoCache placeholder saved to DB so they are never retried;
skip set also prevents re-queuing known-empty IPs during flush
- Remove _fetch_geo / _enrich_dns_geo / _enrich_wan_geo helpers
(logic consolidated into the new batch worker)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Remove SO_REUSEADDR from UDP socket so only one gunicorn worker binds
port 5514 (second worker intentionally gets EADDRINUSE and skips)
- Add print() fallback for bind confirmation/errors so startup is visible
even when Django logging config is not fully set up
- Fix duplicate LOGGING dict in settings.py: second assignment was
overriding the first and removing the root logger handler, silently
swallowing all routermon/core startup logs
- Add sys.stderr fallback in core/apps.py ready() for startup exceptions
- Fix JS SyntaxError: {{ top_domains_json }} needs |safe filter since
Django auto-escapes quotes to " inside script tags
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The knowledge graph feature (links graph) was not functioning correctly
and was slowing down the application. This commit removes it entirely:
- Delete knowledge_graph_urls.py, knowledge_graph_views.py, llm_client.py
- Delete knowledge_graph.html template
- Remove KnowledgeGraphSnapshot model and all llm_*/kg_* fields from
SiteSettings (migration 0048)
- Remove build_knowledge_graph() and schedule_kg_build() from tasks.py
- Remove KG settings save logic and bulk delete action from views.py
- Remove knowledge_graph_urls include from links/urls.py
- Remove schedule_kg_build scheduler job from core/apps.py
- Remove KG snapshot job registry from links/apps.py
- Remove Knowledge Graph nav item from base.html
- Remove KG settings cards and llmSettingsHelper JS from settings.html