وقتی سرعت توسعه نرمافزار بالا میرود، یک مشکل مهم هم جدیتر میشود: کد جدید قبل از Merge شدن چه مقدار ریسک امنیتی دارد؟ بررسی دستی Pull Request همیشه زمان کافی ندارد و ابزارهای سنتی هم ممکن است بخشی از منطق برنامه را درک نکنند.
در این آموزش، یک AI Security Reviewer را روی سرور مجازی راهاندازی میکنیم تا Pull Requestها را بررسی کند، بخشهای مشکوک کد را پیدا کند، مشکلات امنیتی را توضیح دهد و در کنار بررسی مبتنی بر مدل زبانی، وابستگیهای آسیبپذیر و Secretهای احتمالی را نیز بررسی کند.
📌 چرا این روش با یک AI Code Reviewer معمولی فرق دارد؟
در این سناریو هدف فقط اصلاح کیفیت کد نیست. Reviewer باید روی مواردی مانند SQL Injection، XSS، احراز هویت، کنترل دسترسی، CSRF، SSRF، deserialization ناامن، Secretهای لو رفته و آسیبپذیری وابستگیها حساس باشد و نتیجه را پیش از ورود تغییرات به شاخه اصلی در اختیار تیم قرار دهد.
AI Security Reviewer دقیقاً چه کاری انجام میدهد؟
یک Security Reviewer خودکار را میتوان بهعنوان یک لایه بررسی بین توسعهدهنده و Merge در نظر گرفت. بهجای اینکه منتظر بمانیم یک توسعهدهنده تمام فایلهای تغییرکرده را دستی بخواند، سیستم تغییرات Pull Request را دریافت میکند و آنها را از چند زاویه بررسی میکند.
🔹 بررسی منطق امنیتی کد و مسیرهای ورود داده
🔹 پیدا کردن الگوهای احتمالی SQL Injection و XSS
🔹 بررسی احراز هویت و کنترل دسترسی
🔹 بررسی SSRF و درخواستهای خارجی ناامن
🔹 تشخیص Secret، Token و Credential در تغییرات جدید
🔹 بررسی وابستگیهای اضافه یا ارتقایافته از نظر آسیبپذیری
🔹 ارائه توضیح انسانی برای اینکه مشکل کجاست و چرا اهمیت دارد
نکته مهم این است که AI نباید جایگزین تست امنیتی قطعی و بازبینی انسانی تلقی شود. بهترین معماری، ترکیب تحلیل مدل زبانی با اسکنهای deterministic، تست، SAST، dependency scanning و بررسی انسانی است.
چرا VPS برای ساخت Security Reviewer مناسب است؟
اگر چند پروژه نرمافزاری دارید، اجرای Reviewer روی لپتاپ توسعهدهنده باعث میشود فرآیند بررسی به دستگاه خاصی وابسته باشد. VPS میتواند یک نقطه مرکزی برای Webhook، Dashboard، پردازش Pull Request و نگهداری Index پروژهها ایجاد کند.
| منبع اجرا | مزیت | محدودیت |
|---|---|---|
| لپتاپ توسعهدهنده | راهاندازی ساده | وابستگی به روشن بودن دستگاه |
| CI/CD ابری | مقیاسپذیری و مدیریت ساده | کنترل کمتر روی زیرساخت |
| VPS اختصاصی | کنترل زیرساخت، IP ثابت و اجرای 24/7 | نیاز به مدیریت امنیت و سرور |
برای پروژههای کوچک میتوان از منابع کمتر شروع کرد. اگر Repository بزرگ است و Indexing زیادی انجام میشود، RAM و سرعت دیسک اهمیت بیشتری پیدا میکنند. خود Mira نیز اشاره میکند که بخش Indexing میتواند مصرف RAM را افزایش دهد و برای محیطهای جدیتر استفاده از PostgreSQL را توصیه میکند.
⚠️ نکته امنیتی
اگر کد خصوصی شرکت را برای بررسی به یک مدل ابری ارسال میکنید، باید سیاست نگهداری و پردازش داده سرویس مدل را بررسی کنید. برای محرمانگی بیشتر میتوان معماری را به سمت مدل محلی و زیرساخت تحت کنترل خود برد؛ اما حتی در این حالت نیز امنیت VPS، Secretها و Webhook اهمیت دارد.
انتخاب ابزار: چرا Mira را در این آموزش استفاده میکنیم؟
برای این آموزش از Mira استفاده میکنیم؛ یک پروژه متنباز و قابل استقرار روی زیرساخت شخصی که Pull Request و Merge Request را بررسی میکند و قابلیتهایی مانند Index کردن Repository، بررسی امنیتی، بررسی آسیبپذیری وابستگیها و تعریف Ruleهای سفارشی را در اختیار میگذارد.
Mira در مستندات فعلی خود اعلام میکند که بررسی امنیتی اختصاصی برای مواردی مانند Injection، XSS، Auth Bypass، CSRF، SSRF و Deserialization ناامن دارد. همچنین Secret scanning روی خطوط اضافهشده و بررسی وابستگیهای جدید یا ارتقایافته با OSV را انجام میدهد.
برای مطالعه مستندات رسمی میتوانید به مستندات رسمی Mira و مخزن GitHub پروژه Mira مراجعه کنید.
معماری نهایی AI Security Reviewer
معماری پیشنهادی ساده است. GitHub یا GitLab تغییر جدید را اعلام میکند، Webhook درخواست را به VPS میفرستد و Mira تغییرات را برای تحلیل آماده میکند.
Developer → Pull Request → Webhook → VPS → AI Security Review → Findings → Human Review → Merge
در کنار مدل زبانی، بررسی Secret و Dependency نیز میتواند بهصورت مستقل انجام شود.
حداقل منابع پیشنهادی برای VPS
| نوع استفاده | CPU | RAM | دیسک |
|---|---|---|---|
| تست و Repository کوچک | 2 vCPU | 4 تا 8 GB | 40 تا 60 GB NVMe |
| چند Repository متوسط | 4 vCPU | 8 تا 16 GB | 80 تا 120 GB NVMe |
| Repositoryهای بزرگ و Indexing سنگین | 6 تا 8 vCPU | 16 تا 32 GB | 120 GB به بالا NVMe |
این اعداد را بهعنوان نقطه شروع در نظر بگیرید، نه الزام ثابت. اندازه Repository، تعداد Pull Requestها، تعداد فایلهای Index شده و مدل انتخابی میتواند نیاز واقعی را تغییر دهد.
📌 اگر Reviewer قرار است همیشه روشن باشد، VPS چه مزیتی دارد؟
برای یک Security Reviewer دائمی، خاموششدن سیستم یعنی Webhookها و بررسی Pull Requestها نیز متوقف میشوند. یک سرور مجازی با منابع مشخص و اتصال پایدار میتواند این سرویس را به یک بخش ثابت از زیرساخت توسعه تبدیل کند.
اگر Repositoryهای خصوصی، CI/CD یا چند پروژه همزمان دارید، انتخاب منابع مناسب VPS از همان ابتدا میتواند جلوی کندی Indexing و صفشدن بررسیها را بگیرد.
📞 تماس با پشتیبانی: 021-91302460 | ایرانیکاسرور
مرحله اول؛ نصب Docker روی VPS
برای اجرای Mira، Docker مسیر سادهای است. ابتدا سیستم را بهروزرسانی کنید:
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com | sudo sh
sudo systemctl enable --now docker
docker --version
اگر از Ubuntu Server استفاده میکنید، بهتر است قبل از اجرای سرویس، ساعت سیستم، DNS، فایروال و دسترسی SSH را نیز بررسی کنید.
مرحله دوم؛ ساخت مسیر اختصاصی برای Mira
sudo mkdir -p /opt/mira
sudo mkdir -p /opt/mira/data
sudo mkdir -p /opt/mira/secrets
sudo chmod 700 /opt/mira/secrets
cd /opt/mira
دلیل جداکردن Secretها از فایلهای معمولی این است که کلید GitHub App و کلید مدل زبانی نباید داخل Repository یا فایل تنظیمات عمومی پروژه قرار بگیرند.
مرحله سوم؛ ساخت GitHub App برای Reviewer
در GitHub باید یک App برای Mira ایجاد کنید. مستندات رسمی پروژه برای Pull Request، Contents، Issues و Metadata سطح دسترسی مشخصی پیشنهاد میکند و Webhook نیز باید به آدرس سرویس شما متصل شود.
مجوزهای مهم GitHub App
🔹 Pull requests: دسترسی Read & Write
🔹 Contents: دسترسی Read & Write
🔹 Issues: دسترسی Read & Write
🔹 Metadata: دسترسی Read
🔹 رویدادهای Pull Request، Issue Comment و Push را فعال کنید.
بعد از ساخت App، یک فایل Private Key با پسوند PEM دریافت میکنید. این فایل را در اختیار هیچ Repository عمومی قرار ندهید.
مرحله چهارم؛ ساخت Secret برای Webhook
برای Webhook یک مقدار تصادفی و طولانی بسازید:
openssl rand -hex 32
خروجی را نگه دارید؛ این مقدار باید در تنظیمات GitHub App و متغیر MIRA_WEBHOOK_SECRET یکسان باشد.
مرحله پنجم؛ ساخت فایل محیطی Mira
فایل Secretها را ایجاد کنید:
sudo nano /opt/mira/mira.env
ساختار کلی فایل میتواند شبیه نمونه زیر باشد:
MIRA_GITHUB_APP_ID=YOUR_APP_ID
MIRA_GITHUB_PRIVATE_KEY=@/etc/mira/private-key.pem
MIRA_WEBHOOK_SECRET=YOUR_RANDOM_WEBHOOK_SECRET
OPENROUTER_API_KEY=YOUR_OPENROUTER_KEY
MIRA_MODEL=anthropic/claude-sonnet-4-6
ADMIN_PASSWORD=CHANGE_THIS_PASSWORD
MIRA_DASHBOARD_URL=https://security.example.com
⚠️ این فایل را داخل Git Commit نکنید
کلید API مدل، Private Key و Webhook Secret اطلاعات حساس هستند. دسترسی فایل را محدود کنید و از قرار دادن آن در Repository خودداری کنید.
مرحله ششم؛ قرار دادن Private Key در مسیر امن
sudo cp private-key.pem /opt/mira/secrets/private-key.pem
sudo chmod 600 /opt/mira/secrets/private-key.pem
اگر فایل Private Key را در اختیار دیگری قرار دادهاید، آن را بهعنوان یک Credential حساس در نظر بگیرید و در صورت نیاز آن را باطل و کلید جدید تولید کنید.
مرحله هفتم؛ اجرای Mira با Docker
تصویر رسمی Mira از GitHub Container Registry ارائه میشود. برای یک استقرار اولیه میتوانید کانتینر را به شکل زیر اجرا کنید:
docker run -d \
--name mira \
--restart unless-stopped \
--pull=always \
-p 8000:8000 \
--env-file /opt/mira/mira.env \
-v /opt/mira/secrets/private-key.pem:/etc/mira/private-key.pem:ro \
-v /opt/mira/data:/data/indexes \
ghcr.io/miracodeai/mira:latest
در محیط Production بهتر است نسخه مشخص Image را Pin کنید و صرفاً به Tag متحرک latest وابسته نباشید. این کار باعث میشود زمان بهروزرسانی نسخه را خودتان کنترل کنید.
مرحله هشتم؛ بررسی وضعیت سرویس
docker ps
docker logs --tail 100 mira
curl http://127.0.0.1:8000/health
اگر سرویس سالم باشد، Endpoint سلامت Mira باید پاسخ موفقیتآمیز برگرداند. این Endpoint برای Health Check در محیطهای Production نیز کاربرد دارد.
مرحله نهم؛ اتصال دامنه و HTTPS
برای Webhook عمومی بهتر است Mira را مستقیماً با IP و پورت خام منتشر نکنید. یک دامنه مانند security.example.com تعریف کنید و Reverse Proxy مانند Nginx یا Caddy را جلوی آن قرار دهید.
🔹 HTTPS برای Webhook فعال کنید.
🔹 پورت مدیریتی را بدون نیاز عمومی باز نگذارید.
🔹 دسترسی SSH را محدود و ترجیحاً با کلید مدیریت کنید.
🔹 Firewall را فقط برای سرویسهای لازم تنظیم کنید.
🔹 Webhook Secret را طولانی و تصادفی انتخاب کنید.
مرحله دهم؛ تنظیم Webhook در GitHub
بعد از آمادهشدن دامنه، آدرس Webhook را به شکل زیر در GitHub App قرار دهید:
https://security.example.com/github/webhook
پس از نصب App روی Repository، Mira میتواند Repository را مشاهده و Index کند و Pull Requestهای جدید را برای بررسی دریافت کند.
AI Security Reviewer چگونه یک آسیبپذیری را پیدا میکند؟
فرض کنید توسعهدهنده کدی نوشته که مقدار دریافتشده از کاربر را مستقیماً در Query قرار میدهد:
const id = req.query.id;
const query = "SELECT * FROM users WHERE id = " + id;
یک Reviewer امنیتی باید متوجه شود که داده کنترلشده توسط کاربر وارد Query شده است. گزارش خوب فقط نباید بگوید «این کد ناامن است». باید توضیح دهد داده از کجا آمده، در کجا وارد Sink شده و چه الگوی امنتری باید استفاده شود.
نسخه بهتر میتواند از Parameterized Query استفاده کند:
const id = req.query.id;
const query = "SELECT * FROM users WHERE id = ?";
const result = await db.query(query, [id]);
📌 گزارش خوب باید قابل اقدام باشد
بهجای هشدار مبهم، گزارش باید محل مشکل، نوع ریسک، دلیل ایجاد آسیبپذیری، شدت تقریبی و پیشنهاد اصلاح را مشخص کند. این ساختار باعث میشود توسعهدهنده سریعتر بتواند مشکل را بررسی کند.
چه آسیبپذیریهایی را قبل از Merge بررسی کنیم؟
| دسته | نمونه مشکل | هدف بررسی |
|---|---|---|
| Injection | SQL Injection | کنترل جریان داده ورودی تا Query |
| XSS | خروجی HTML بدون Escape | اعتبارسنجی و Encoding خروجی |
| Auth | بررسی ناقص هویت | جلوگیری از دسترسی غیرمجاز |
| SSRF | URL کنترلشده توسط کاربر | محدودسازی مقصد درخواست |
| Secrets | API Key داخل Commit | جلوگیری از افشای Credential |
| Dependencies | Package آسیبپذیر | بررسی نسخه و Advisory |
چطور False Positive را کاهش دهیم؟
اگر Security Reviewer برای هر مورد کوچک هشدار بدهد، تیم توسعه بعد از مدتی هشدارها را نادیده میگیرد. بنابراین کیفیت Reviewer فقط به تعداد آسیبپذیریهای پیداشده وابسته نیست؛ نسبت هشدارهای قابل اقدام به هشدارهای بیارزش هم اهمیت دارد.
🔹 برای شدتهای مختلف Threshold تعریف کنید.
🔹 قوانین اختصاصی پروژه را در Reviewer ثبت کنید.
🔹 فایلهای Generated و Vendor را از بررسی خارج کنید.
🔹 Repository را فقط به Diff محدود نکنید؛ Context پروژه نیز مهم است.
🔹 قبل از Block کردن Merge، Findingهای مهم را با تست و بازبینی انسانی تأیید کنید.
یک Rule امنیتی سفارشی برای پروژه تعریف کنیم
یکی از قابلیتهای مهم سیستمهای جدید AI Review این است که میتوانید استانداردهای داخلی تیم را به Reviewer منتقل کنید. برای مثال میتوانید قانونی تعریف کنید که هر Endpoint جدید باید Authentication مشخص داشته باشد.
Security rule:
Every new API endpoint must explicitly verify authentication
and authorization before accessing tenant-owned resources.
Flag the PR if:
- authentication is missing
- authorization depends only on a client-provided ID
- tenant isolation is not enforced
این نوع Ruleها برای تیمهایی که استاندارد امنیتی مشخص دارند بسیار کاربردی است؛ چون Reviewer فقط یک چکلیست عمومی نیست و میتواند با معماری پروژه هماهنگ شود.
ترکیب AI Reviewer با SAST؛ چرا فقط به LLM تکیه نکنیم؟
یک معماری حرفهای بهتر است چند لایه داشته باشد. مدل زبانی برای درک Context و منطق برنامه مفید است، درحالیکه ابزارهای SAST میتوانند Ruleهای قطعی و قابل تکرار را اجرا کنند.
برای مثال Semgrep امکان اجرای اسکن روی Pull Request را فراهم میکند و مستندات رسمی آن Diff-aware scanning و PR comments را توضیح میدهد.
معماری پیشنهادی چندلایه
🔹 Layer 1: Secret Scanning
🔹 Layer 2: SAST و Ruleهای قطعی
🔹 Layer 3: Dependency و CVE Scanning
🔹 Layer 4: AI Security Review
🔹 Layer 5: Human Approval برای موارد حساس
بررسی امنیتی وابستگیها قبل از Merge
گاهی خود کدی که توسعهدهنده نوشته مشکل ندارد، اما یک Package جدید آسیبپذیر است. بنابراین Pull Request باید از نظر Dependency نیز بررسی شود.
Mira در قابلیتهای فعلی خود بررسی Packageهای اضافه یا ارتقایافته را با OSV انجام میدهد و برای آسیبپذیریهای شناختهشده اطلاعاتی مانند شدت و نسخه اصلاحشده را ارائه میکند.
این بخش یک تفاوت مهم با Code Review معمولی ایجاد میکند: Reviewer فقط نمیپرسد «کد جدید چه کاری انجام میدهد؟» بلکه میپرسد «آیا وابستگی جدیدی که وارد پروژه شده، ریسک شناختهشده دارد؟»
باکس پیشنهادی برای تیمهای توسعه
📌 اگر چند پروژه را همزمان مدیریت میکنید
اجرای یک Reviewer دائمی روی VPS میتواند یک لایه امنیتی مشترک برای پروژههای شما ایجاد کند. با منابع CPU و RAM مشخص، دیسک NVMe و دسترسی پایدار، VPS میتواند میزبان ابزارهایی مانند AI Code Reviewer، CI Runner، سرویسهای مانیتورینگ و سایر ابزارهای DevOps باشد.
اگر هنوز زیرساخت مناسبی برای چنین سرویسهایی ندارید، میتوانید مشخصات سرور مجازی را متناسب با تعداد Repository و حجم Indexing انتخاب کنید.
📞 تماس با پشتیبانی: 021-91302460 | ایرانیکاسرور
چگونه Reviewer را وارد فرآیند Merge کنیم؟
هدف نهایی این نیست که یک Dashboard دیگر روی VPS داشته باشیم. هدف این است که بررسی امنیتی وارد Workflow واقعی تیم شود.
🔹 Developer یک Branch ایجاد میکند.
🔹 Pull Request باز میشود.
🔹 Webhook به Security Reviewer ارسال میشود.
🔹 AI و Scannerها تغییرات را بررسی میکنند.
🔹 Findingهای مهم داخل Pull Request نمایش داده میشوند.
🔹 توسعهدهنده اصلاحات را انجام میدهد و سپس Merge انجام میشود.
به این ترتیب Security Review از یک کار دستی و پراکنده به یک مرحله قابل تکرار در چرخه توسعه تبدیل میشود.
امنیت خود VPS را فراموش نکنید
ساخت Security Reviewer روی یک VPS، خودش یک سرویس حساس ایجاد میکند. این سرور به Repositoryها، Webhookها و احتمالاً Credentialهای سرویس مدل دسترسی دارد. بنابراین محافظت از خود Reviewer به اندازه بررسی کد اهمیت دارد.
⚠️ چکلیست Hardening
🔹 HTTPS را اجباری کنید.
🔹 Secretها را داخل Git ذخیره نکنید.
🔹 دسترسی SSH را محدود کنید.
🔹 Docker و سیستمعامل را بهروز نگه دارید.
🔹 برای Database در محیط Production از PostgreSQL استفاده کنید.
🔹 اگر SQLite استفاده میکنید، Volume پایدار داشته باشید.
🔹 Image نسخهدار را برای Production ترجیح دهید.
یک تست واقعی برای AI Security Reviewer
بعد از اتصال Repository، یک Pull Request آزمایشی ایجاد کنید. عمداً یک آسیبپذیری واقعی را وارد Production نکنید؛ بهتر است یک Repository آزمایشی با کد ساختگی داشته باشید.
git checkout -b security-review-test
git add .
git commit -m "test security reviewer"
git push origin security-review-test
سپس Pull Request را باز کنید و ببینید Reviewer چه مواردی را گزارش میکند. در تست اولیه سه موضوع را بررسی کنید: دقت Finding، توضیح مشکل و کیفیت پیشنهاد اصلاح.
اگر AI یک مشکل را اشتباه تشخیص داد چه کنیم؟
False Positive اجتنابناپذیر است. اگر یک Finding اشتباه بود، نباید صرفاً آن را نادیده بگیرید. علت خطا را بررسی کنید و در صورت امکان Rule یا Context پروژه را اصلاح کنید.
هدف این است که Reviewer با گذشت زمان با معماری و استانداردهای تیم هماهنگتر شود. در سیستمهایی مانند Mira حتی مکانیزمهایی برای استفاده از بازخوردهای Reviewهای انسانی و ساخت Ruleهای آموختهشده وجود دارد.
آیا AI Security Reviewer جایگزین متخصص امنیت میشود؟
خیر. AI Security Reviewer یک لایه اتوماسیون است. ارزش اصلی آن در پیدا کردن سریعتر الگوهای مشکوک، کاهش کارهای تکراری و ارائه بازخورد در همان مرحله Pull Request است.
برای سیستمهای حساس، بهتر است Findings مهم با تست امنیتی، تست نفوذ، تحلیل SAST/SCA و بررسی متخصص امنیت ترکیب شوند. مخصوصاً در مواردی که مدل درباره Business Logic یا سطح دسترسی تصمیمگیری میکند، تأیید انسانی همچنان اهمیت دارد.
مقایسه معماری ساده و معماری حرفهای
| ویژگی | راهاندازی ساده | معماری حرفهای |
|---|---|---|
| اجرای Reviewer | Docker روی VPS | Docker + Reverse Proxy |
| Database | SQLite | PostgreSQL |
| AI | API مدل ابری | API یا مدل تحت کنترل سازمان |
| Security Scan | AI Review | AI + SAST + SCA + Secret Scan |
| مدیریت Secret | Environment Variables | Secret Manager |
رفع مشکل اگر Mira اجرا نشد
اگر بعد از اجرای Docker داشبورد بالا نمیآید، ابتدا وضعیت Container و Logها را بررسی کنید:
docker ps -a
docker logs --tail 200 mira
docker inspect mira
curl http://127.0.0.1:8000/health
🛠️ اگر در نصب، Docker، دامنه یا کانفیگ VPS گیر کردید
مشکل را قبل از اینکه تنظیمات سرور را تصادفی تغییر دهید بررسی کنید. خطای Webhook، پورت، SSL، Permission، Docker یا Resource Limit ممکن است علت متفاوتی داشته باشد. میتوانید برای بررسی و کانفیگ سرور از خدمات رفع مشکل ایرانیکاسرور استفاده کنید.
📞 تماس با پشتیبانی: 021-91302460 | ایرانیکاسرور
جمعبندی؛ ساخت یک لایه امنیتی قبل از انتشار کد
ساخت AI Security Reviewer فقط نصب یک ابزار AI نیست.
اگر آن را روی یک VPS پایدار اجرا کنید و به GitHub یا GitLab متصل کنید، میتوانید بررسی امنیتی را وارد چرخه واقعی توسعه کنید. ترکیب AI Security Review، Secret Scanning، Dependency Scanning و SAST میتواند قبل از Merge شدن بسیاری از خطاهای قابل تشخیص را آشکار کند.
در عین حال، AI نباید بهعنوان تنها مرجع امنیتی استفاده شود. برای پروژههای حساس، Findingهای مهم باید با تست و بررسی انسانی تأیید شوند. مزیت اصلی این معماری، پیدا کردن سریعتر مشکلات در همان جایی است که هنوز اصلاح آنها ساده و کمهزینه است: قبل از انتشار.
📌 چکلیست نهایی راهاندازی
🔹 VPS با منابع متناسب با Repositoryها تهیه کنید.
🔹 Docker و Mira را نصب کنید.
🔹 GitHub App یا اتصال GitLab را ایجاد کنید.
🔹 Webhook Secret امن بسازید.
🔹 Private Key و API Key را خارج از Git نگه دارید.
🔹 HTTPS و Reverse Proxy را تنظیم کنید.
🔹 Health Check را آزمایش کنید.
🔹 یک Pull Request آزمایشی ایجاد کنید.
🔹 در مرحله بعد AI Reviewer را با SAST و Dependency Scanning ترکیب کنید.
📞 تماس با پشتیبانی: 021-91302460 | ایرانیکاسرور






دیدگاهها (۰)