SSD Nodes Learn Hosting plans →
راهنماها Matt Connorتوسط Matt Connor · به‌روزرسانی شده 2026-08-28

آموزش نصب و میزبانی شخصی موتور جستجوی Hister

با نصب Hister روی VPS، تمام صفحات بازدید شده و فایل‌های شخصی خود را نمایه‌سازی کنید. این راهنما شامل مراحل نصب Docker، تنظیمات TLS، احراز هویت و پیکربندی MCP برای جستجوی هوشمند است.

Hister چیست و چه چیزی نیست

Hister یک موتور جستجوی شخصی است که آن را روی سرور خود میزبانی می‌کنید. این ابزار متن کامل صفحاتی که بازدید کرده‌اید و فایل‌هایی که نگهداری می‌کنید را نمایه‌سازی (index) می‌کند و سپس به شما اجازه می‌دهد از طریق یک رابط وب، کلاینت ترمینال، HTTP API یا یک دستیار هوش مصنوعی (AI) در آن مجموعه جستجو کنید. Hister به یک پرسش پاسخ می‌دهد: «آن مطلب را کجا خواندم؟»

بیشتر خوانندگان این ایده را از طریق SearXNG می‌شناسند، اما این دو ابزار یکسان نیستند. اگر نامی که می‌شناسید Searx قدیمی‌تر است، این پروژه از سال 2023 تاکنون هیچ commit کدی نداشته و SearXNG مسیر آن را ادامه می‌دهد؛ بنابراین نمونه‌ای که امروز راه‌اندازی می‌کنید، در هر صورت SearXNG است. SearXNG یک proxy فرابازجست‌وجو است. query شما به آن ارسال می‌شود، SearXNG از طرف شما از موتورهای دیگر درخواست می‌کند و نتایج آن‌ها را پس از حذف tracking برمی‌گرداند. index متعلق به همان موتورهای جست‌وجو است. Hister index خود را از محتوایی می‌سازد که در اختیارش قرار می‌دهید: صفحه‌هایی که یک browser extension ثبت کرده است، browser history واردشده، URLهایی که crawl شده‌اند و فایل‌های موجود در directoryهایی که به آن معرفی می‌کنید. یک نمونهٔ SearXNG با میزبانی شخصی دسترسی خصوصی به وب عمومی فراهم می‌کند. Hister امکان جست‌وجو در مطالبی را فراهم می‌کند که خودتان مطالعه کرده‌اید. این دو وظیفه متفاوتی دارند؛ بنابراین اجرای هر دو روی یک سرور کاملاً معمول است. اگر هر دو را اجرا می‌کنید، بهتر است بدانید SearXNG واقعاً چه مقدار از جست‌وجوهای شما را پنهان می‌کند؛ زیرا SearXNG در موتورهای جست‌وجو IP شما را با IP سرورتان جایگزین می‌کند، نه این‌که خود queryها را پنهان کند.

Hister نرم‌افزاری آزاد تحت مجوز AGPLv3 (مجوز عمومی همگانی آفرو گنو، نسخه 3) یا نسخه‌های بعدی است. این ابزار هیچ‌گونه تله‌متری ندارد و به هیچ سرویس ابری وابسته نیست. این راهنما نسخه v0.17.0 را هدف قرار داده است که در تاریخ 2026-07-28 نسخه جاری (release) بود. پیش از کپی کردن هر دستوری، صفحه نسخه‌ها (releases) را برای یافتن تگ فعلی بررسی کنید و سپس تگی که در آنجا می‌بینید را جایگزین کنید.

چرا Hister را روی یک VPS میزبانی کنیم

یک ایندکس تنها زمانی مفید است که کامل باشد، و تنها در صورتی کامل است که سرور در حین مطالعهٔ شما در حال اجرا بوده باشد. لپ‌تاپ نیمی از روز را در حالت خواب (sleep) سپری می‌کند. صفحاتی که در آن زمان با گوشی خود باز می‌کنید هرگز به سرور نمی‌رسند و عملیات import که شبانه آغاز شده باشد، هرگز شروع نمی‌شود. یک VPS (سرور مجازی خصوصی) همیشه روشن است؛ بنابراین تمام دستگاه‌های شما داده‌ها را به یک ایندکس واحد ارسال می‌کنند و خزنده (crawler) در حالی که شما خواب هستید، به کار خود ادامه می‌دهد.

