พื้นที่เก็บข้อมูลนี้ประกอบด้วยฐานโค้ดที่สมบูรณ์สำหรับ 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 นาที และคอนเทนเนอร์โมเดลจะดาวน์โหลดไฟล์โมเดล 3Gb
ด้วยข้อกำหนดเบื้องต้น คุณสามารถเริ่มต้นสภาพแวดล้อมการพัฒนาของคุณด้วย:
cd ~/projects/searchmysite.net/src
docker compose up -d
เว็บไซต์จะพร้อมใช้งานที่ http://localhost:8080/ และอินเทอร์เฟซผู้ดูแลระบบ Apache Solr ที่ http://localhost:8983/solr/#/
หากคุณต้องการอนุมัติหรือปฏิเสธไซต์ที่เพิ่มเป็นรายการพื้นฐาน คุณจะต้องตั้งค่าผู้ใช้ที่เป็นผู้ดูแลระบบตั้งแต่หนึ่งรายขึ้นไป เฉพาะเจ้าของไซต์ที่ได้รับการยืนยัน เช่น ผู้ที่มีรายการแบบเต็มและสามารถเข้าสู่ระบบได้เท่านั้นที่สามารถได้รับสิทธิ์ในฐานะผู้ใช้ที่เป็นผู้ดูแลระบบ คุณสามารถใช้อินเทอร์เฟซเว็บเพื่อเพิ่มไซต์ของคุณเองเป็นรายการทั้งหมดผ่านทาง Add Site หรือแทรกรายละเอียดลงในฐานข้อมูลโดยตรง
เมื่อคุณมีเจ้าของไซต์ที่ได้รับการยืนยันตั้งแต่หนึ่งรายขึ้นไป คุณสามารถอนุญาตให้พวกเขาเป็นผู้ดูแลระบบในฐานข้อมูลได้ เช่น:
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 สำหรับ dev กำหนดค่าเว็บเซิร์ฟเวอร์ให้อ่านจากแหล่งที่มา ดังนั้นจึงสามารถทำการเปลี่ยนแปลงในแหล่งที่มาและโหลดซ้ำได้ โดยทั่วไปเว็บเซิร์ฟเวอร์จะต้องรีสตาร์ทเพื่อดูการเปลี่ยนแปลง:
docker exec -it web_dev apachectl restart
สำหรับการเปลี่ยนแปลงบ่อยครั้ง ควรใช้สภาพแวดล้อมการพัฒนา Flask ภายนอก Docker จะดีกว่า
ในการดำเนินการนี้ ขั้นแรก คุณจะต้องตั้งค่ารายการโฮสต์ในเครื่องสำหรับ "db", "models" และ "search" เช่น ใน /etc/hosts (เนื่องจากคอนเทนเนอร์ "เว็บ" จะพูดคุยกับ db, โมเดล และคอนเทนเนอร์การค้นหา ผ่านชื่อโฮสต์ "db", "models" และ "search"):
127.0.0.1 search
127.0.0.1 db
127.0.0.1 models
ประการที่สอง ติดตั้ง Flask และการอ้างอิงในเครื่อง (โปรดทราบว่าจำเป็นต้องใช้ apache2-dev สำหรับ mod-wsgi และ libpq-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 .
สุดท้ายนี้ เมื่อเริ่มต้นเซสชัน dev ทุกเซสชัน ให้โหลดตัวแปรสภาพแวดล้อมและเริ่ม 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) . การเปลี่ยนแปลงโค้ดจะมีผลโดยไม่ต้องรีสตาร์ทเซิร์ฟเวอร์ คุณจะเห็นข้อความบันทึกการแก้ไขข้อบกพร่อง และการติดตามสแต็กแบบเต็มจะมองเห็นได้ชัดเจนยิ่งขึ้นในกรณีที่เกิดข้อผิดพลาด
เช่นเดียวกับคอนเทนเนอร์บนเว็บ คอนเทนเนอร์การจัดทำดัชนีบน dev ได้รับการกำหนดค่าให้อ่านโดยตรงจากแหล่งที่มา ดังนั้นคุณเพียงแค่ต้องบันทึกการเปลี่ยนแปลง
โดยทั่วไปคุณจะทริกเกอร์การสร้างดัชนีใหม่โดยการรัน SQL เช่น:
UPDATE tblDomains
SET full_indexing_status = 'PENDING'
WHERE domain = 'michael-lewis.com';
และรอ src/indexing/indexer/run.sh ถัดไป (สูงสุด 1 นาทีสำหรับ dev) หรือทริกเกอร์ด้วยตนเอง:
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 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* ดังนั้นหากคุณลบและสร้างไดเร็กทอรี data/sqldata ใหม่ สคีมาล่าสุดจะถูกนำมาใช้
สำหรับการทดลองขั้นพื้นฐานด้วยการปรับแต่งความเกี่ยวข้อง คุณสามารถเพิ่มไซต์สองสามไซต์ด้วยตนเอง และทดลองกับไซต์เหล่านั้นได้ อย่าลืมตรวจสอบให้แน่ใจว่ามีลิงก์ระหว่างไซต์เหล่านี้ เนื่องจาก indexed_inlink_domains_count เป็นปัจจัยสำคัญในการให้คะแนน โปรดจำไว้ด้วยว่าค่า indexed_inlink* อาจจำเป็นต้องมีการจัดทำดัชนีไซต์สองครั้งเพื่อให้ตั้งค่าได้อย่างถูกต้อง - กระบวนการจัดทำดัชนีจะตั้งค่า indexed_inlink* จากค่า indexed_outlink* ดังนั้นจึงต้องผ่านครั้งแรกเพื่อให้แน่ใจว่าไซต์ทั้งหมดตั้งค่า indexed_outlink* ไว้
อย่างไรก็ตาม สำหรับการปรับแต่งความเกี่ยวข้องอย่างจริงจัง ควรใช้การกู้คืนคอลเลกชัน Solr ที่ใช้งานจริงจะดีกว่า หากคุณสนใจที่จะทำเช่นนี้ โปรดแจ้งให้เราทราบ แล้วเราจะจัดเตรียมข้อมูลที่เป็นปัจจุบันไว้ให้
โปรดทราบว่าหากคุณเพิ่มฟิลด์ใหม่ให้กับ Solr schema ซึ่งจะใช้ในการให้คะแนนความเกี่ยวข้อง จะเป็นการดีกว่าที่จะรอจนกว่าไซต์ทั้งหมดจะเพิ่มฟิลด์เหล่านี้ก่อนที่จะปรับใช้การเปลี่ยนแปลงการให้คะแนนความเกี่ยวข้องใหม่ มีสองวิธีในการทำเช่นนี้: บังคับให้จัดทำดัชนีใหม่ของไซต์ทั้งหมด หรือรอจนกว่าไซต์ทั้งหมดจะได้รับการจัดทำดัชนีใหม่ตามธรรมชาติ จะง่ายกว่าและปลอดภัยกว่าในการรอดัชนีใหม่ตามธรรมชาติ แรงที่จัดทำดัชนีใหม่ การทำดัชนีซ้ำของทุกสิ่งมีแนวโน้มที่จะใช้เวลานานกว่า 24 ชั่วโมง เนื่องจากการทำดัชนีใหม่เกิดขึ้นในชุดละ 20 รายการ และบางไซต์ใช้เวลามากกว่า 1 ชั่วโมงในการสร้างดัชนีใหม่ ในขณะที่การทำดัชนีใหม่ตามธรรมชาติจะใช้เวลา 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 ใด ๆ สร้างใหม่และเริ่มต้นอินสแตนซ์ docker ทดสอบใหม่ทั้งหมดrun_tests.sh
- ตั้งค่าตัวแปรสภาพแวดล้อม รันสคริปต์ pytest และการจัดทำดัชนีสคริปต์ pytest:
หากต้องการเรียกใช้:
cd ~/projects/searchmysite.net/tests
./clean_test_env.sh
./run_tests.sh
ขั้นตอนการจัดทำดัชนีจะใช้เวลาหนึ่งหรือสองนาที เนื่องจากเป็นการดำเนินการจัดทำดัชนีของไซต์จริง และหาก ENABLE_PAYMENT=True คุณจะเห็นเบราว์เซอร์ปรากฏขึ้นซึ่งใช้เวลาไม่กี่วินาทีในการเปิดและปิด
หากการทดสอบสำเร็จ สภาพแวดล้อมจะคงอยู่ในสถานะเดียวกับตอนเริ่มต้น กล่าวคือ สภาพแวดล้อมจะล้างข้อมูลหลังจากนั้นเอง ดังนั้นคุณไม่จำเป็นต้องเรียกใช้ clean_test_env.sh
ก่อน run_tests.sh
อีกครั้ง อย่างไรก็ตาม หากการทดสอบล้มเหลว คุณจะต้องรัน clean_test_env.sh
อีกครั้ง ด้วยเหตุผลเดียวกัน หากคุณเรียกใช้ run_tests.sh
กับ dev โดยไม่ตั้งใจ แทนที่จะเรียกใช้ test env เช่น เนื่องจากคุณไม่ได้เรียกใช้ clean_test_env.sh
ก่อน ดังนั้นหากการทดสอบสำเร็จ สภาพแวดล้อมก็จะดี จะดีกว่าถ้าใช้สภาพแวดล้อมนักเทียบท่าทดสอบ เนื่องจากเป็นจุดเริ่มต้นที่ทราบดีอยู่แล้ว และช่วยให้แน่ใจว่าการจัดทำดัชนีใหม่ตามกำหนดการจะไม่รบกวนการจัดทำดัชนีในการทดสอบ