Repositori ini berisi basis kode lengkap untuk https://searchmysite.net/, mesin pencari sumber terbuka independen dan pencarian sebagai layanan untuk situs web pribadi dan independen (lihat Tentang searchmysite.net untuk rincian lebih lanjut tentang searchmysite.net).
Anda dapat menggunakan repositori ini untuk:
Aplikasi ini dibagi menjadi 5 komponen, masing-masing disebarkan dalam wadah Dockernya sendiri:
Struktur direktori proyek adalah sebagai berikut:
.
├── 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
Ada 3 file pembuat buruh pelabuhan, yang sebagian besar identik kecuali:
Pastikan Docker diinstal.
Dapatkan kode sumber dengan misalnya
cd ~/projects/
git clone https://github.com/searchmysite/searchmysite.net.git
Buat direktori data untuk database dan indeks pencarian:
cd ~/projects/searchmysite.net/
mkdir -p data/solrdata
mkdir -p data/sqldata
sudo chown 8983:8983 data/solrdata
Buat file ~/projects/searchmysite.net/src/.env untuk docker-compose.yml yang berisi setidaknya yang berikut:
POSTGRES_PASSWORD=<password>
SECRET_KEY=<secretkey>
POSTGRES_PASSWORD dan SECRET_KEY dapat berupa nilai apa pun yang Anda pilih untuk pengembang lokal. Perhatikan bahwa meskipun ini adalah satu-satunya nilai yang diperlukan agar aplikasi dasar dapat berfungsi, ada nilai lain yang perlu disiapkan untuk fungsionalitas tambahan - lihat bagian "Variabel lingkungan tambahan" di bawah.
Dan terakhir, buat image buruh pelabuhan:
cd ~/projects/searchmysite.net/src
docker compose build
Perhatikan bahwa pembuatan pertama dapat memakan waktu 20-30 menit, dan wadah model mengunduh file model 3Gb.
Dengan prasyarat yang ada, Anda dapat memulai lingkungan pengembangan Anda dengan:
cd ~/projects/searchmysite.net/src
docker compose up -d
Situs web akan tersedia di http://localhost:8080/, dan antarmuka admin Apache Solr di http://localhost:8983/solr/#/.
Jika Anda ingin dapat Menyetujui atau Menolak situs yang ditambahkan sebagai daftar Dasar, Anda perlu menyiapkan satu atau beberapa pengguna Admin. Hanya pemilik situs terverifikasi, yaitu pemilik situs yang memiliki daftar lengkap dan dapat login, yang dapat diberi izin sebagai pengguna Admin. Anda dapat menggunakan antarmuka web untuk menambahkan situs Anda sendiri sebagai daftar Lengkap melalui Tambah Situs, atau memasukkan detail langsung ke database.
Setelah Anda memiliki satu atau lebih pemilik situs terverifikasi, Anda dapat mengizinkan mereka sebagai Admin di database, misalnya:
INSERT INTO tblPermissions (domain, role)
VALUES ('michael-lewis.com', 'admin');
Anda dapat menggunakan Tambah Situs untuk menambahkan situs atau beberapa situs sebagai daftar Dasar melalui antarmuka web. Anda harus masuk sebagai pengguna Admin, klik Tinjau, dan pilih Setuju agar mereka dapat dimasukkan dalam antrean pengindeksan.
Ada juga skrip impor massal di src/db/bulkimport. checkdomains.py mengambil daftar domain atau halaman beranda sebagai masukan, memeriksa apakah situs tersebut valid, dan belum ada dalam daftar atau database, dan membuat file untuk disisipkan insertdomains.py.
Lihat juga pembahasannya di #91.
Jika Anda ingin menggunakan fungsi pengiriman email (misalnya formulir Kontak), Anda perlu menetapkan nilai berikut:
SMTP_SERVER=
SMTP_PORT=
SMTP_FROM_EMAIL=
SMTP_FROM_PASSWORD=
SMTP_TO_EMAIL=
Jika hanya pengujian, Anda dapat membuat akun email berbasis web dan menggunakan detail SMTP untuk itu.
Jika Anda ingin mengaktifkan mekanisme pembayaran untuk kiriman terverifikasi, Anda perlu mengatur:
ENABLE_PAYMENT=True
STRIPE_SECRET_KEY=
STRIPE_PUBLISHABLE_KEY=
STRIPE_PRODUCT_ID=
STRIPE_ENDPOINT_SECRET=
Jika sekedar pengujian, Anda bisa mendapatkan akun pengujian dari Stripe.
docker-compose.yml untuk dev mengonfigurasi server web untuk membaca dari sumber, sehingga perubahan dapat dilakukan pada sumber dan dimuat ulang. Server web biasanya harus dimulai ulang untuk melihat perubahan:
docker exec -it web_dev apachectl restart
Untuk perubahan yang sering terjadi, lebih baik menggunakan lingkungan pengembangan Flask di luar Docker.
Untuk melakukan ini, pertama-tama, Anda perlu menyiapkan entri host lokal untuk "db", "model" dan "pencarian", yaitu di /etc/hosts (mengingat wadah "web" berbicara dengan db, model, dan wadah pencarian melalui nama host "db", "models" dan "search"):
127.0.0.1 search
127.0.0.1 db
127.0.0.1 models
Kedua, instal Flask dan dependensi secara lokal (perhatikan bahwa Apache2-dev diperlukan untuk mod-wsgi dan libpq-dev untuk psycopg2), dan instal paket searchmysite dalam mode yang dapat diedit (langkah-langkah ini hanya perlu dilakukan satu kali):
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 .
Terakhir, di awal setiap sesi pengembangan, muat variabel lingkungan dan mulai Flask dalam mode pengembangan melalui:
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
Situs web Flask lokal Anda akan tersedia di misalnya http://localhost:5000/search/ (perhatikan bahwa laman beranda, yaitu http://localhost:5000/, tidak disajikan secara dinamis sehingga tidak akan tersedia melalui Flask) . Perubahan pada kode akan terlihat tanpa restart server, Anda akan melihat pesan log debug, dan jejak tumpukan penuh akan lebih terlihat jika terjadi kesalahan.
Seperti halnya penampung web, penampung pengindeksan di dev dikonfigurasi untuk membaca langsung dari sumbernya, jadi perubahan hanya perlu disimpan.
Anda biasanya memicu pengindeksan ulang dengan menjalankan SQL seperti:
UPDATE tblDomains
SET full_indexing_status = 'PENDING'
WHERE domain = 'michael-lewis.com';
dan menunggu src/indexing/indexer/run.sh berikutnya (hingga 1 menit pada dev), atau memicunya secara manual:
docker exec -it src-indexing-1 python /usr/src/app/search_my_site_scheduler.py
Seharusnya tidak ada masalah apa pun dengan beberapa penjadwal yang berjalan secara bersamaan jika Anda memicunya secara manual dan pekerjaan terjadwal kemudian berjalan.
Anda dapat memantau log pengindeksan melalui:
docker logs -f src-indexing-1
dan dapat mengubah LOG_LEVEL menjadi DEBUG di src/indexing/indexer/settings.py.
Kontainer buruh pelabuhan dev Solr menyalin konfigurasi pada build, sehingga docker compose build
diperlukan untuk setiap perubahan konfigurasi.
Perhatikan bahwa solr-precreate content /opt/solr/server/solr/configsets/content
tidak benar-benar memuat konfigurasi baru setelah docker compose build
, jadi langkah-langkah berikut diperlukan untuk menerapkan perubahan konfigurasi 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
Tergantung pada perubahannya, Anda mungkin juga perlu menghapus beberapa atau seluruh data dalam indeks, misalnya
curl http://localhost:8983/solr/content/update?commit=true -H "Content-Type: text/xml" --data-binary '<delete><query>domain:michael-lewis.com</query></delete>'
dan memicu pengindeksan ulang seperti di atas. Gunakan <query>*:*</query>
untuk menghapus semua data dalam indeks.
Anda juga dapat menghapus dan membuat ulang direktori data/solrdata, lalu membangunnya kembali, untuk awal yang baru.
Anda dapat terhubung ke database melalui:
"host": "127.0.0.1",
"user": "postgres",
"port": 5432,
"ssl": false,
"database": "searchmysitedb",
"password": <password-from-dotenv-file>
Perubahan skema harus diterapkan pada file src/db/sql/init* jadi jika Anda menghapus dan membuat ulang direktori data/sqldata, skema terbaru akan diterapkan.
Untuk eksperimen dasar dengan penyesuaian relevansi, Anda dapat menambahkan beberapa situs secara manual, dan bereksperimen dengan situs tersebut. Ingatlah untuk memastikan ada tautan di antara situs-situs ini, karena jumlah_domain_link_yang diindeks merupakan faktor penting dalam penilaian. Ingat juga bahwa nilai indexed_inlink* mungkin mengharuskan situs diindeks dua kali agar dapat disetel dengan benar - proses pengindeksan menetapkan nilai indexed_inlink* dari nilai indexed_outlink*, sehingga memerlukan langkah pertama untuk memastikan semua situs memiliki nilai indexed_outlink* yang disetel.
Namun, untuk penyetelan relevansi yang serius, lebih baik menggunakan pemulihan koleksi Solr produksi. Jika Anda tertarik melakukan hal ini, beri tahu saya dan saya akan menyediakan yang terbaru.
Perhatikan bahwa jika Anda menambahkan bidang baru ke skema Solr yang akan digunakan dalam penilaian relevansi, lebih baik menunggu sampai semua situs telah menambahkan bidang ini sebelum menerapkan perubahan penilaian relevansi baru. Ada dua cara untuk melakukannya: memaksa pengindeksan ulang semua situs, atau menunggu hingga semua situs diindeks ulang secara alami. Lebih mudah dan aman menunggu indeks ulang alami. Pengindeksan ulang secara paksa untuk segala sesuatu kemungkinan akan memakan waktu lebih dari 24 jam mengingat pengindeksan ulang terjadi dalam batch 20 dan beberapa situs memerlukan waktu lebih dari 1 jam untuk mengindeks ulang, sedangkan pengindeksan ulang alami akan memakan waktu 3,5 hari untuk memastikan semua situs terverifikasi diindeks ulang (28 hari untuk situs yang belum terverifikasi).
Pengujian dijalankan dengan pytest pada instance Flask lokal, jadi Anda perlu menginstal pytest dan menyiapkan instance Flask lokal sesuai bagian "Melakukan perubahan pada pengembang lokal"/"Perubahan web" di atas. Jika Anda memiliki ENABLE_PAYMENT=True, Anda juga perlu mengatur Selenium dan WebDriver, karena integrasi Stripe melibatkan tombol yang menjalankan JavaScript, misalnya:
pip3 install selenium
pip3 install chromedriver-py
Ada dua skrip pengujian:
clean_test_env.sh
- mematikan semua instance docker dev, membangun kembali dan memulai instance docker pengujian bersih.run_tests.sh
- menyiapkan variabel lingkungan, menjalankan skrip pytest dan pengindeksan.Skrip paling sederhana:
Untuk menjalankan:
cd ~/projects/searchmysite.net/tests
./clean_test_env.sh
./run_tests.sh
Langkah pengindeksan akan memakan waktu satu atau dua menit, mengingat ia melakukan pengindeksan situs sebenarnya, dan jika ENABLE_PAYMENT=True Anda akan melihat browser muncul yang memerlukan beberapa detik untuk membuka dan menutup.
Jika pengujian berhasil, lingkungan akan tetap dalam keadaan yang sama seperti saat awal, yaitu lingkungan akan dibersihkan sendiri, sehingga Anda tidak perlu menjalankan clean_test_env.sh
sebelum run_tests.sh
lagi. Namun jika pengujian gagal, Anda perlu menjalankan kembali clean_test_env.sh
. Untuk alasan yang sama, jika Anda secara tidak sengaja menjalankan run_tests.sh
terhadap dev daripada test env, misalnya karena Anda tidak menjalankan clean_test_env.sh
terlebih dahulu, maka jika pengujian berhasil maka lingkungan akan baik-baik saja. Lebih baik menggunakan lingkungan buruh pelabuhan pengujian karena ini memberikan titik awal yang bersih, dan memastikan pengindeksan ulang terjadwal tidak mengganggu pengindeksan dalam pengujian.