دلیل دوم، جداسازی است. تنظیم user_handling: true در بخش app به هر حساب کاربری، اعتبارنامه‌های اختصاصی و مجموعه اسناد مجزای خود را در یک نمونه (instance) واحد می‌دهد. بدین ترتیب، یک سرور می‌تواند نیازهای یک خانواده یا یک تیم کوچک را بدون اینکه کسی بتواند مطالب مطالعه‌شده توسط دیگری را جستجو کند، پوشش دهد.

دلیل سوم، زیرساخت اتصال است. VPS از قبل یک نام میزبان عمومی و یک گواهی دارد؛ افزونهٔ مرورگر برای دسترسی به سرور از شبکه‌ای که کنترل آن را در اختیار ندارید، به همین موارد نیاز دارد. همین جفت در بخش‌های دیگری از سرور نیز کاربرد دارد، زیرا openGym اولین passkey خود را در برابر نام میزبانی ثبت می‌کند که در آن زمان فعال است؛ بنابراین نام و گواهی باید پیش از ایجاد نخستین حساب نهایی شده باشند.

نصب مسیر یک: فایل باینری نسخه منتشر شده

Hister برای هر پلتفرم یک فایل باینری ارائه می‌دهد. آن را به همراه فایل checksum دانلود کنید و پیش از نصب، صحت آن را بررسی نمایید.

cd /tmp
curl -LO https://github.com/asciimoo/hister/releases/download/v0.17.0/hister_0.17.0_linux_amd64
curl -LO https://github.com/asciimoo/hister/releases/download/v0.17.0/hister_0.17.0_checksums.txt
sha256sum --ignore-missing -c hister_0.17.0_checksums.txt

نتیجه سالم، نمایش خط واحد hister_0.17.0_linux_amd64: OK است. مشاهده خط FAILED به این معناست که فایل دانلود شده آسیب دیده یا تغییر یافته است؛ بنابراین به جای نصب، دوباره آن را دانلود کنید.

فایل باینری را نصب کرده و سپس یک حساب کاربری سیستمی و دایرکتوری‌هایی که از آن استفاده خواهد کرد را ایجاد کنید.

sudo install -m 755 /tmp/hister_0.17.0_linux_amd64 /usr/local/bin/hister
sudo useradd --system --home-dir /var/lib/hister --shell /usr/sbin/nologin hister
sudo install -d -o hister -g hister -m 750 /var/lib/hister
sudo install -d -m 755 /etc/hister
sudo hister create-config /etc/hister/config.yml

دستور create-config یک فایل پیکربندی پیش‌فرض ایجاد می‌کند و همچنین ثابت می‌کند که فایل باینری روی این ماشین اجرا می‌شود. دانلود فایل برای معماری اشتباه، دقیقاً در همین مرحله با خطای cannot execute binary file: Exec format error شکست می‌خورد.

تنظیمات مهم را ویرایش کنید. باقی محتویات فایل تولید شده می‌تواند به همان شکل باقی بماند.

app:
  directory: /var/lib/hister
  access_token: 'paste-a-long-random-string-here'
server:
  address: 127.0.0.1:4433
  base_url: https://hister.example.com

توکن را با استفاده از openssl rand -hex 32 تولید کنید. این فایل اکنون حاوی یک اعتبارنامه است، بنابراین پیش از شروع به کار سرویس، دسترسی به آن را محدود کنید.

sudo chown root:hister /etc/hister/config.yml
sudo chmod 640 /etc/hister/config.yml

اجرای آن تحت systemd

فایل /etc/systemd/system/hister.service را بنویسید:

[Unit]
Description=Hister personal search engine
After=network-online.target
Wants=network-online.target

[Service]
User=hister
Group=hister
Environment=HISTER_CONFIG=/etc/hister/config.yml
ExecStart=/usr/local/bin/hister listen
Restart=on-failure
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/hister

[Install]
WantedBy=multi-user.target

