Этот репозиторий содержит полную базу кода для 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-compose, которые во многом идентичны, за исключением:
Убедитесь, что 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 для dev настраивает веб-сервер для чтения из источника, поэтому можно вносить изменения в источник и перезагружать его. Для просмотра изменений обычно необходимо перезапустить веб-сервер:
docker exec -it web_dev apachectl restart
Для частых изменений лучше использовать среду разработки Flask вне Docker.
Для этого, во-первых, вам нужно будет настроить записи локального хоста для «db», «models» и «search», то есть в /etc/hosts (учитывая, что «веб-контейнер» взаимодействует с базой данных, моделями и контейнерами поиска). через имена хостов «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 .
Наконец, в начале каждого сеанса разработки загружайте переменные среды и запускайте 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 минуты для разработчиков) или запуск его вручную:
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 новые поля, которые будут использоваться при оценке релевантности, лучше подождать, пока эти поля будут добавлены на все сайты, прежде чем развертывать новые изменения оценки релевантности. Есть два способа сделать это: принудительно переиндексировать все сайты или подождать, пока все сайты не будут переиндексированы естественным путем. Проще и безопаснее дождаться естественного переиндексирования. Принудительная переиндексация всего, скорее всего, займет более 24 часов, учитывая, что переиндексация происходит партиями по 20 штук, а на переиндексацию некоторых сайтов уходит более 1 часа, тогда как естественная переиндексация займет 3,5 дня, чтобы гарантировать переиндексацию всех проверенных сайтов (28 дней для непроверенные сайты).
Тесты запускаются с помощью pytest на локальном экземпляре Flask, поэтому вам нужно будет установить pytest и настроить локальный экземпляр Flask в соответствии с разделом «Внесение изменений на локальном устройстве» / «Веб-изменения» выше. Если у вас ENABLE_PAYMENT=True, вам также потребуется настроить Selenium и WebDriver, поскольку интеграция Stripe включает в себя кнопки, которые выполняют JavaScript, например:
pip3 install selenium
pip3 install chromedriver-py
Есть два тестовых сценария:
clean_test_env.sh
— отключает все экземпляры докера для разработки, перестраивает и запускает экземпляры докера для чистого тестирования.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
для разработчика, а не тестировали env, например, потому что вы сначала не запустили clean_test_env.sh
, то, если тесты пройдут успешно, со средой все будет в порядке. Однако лучше использовать тестовую среду Docker, поскольку она обеспечивает известную чистую отправную точку и гарантирует, что запланированное переиндексирование не будет мешать индексированию при тестировании.