Este repositorio contiene el código base completo para https://searchmysite.net/, el motor de búsqueda independiente de código abierto y búsqueda como servicio para sitios web personales e independientes (consulte Acerca de searchmysite.net para obtener más detalles sobre searchmysite.net).
Puede utilizar este repositorio para:
La aplicación se divide en 5 componentes, cada uno implementado en su propio contenedor Docker:
La estructura del directorio del proyecto es la siguiente:
.
├── 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
Hay 3 archivos docker-compose, que son prácticamente idénticos excepto:
Asegúrese de que Docker esté instalado.
Obtenga el código fuente con, por ejemplo
cd ~/projects/
git clone https://github.com/searchmysite/searchmysite.net.git
Cree los directorios de datos para la base de datos y el índice de búsqueda:
cd ~/projects/searchmysite.net/
mkdir -p data/solrdata
mkdir -p data/sqldata
sudo chown 8983:8983 data/solrdata
Cree un archivo ~/projects/searchmysite.net/src/.env para docker-compose.yml que contenga al menos lo siguiente:
POSTGRES_PASSWORD=<password>
SECRET_KEY=<secretkey>
POSTGRES_PASSWORD y SECRET_KEY pueden ser cualquier valor que elija para el desarrollo local. Tenga en cuenta que, aunque estos son los únicos valores necesarios para que funcione la aplicación básica, hay otros valores que deberán configurarse para obtener funcionalidad adicional; consulte la sección "Variables de entorno adicionales" a continuación.
Y finalmente, cree las imágenes de la ventana acoplable:
cd ~/projects/searchmysite.net/src
docker compose build
Tenga en cuenta que la primera compilación puede tardar entre 20 y 30 minutos y que el contenedor de modelos descarga un archivo de modelo de 3 Gb.
Con los requisitos previos implementados, puede iniciar su entorno de desarrollo con:
cd ~/projects/searchmysite.net/src
docker compose up -d
El sitio web estará disponible en http://localhost:8080/ y la interfaz de administración de Apache Solr en http://localhost:8983/solr/#/.
Si desea poder aprobar o rechazar sitios agregados como una lista básica, deberá configurar uno o más usuarios administradores. Sólo los propietarios de sitios verificados, es decir, aquellos con una lista completa y capaces de iniciar sesión, pueden tener permiso como usuarios administradores. Puede utilizar la interfaz web para agregar su propio sitio como listado completo mediante Agregar sitio, o insertar detalles directamente en la base de datos.
Una vez que tenga uno o más propietarios de sitios verificados, puede autorizarlos como administradores en la base de datos, por ejemplo:
INSERT INTO tblPermissions (domain, role)
VALUES ('michael-lewis.com', 'admin');
Puede utilizar Agregar sitio para agregar un sitio o sitios como una lista básica a través de la interfaz web. Deberá iniciar sesión como usuario administrador, hacer clic en Revisar y seleccionar Aprobar para que se pongan en cola para la indexación.
También hay scripts de importación masiva en src/db/bulkimport. checkdomains.py toma una lista de dominios o páginas de inicio como entrada, verifica que sean sitios válidos y que no estén ya en la lista o en la base de datos, y genera un archivo para que insertdomains.py lo inserte.
Véase también la discusión en el n.º 91.
Si desea utilizar la funcionalidad que envía correos electrónicos (por ejemplo, el formulario de contacto), deberá establecer los siguientes valores:
SMTP_SERVER=
SMTP_PORT=
SMTP_FROM_EMAIL=
SMTP_FROM_PASSWORD=
SMTP_TO_EMAIL=
Si solo está realizando una prueba, puede crear una cuenta de correo electrónico basada en la web y utilizar los detalles SMTP para ello.
Si desea habilitar el mecanismo de pago para envíos verificados, deberá configurar:
ENABLE_PAYMENT=True
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
STRIPE_PRODUCT_ID=
STRIPE_ENDPOINT_SECRET=
Si solo está realizando una prueba, puede obtener una cuenta de prueba de Stripe.
Docker-compose.yml para desarrolladores configura el servidor web para leer desde el código fuente, de modo que se puedan realizar cambios en el código fuente y volver a cargarlo. Normalmente será necesario reiniciar el servidor web para ver los cambios:
docker exec -it web_dev apachectl restart
Para cambios frecuentes, es mejor utilizar un entorno de desarrollo Flask fuera de Docker.
Para hacer esto, en primer lugar, necesitará configurar entradas de host local para "db", "models" y "search", es decir, en /etc/hosts (dado que el contenedor "web" se comunica con la base de datos, los modelos y los contenedores de búsqueda). a través de los nombres de host "db", "modelos" y "búsqueda"):
127.0.0.1 search
127.0.0.1 db
127.0.0.1 models
En segundo lugar, instale Flask y las dependencias localmente (tenga en cuenta que se requiere apache2-dev para mod-wsgi y libpq-dev para psycopg2) e instale el paquete searchmysite en modo editable (estos pasos solo deben realizarse una vez):
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 .
Finalmente, al inicio de cada sesión de desarrollo, cargue las variables de entorno e inicie Flask en modo de desarrollo mediante:
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
Su sitio web local de Flask estará disponible, por ejemplo, en http://localhost:5000/search/ (tenga en cuenta que la página de inicio, es decir, http://localhost:5000/, no se ofrece dinámicamente, por lo que no estará disponible a través de Flask). . Los cambios en el código se reflejarán sin reiniciar el servidor, verá mensajes de registro de depuración y los seguimientos completos de la pila serán más visibles en caso de errores.
Al igual que con el contenedor web, el contenedor de indexación en el desarrollador está configurado para leer directamente desde la fuente, por lo que solo es necesario guardar los cambios.
Normalmente, activaría una reindexación ejecutando SQL como:
UPDATE tblDomains
SET full_indexing_status = 'PENDING'
WHERE domain = 'michael-lewis.com';
y esperando el siguiente src/indexing/indexer/run.sh (hasta 1 minuto en desarrollo), o activándolo manualmente:
docker exec -it src-indexing-1 python /usr/src/app/search_my_site_scheduler.py
No debería haber ningún problema con varios programadores ejecutándose simultáneamente si lo activa manualmente y luego se ejecuta el trabajo programado.
Puede monitorear los registros de indexación a través de:
docker logs -f src-indexing-1
y puede cambiar LOG_LEVEL a DEBUG en src/indexing/indexer/settings.py.
El contenedor acoplable dev Solr se copia en la configuración durante la compilación, por lo que se requiere una docker compose build
para cada cambio de configuración.
Tenga en cuenta que el solr-precreate content /opt/solr/server/solr/configsets/content
en realidad no carga la nueva configuración después de una docker compose build
, por lo que se requieren los siguientes pasos para aplicar los cambios de configuración de 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
Dependiendo de los cambios, es posible que también necesite eliminar algunos o todos los datos del índice, por ejemplo
curl http://localhost:8983/solr/content/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>domain:michael-lewis.com</query></delete>'
y activar la reindexación como se indica arriba. Utilice <query>*:*</query>
para eliminar todos los datos del índice.
También puede eliminar y volver a crear el directorio data/solrdata y luego reconstruirlo para comenzar de nuevo.
Puede conectarse a la base de datos a través de:
"host": "127.0.0.1",
"user": "postgres",
"port": 5432,
"ssl": false,
"database": "searchmysitedb",
"password": <password-from-dotenv-file>
Los cambios de esquema deben aplicarse a los archivos src/db/sql/init*, de modo que si elimina y vuelve a crear el directorio data/sqldata, se aplica el esquema más reciente.
Para una experimentación básica con el ajuste de relevancia, puede agregar manualmente algunos sitios y experimentar con ellos. Recuerde asegurarse de que haya enlaces entre estos sitios, porque indexed_inlink_domains_count es un factor importante en la puntuación. Recuerde también que los valores indexed_inlink* pueden requerir que los sitios se indexen dos veces para estar configurados correctamente: el proceso de indexación establece los valores indexed_inlink* a partir de los valores indexed_outlink*, por lo que es necesario un primer paso para garantizar que todos los sitios tengan valores indexed_outlink* configurados.
Sin embargo, para un ajuste de relevancia importante, es mejor utilizar una restauración de la colección Solr de producción. Si está interesado en hacer esto, hágamelo saber y pondré uno actualizado a disposición.
Tenga en cuenta que si agrega nuevos campos al esquema de Solr que se utilizarán en la puntuación de relevancia, es mejor esperar hasta que se hayan agregado estos campos a todos los sitios antes de implementar los nuevos cambios en la puntuación de relevancia. Hay dos formas de hacerlo: forzar una reindexación de todos los sitios o esperar hasta que todos los sitios se reindexen de forma natural. Es más fácil y seguro esperar la reindexación natural. Es probable que la reindexación forzada de todo demore más de 24 horas, dado que la reindexación se realiza en lotes de 20 y algunos sitios tardan más de 1 hora en reindexarse, mientras que una reindexación natural tomará 3,5 días para garantizar que todos los sitios verificados se reindexen (28 días para sitios no verificados).
Las pruebas se ejecutan con pytest en una instancia de Flask local, por lo que deberá instalar pytest y configurar una instancia de Flask local según la sección "Realizar cambios en el desarrollo local"/"Cambios web" anterior. Si tiene ENABLE_PAYMENT=True, también necesitará configurar Selenium y WebDriver, porque la integración de Stripe implica botones que ejecutan JavaScript, por ejemplo:
pip3 install selenium
pip3 install chromedriver-py
Hay dos scripts de prueba:
clean_test_env.sh
: cierra cualquier instancia de la ventana acoplable de desarrollo, reconstruye e inicia las instancias de la ventana acoplable de prueba limpia.run_tests.sh
: configura las variables de entorno, ejecuta los scripts pytest y la indexación.Los scripts de pytest:
Para ejecutar:
cd ~/projects/searchmysite.net/tests
./clean_test_env.sh
./run_tests.sh
El paso de indexación tomará uno o dos minutos, dado que se realiza la indexación de sitios reales, y si ENABLE_PAYMENT=True verá una ventana emergente del navegador que tarda unos segundos en abrirse y cerrarse.
Si las pruebas tienen éxito, dejará el entorno en el mismo estado que estaba al principio, es decir, se limpiará después de sí mismo, por lo que no es necesario ejecutar clean_test_env.sh
antes de run_tests.sh
nuevamente. Sin embargo, si las pruebas fallan, deberá volver a ejecutar clean_test_env.sh
. Por la misma razón, si ejecuta accidentalmente run_tests.sh
contra el desarrollador en lugar de probar el entorno, por ejemplo, porque no ejecutó clean_test_env.sh
primero, si las pruebas tienen éxito, el entorno estará bien. Sin embargo, es mejor utilizar el entorno acoplable de prueba porque proporciona un punto de partida limpio y conocido y garantiza que la reindexación programada no interfiera con la indexación en la prueba.