متغیر محیطی HISTER_CONFIG مسیر پیکربندی مستندشده است، بنابراین unit به دایرکتوری home حساب کاربری hister وابسته نخواهد بود. گزینه ProtectSystem=strict کل سیستم فایل را برای این سرویس فقط‌خواندنی (read-only) می‌کند، به همین دلیل ReadWritePaths باید مسیر دایرکتوری داده را مشخص کند. گزینه ProtectHome=yes مسیر /home را از دید سرویس مخفی می‌کند، بنابراین یک دایرکتوری تحت نظارت در /home برای ایندکس‌کننده خالی به نظر می‌رسد. اگر نیاز دارید فایل‌های آنجا را ایندکس کنید، این خط را حذف کنید.

sudo systemctl daemon-reload
sudo systemctl enable --now hister
systemctl status hister --no-pager
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:4433/

هر کد وضعیت HTTP که توسط دستور آخر چاپ شود، به این معنی است که پردازش در حال گوش دادن است. کد curl: (7) Failed to connect به این معنی است که سرویس در حال گوش دادن نیست و journalctl -u hister -n 50 --no-pager دلیل آن را اعلام خواهد کرد.

روش نصب دوم: Docker Compose

این ایمیج در GitHub container registry منتشر شده است و برای هر نسخه (release)، یک تگ اختصاصی دارد.

services:
  hister:
    image: ghcr.io/asciimoo/hister:v0.17.0
    container_name: hister
    user: '1000:1000'
    restart: unless-stopped
    environment:
      - HISTER__SERVER__ADDRESS=0.0.0.0:4433
      - HISTER__SERVER__BASE_URL=https://hister.example.com
      - HISTER__APP__ACCESS_TOKEN=${HISTER_ACCESS_TOKEN}
    volumes:
      - ./data:/hister/data
    ports:
      - 127.0.0.1:4433:4433

هر کلید پیکربندی دارای یک جایگزین محیطی (environment override) به فرمت HISTER__<SECTION>__<KEY> است که در آن از دو کاراکتر زیرخط به عنوان جداکننده استفاده می‌شود؛ بنابراین در استقرار کانتینری نیازی به mount کردن فایل پیکربندی نیست. مقدار HISTER_ACCESS_TOKEN را در یک فایل .env در کنار فایل compose نگه دارید. اگر ترجیح می‌دهید فایل را ویرایش کنید، دستور docker run --rm ghcr.io/asciimoo/hister:v0.17.0 create-config > config.yml مقادیر پیش‌فرض را چاپ می‌کند.

اشتباه در دو خط بالا بسیار رایج است و درک هر دو مورد اهمیت دارد.

آدرس داخل کانتینر باید 0.0.0.0:4433 باشد. هر کانتینر فضای نام شبکه (network namespace) اختصاصی خود را دارد؛ بنابراین فرآیندی که روی 127.0.0.1 در داخل کانتینر bind شده باشد، فقط از داخل همان کانتینر قابل دسترسی است و پورت منتشرشده (published port) مقصدی برای هدایت ترافیک نخواهد داشت.

پورت منتشرشده باید به صورت 127.0.0.1:4433:4433 نوشته شود، نه 4433:4433. داکر پورت‌ها را با درج قوانین netfilter اختصاصی خود منتشر می‌کند و این قوانین پیش از قوانین ufw ارزیابی می‌شوند؛ بنابراین یک 4433:4433 ساده، حتی در سروری که ufw status وضعیت پورت را بسته نشان می‌دهد، همچنان از اینترنت قابل دسترسی باقی می‌ماند. bind کردن سمت host روی 127.0.0.1 باعث می‌شود reverse proxy تنها راه ورود باشد. همین تله برای تمام کانتینرهای روی سرور صدق می‌کند و Docker Compose روی VPS سایر جزئیات مربوط به این موضوع را پوشش می‌دهد.

ایمیج پیش‌فرض با UID 1000 و GID 1000 اجرا می‌شود، بنابراین مسیر ./data باید توسط آن حساب کاربری قابل نوشتن باشد، در غیر این صورت کانتینر هنگام شروع به دلیل خطای مجوز (permission error) متوقف می‌شود. دستور sudo chown -R 1000:1000 ./data این مشکل را برطرف می‌کند. اگر با این اعداد آشنا نیستید، ابتدا اینکه یک کانتینر فایل‌ها را با چه UID و GID می‌نویسد را مطالعه کنید.

