החלטתי להריץ מנוע חיפוש בעצמי, מה עכשיו?

כמובן שהינכם מוזמנים לעשות שימוש, ולחוות את דעתכם לגבי השרת חיפוש: Encrypt - YaCy Search.

הקדמה

השינויים הטכנולוגיים בתקופה האחרונה, בעיקר אלו שבישרו את כניסת ה-GenAI אל חיינו, גורמים לשינויים פונקציונאלים במוצרים (חדשים וקיימים) ואלו מובילים לשינויים בתוצרים ובדרך שאנחנו צורכים אותם. האם אני היחיד שמרגיש שתוצאות חיפוש בזמן האחרון פחות טובות מבעבר, האם זה משהו שצריך להתרגל אליו, האם אנשים הפסיקו ליצור מענה בפורומים שהוא בעל רב-גוניות? איך הפכנו להיות חברה של מענה אחד ויחיד.

תמיד העדפתי Self-hosting, אפשר לדבר על זה רבות, למה זה חשוב, למה זה בטוח (או לא), ולמה זו הדרך - היחידה - לשמור על הפרטיות. ולאחרונה זכיתי לתמריץ לעשות משהו לגבי מנועי חיפוש, אם כן אני מוכרח לומר - שזה לא באמת תחליף, לא איך שזה נראה כרגע. אז למי שלא יודע, יש לי פרוייקט חברתי (Encrypt), שמריץ שירותים שונים עבור הקהל במטרה לספק שירותי בטוח ופרטי.

שירותים שקיימים נכון לעכשיו

PasteBin (Privatebin)
DoH/DoT Server
Search (YaCy)

יתווספו עוד בעתיד…

הסתכלתי על מפת מנועי החיפוש, והריכוזיות ברורה. והיותר גרוע בכל הסיפור, שכנראה כולם ילכו בסופו של דבר לכיוון של ChatBots ו-GenAI, ויוותרו על אינדקסים (זה יהפוך למידע שיושב מאוחרי הקלעים, הבוטים הללו יהוו אבסטרקציה לאינדקסים של מילארדי עמודים).


מקור

לכן החלטתי לעבוד על אירוח של מנוע חיפוש מבוסס על YaCy.

התקנה

YaCy הינו מנוע חיפוש P2P, מבוסס ג’אווה, מה שמאפשר לאפליקציה לרוץ בכל מקום שניתן להריץ ג’אווה (חלונות, מאק, לינוקס, מעבדי x86 ו-ARM). אני בחרתי להריץ את האפליקציה בתוך דוקר קונטיינר, פירוט מלא של ההתקנה ימצא בעתיד בוויקיפדיה של Behemoth LTD, אבל כרגע אציג כאן רק מידע כללי ולא מעמיק שיהיה ניתן למצוא בוויקיפדיה של ביהימות’ בע"מ.

בעוד שאפשר להשתמש בבילד שלהם והאימג’ שיצרו, החלטתי לבנות את האימג’ (פרקטיקה שאני מנסה להקפיד עליה, ברוב המקרים).

git clone https://github.com/yacy/yacy_search_server search
cd search
docker build --no-cache --progress plain -t yacy-server:1 -f docker/Dockerfile .

הבילד יקח כמה דקות, ובסופו יהיה אימג’ מקומי שאפשר להריץ (בעתיד יהיה חלק מ-CI/CD שיבדוק עם Trivy בצורה סטטית את החבילות לבעיות אבטחת).

הרצה

ספציפית היוזר (פרוייקט) encrypt מריץ מספר קונטיינרים, אולי בעתיד אפריד אותם - כרגע הם רצים באותו קובץ docker- compose.yaml, אך חסכתי ממכם איך הקונטיינרים האחרים שמוגדרים בקובץ.

docker-compose.yaml
services:
  search:
    image: yacy-server:1
    restart: unless-stopped
    ports:
      - 9001:8090
      - 9002:8443
    volumes:
      - /home/encrypt/Apps/Data/search:/opt/yacy_search_server/DATA:rw
    logging:
      driver: "json-file"
      options:
        max-size: "200m"
        max-file: "2"
    deploy:
      resources:
        limits:
          cpus: '2.50'
          memory: 12G
    cap_drop:
      - NET_ADMIN
      - SYS_ADMIN
      - CAP_MKNOD
      - CAP_MAC_ADMIN
      - CAP_NET_RAW
      - CAP_SYS_CHROOT
      - CAP_SYS_PTRACE
      - CAP_SYS_RAWIO
    networks:
      - encrypt-search

networks:
  encrypt-search:
    external: true

