يحتوي هذا المستودع على قاعدة التعليمات البرمجية الكاملة لـ https://searchmysite.net/، محرك البحث المستقل مفتوح المصدر والبحث كخدمة لمواقع الويب الشخصية والمستقلة (راجع حول searchmysite.net للحصول على مزيد من التفاصيل حول searchmysite.net).
يمكنك استخدام هذا المستودع من أجل:
ينقسم التطبيق إلى 5 مكونات، يتم نشر كل منها في حاوية Docker الخاصة به:
هيكل دليل المشروع هو كما يلي:
.
├── data # Data for Docker data volumes (not in git - to be set up locally)
│ ├── solrdata # Mounted to /var/solr/solrdata in Solr Docker
│ ├── sqldata # Mounted to /var/lib/postgresql/data in Postgres Docker
├── src # Source files
│ ├── db # Database scripts
│ │ ├── bulkimport # Scripts to load sites into the database for the indexer to index
│ ├── indexing # Indexing code
│ │ ├── bulkimport # Scripts to load content directly into the search engine
│ │ ├── common # Indexing code shared between bulk import and spider
│ │ ├── indexer # Spidering code
│ ├── models # Language models
│ ├── search # Search engine configuration
│ ├── web # Files for deployment to web / app server
│ │ ├── config # Web server configuration
│ │ ├── content/dynamic # Dynamic pages and API, for deployment to app server
│ │ ├── content/static # Static assets, for deployment to static web server
├── tests # Test scripts
└── README.md # This file
هناك 3 ملفات إنشاء عامل إرساء، وهي متطابقة إلى حد كبير باستثناء:
تأكد من تثبيت Docker.
احصل على الكود المصدري على سبيل المثال
cd ~/projects/
git clone https://github.com/searchmysite/searchmysite.net.git
قم بإنشاء أدلة البيانات لقاعدة البيانات وفهرس البحث:
cd ~/projects/searchmysite.net/
mkdir -p data/solrdata
mkdir -p data/sqldata
sudo chown 8983:8983 data/solrdata
قم بإنشاء ملف ~/projects/searchmysite.net/src/.env لـ docker-compose.yml الذي يحتوي على ما يلي على الأقل:
POSTGRES_PASSWORD=<password>
SECRET_KEY=<secretkey>
يمكن أن تكون POSTGRES_PASSWORD وSECRET_KEY أي قيم تختارها للتطوير المحلي. لاحظ أنه على الرغم من أن هذه هي القيم الوحيدة المطلوبة لكي يعمل التطبيق الأساسي، إلا أن هناك قيمًا أخرى يجب إعدادها للحصول على وظائف إضافية - راجع قسم "متغيرات البيئة الإضافية" أدناه.
وأخيرًا، أنشئ صور عامل الإرساء:
cd ~/projects/searchmysite.net/src
docker compose build
لاحظ أن البناء الأول قد يستغرق من 20 إلى 30 دقيقة، وأن حاوية النماذج تقوم بتنزيل ملف نموذج بسعة 3 جيجابايت.
مع توفر المتطلبات الأساسية، يمكنك بدء بيئة التطوير الخاصة بك باستخدام:
cd ~/projects/searchmysite.net/src
docker compose up -d
سيكون موقع الويب متاحًا على http://localhost:8080/، وواجهة إدارة Apache Solr على http://localhost:8983/solr/#/.
إذا كنت تريد أن تكون قادرًا على الموافقة على المواقع المضافة كقائمة أساسية أو رفضها، فستحتاج إلى إعداد مستخدم إداري واحد أو أكثر. يمكن السماح فقط لأصحاب المواقع الذين تم التحقق منهم، أي أصحاب القائمة الكاملة والقادرين على تسجيل الدخول، كمستخدمين إداريين. يمكنك استخدام واجهة الويب لإضافة موقعك كقائمة كاملة عبر إضافة موقع، أو إدراج التفاصيل مباشرة في قاعدة البيانات.
بمجرد أن يكون لديك مالك موقع واحد أو أكثر تم التحقق منهم، يمكنك السماح لهم كمسؤولين في قاعدة البيانات، على سبيل المثال:
INSERT INTO tblPermissions (domain, role)
VALUES ('michael-lewis.com', 'admin');
يمكنك استخدام "إضافة موقع" لإضافة موقع أو مواقع كقائمة أساسية عبر واجهة الويب. ستحتاج إلى تسجيل الدخول كمستخدم إداري، ثم النقر فوق "مراجعة"، ثم تحديد "الموافقة" حتى يتم وضعهم في قائمة الانتظار للفهرسة.
توجد أيضًا برامج نصية للاستيراد المجمع في src/db/bulkimport. يأخذ checkdomains.py قائمة بالمجالات أو الصفحات الرئيسية كمدخلات، ويتحقق من أنها مواقع صالحة، وأنها ليست موجودة بالفعل في القائمة أو قاعدة البيانات، ويقوم بإنشاء ملف لإدخال Insertdomains.py.
وانظر الحديث في رقم 91.
إذا كنت تريد استخدام الوظيفة التي ترسل رسائل البريد الإلكتروني (مثل نموذج الاتصال)، فستحتاج إلى تعيين القيم التالية:
SMTP_SERVER=
SMTP_PORT=
SMTP_FROM_EMAIL=
SMTP_FROM_PASSWORD=
SMTP_TO_EMAIL=
في حالة الاختبار فقط، يمكنك إنشاء حساب بريد إلكتروني على الويب واستخدام تفاصيل SMTP لذلك.
إذا كنت تريد تمكين آلية الدفع لعمليات الإرسال التي تم التحقق منها، فستحتاج إلى تعيين:
ENABLE_PAYMENT=True
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
STRIPE_PRODUCT_ID=
STRIPE_ENDPOINT_SECRET=
في حالة الاختبار فقط، يمكنك الحصول على حساب اختباري من Stripe.
يقوم docker-compose.yml for dev بتكوين خادم الويب للقراءة من المصدر، بحيث يمكن إجراء تغييرات في المصدر وإعادة تحميله. سيتعين عادةً إعادة تشغيل خادم الويب لعرض التغييرات:
docker exec -it web_dev apachectl restart
لإجراء تغييرات متكررة، من الأفضل استخدام بيئة تطوير Flask خارج Docker.
للقيام بذلك، ستحتاج أولاً إلى إعداد إدخالات مضيف محلي لـ "db" و"models" و"search"، أي في /etc/hosts (نظرًا لأن حاوية "web" تتحدث مع قاعدة البيانات والنماذج وحاويات البحث عبر أسماء المضيفين "db" و"models" و"search":
127.0.0.1 search
127.0.0.1 db
127.0.0.1 models
ثانيًا، قم بتثبيت Flask والتبعيات محليًا (مع ملاحظة أن apache2-dev مطلوب لـ mod-wsgi وlippq-dev لـ psycopg2)، ثم قم بتثبيت حزمة searchmysite في الوضع القابل للتحرير (يجب تنفيذ هذه الخطوات مرة واحدة فقط):
sudo apt install apache2-dev libpq-dev
cd ~/projects/searchmysite.net/src/web/
pip3 install -r requirements.txt
cd ~/projects/searchmysite.net/src/web/content/dynamic/
pip3 install -e .
أخيرًا، في بداية كل جلسة تطوير، قم بتحميل متغيرات البيئة وابدأ تشغيل Flask في وضع التطوير عبر:
set -a; source ~/projects/searchmysite.net/src/.env; set +a
export FLASK_ENV=development
export FLASK_APP=~/projects/searchmysite.net/src/web/content/dynamic/searchmysite
flask run --debug
سيكون موقع Flask المحلي الخاص بك متاحًا على سبيل المثال http://localhost:5000/search/ (لاحظ أن الصفحة الرئيسية، أي http://localhost:5000/، لا يتم تقديمها ديناميكيًا لذا لن تكون متاحة عبر Flask) . ستنعكس التغييرات التي يتم إجراؤها على التعليمات البرمجية دون إعادة تشغيل الخادم، وسترى رسائل سجل التصحيح، وستكون آثار المكدس الكامل أكثر وضوحًا في حالة حدوث أخطاء.
كما هو الحال مع حاوية الويب، تم تكوين حاوية الفهرسة على المطور للقراءة مباشرة من المصدر، لذا يجب حفظ التغييرات فقط.
يمكنك عادةً تشغيل إعادة الفهرسة عن طريق تشغيل SQL مثل:
UPDATE tblDomains
SET full_indexing_status = 'PENDING'
WHERE domain = 'michael-lewis.com';
وانتظار src/indexing/indexer/run.sh التالي (ما يصل إلى دقيقة واحدة عند التطوير)، أو تشغيله يدويًا:
docker exec -it src-indexing-1 python /usr/src/app/search_my_site_scheduler.py
من المفترض ألا تكون هناك أية مشكلات في تشغيل العديد من برامج الجدولة بشكل متزامن إذا قمت بتشغيلها يدويًا ثم تم تشغيل المهمة المجدولة.
يمكنك مراقبة سجلات الفهرسة عبر:
docker logs -f src-indexing-1
ويمكن تغيير LOG_LEVEL إلى DEBUG في src/indexing/indexer/settings.py.
تُنسخ حاوية dev Solr docker في التكوين عند الإنشاء، لذلك يلزم docker compose build
لكل تغيير في التكوين.
لاحظ أن solr-precreate content /opt/solr/server/solr/configsets/content
لا يقوم فعليًا بتحميل التكوين الجديد بعد docker compose build
، لذا فإن الخطوات التالية مطلوبة لتطبيق تغييرات تكوين Solr:
docker compose build
docker compose up -d
docker exec -it search_dev cp -r /opt/solr/server/solr/configsets/content/conf /var/solr/data/content/
docker restart search_dev
اعتمادًا على التغييرات، قد تحتاج أيضًا إلى حذف بعض أو كل البيانات الموجودة في الفهرس، على سبيل المثال
curl http://localhost:8983/solr/content/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>domain:michael-lewis.com</query></delete>'
وتشغيل إعادة الفهرسة كما هو مذكور أعلاه. استخدم <query>*:*</query>
لحذف كافة البيانات الموجودة في الفهرس.
يمكنك أيضًا حذف وإعادة إنشاء دليل data/solrdata، ثم إعادة بنائه، لبداية جديدة.
يمكنك الاتصال بقاعدة البيانات عبر:
"host": "127.0.0.1",
"user": "postgres",
"port": 5432,
"ssl": false,
"database": "searchmysitedb",
"password": <password-from-dotenv-file>
يجب تطبيق تغييرات المخطط على ملفات src/db/sql/init*، لذلك إذا قمت بحذف دليل البيانات/sqldata وإعادة إنشائه، فسيتم تطبيق أحدث مخطط.
لإجراء التجارب الأساسية مع ضبط الملاءمة، يمكنك إضافة بعض المواقع يدويًا وتجربتها. تذكر التأكد من وجود روابط بين هذه المواقع، لأن Indexed_inlink_domains_count عامل مهم في التسجيل. تذكر أيضًا أن قيم Indexed_inlink* قد تتطلب فهرسة المواقع مرتين ليتم تعيينها بشكل صحيح - تقوم عملية الفهرسة بتعيين قيم Indexed_inlink* من قيم Indexed_outlink*، لذلك تحتاج إلى تمرير أول للتأكد من تعيين قيم Indexed_outlink* لجميع المواقع.
ومع ذلك، من أجل ضبط الملاءمة الجادة، من الأفضل استخدام استعادة مجموعة الإنتاج Solr. إذا كنت مهتمًا بالقيام بذلك، فأخبرني وسأقوم بتوفير أحدث المعلومات.
لاحظ أنه إذا قمت بإضافة حقول جديدة إلى مخطط Solr والتي سيتم استخدامها في تسجيل نقاط الملاءمة، فمن الأفضل الانتظار حتى تتم إضافة هذه الحقول إلى جميع المواقع قبل نشر تغييرات تسجيل الملاءمة الجديدة. هناك طريقتان للقيام بذلك: فرض إعادة فهرسة كافة المواقع، أو الانتظار حتى تتم إعادة فهرسة كافة المواقع بشكل طبيعي. من الأسهل والأكثر أمانًا انتظار إعادة الفهرسة الطبيعية. من المرجح أن تستغرق عملية إعادة الفهرسة القسرية لكل شيء أكثر من 24 ساعة نظرًا لأن إعادة الفهرسة تتم على دفعات مكونة من 20 موقعًا وتستغرق بعض المواقع أكثر من ساعة واحدة لإعادة الفهرسة، في حين أن إعادة الفهرسة الطبيعية ستستغرق 3.5 يومًا لضمان إعادة فهرسة جميع المواقع التي تم التحقق منها (28 يومًا مواقع لم يتم التحقق منها).
يتم تشغيل الاختبارات باستخدام pytest على مثيل Flask محلي، لذلك ستحتاج إلى تثبيت pytest وإعداد مثيل Flask محلي وفقًا لقسم "إجراء تغييرات على dev المحلي"/"تغييرات الويب" أعلاه. إذا كان لديك ENABLE_PAYMENT=True، فستحتاج أيضًا إلى إعداد Selenium وWebDriver، لأن تكامل Stripe يتضمن أزرارًا تنفذ JavaScript، على سبيل المثال:
pip3 install selenium
pip3 install chromedriver-py
هناك نوعان من البرامج النصية للاختبار:
clean_test_env.sh
- يقوم بإيقاف تشغيل أي مثيلات dev docker، ويعيد بناء مثيلات عامل الإرساء الاختبارية النظيفة ويبدأ تشغيلها.run_tests.sh
- يقوم بإعداد متغيرات البيئة وتشغيل البرامج النصية pytest والفهرسة.البرامج النصية pytest:
للتشغيل:
cd ~/projects/searchmysite.net/tests
./clean_test_env.sh
./run_tests.sh
ستستغرق خطوة الفهرسة دقيقة أو دقيقتين، نظرًا لأنها تؤدي إلى فهرسة مواقع حقيقية، وإذا كان ENABLE_PAYMENT=صحيحًا، فسترى نافذة منبثقة للمتصفح تستغرق بضع ثوانٍ لفتحها وإغلاقها.
إذا نجحت الاختبارات، فسوف تترك البيئة في نفس الحالة التي كانت عليها في البداية، أي أنها تنظف نفسها بعد ذلك، لذلك لا تحتاج إلى تشغيل clean_test_env.sh
قبل run_tests.sh
مرة أخرى. ومع ذلك، إذا فشلت الاختبارات، فسوف تحتاج إلى إعادة تشغيل clean_test_env.sh
. لنفس السبب، إذا قمت بتشغيل run_tests.sh
عن طريق الخطأ ضد المطور بدلاً من اختبار البيئة، على سبيل المثال لأنك لم تقم بتشغيل clean_test_env.sh
أولاً، فإذا نجحت الاختبارات، فستكون البيئة على ما يرام. من الأفضل استخدام بيئة الإرساء الاختبارية لأن ذلك يوفر نقطة بداية نظيفة معروفة، ويضمن عدم تداخل إعادة الفهرسة المجدولة مع الفهرسة في الاختبار.