SSD Nodes Learn 🎉 VPS از $5.50/ماه
راهنماها Matt Connorتوسط Matt Connor · به‌روزرسانی شده 2026-08-21

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

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

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

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

بیشتر کاربران با این ایده از طریق SearXNG آشنا می‌شوند، اما این دو ابزار یکسان نیستند. SearXNG یک پروکسی جستجوی متا (metasearch proxy) است. پرس‌وجوی شما به آن ارسال می‌شود، آن به جای شما از موتورهای دیگر سوال می‌کند و نتایج را بدون ردیابی به شما بازمی‌گرداند. ایندکس متعلق به آن موتورها است. Hister ایندکس اختصاصی خود را از محتوایی که به آن می‌دهید می‌سازد: صفحاتی که توسط افزونه مرورگر ضبط شده‌اند، تاریخچه مرورگر واردشده، URLهای خزش‌شده و فایل‌هایی که در دایرکتوری‌های مشخص‌شده قرار دارند. یک نمونه SearXNG خودمیزبان دسترسی خصوصی به وب عمومی را برای شما فراهم می‌کند. Hister امکان جستجو در مطالعات شخصی شما را فراهم می‌آورد. وظایف این دو متفاوت است، بنابراین اجرای هر دو روی یک سرور امری عادی است.

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

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

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

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

دلیل سوم، زیرساخت شبکه است. VPS از قبل دارای یک نام میزبان (hostname) عمومی و یک گواهی‌نامه است؛ این دقیقاً همان چیزی است که افزونه مرورگر برای دسترسی به سرور از شبکه‌ای که شما کنترل آن را در دست ندارید، به آن نیاز دارد.

نصب از طریق فایل باینری نسخه منتشرشده

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 تولید کنید. اکنون این فایل حاوی یک اعتبارنامه (credential) است، بنابراین پیش از شروع به کار سرویس، دسترسی‌های آن را محدود کنید.

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 کل سیستم فایل را برای این سرویس فقط‌خواندنی می‌کند، به همین دلیل است که 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) مقصدی برای forward کردن ترافیک نخواهد داشت.

پورت منتشرشده باید به صورت 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 عمداً در این لیست قرار نگرفته است.

مقدار 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؛ و وارد کردن مجدد، فقط مواردی را دریافت می‌کند که جدیدتر از آخرین عملیات باشند.

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

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) رابطی است که یک دستیار برای فراخوانی ابزارها روی یک سرور از آن استفاده می‌کند. Hister این پروتکل را در POST /mcp تحت همان URL پایه و از طریق پروتکل انتقال HTTP جریان‌پذیر (streamable) ارائه می‌دهد و search، get_preview و get_history را در دسترس قرار می‌دهد. احراز هویت مشابه سایر بخش‌های API، از طریق bearer token انجام می‌شود.

{
  "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 فضا اشغال می‌کند. سیستم سهمیه‌بندی (quota) وجود ندارد. دو تنظیم اغلب با هم اشتباه گرفته می‌شوند: 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 یتیم (orphaned) که پس از حذف باقی مانده‌اند را پاکسازی می‌کند.

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

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

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

مجوز 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 باشد، سرور باید در حال اجرا و به‌روز باشد، و ممکن است یک فایروال در مسیر، ارتباط را بدون نمایش هیچ پیامی در صفحه مسدود کرده باشد. فایرفاکس لاگ‌های افزونه را در کنسول معمولی نمایش نمی‌دهد: صفحه about:debugging#/runtime/this-firefox را باز کرده و افزونه Hister را بررسی کنید.

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

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

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

FAQ

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

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

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

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

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

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

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

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