چرا افشای یک نمایه جستجوی شخصی خطرناک‌ترین کار است

برنامه Hister به‌صورت پیش‌فرض روی 127.0.0.1:4433 گوش می‌دهد و این انتخاب کاملاً آگاهانه است. به محتوایی که این نمایه پس از یک ماه استفاده در خود جای می‌دهد فکر کنید: صفحات ویکی داخلی، فاکتورها، تیکت‌های پشتیبانی که در زمان ورود به سیستم باز کرده‌اید، صفحات بازنشانی رمز عبور و متن کامل هر چیزی که مطالعه کرده‌اید. مستندات پروژه مستقیماً به این موضوع اشاره دارد: "Hister کل تاریخچه مرور شما، شامل محتوای صفحات را به سرور ارسال و از آن دریافت می‌کند."

یک پایگاه داده رمز عبور لو رفته، همچنان نیاز به کرک شدن دارد. اما یک نمایه شخصی لو رفته، متن ساده و قابل جستجو است؛ بنابراین این ابزار به مراقبتی بسیار فراتر از یک برنامه کوچک self-hosted معمولی نیاز دارد.

دو واقعیت از این موضوع ناشی می‌شود. Hister به‌صورت پیش‌فرض هیچ احراز هویتی ندارد؛ بنابراین یک reverse proxy به‌تنهایی، یک نسخه قابل جستجو از مطالعات شما را برای هر کسی که نام دامنه (hostname) را پیدا کند، منتشر می‌کند. نقطه پایانی MCP نیز به‌صورت پیش‌فرض در /mcp ارائه می‌شود و بدون داشتن توکن، هر کلاینتی که به آن دسترسی پیدا کند می‌تواند در نمایه شما جستجو انجام دهد.

پیش از آنکه سرویس برای اولین بار از localhost خارج شود، احراز هویت را پیکربندی کنید. برای یک کاربر واحد، تنها به app.access_token نیاز دارید؛ یک رمز مشترک که توسط افزونه مرورگر، کلاینت ترمینال و هر کلاینت MCP ارسال می‌شود. برای چندین نفر، user_handling: true را تنظیم کرده و حساب‌های کاربری بسازید:

sudo -u hister hister create-user alice --admin --config /etc/hister/config.yml

این دستور از شما می‌خواهد رمز عبوری با حداقل 8 کاراکتر وارد کنید. هر حساب کاربری اسناد اختصاصی و یک API token شخصی دریافت می‌کند که مالک می‌تواند آن را از صفحه پروفایل یا با استفاده از فلگ --regen-token در hister update-user بازتولید کند. تولید توکن جدید، توکن قبلی را بلافاصله باطل می‌کند؛ بنابراین پس از آن، باید تمام دستگاه‌هایی که از آن حساب استفاده می‌کنند به‌روزرسانی شوند.

گزینه app.public را تغییر ندهید مگر اینکه دقیقاً قصد انجام آن را داشته باشید. حالت عمومی (Public mode) امکان جستجوی بدون احراز هویت، پیش‌نمایش، سرویس‌دهی فایل و جستجوی MCP را فراهم می‌کند، در حالی که همچنان دسترسی‌های نوشتن، تاریخچه و عملیات مدیریتی را مسدود نگه می‌دارد.

Reverse proxy، TLS و فایروال

نرم‌افزار Hister به‌طور مستقیم HTTPS را ارائه نمی‌دهد، بنابراین باید TLS (امنیت لایه انتقال) را پیش از آن خاتمه دهید. استفاده از Caddy کوتاه‌ترین مسیر است، زیرا این ابزار گواهی‌ها را به‌صورت خودکار از طریق ACME (محیط مدیریت خودکار گواهی) درخواست و تمدید می‌کند.

hister.example.com {
    reverse_proxy 127.0.0.1:4433
}

آن را با sudo systemctl reload caddy بارگذاری مجدد کنید. پیش از صدور گواهی، دو شرط باید برقرار باشد: رکورد A برای hister.example.com باید به این سرور اشاره کند و پورت 80 باید باز باشد، زیرا چالش HTTP-01 در آنجا پاسخ داده می‌شود. در صورت نبود هر یک از این موارد، مرورگر به‌جای صفحه، خطای TLS دریافت می‌کند و لاگ Caddy تلاش‌های ناموفق برای پاسخ به چالش را تکرار می‌کند.

