이 저장소에는 독립적인 오픈 소스 검색 엔진이자 개인 및 독립 웹사이트를 위한 서비스로서의 검색인 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
최소한 다음을 포함하는 docker-compose.yml에 대한 ~/projects/searchmysite.net/src/.env 파일을 만듭니다.
POSTGRES_PASSWORD=<password>
SECRET_KEY=<secretkey>
POSTGRES_PASSWORD 및 SECRET_KEY는 로컬 개발에 대해 선택한 모든 값이 될 수 있습니다. 이는 기본 애플리케이션이 작동하는 데 필요한 유일한 값이지만 추가 기능을 위해 설정해야 하는 다른 값도 있습니다. 아래의 "추가 환경 변수" 섹션을 참조하세요.
마지막으로 Docker 이미지를 빌드합니다.
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/#/에서 사용할 수 있습니다.
기본 목록으로 추가된 사이트를 승인하거나 거부하려면 한 명 이상의 관리자를 설정해야 합니다. 확인된 사이트 소유자, 즉 전체 목록이 있고 로그인할 수 있는 사이트 소유자만 관리자 권한을 부여받을 수 있습니다. 웹 인터페이스를 사용하여 사이트 추가를 통해 자신의 사이트를 전체 목록으로 추가하거나 세부 정보를 데이터베이스에 직접 삽입할 수 있습니다.
확인된 사이트 소유자가 한 명 이상 있으면 데이터베이스에서 관리자 권한을 부여할 수 있습니다. 예:
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은 소스에서 읽도록 웹 서버를 구성하므로 소스에서 변경 사항을 적용하고 다시 로드할 수 있습니다. 변경 사항을 보려면 일반적으로 웹 서버를 다시 시작해야 합니다.
docker exec -it web_dev apachectl restart
변경이 잦은 경우 Docker 외부의 Flask 개발 환경을 사용하는 것이 좋습니다.
이를 수행하려면 먼저 "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와 종속성을 로컬에 설치하고(mod-wsgi에는 apache2-dev가 필요하고 psycopg2에는 libpq-dev가 필요하다는 점에 유의) 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
src/indexing/indexer/settings.py에서 LOG_LEVEL을 DEBUG로 변경할 수 있습니다.
dev Solr docker 컨테이너는 빌드 시 구성을 복사하므로 각 구성 변경에 대해 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_outlink* 값에서 indexed_inlink* 값을 설정하므로 모든 사이트에 indexed_outlink* 값이 설정되도록 하려면 첫 번째 단계가 필요합니다.
그러나 심각한 관련성 조정을 위해서는 프로덕션 Solr 컬렉션의 복원을 사용하는 것이 좋습니다. 이 작업에 관심이 있으시면 알려주세요. 최신 정보를 제공하겠습니다.
관련성 점수에 사용할 Solr 스키마에 새 필드를 추가하는 경우 새 관련성 점수 변경 사항을 배포하기 전에 모든 사이트에 이러한 필드가 추가될 때까지 기다리는 것이 좋습니다. 이를 수행하는 방법에는 두 가지가 있습니다. 모든 사이트를 강제로 다시 색인화하거나 모든 사이트가 자연스럽게 다시 색인화될 때까지 기다리는 것입니다. 자연적인 재색인을 기다리는 것이 더 쉽고 안전합니다. 재색인이 20개 일괄적으로 이루어지고 일부 사이트는 재색인을 생성하는 데 1시간 이상이 소요되는 점을 고려하면 모든 항목의 강제 재색인 재색인은 24시간 이상 걸릴 수 있습니다. 반면 자연 재색인은 확인된 모든 사이트의 재색인을 보장하는 데 3.5일이 소요됩니다. 확인되지 않은 사이트).
테스트는 로컬 Flask 인스턴스에서 pytest로 실행되므로 위의 "로컬 개발에서 변경"/"웹 변경" 섹션에 따라 pytest를 설치하고 로컬 Flask 인스턴스를 설정해야 합니다. ENABLE_PAYMENT=True인 경우 Stripe 통합에는 JavaScript를 실행하는 버튼이 포함되므로 Selenium 및 WebDriver도 설정해야 합니다. 예:
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
실제 사이트의 색인을 수행하는 경우 색인 단계는 1~2분 정도 소요되며, ENABLE_PAYMENT=True인 경우 열고 닫는 데 몇 초가 걸리는 브라우저 팝업이 표시됩니다.
테스트가 성공하면 환경이 시작 시와 동일한 상태로 유지됩니다. 즉, 자체적으로 정리되므로 run_tests.sh
다시 실행하기 전에 clean_test_env.sh
실행할 필요가 없습니다. 그러나 테스트가 실패하면 clean_test_env.sh
다시 실행해야 합니다. 같은 이유로 실수로 테스트 환경이 아닌 개발 환경에 대해 run_tests.sh
실행한 경우(예: clean_test_env.sh
먼저 실행하지 않았기 때문에) 테스트가 성공하면 환경은 괜찮을 것입니다. 하지만 테스트 도커 환경을 사용하는 것이 더 좋습니다. 이는 알려진 명확한 시작 지점을 제공하고 예약된 재인덱싱이 테스트의 인덱싱을 방해하지 않도록 보장하기 때문입니다.