Este repositório contém a base de código completa para https://searchmysite.net/, o mecanismo de pesquisa independente de código aberto e pesquisa como serviço para sites pessoais e independentes (consulte Sobre searchmysite.net para obter mais detalhes sobre searchmysite.net).
Você pode usar este repositório para:
O aplicativo é dividido em 5 componentes, cada um implantado em seu próprio contêiner Docker:
A estrutura de diretórios do projeto é a seguinte:
.
├── 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
Existem 3 arquivos docker-compose, que são praticamente idênticos, exceto:
Certifique-se de que o Docker esteja instalado.
Obtenha o código fonte com, por exemplo
cd ~/projects/
git clone https://github.com/searchmysite/searchmysite.net.git
Crie os diretórios de dados para o banco de dados e o índice de pesquisa:
cd ~/projects/searchmysite.net/
mkdir -p data/solrdata
mkdir -p data/sqldata
sudo chown 8983:8983 data/solrdata
Crie um arquivo ~/projects/searchmysite.net/src/.env para docker-compose.yml contendo pelo menos o seguinte:
POSTGRES_PASSWORD=<password>
SECRET_KEY=<secretkey>
POSTGRES_PASSWORD e SECRET_KEY podem ser quaisquer valores que você escolher para desenvolvimento local. Observe que embora esses sejam os únicos valores necessários para o funcionamento do aplicativo básico, há outros valores que precisarão ser configurados para funcionalidade adicional - consulte a seção "Variáveis de ambiente adicionais" abaixo.
E, finalmente, crie as imagens do Docker:
cd ~/projects/searchmysite.net/src
docker compose build
Observe que a primeira compilação pode levar de 20 a 30 minutos e o contêiner de modelos baixa um arquivo de modelo de 3 Gb.
Com os pré-requisitos implementados, você pode iniciar seu ambiente de desenvolvimento com:
cd ~/projects/searchmysite.net/src
docker compose up -d
O site estará disponível em http://localhost:8080/ e a interface de administração do Apache Solr em http://localhost:8983/solr/#/.
Se quiser aprovar ou rejeitar sites adicionados como uma listagem básica, você precisará configurar um ou mais usuários administradores. Somente proprietários de sites verificados, ou seja, aqueles com uma listagem completa e capazes de fazer login, podem ter permissão como usuários administradores. Você pode usar a interface da web para adicionar seu próprio site como listagem completa por meio de Adicionar site ou inserir detalhes diretamente no banco de dados.
Depois de ter um ou mais proprietários de sites verificados, você pode permiti-los como administradores no banco de dados, por exemplo:
INSERT INTO tblPermissions (domain, role)
VALUES ('michael-lewis.com', 'admin');
Você pode usar Adicionar Site para adicionar um site ou sites como uma listagem Básica por meio da interface da web. Você precisará fazer login como usuário administrador, clicar em Revisar e selecionar Aprovar para que eles sejam colocados na fila para indexação.
Também existem scripts de importação em massa em src/db/bulkimport. checkdomains.py pega uma lista de domínios ou páginas iniciais como entrada, verifica se eles são sites válidos e se ainda não estão na lista ou no banco de dados e gera um arquivo para insertdomains.py inserir.
Veja também a discussão em #91.
Se quiser utilizar a funcionalidade de envio de e-mails (por exemplo, o formulário de contato), você precisará definir os seguintes valores:
SMTP_SERVER=
SMTP_PORT=
SMTP_FROM_EMAIL=
SMTP_FROM_PASSWORD=
SMTP_TO_EMAIL=
Se estiver apenas testando, você pode criar uma conta de e-mail baseada na web e usar os detalhes do SMTP para isso.
Se quiser ativar o mecanismo de pagamento para envios verificados, você precisará definir:
ENABLE_PAYMENT=True
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
STRIPE_PRODUCT_ID=
STRIPE_ENDPOINT_SECRET=
Se estiver apenas testando, você pode obter uma conta de teste do Stripe.
O docker-compose.yml para dev configura o servidor web para ler a fonte, para que alterações possam ser feitas na fonte e recarregadas. O servidor web normalmente precisará ser reiniciado para visualizar as alterações:
docker exec -it web_dev apachectl restart
Para mudanças frequentes, é melhor usar um ambiente de desenvolvimento Flask fora do Docker.
Para fazer isso, primeiro você precisará configurar entradas de host local para "db", "models" e "search", ou seja, em /etc/hosts (dado que o contêiner "web" se comunica com o banco de dados, modelos e contêineres de pesquisa através dos nomes de host "db", "models" e "search"):
127.0.0.1 search
127.0.0.1 db
127.0.0.1 models
Em segundo lugar, instale o Flask e as dependências localmente (observando que apache2-dev é necessário para mod-wsgi e libpq-dev para psycopg2) e instale o pacote searchmysite em modo editável (essas etapas só precisam ser executadas uma 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, no início de cada sessão de desenvolvimento, carregue as variáveis de ambiente e inicie o Flask no modo de desenvolvimento via:
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
Seu site local do Flask estará disponível, por exemplo, http://localhost:5000/search/ (observe que a página inicial, ou seja, http://localhost:5000/, não é veiculada dinamicamente, portanto não estará disponível via Flask) . As alterações no código serão refletidas sem a reinicialização do servidor, você verá mensagens de log de depuração e os rastreamentos completos da pilha ficarão mais visíveis em caso de erros.
Tal como acontece com o contêiner da web, o contêiner de indexação no dev é configurado para ler diretamente da fonte, portanto, as alterações só precisam ser salvas.
Normalmente, você acionaria uma reindexação executando SQL como:
UPDATE tblDomains
SET full_indexing_status = 'PENDING'
WHERE domain = 'michael-lewis.com';
e aguardando o próximo src/indexing/indexer/run.sh (até 1 min no dev) ou acionando-o manualmente:
docker exec -it src-indexing-1 python /usr/src/app/search_my_site_scheduler.py
Não deverá haver problemas com vários agendadores em execução simultaneamente se você acioná-los manualmente e o trabalho agendado for executado.
Você pode monitorar os logs de indexação por meio de:
docker logs -f src-indexing-1
e pode alterar LOG_LEVEL para DEBUG em src/indexing/indexer/settings.py.
O contêiner docker dev Solr copia na configuração na compilação, portanto, uma docker compose build
é necessária para cada alteração na configuração.
Observe que solr-precreate content /opt/solr/server/solr/configsets/content
na verdade não carrega a nova configuração após um docker compose build
, portanto, as etapas a seguir são necessárias para aplicar as alterações de configuração do 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
Dependendo das alterações, você também pode precisar excluir alguns ou todos os dados do índice, por exemplo
curl http://localhost:8983/solr/content/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>domain:michael-lewis.com</query></delete>'
e acionar a reindexação conforme acima. Use <query>*:*</query>
para excluir todos os dados do índice.
Você também pode excluir e recriar o diretório data/solrdata e, em seguida, reconstruí-lo para um novo começo.
Você pode se conectar ao banco de dados via:
"host": "127.0.0.1",
"user": "postgres",
"port": 5432,
"ssl": false,
"database": "searchmysitedb",
"password": <password-from-dotenv-file>
As alterações de esquema devem ser aplicadas aos arquivos src/db/sql/init*, portanto, se você excluir e recriar o diretório data/sqldata, o esquema mais recente será aplicado.
Para experiências básicas com ajuste de relevância, você pode adicionar manualmente alguns sites e fazer experiências com eles. Lembre-se de garantir que haja links entre esses sites, pois indexed_inlink_domains_count é um fator importante na pontuação. Lembre-se também de que os valores indexed_inlink* podem exigir que os sites sejam indexados duas vezes para serem definidos corretamente - o processo de indexação define os valores indexed_inlink* a partir dos valores indexed_outlink*, portanto, precisa de uma primeira passagem para garantir que todos os sites tenham valores indexed_outlink* definidos.
No entanto, para um ajuste de relevância sério, é melhor usar uma restauração da coleção Solr de produção. Se você estiver interessado em fazer isso, me avise e disponibilizarei um atualizado.
Observe que se você adicionar novos campos ao esquema Solr que serão usados na pontuação de relevância, é melhor esperar até que todos os sites tenham esses campos adicionados antes de implementar as novas alterações de pontuação de relevância. Existem duas maneiras de fazer isso: forçar uma reindexação de todos os sites ou esperar até que todos os sites sejam reindexados naturalmente. É mais fácil e seguro aguardar a reindexação natural. A reindexação forçada de tudo provavelmente levará mais de 24 horas, já que a reindexação ocorre em lotes de 20 e alguns sites levam mais de 1 hora para reindexar, enquanto uma reindexação natural levará 3,5 dias para garantir que todos os sites verificados sejam reindexados (28 dias para sites não verificados).
Os testes são executados com pytest em uma instância local do Flask, portanto, você precisará instalar o pytest e configurar uma instância local do Flask conforme a seção "Fazendo alterações no desenvolvedor local"/"Alterações na Web" acima. Se você tiver ENABLE_PAYMENT=True, também precisará configurar o Selenium e o WebDriver, pois a integração do Stripe envolve botões que executam JavaScript, por exemplo:
pip3 install selenium
pip3 install chromedriver-py
Existem dois scripts de teste:
clean_test_env.sh
- desliga qualquer instância do dev docker, reconstrói e inicia as instâncias limpas do docker de teste.run_tests.sh
- configura as variáveis de ambiente, executa os scripts pytest e a indexação.Os scripts pytest:
Para executar:
cd ~/projects/searchmysite.net/tests
./clean_test_env.sh
./run_tests.sh
A etapa de indexação levará um ou dois minutos, visto que está realizando a indexação de sites reais, e se ENABLE_PAYMENT=True você verá um navegador pop-up que leva alguns segundos para abrir e fechar.
Se os testes forem bem-sucedidos, ele deixará o ambiente no mesmo estado em que estava no início, ou seja, ele se limpará, então você não precisa executar clean_test_env.sh
antes de run_tests.sh
novamente. Se, no entanto, os testes falharem, você precisará executar novamente clean_test_env.sh
. Pela mesma razão, se você acidentalmente executar run_tests.sh
no ambiente dev em vez de testar, por exemplo, porque você não executou clean_test_env.sh
primeiro, se os testes forem bem-sucedidos, o ambiente ficará bem. É melhor usar o ambiente docker de teste porque ele fornece um ponto de partida limpo e conhecido e garante que a reindexação agendada não interfira na indexação no teste.