سپس تمام پورت‌های دیگر را ببندید.

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status

پورت 4433 عمداً در این لیست قرار نگرفته است. نام دامنه عمومی تنها راه دسترسی نیست و یک سرویس onion که به همان پورت loopback اشاره می‌کند، بدون نیاز به رکورد DNS یا باز کردن هیچ پورت ورودی، از دستگاه‌های خودتان به ایندکس شما دسترسی پیدا می‌کند.

server.base_url باید با آدرسی که در مرورگر وارد می‌کنید، از جمله طرح (scheme)، مطابقت داشته باشد. وقتی این تطابق وجود نداشته باشد، رابط کاربری با متن‌های بدون استایل و تصاویر ناقص بارگذاری می‌شود، زیرا سرور لینک‌های دارایی‌های خود را بر اساس base_url می‌سازد و مرورگر سپس آن‌ها را از مبدأیی درخواست می‌کند که پاسخی نمی‌دهد. همان URL باید در افزونه مرورگر نیز وارد شود.

تکمیل ایندکس

افزونهٔ مرورگر، جمع‌آوری‌کنندهٔ اصلی است. آن را از Mozilla Add-ons یا Chrome Web Store نصب کنید، صفحهٔ تنظیمات آن را باز کنید، آدرس سرور را روی https://hister.example.com تنظیم کرده و توکن دسترسی را وارد کنید. سپس این افزونه عنوان، متن کامل، HTML و فاوآیکون هر صفحه‌ای که بازدید می‌کنید را دریافت کرده و به سرور شما ارسال می‌کند. استخراج داده‌ها در سمت کلاینت و داخل مرورگر انجام می‌شود. افزونه با هیچ شخص ثالثی ارتباط برقرار نمی‌کند و تنها درخواست خارجی آن برای دریافت فاوآیکون صفحه است.

استخراج در سمت کلاینت همان چیزی است که ایندکس‌گذاری خصوصی را ممکن می‌سازد. افزونه صفحه را دقیقاً همان‌طور که شما می‌بینید، پس از ورود به سیستم و رندر شدن مشاهده می‌کند؛ بنابراین یک صفحهٔ ویکی داخلی یا یک مقالهٔ پولی به‌درستی ایندکس می‌شود و سرور شما هرگز نیازی به اطلاعات ورود (credentials) ندارد. این همچنین به این معنی است که هر چیزی که مشاهده می‌کنید کاندیدای ایندکس شدن است، به همین دلیل است که قوانین نادیده‌گیری (skip rules) پیش از محتوای بیشتر قرار می‌گیرند.

قوانین نادیده‌گیری در نصب‌های تک‌کاربره در rules.json قرار دارند یا برای هر کاربر در دیتابیس ذخیره می‌شوند، و تب Rules در رابط کاربری وب، ساده‌ترین راه برای ویرایش آن‌هاست. این قوانین عبارت‌های باقاعده (regular expressions) زبان Go هستند که با کل URL مطابقت داده می‌شوند:

^https://mail\.example\.com
^https://bank\.example\.com
.*?utm_source=

الگویی مانند ^mail.example.com هرگز مطابقت پیدا نمی‌کند، زیرا رشته‌ای که در حال تست است با https:// شروع می‌شود. یک $ در انتهای الگو نیز برای هر URL که دارای query string باشد شکست می‌خورد، زیرا پارامترهای query در طول فرآیند تطبیق حفظ می‌شوند.

تاریخچهٔ موجود با خواندن دیتابیس خودِ مرورگر وارد می‌شود، بنابراین آن دستور باید روی دستگاهی اجرا شود که پروفایل مرورگر را نگه می‌دارد؛ یعنی لپ‌تاپ شما و نه VPS. همان فایل باینری را در آنجا نصب کرده و به سرور اشاره دهید:

export HISTER_TOKEN='your-access-token'
hister import browser firefox -u https://hister.example.com -t "$HISTER_TOKEN"

