User.privacy_mode (boolean, default False) — единственный источник правды, выключает всю телеметрию у конкретного юзера.
Не на
Group(та про маршрутизацию). Не наPayer(та про деньги, семьи). Только на User.
Batch-переключатель на /admin/payer/<id>/privacy раскидывает на все user_sid плательщика.
awg show)TrafficUsage 1ч/24ч/7д/30д)Достаточно для биллинга и базового мониторинга. Throttle-уведомления и операции списания работают как обычно.
DnsLogParser → dns_query_logNetflowCollector → netflow_log (flows where src OR dst in privacy_ips)AmneziaWGPinger.ping_all:
_lookup_endpoint_info — ip-api.com GeoIP_scan_ports — публичный IP + banner grab_scan_vpn_ports_batch — VPN IP_probe_mdns_batch — Bonjour / Avahi discovery_update_endpoint_sessions — UserEndpointSession трекинг/admin/monitoring → host_info / location секции/admin/map → точка юзера/my ЛК — скрыто всё кроме тарифа + маршрутов + 🔒 баннераInterfaces/privacy.pyБез Flask и ORM. Принимает open session:
privacy_user_sids(db) — set sid'ов с privacyprivacy_user_ips(db) — set IP-адресовprivacy_endpoint_ips(db) — публичные endpoint'ыMemcached TTL 60 сек (вызвать invalidate_privacy_cache() после любого UPDATE).
/admin/user/<sid>/toggle-privacy — переключает + инвалидирует кэш/admin/user/<sid>/purge-history — DELETE из dns_query_log/netflow_log/user_endpoint_session/admin/payer/<id>/privacy?action=enable|disable — batch на все учёткиНЕ удаляются при toggle. Отдельная кнопка «🗑 Очистить историю» с confirm.
Опечатка админа не должна терять журналы.
tests/test_privacy_helpers.py — 11 unittests/test_privacy_integration.py — 9 integration через admin_client + симуляция коллекторовdocs/23-privacy-mode.md в репо AWG-stats — архитектура, API, how-to для новых коллекторов.
privacy_mode забывается в сериализованных user_dict — admin_user_detail и user_cabinet делают явный dict из ORM. Обязательно клади туда флаг. Grep перед запуском: grep "user_dict = {" Interfaces/Views/./admin/map отдельный SQL — не забудь User.privacy_mode == False.get_user_accounts разворачивает через payer — если privacy, НЕ разворачивай, иначе утечка связей с семьёй/коллегами.PayerUser.is_payer == True, иначе family member без платёжной роли видит всех подшефных.miniapp_dash:{tg_id} при toggle, иначе stale ещё 30с.Applications.config.memcached — это функция def → dict, не сам dict. В Interfaces/privacy.py вызываем через callable() check.purge-history по user_sid недостаточно — NetflowCollector пишет conntrack-flows с user_sid=NULL. DELETE и по src_ip/dst_ip=addr.from sqlalchemy import text, inspect
for tbl in inspect(engine).get_table_names():
cols = [c["name"] for c in inspect(engine).get_columns(tbl)]
if "user_sid" in cols:
n = db.execute(text(f"SELECT COUNT(*) FROM {tbl} WHERE user_sid=:s"), {"s":sid}).scalar()
if n: print(f"{tbl}: {n}")
for col in ("client_ip", "src_ip", "dst_ip"):
if col in cols:
n = db.execute(text(f"SELECT COUNT(*) FROM {tbl} WHERE {col}=:a"), {"a":addr}).scalar()
if n: print(f"{tbl}.{col}: {n}")
Ожидаемо после toggle+purge остаётся только: sessions, traffic_usage, subscriptions, payer_users, user_groups, user_routing_groups, user_geo_directs — настройки и биллинг, не телеметрия.
При добавлении нового коллектора (трафик, метаданные, что угодно):
from Interfaces.privacy import privacy_user_sids (или _ips).user_sid (или ip) не в privacy-set.user_sid=NULL — добавить путь purge по IP-колонкам.Changelog