شرح وضعیت پروژهٔ جستجو برای مدل بعدی تاریخ: ۲۸ سپتامبر ۲۰۲۶ مخزن: /home/abas/Google ماژول Go: search زبان پیاده‌سازی: فقط Go. پیشنهاد React، Next.js، TypeScript یا پایتون را نده. این متن را بخوان و فقط بر اساس همین واقعیت‌ها بگو قدم بعدی چیست. معماری خیالی نساز. اگر چیزی در این متن نیست، فرض نکن که وجود دارد. ۱. هدف صاحب پروژه چند کراولر تخصصی می‌خواهد که موازی کار کنند. موضوع‌هایی که به یک مدل دیگر گفته شده: اینستاگرام، خبر و RSS، ردیت، یوتیوب، پتنت (EPO و USPTO)، قیمت فروشگاه، تلگرام و ایتا، مقالهٔ علمی (arXiv و Semantic Scholar و Crossref)، و خبر بازار. قید خودش: سرعت کراول فعلی کم نشود. همه‌چیز Go بماند. ۲. چیزی که الان واقعاً وجود دارد یک باینری: cmd/search فرمان‌ها: web، daily، crawl، fetch-queries سرویس‌های کاربر systemd: - google-web.service اجرای bin/search web --addr=127.0.0.1:3010 - google-daily.service اجرای bin/search daily --loop وب عمومی، از nginx روی پورت 8443: https://146.19.130.84:8443/ داشبورد: https://146.19.130.84:8443/dashboard ورود داشبورد: https://146.19.130.84:8443/dashboard/login پورت 3010 فقط روی localhost است و از بیرون باز نیست. نام کاربری و رمز فقط در .env با کلیدهای DASHBOARD_USER و DASHBOARD_PASSWORD هستند. در کد هاردکد نیستند. مقدارشان را حدس نزن و در پاسخ ننویس. SearXNG محلی: http://127.0.0.1:8888 داخل کانتینر google-searxng. از بیرون پورت ۸۸۸۸ باز نیست. آرشیو SQLite: data/search.db با journal_mode=WAL و busy_timeout=۵۰۰۰. این فایل داخل گیت نیست. وابستگی‌های مستقیم: goquery، robotstxt، modernc.org/sqlite. Colly، gofeed، Redis، BoltDB، Prometheus، zerolog و zap در پروژه نیستند. پوشه‌های کد: - cmd/search ورود فرمان - internal/crawl دانلود، robots.txt، فیلتر URL - internal/frontier صف URL. سقف کل ۲۰۰۰۰ و سقف هر میزبان ۲۵۰ - internal/pages جدول pages - internal/extract عنوان، توضیح، متن، لینک - internal/platforms بازنویسی تلگرام و ایتا. لینکدین عمداً دانلود نمی‌شود - internal/jobs حلقهٔ daily و crawl - internal/search مسیر نتیجه: کش، زنده، کهنه، مشابه - internal/providers سرویس SearXNG و در صورت کمبود نتیجه Tavily. Brave اختیاری است و کلیدش خالی است - internal/dashboard آمار آرشیو - internal/web قالب HTML داشبورد و جستجو - internal/db اسکیما پوشهٔ internal/core وجود ندارد. fetcher.go و queue.go و dedup.go و ratelimiter.go و storage.go و logger.go با این نام‌ها وجود ندارند. ۳. اسکیمای ذخیره جدول pages ستون source_type ندارد. ستون‌ها: id، url یکتا، host، title، description، body، tags، lang، status، error، fetched_at. status یکی از این‌هاست: ok، empty، error، skipped. داشبورد کارت «نتیجهٔ صفحه‌ها» را از همین status می‌سازد. فیلدهای price و currency و doi و authors و citation_count وجود ندارند. جدول results نتیجهٔ جستجو است، نه صفحهٔ دانلودشده. ستون‌ها: query_norm، query_text، url، title، snippet، provider، rank، lang، indexed_at. جدول frontier فقط url و host و added_at است. جداول دیگر: provider_usage، browse_log، grown_queries، suggest_seeds. جستجوی متنی با FTS5 روی pages و results است. ۴. کراولر فعلی چطور کار می‌کند google-daily یک فرآیند است: search daily --loop در حالت حلقه، پیش‌فرض‌ها این‌هاست: ۱۲ جستجو در هر دور، ۵۰۰ صفحه، فاصلهٔ جستجو ۴ ثانیه، همزمانی جستجو ۱، فاصلهٔ دانلود ۲۵۰ میلی‌ثانیه، همزمانی دانلود ۱۲، سقف هر میزبان در یک دور ۳۰. جستجو از SearXNG می‌آید. اگر نتیجه کم باشد Tavily پشتیبان است. لینک‌ها وارد frontier می‌شوند و همان فرآیند HTML را دانلود می‌کند. دو نویسندهٔ همزمان روی یک search.db نگذار. وب و کراولر می‌توانند همزمان بخوانند. نویسنده یکی است. تلگرام از آدرس عمومی https://t.me/s/{channel} خوانده می‌شود، نه MTProto و نه اکانت شخصی. ایتا هم در همین پکیج platforms است. ۵. وضعیت SearXNG در همین تاریخ کانتینر بالا است. خالی بودن قبلی به‌خاطر بن شدن کل آی‌پی سرور نبود. موتورهای وب که در تنظیم پیش‌فرض این ایمیج خاموش بودند روشن شده‌اند. روشن و در آزمایش «ویکی‌پدیا» نتیجه‌دار: google، bing، yahoo، yandex، naver، seznam، duckduckgo web، yep، gmx، mwmbl، zapmeta، encyclosearch، tusksearch، boardreader. خاموش به‌عمد: duckduckgo نسخهٔ HTML، چون تا ۸ ثانیه تایم‌اوت می‌شد و نتیجه نمی‌داد. جایگزینش duckduckgo web است که حدود ۱ ثانیه جواب می‌دهد. هنوز بد: brave به‌خاطر درخواست زیاد معلق است، google cse به‌خاطر درخواست زیاد معلق است، qwant کپچا می‌دهد. سقف انتظار هر موتور: request_timeout برابر ۳٫۵ ثانیه. wikidata جداگانه timeout برابر ۱٫۵ ثانیه دارد تا جستجو را معطل نکند. بعد از این تغییر، یک جستجوی ترکیبی حدود ۱٫۷ ثانیه طول کشید و حدود ۱۱۵ نتیجه داد. قبل از موتورهای اضافه، همان جستجو حدود ۱٫۴ ثانیه و ۴۶ نتیجه بود. فایل تنظیم: searxng/settings.yml کلید secret_key این فایل را در هیچ چتی کپی نکن. ۶. چرا پرامپت قبلی را نباید عیناً اجرا کرد دو متن با هم جور نیستند. یکی می‌گوید internal/core را دست نزن و شش ماژول جدا بساز. دیگری می‌گوید هسته را به سه کراولر social و academic و market ریفکتور کن. هستهٔ توصیف‌شده وجود ندارد، پس «بدون تغییر هسته» قابل اجرا نیست. چند باینری نویسنده روی همین SQLite سرعت کراول فعلی را کم می‌کند، نه زیاد. source_type و فیلدهای قیمت و مقاله در اسکیما نیستند. داشبورد آن‌ها را نشان نمی‌دهد مگر اسکیما و داشبورد با هم عوض شوند. تأخیر تصادفی برای این‌که الگوی درخواست قابل شناسایی نباشد را پیاده نکن. Colly را به‌صرف این‌که پرامپت گفته جایگزین goquery و net/http نکن، مگر دلیل مشخصی داخل همین معماری باشد. ۷. کاری که فقط صاحب پروژه باید انجام دهد کد این‌ها را نمی‌سازد: - اینستاگرام: اپ Meta، عبور از App Review، توکن Business یا Creator. اکانت شخصی با Graph API کار نمی‌کند. سقف تقریبی ۳۰ هشتگ در ۷ روز و ۲۰۰ درخواست در ساعت برای هر توکن. - ردیت: client_id و client_secret. استفادهٔ تجاری تعرفهٔ جدا دارد. - یوتیوب: کلید YouTube Data API v3. سهمیهٔ پیش‌فرض روزی ۱۰۰۰۰ واحد است و هر search.list صد واحد است، یعنی حدود ۱۰۰ جستجو در روز. - پتنت: Consumer Key و Secret برای EPO OPS، و API key برای USPTO PatentsView. - Crossref: یک ایمیل واقعی برای mailto. - فهرست منبع: فید RSS، کانال تلگرام و ایتا، ساب‌ردیت، کلیدواژهٔ علمی، و برای قیمت آدرس صفحهٔ محصول به‌علاوهٔ selector همان فروشگاه. تا این فهرست‌ها و کلیدها نباشند، کراولر تخصصی چیزی برای خواندن ندارد. ۸. قیدهایی که جواب تو باید رعایت کند - فقط Go. - یک نویسنده برای search.db، مگر اول طرح جدا کردن ذخیره را بدهی و صاحب پروژه تأیید کند. - کراولر تخصصی اگر ساخته شود، لینک تازه را به frontier فعلی بدهد و همان daily دانلود کند. یا صریح بگو این کار بدون عوض کردن ذخیره ممکن نیست. - رازها فقط از .env. هیچ کلیدی را در کد یا در پاسخ چت ننویس. - سرعت حلقهٔ daily را بدتر نکن. موتور کند به SearXNG اضافه نکن. - robots.txt همین حالا در internal/crawl رعایت می‌شود. همان را نگه دار. - لینکدین را کراول نکن. این تصمیم فعلی کد است. ۹. چیزی که از تو می‌خواهیم یک طرح مرحله‌ای بده، کوتاه و قابل اجرا روی همین مخزن. بگو کدام کراولر تخصصی را با همین صف و همین یک نویسنده می‌شود اضافه کرد و کدام را نباید شروع کرد تا کلید و فهرست و طرح دیتابیس آماده شود. اگر اسکیما باید ستون جدید بگیرد، بگو کدام ستون و داشبورد کدام کارت را باید نشان دهد. ساختار پوشه را از روی پوشه‌های واقعی بند ۲ پیشنهاد بده، نه از internal/core. کد ننویس مگر صاحب پروژه بعد از خواندن این طرح جداگانه بگوید پیاده کن.