عملیات وارد کردن (import) به عنوان یک job قابل‌ادامه با نام browser-import-YYYY-MM-DD اجرا می‌شود، بنابراین می‌توانید آن را متوقف کرده و بعداً دوباره شروع کنید. سرویس‌های بوک‌مارک نیز به همین روش وارد می‌شوند، از جمله Linkwarden، Karakeep، Wallabag، Linkding، Readeck و Shaarli، و تکرار عملیات import فقط مواردی را دریافت می‌کند که جدیدتر از آخرین مورد باشند.

فایل‌های موجود در سرور با نام‌گذاری دایرکتوری‌ها در فایل پیکربندی ایندکس می‌شوند:

indexer:
  directories:
    - path: '/var/lib/hister/documents'
      label: 'documents'
      filetypes: ['pdf', 'docx', 'md', 'txt']

فایل‌های PDF، DOCX، Markdown، Org mode و فایل‌های متنی با فرمت UTF-8 معتبر به صورت متن کامل خوانده می‌شوند. عکس‌ها و ویدیوها در این لیست نیستند، بنابراین یک کتابخانهٔ تصاویر به سروری نیاز دارد که به جای متن، چهره‌ها، مکان‌ها و تاریخ‌ها را ایندکس کند، و PhotoPrism و Immich دو گزینه‌ای هستند که معمولاً برای این کار مقایسه می‌شوند. یک صفحهٔ تکی با hister index https://example.com اضافه می‌شود. تبدیل کل سایت‌ها به متن تمیز برای ابزارهای دیگر، یک وظیفهٔ جداگانه است که توسط خزنده‌های self-hosted که صفحات را به متن تمیز تبدیل می‌کنند انجام می‌شود.

جستجو مبتنی بر فیلد است، بنابراین زبان پرس‌وجو (query language) ارزش ده دقیقه مطالعه را دارد:

"connection reset" domain:github.com added:<30d
title:(wireguard|nftables) -tutorial sort:-visits

اشاره‌گر یک عامل کدنویسی به ایندکس شخصی از طریق MCP

MCP (model context protocol) واسطی است که یک assistant برای فراخوانی ابزارها روی یک server استفاده می‌کند. Hister آن را در POST /mcp و زیر همان base URL، از طریق streamable HTTP transport ارائه می‌کند و search، get_preview و get_history را در اختیار می‌گذارد. احراز هویت، همان bearer token مورد استفاده در بخش‌های دیگر API است. اگر tool calling برای شما موضوعی جدید است، نوشتن یک agent loop کوچک به‌صورت دستی سریع‌ترین راه برای مشاهدهٔ چیزی است که endpointای مانند این واقعاً در اختیار یک assistant قرار می‌دهد.

{
  "mcpServers": {
    "hister": {
      "url": "https://hister.example.com/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_ACCESS_TOKEN"
      }
    }
  }
}

هدر X-Access-Token به عنوان جایگزینی برای Authorization عمل می‌کند.

ارزش این قابلیت در محتوایی است که عامل (agent) جستجو می‌کند. جستجوی وب باز، هر چیزی که امروز رتبه بالایی دارد را برمی‌گرداند که برای نرم‌افزارهای با تغییرات سریع، اغلب شامل مستندات نسخه‌ای است که شما از آن استفاده نمی‌کنید. ایندکس شخصی شما، صفحاتی را برمی‌گرداند که قبلاً خوانده و تصمیم به نگهداری آن‌ها گرفته‌اید؛ همچنین get_preview نسخه ذخیره‌شده را ارائه می‌دهد، بنابراین پاسخ حتی پس از آفلاین شدن صفحه اصلی نیز در دسترس باقی می‌ماند. اگر به نتایج عمومی نیز نیاز دارید، هر دو منبع را در اختیار عامل قرار دهید: یک مهارت جستجوی مرورگر مبتنی بر SearXNG وب باز را به عنوان یک ابزار مجزا اضافه می‌کند. هنگامی که بیش از یکی از این endpointها را اجرا می‌کنید، مطالعه میزبانی سرورهای MCP روی یک VPS توصیه می‌شود، زیرا هر یک از آن‌ها با این مشکل مواجهه (exposure) روبرو هستند.

