После установки wiki.js у меня возник вопрос, а как сделать что бы поисковики могли нормально индексировать все страницы. Немного порывшись в интернете я пришел к необходимости составления sitemap. Роботы поисковиков, в теории, должны и сами составлять этот sitemap, но видимо они не умеют в csr (Client-Side Rendering).
Вручную постоянно добавлять url`ы я не хочу, поэтому пришлось что-то думать и автоматизировать процесс.
Curl, как и обычные роботы поисковиков, не рендерит страничку. Для рендера пришлось ставить rendertron. Хоть приложение и древнее да ещё и находиться уже в архиве, работает неплохо.
Немного об окружении:
В качестве хоста используется lxc контейнер с debian 11. В нем установлен docker, в docker`е крутиться на 3000 порту сам wiki.js.
Что бы перенаправлять необходимые запросы в контейнер использую nginx, xml и txt файлы беру локальные. Часть nginx конфига:
root /var/www/wikijs;
location ~* \.(xml|txt)$ {
try_files $uri =404;
}
mkdir /render
cd /render
apt-get update
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
apt install -y nodejs
git clone https://github.com/GoogleChrome/rendertron.git
cd rendertron
Ставим кучу пакетов, нужных для rendertron:
apt-get install libatk1.0-* libatk-bridge2.0-* libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxcomposite1 libcups2 libdrm2 libxkbcommon0 libxcomposite1 libxdamage1 libxrandr2 libgbm1 libpango-1.0-0 libasound2 libcairo2 libxshmfence1 libnss3 -y
Сделаем небольшой systemd сервис для rendertron:
vim /etc/systemd/system/rendertron.service
[Unit] Description=rendertron service [Service] Type=simple ExecStart=/render/rendertron.sh [Install] WantedBy=multi-user.target
Заполняем сам скрипт для старта:
vim /render/rendertron.sh
#!/bin/bash cd /render/rendertron && PORT=3002 npm start
Заполняем файл сервиса:
vim /etc/systemd/system/sitemap_gen.service
[Unit] Description=rendertron service [Service] Type=simple ExecStart=/render/sitemap_gen.sh [Install] WantedBy=multi-user.target
Заполняем файл скрипта:
vim /render/sitemap_gen.sh
#!/bin/bash systemctl start rendertron.service sleep 10 BASE_URL="http://localhost:3002/render/http://127.0.0.1:3000" DOMAIN="https://wiki.example.ru" OUTPUT_FILE="/var/www/wikijs/sitemap.xml" REGION=ru HTML=$(curl -s "$BASE_URL") LINKS=$(echo "$HTML" | grep -oP '(?<=href=")[^"]*' | \ grep -E "^/|^$DOMAIN" | \ sed "s|^/|$DOMAIN/|" | grep \/$REGION | \ sort | uniq) { echo '<?xml version="1.0" encoding="UTF-8"?>' echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' for LINK in $LINKS; do echo " <url>" echo " <loc>$LINK</loc>" echo " </url>" done echo '</urlset>' } > "$OUTPUT_FILE" systemctl stop rendertron.service
Переменные необходимо изменить под себя
Заполняем файл таймера:
vim /etc/systemd/system/sitemap_gen.timer
[Unit] Description=start sitemap generator at 5am [Timer] OnCalendar=*-*-* 05:00:00 Persistent=true [Install] WantedBy=timers.target
Каждый день в 5 утра будет запускаться сервис и переконфигурировать sitemap.xml
Перечитываем демонов:
systemctl daemon-reload
Запускаем таймер:
systemctl enable --now sitemap_gen.timer