יש לי גם vhost ב-Nginx שמשמש כ-HTTP/S Terminator לכלל השרת (Reverse Proxy), והגדרתי לו לאן לפנות כאשר ניגשים לכתובת search.encrypt.co.il.

40_search.conf
server {
    listen       8090;
    listen       80;
    listen       [::]:80;
    listen       [::]:8090;

    server_name search.encrypt.co.il;
    
    location /.well-known/acme-challenge {
        allow all;
        try_files $uri $uri/ =404;
        root /home/dm/Apps/Shared/acme-challenge;
    }

    location / {
        proxy_pass http://127.0.0.1:9001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # deny access to dot files (.)
    location ~ /\. {
        deny  all;
    }

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}

server {
    listen  443 ssl;
    listen  8443 ssl;
    listen  [::]:443 ssl;
    listen  [::]:8443 ssl;
    http2 on;
    server_name search.encrypt.co.il;

    ssl_certificate      /etc/nginx/certs/search.encrypt.co.il/fullchain.pem;
    ssl_certificate_key  /etc/nginx/certs/search.encrypt.co.il/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    add_header 'Strict-Transport-Security' 'max-age=63072000' always;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # verify chain of trust of OCSP response using Root CA and Intermediate certs
    ssl_trusted_certificate /etc/nginx/certs/search.encrypt.co.il/chain.pem;

    location / {
        proxy_pass https://127.0.0.1:9002;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # deny access to dot files (.)
    location ~ /\. {
        deny  all;
    }

    # replace with the IP address of your resolver
    resolver 127.0.0.1;
}

הגדרה

לאפליקצית ג’אווה לוקח כמה שניות לעלות, ואז אפשר לגשת לעמוד /ConfigAccounts_p.html להגדיר את היוזר (אל תשארו עם היוזר והססמה הדיפולטיבים!), והגדרות נוספות. כל ההגדרות נשמרות בקובץ תחת הנתיב שהוגדר ב-volume, לכן ישמרו בין אתחולים.

אינדוקס

ובשלב הזה נתקלתי בשאלה של “מה עכשיו?”… גם אם אתם לא מבצעים אינדוקס של אתרים באופן אקטיבי, ברגע שאתם מחוברים לרשת, אתם יכולים לקבל משרתים אחרים תוצאות חיפוש, אך לרוב תוצאות אלו אינן מתקרבות באיכותן אף לתוצאות הגרועות של בינג וגוגל.

לכן מומלץ שתתחילו לאנדקס עמודים שמכילים מידע שאתם עתידים לצרוך (לדוגמה אתרים שקשורים למוצרים טכנולוגיים שאתם עושים בהם שימוש, עמודי התיעוד שלהם, הוויקיפדיה וכו). תהליך האינדקוס הינו אינטנסיבי, דורש משאבי עיבוד, רשת וכונן, ואף עלול לגרום לכתובת אי פי של השרת שלכם להיחסם אם האינדוקס אגרסיבי מדי.

התהליך הזה גרם לי להבין שדברים מובנים מאליהם - כמו מנוע חיפוש - הם מוצרים סופר מורכבים, והדרישות מאחוריהן (עיבוד, רשת, אחסון) פשוט הזוי! אבל אני לא מתכוון לוותר, אני מתכנן לעבוד בצורה יותר אוטומטית איך לאנדקס עמודים, שימוש ב-API בכדי לשלוח אתרים לאינדוקס. כרגע אני לא מצפה לזנוח את מנועי החיפוש הנפוצים, ונותר לי רק לקוות שתו"כ אינדוקסים של עמודים נוספים, התוצאות במנוע חיפוש שאני מריץ יהיו רלוונטיות יותר.

אולי הבחירה של YaCy לא הייתה הכי חכמה, שלא תבינו לא נכון, המוצר הזה טוב, אך הוא נועד בתכלס לאנשים\ארגונים שרוצים לאנדקס בעצם, אם זה חומרים שהם ב-Darknet (הרשת הפנימית של הארגון) או חומרים ספציפיים ברשת. אני רק אזכיר מספר אלטרנטיבות (לאירוח עצמי):

תמונות מסך


Status Page


P2P Status


Crawling

קריאה נוספת

הפרוייקט נזנח; התוצאות חיפוש בעוד שמסקרנות הרבה פעמים (rabbit hole שנראה מעניין להתעמק בו), הן כמעט ואף פעם אינן רלוונטיות לחיפוש עצמו, מה שגורם לי לחפש Searx.

אני כנראה אקים Searx NG במקום, אני אתעד את התהליך באשכול נפרד.