دیسک، پشتیبان‌گیری و نگهداری

مستندات، هر صفحهٔ نمایه‌شده را حدود 100 KB در نظر می‌گیرند که شامل پیش‌نمایش فشرده نیز می‌شود؛ بنابراین صد هزار صفحه تقریباً معادل 10 GB است. سیستم سهمیه‌بندی وجود ندارد. دو تنظیم اغلب با هم اشتباه گرفته می‌شوند: indexer.max_file_size_mb (به‌صورت پیش‌فرض 1 MiB) که اندازهٔ یک فایل تحت نظارت را محدود می‌کند و server.max_batch_body_size (به‌صورت پیش‌فرض 40 MiB) که محدودکنندهٔ یک درخواست API است.

دایرکتوری مشخص‌شده توسط app.directory شامل index.db برای فایل‌های نمایهٔ هر زبان، db.sqlite3 برای حساب‌ها و وظایف، data/html/ برای پیش‌نمایش‌ها و rules.json است. پشتیبان‌گیری شامل متوقف کردن سرویس و کپی گرفتن از کل آن دایرکتوری و فایل پیکربندی است. hister export backup.json اسناد را برای مهاجرت به فرمت JSON می‌نویسد و این یک پشتیبان‌گیری از سرور محسوب نمی‌شود.

دو دستور نگهداری ارزش دانستن دارند. hister reindex نمایه‌های جستجو را بازسازی می‌کند که پس از تغییر تنظیمات ایندکسر الزامی است. اگر در حین وارد کردن حجم زیادی از داده‌ها، مصرف حافظه افزایش یافت، detect_languages: false را در بخش indexer تنظیم کرده و مجدداً نمایه‌سازی کنید. hister cleanup فایل‌های پیش‌نمایش و favicon یتیم (بدون استفاده) که پس از حذف باقی مانده‌اند را پاکسازی می‌کند.

حذف کردن یک کوئری است، بنابراین ابتدا آن را در حالت آزمایشی (dry mode) اجرا کنید:

hister delete 'domain:example.com' --dry --verbose

اگر یک جمع‌آوری‌کننده (collector) همچنان صفحه‌ای را ارسال کند، صفحهٔ حذف‌شده بازمی‌گردد؛ بنابراین پیش از حذف، قانون skip را اضافه کنید.

مجوز AGPLv3 تنها در صورتی اهمیت پیدا می‌کند که کد را تغییر دهید. اجرای یک نسخهٔ اصلاح‌نشده برای استفادهٔ شخصی هیچ تعهدی ایجاد نمی‌کند. اگر Hister را تغییر دهید و به دیگران اجازه دهید از نسخهٔ شما از طریق شبکه استفاده کنند، مجوز شما را ملزم می‌کند که سورس‌کد اصلاح‌شده را در اختیار آن‌ها قرار دهید.

حالت‌های شکست و پیام‌هایی که مشاهده خواهید کرد

سرور اجرا نمی‌شود. یا پورت 4433 قبلاً اشغال شده است، یا فایل پیکربندی دارای خطای نحوی YAML است. دستور sudo ss -lntp | grep 4433 نشان می‌دهد چه فرآیندی پورت را اشغال کرده و journalctl -u hister -n 50 --no-pager خطای تجزیه (parse error) را چاپ می‌کند.

رابط کاربری بارگذاری می‌شود اما ناقص به نظر می‌رسد. به‌هم‌ریختگی متن و تصاویرِ بارگذاری‌نشده به این معنی است که server.base_url با URL موجود در نوار آدرس مطابقت ندارد. وجود یک اسلش (/) در انتهای آدرس نیز به عنوان عدم تطابق محسوب می‌شود.

افزونه متصل نمی‌شود. URL سرور در تنظیمات افزونه باید دقیقاً با base_url برابر باشد، سرور باید در حال اجرا و به‌روز باشد، و ممکن است یک فایروال در مسیر، ارتباط را بدون نمایش هیچ پیامی در صفحه مسدود کرده باشد. فایرفاکس لاگ‌های افزونه را در کنسول معمولی نمایش نمی‌دهد: برای بررسی افزونه Hister، صفحه about:debugging#/runtime/this-firefox را باز کنید.

