راهنمای سامانه مانیتورینگ ترافیک به تفکیک اپراتور

این سامانه به‌صورت مستقل از کد سایت، با خواندن لاگ‌های Nginx و تشخیص اپراتور بر اساس IP، آمار ترافیک و بازدیدکننده‌ی یکتا را به تفکیک اپراتور نمایش می‌دهد.
پنل اصلی
/tcpanel/
فایل: index.php
API
/tcpanel/api.php
فایل: api.php

۱) معماری و جریان داده

منبع داده
لاگ دسترسی Nginx (Access Log) شامل IP، زمان، مسیر درخواست و حجم پاسخ (bytes_sent).
تشخیص اپراتور
سامانه اپراتور را بر اساس محدوده‌های IP (CIDR) تشخیص می‌دهد. اگر در لاگ مقدار op=... وجود داشته باشد، همان به‌عنوان اپراتور استفاده می‌شود (دقیق‌تر و سریع‌تر).
تجمیع و ذخیره‌سازی
داده‌ها به‌صورت افزایشی ingest می‌شوند (برای هر فایل لاگ، موقعیت خوانده‌شده ذخیره می‌شود تا دوباره از ابتدا خوانده نشود) و نتایج در SQLite داخل پوشه storage/ ذخیره می‌شود.
خروجی
داشبورد با فیلتر تاریخ شمسی، ترافیک/درخواست‌ها/بازدیدکننده یکتا را نمایش می‌دهد و نمودارهای تعاملی ارائه می‌کند.

۲) مسیرهای خروجی و مشاهده آمار

داشبورد
/tcpanel/
API آمار
/tcpanel/api.php?action=stats&from=1405/02/31&to=1405/03/06
تاریخ‌ها می‌توانند شمسی (YYYY/MM/DD) یا میلادی (YYYY-MM-DD) باشند. ارقام فارسی/عربی هم پشتیبانی می‌شود.
Ingest دستی لاگ‌ها
/tcpanel/api.php?action=ingest
این عملیات معمولاً توسط دکمه «Ingest لاگ‌ها» در داشبورد انجام می‌شود.
تست تشخیص اپراتور از IP
/tcpanel/ip-operator/detect.php
برای تست IP دلخواه: detect.php?ip=5.62.192.1

۳) نصب روی سرور لینوکسی (Nginx + DirectAdmin)

گام ۱: آپلود پروژه
پوشه پروژه را داخل مسیر وب‌سایت قرار دهید، برای مثال: /home/USER/domains/DOMAIN/public_html/tcpanel/
گام ۲: فعال بودن SQLite در PHP
این سامانه از SQLite استفاده می‌کند. روی اغلب نصب‌های استاندارد PHP فعال است. در صورت خطای مربوط به SQLite، باید افزونه pdo_sqlite و sqlite3 فعال باشد.
گام ۳: اجازه نوشتن برای پوشه storage
در اولین اجرا، سامانه پوشه storage/ را می‌سازد و دیتابیس را ایجاد می‌کند. مطمئن شوید کاربر اجرای PHP-FPM اجازه نوشتن دارد (مثلاً 775/755 بسته به مالکیت):
chmod 775 /home/USER/domains/DOMAIN/public_html/tcpanel/storage
گام ۴: دسترسی به لاگ‌های Nginx (نکته مهم)
روی DirectAdmin ممکن است لاگ‌های دامنه در مسیرهایی مانند /var/log/nginx/domains باشند و PHP به آن مسیرها دسترسی نداشته باشد. بهترین روش این است که یک لاگ اختصاصی برای پنل، در مسیر قابل‌خواندن توسط PHP تعریف کنید (بدون تغییر کد سایت).
نمونه کانفیگ پیشنهادی (برای هر دامنه)
log_format trafficpanel '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent op=$op';

access_log /home/USER/domains/DOMAIN/logs/trafficpanel_access.log trafficpanel;
اگر $op را تعریف نکرده باشید، می‌توانید op=$op را حذف کنید. سامانه در نبود op، اپراتور را با دیتابیس IP خودش تشخیص می‌دهد.

۴) راهنمای تکمیل و به‌روزرسانی لیست IP اپراتورها

فایل‌های CIDR
لیست IP اپراتورها در مسیر config/ip-operator/ نگه‌داری می‌شود:
  • mci.conf (همراه اول)
  • mtn.conf (ایرانسل)
  • rightel.conf (رایتل)
  • tci.conf (مخابرات ایران)
  • taliya.conf (تالیا)
  • other.conf (سایر اپراتورها)
هر خط فرمت مشابه زیر دارد: 5.112.0.0/12 1;
بازسازی کش تشخیص اپراتور
کش به‌صورت خودکار با تغییر فایل‌ها بازسازی می‌شود، ولی برای بازسازی دستی می‌توانید از صفحه تشخیص IP استفاده کنید:
/tcpanel/ip-operator/detect.php?rebuild=1
برای دقت ۱۰۰٪، باید لیست‌های CIDR همه اپراتورها کامل و به‌روز باشد.

۵) امنیت (الزامی روی Nginx)

دیتابیس SQLite و کش‌ها در مسیر tcpanel/storage/ ایجاد می‌شوند. چون Nginx مانند Apache فایل .htaccess را اجرا نمی‌کند، باید دسترسی وب به این مسیر را ببندید.
اسنیپت پیشنهادی
location ^~ /tcpanel/storage/ { deny all; }
location ~* ^/tcpanel/.*\.(sqlite|conf)$ { deny all; }

۶) نکات عیب‌یابی

مشکل: آمار صفر است
  • ابتدا api.php?action=ingest را اجرا کنید و سپس دوباره داشبورد را باز کنید.
  • مسیر لاگ قابل خواندن توسط PHP نیست: لاگ اختصاصی در مسیر /home/USER/domains/DOMAIN/logs/ بسازید.
  • فرمت لاگ متفاوت است: سامانه فرمت کلاسیک و JSON را پشتیبانی می‌کند، ولی اگر فرمت خیلی سفارشی باشد باید الگوی parser تنظیم شود.
مشکل: خطای Permission برای storage
  • مالکیت و سطح دسترسی پوشه storage را اصلاح کنید (برای PHP-FPM).
مشکل: اپراتور اشتباه تشخیص داده می‌شود
  • لیست CIDR اپراتورها باید کامل و به‌روز باشد.
  • راه دقیق‌تر: اپراتور را داخل لاگ با op=... ثبت کنید.

۷) فایل‌های اصلی پروژه

tcpanel/
├─ index.php
├─ api.php
├─ config/
│ └─ ip-operator/
│ ├─ mci.conf
│ ├─ mtn.conf
│ ├─ rightel.conf
│ ├─ tci.conf
│ ├─ taliya.conf
│ └─ other.conf
├─ assets/
│ ├─ tailwind.css
│ ├─ app.css
│ ├─ app.js
│ ├─ vendor/
│ │ ├─ chart.umd.min.js
│ │ └─ numeral.min.js
│ └─ fonts/
│ ├─ Vazirmatn-Regular.woff2
│ └─ Vazirmatn-Bold.woff2
├─ ip-operator/
│ ├─ lib.php
│ ├─ detect.php
│ └─ assets/
│ ├─ app.css
│ └─ app.js
└─ storage/
├─ traffic.sqlite
└─ ip-operator/
└─ ip_cache.php
این صفحه راهنما به‌صورت کامل لوکال و با فونت وزیرمتن بارگذاری می‌شود.