کانتینر هنگام شروع کار متوقف می‌شود. خطای مجوز در مسیر ./data به این معنی است که مالکیت دایرکتوری در اختیار UID دیگری غیر از 1000 است؛ این همان کاربری است که داخل ایمیج پیش‌فرض تعریف شده است.

خطای 403 Forbidden در مسیرهای مدیریتی. مسیرهای POST /api/reindex و POST /api/cleanup زمانی که مدیریت کاربران فعال باشد، فقط برای مدیران در دسترس هستند؛ بنابراین دسترسی حساب‌های کاربری عادی به آن‌ها رد می‌شود.

مصرف حافظه هنگام import افزایش می‌یابد. دلیل معمول این اتفاق، تشخیص زبان روی تاریخچه‌ای حجیم است. مقدار detect_languages: false را تنظیم کرده و پس از آن hister reindex را اجرا کنید.

FAQ

تفاوت Hister با SearXNG در چیست؟

SearXNG یک پروکسی جستجوی متا (metasearch) است: پرس‌وجوی شما را به موتورهای جستجوی عمومی ارسال کرده و نتایج آن‌ها را پس از حذف ردیاب‌ها بازمی‌گرداند؛ بنابراین ایندکس متعلق به همان موتورهاست. Hister ایندکس تمام‌متن (full-text) اختصاصی خود را از صفحاتی که بازدید کرده‌اید و فایل‌هایی که نگهداری می‌کنید می‌سازد. در نتیجه، Hister به پرسش «کجا آن مطلب را خواندم؟» پاسخ می‌دهد، در حالی که SearXNG به پرسش «وب درباره این موضوع چه می‌گوید؟» پاسخ می‌دهد. این دو ابزار مسائل متفاوتی را حل می‌کنند و بسیاری از کاربران هر دو را روی یک سرور اجرا می‌کنند.

آیا ذخیره کل تاریخچه مرورگر روی یک VPS امن است؟

تنها در صورتی که اقدامات لازم برای محدود کردن دسترسی انجام شده باشد. Hister به‌طور پیش‌فرض روی 127.0.0.1:4433 گوش می‌دهد و نیازی به احراز هویت ندارد. حتماً app.access_token یا user_handling: true را تنظیم کنید، یک reverse proxy با TLS در مقابل آن قرار دهید و پورت 4433 را در فایروال ببندید. ایندکس تمام‌متنِ تاریخچه مطالعه شما به صورت متن ساده (plain text) است؛ بنابراین هر کسی که به این پورت دسترسی پیدا کند، می‌تواند بدون نیاز به شکستن هیچ حفاظی، تمام محتوا را بخواند.

آیا به افزونه مرورگر نیاز دارم یا می‌توانم فقط تاریخچه را وارد (import) کنم؟

وارد کردن تاریخچه یک عملیات یک‌باره برای تکمیل داده‌های قدیمی است. این کار پایگاه داده تاریخچه مرورگر را می‌خواند و روی همان کامپیوتری اجرا می‌شود که پروفایل مرورگر در آن قرار دارد، نه روی سرور. افزونه مرورگر از آن لحظه به بعد ایندکس را به‌روز نگه می‌دارد و صفحات پشتِ صفحه ورود (login) را نیز ثبت می‌کند، زیرا محتوا را پس از رندر شدن در مرورگر استخراج می‌کند. یک پیکربندی رایج، انجام یک بار وارد کردن داده‌ها و سپس استفاده از افزونه است.

آیا یک عامل کدنویسی (coding agent) می‌تواند در ایندکس Hister من جستجو کند؟

بله. Hister یک سرور MCP (پروتکل زمینه مدل) در آدرس POST /mcp روی base URL شماست که توابع search، get_preview و get_history را ارائه می‌دهد. کلاینت خود را به آدرس https://your-host/mcp هدایت کنید و از هدر Authorization: Bearer برای ارسال توکن دسترسی خود استفاده نمایید. سپس عامل می‌تواند در مستنداتی که واقعاً مطالعه کرده‌اید (با همان نسخه‌ای که خوانده‌اید) جستجو کند، به جای اینکه به نتایج رتبه‌بندی‌شده در موتورهای جستجوی عمومی تکیه کند.