SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-28

Hister self-host করুন: আপনার ব্যক্তিগত search engine

VPS-এ Hister চালিয়ে দেখা web page ও রাখা file-এর full-text search করুন। binary ও Docker install, TLS, login এবং MCP endpoint সেটআপের ধাপ একসঙ্গে জানুন।

Hister কী এবং কী নয়

Hister একটি personal search engine, যা আপনি নিজে host করেন। এটি আপনার দেখা পৃষ্ঠাগুলোর পূর্ণ পাঠ্য এবং আপনার সংরক্ষণ করা ফাইল index করে। এরপর web interface, terminal client, HTTP API অথবা AI (artificial intelligence) assistant থেকে সেই collection-এ search করতে দেয়। Hister একটি প্রশ্নের উত্তর দেয়: আমি এটি কোথায় পড়েছিলাম।

বেশিরভাগ পাঠক এই ধারণার সঙ্গে SearXNG-এর মাধ্যমে পরিচিত হন, তবে দুটি একই tool নয়। আপনার পরিচিত নামটি যদি পুরোনো Searx হয়, ওই project-এ 2023 সালের পর আর কোনো code commit হয়নি এবং SearXNG সেটিই এগিয়ে নিয়ে যাচ্ছে, তাই আজ নতুন instance চালু করলে সেটি যেভাবেই হোক SearXNG হবে। SearXNG একটি metasearch proxy। আপনার query সেখানে যায়, এটি আপনার হয়ে অন্য engine-গুলোকে query পাঠায়, তারপর tracking বাদ দিয়ে তাদের result ফিরিয়ে দেয়। index-এর মালিক ওই engine-গুলোই। আপনি যে content দেন, Hister তা থেকে নিজের index তৈরি করে: browser extension দিয়ে capture করা page, import করা browser history, crawl করা URL এবং আপনি নির্দিষ্ট করে দেওয়া directory-র file থেকে। Self-hosted SearXNG instance আপনাকে public web-এ private access দেয়। Hister আপনার নিজের পড়া content-এর ওপর search দেয়। কাজ দুটি আলাদা, তাই একই box-এ দুটিই চালানো স্বাভাবিক। আপনি যদি তা করেন, SearXNG আপনার searching-এর কতটা আসলে আড়াল করে তা জানা গুরুত্বপূর্ণ, কারণ এটি query নিজে আড়াল না করে engine-গুলোর কাছে আপনার IP-এর বদলে server-এর IP পাঠায়।

Hister AGPLv3 (GNU Affero General Public License, version 3) বা পরবর্তী version-এর অধীনে free software। এতে কোনো telemetry নেই এবং কোনো cloud service প্রয়োজন হয় না। এই guide-এ version v0.17.0 নির্দিষ্ট করা হয়েছে। 2026-07-28 তারিখে এটিই current release ছিল। কিছু copy করার আগে releases page-এ current tag পরীক্ষা করুন। এরপর সেখানে পাওয়া tag নির্দিষ্ট করে ব্যবহার করুন।

VPS-এ Hister self-host করার কারণ

একটি index তখনই কার্যকর হয়, যখন এটি সম্পূর্ণ থাকে। আর index সম্পূর্ণ থাকে কেবল তখনই, যখন আপনি পড়ার সময় server চালু থাকে। একটি laptop দিনের অর্ধেক সময় sleep mode-এ থাকে। সেই সময় ফোনে খোলা page-গুলো laptop-এ কখনো পৌঁছায় না, এবং রাতের import-ও শুরু হয় না। একটি VPS (virtual private server) সব সময় চালু থাকে। তাই আপনার প্রতিটি device একই index-এ content পাঠাতে পারে, এবং আপনি ঘুমানোর সময়ও crawler কাজ চালিয়ে যায়।

দ্বিতীয় কারণ হলো আলাদা রাখা। app section-এ user_handling: true সেট করলে একই instance-এ প্রতিটি account নিজস্ব credentials এবং নিজস্ব document collection পায়। ফলে একটি server-এ একটি পরিবার বা ছোট team-এর data রাখা যায়, এবং কেউ অন্যের পড়া content search করতে পারে না।

তৃতীয় কারণটি হলো সংযোগব্যবস্থা। VPS-এ ইতিমধ্যে একটি public hostname এবং একটি certificate আছে। আপনি নিয়ন্ত্রণ করেন না এমন কোনো network থেকে server-এ পৌঁছাতে browser extension-এর এগুলো প্রয়োজন। একই hostname ও certificate server-এর অন্য কাজেও ব্যবহৃত হয়, কারণ openGym সেই সময় সক্রিয় থাকা hostname-এর বিপরীতে তার প্রথম passkey নিবন্ধন করে। তাই প্রথম account তৈরি করার আগে hostname এবং certificate নির্ধারিত থাকতে হবে।

ইনস্টল পথ এক: release binary

Hister প্রতিটি platform-এর জন্য একটি binary প্রকাশ করে। এটি checksums file-এর সঙ্গে download করুন এবং install করার আগে যাচাই করুন।

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 লাইন দেখালে download ক্ষতিগ্রস্ত বা পরিবর্তিত হয়েছে। তাই install না করে এটি আবার fetch করুন।

Binary install করুন। এরপর একটি system account এবং এটি ব্যবহার করবে এমন directory তৈরি করুন।

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 একটি default configuration file লেখে। এটি প্রমাণ করে যে binary এই machine-এ চলছে। ভুল architecture-এর জন্য download করা হলে এখানেই cannot execute binary file: Exec format error দেখিয়ে ব্যর্থ হবে।

প্রয়োজনীয় কয়েকটি setting edit করুন। Generated file-এর বাকি অংশ অপরিবর্তিত রাখা যায়।

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 দিয়ে token তৈরি করুন। File-এ এখন একটি credential আছে। তাই service চালু হওয়ার আগেই এর permission সীমিত করুন।

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

Configuration path-এর জন্য HISTER_CONFIG হলো নথিভুক্ত environment variable। তাই unit-টি hister account-এর home directory-এর ওপর নির্ভর করে না। ProtectSystem=strict এই service-এর জন্য পুরো filesystem read-only করে। তাই ReadWritePaths-এ data directory উল্লেখ করতে হয়। ProtectHome=yes service-এর কাছ থেকে /home আড়াল করে। ফলে /home-এর অধীনে monitor করা directory indexer-এর কাছে খালি দেখাবে। সেখানে থাকা file index করতে হলে ওই line বাদ দিন।

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/

শেষ command-এ প্রদর্শিত যেকোনো HTTP status code নির্দেশ করে যে process-টি listening করছে। curl: (7) Failed to connect মানে process-টি listening করছে না, আর journalctl -u hister -n 50 --no-pager কারণ জানাবে।

ইনস্টল করার দ্বিতীয় পদ্ধতি: Docker Compose

ইমেজটি GitHub container registry-তে প্রকাশিত হয়, এবং প্রতিটি release-এর জন্য একটি করে tag থাকে।

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

প্রতিটি configuration key-এর জন্য HISTER__<SECTION>__<KEY> আকৃতির একটি environment override থাকে। এখানে separator হিসেবে দুটি underscore ব্যবহৃত হয়। তাই container deployment-এর জন্য mounted config file প্রয়োজন হয় না। HISTER_ACCESS_TOKEN-কে compose file-এর পাশে একটি .env file-এ রাখুন। আপনি যদি file সম্পাদনা করতে চান, docker run --rm ghcr.io/asciimoo/hister:v0.17.0 create-config > config.yml চালিয়ে default মানগুলো দেখুন।

উপরের দুটি লাইন সহজেই ভুলভাবে প্রয়োগ করা যায়। তাই দুটির অর্থ বোঝা গুরুত্বপূর্ণ।

Container-এর ভেতরের address অবশ্যই 0.0.0.0:4433 হতে হবে। Container-এর নিজস্ব network namespace থাকে। তাই সেখানে 127.0.0.1-এ bind করা কোনো process-এ শুধু ওই container-এর ভেতর থেকেই পৌঁছানো যায়। ফলে published port-এর জন্য forward করার মতো কোনো service থাকে না।

Published port 127.0.0.1:4433:4433 হিসেবে লিখতে হবে, 4433:4433 হিসেবে নয়। Docker নিজস্ব netfilter rule যোগ করে port publish করে। এই rule-গুলো ufw rule-এর আগে evaluate হয়। তাই 4433:4433 সরাসরি Internet থেকে reachable থাকে, এমন server-এও যেখানে ufw status port-টিকে closed দেখায়। Host side-কে 127.0.0.1-এ bind করলে reverse proxy-ই প্রবেশের একমাত্র পথ থাকে। একই সমস্যা server-এর প্রতিটি container-এর ক্ষেত্রে প্রযোজ্য। VPS-এ Docker Compose-এ এই বিষয়ের বাকি অংশ ব্যাখ্যা করা হয়েছে।

Default image UID 1000 এবং GID 1000 হিসেবে চলে। তাই ./data ওই account-এর জন্য writable হতে হবে। তা না হলে permission error দিয়ে container startup-এর সময় বন্ধ হয়ে যায়। sudo chown -R 1000:1000 ./data এটি ঠিক করে। এই সংখ্যাগুলো অপরিচিত হলে আগে কোন UID এবং GID হিসেবে container file লেখে পড়ুন।

ব্যক্তিগত search index প্রকাশ করার ঝুঁকি সবচেয়ে বেশি কেন

Hister ডিফল্টভাবে 127.0.0.1:4433-এ listen করে, এবং এই default ইচ্ছাকৃত। এক মাস ব্যবহারের পরে index-এ কী থাকে তা বিবেচনা করুন: internal wiki page, invoice, আপনি login করা অবস্থায় খোলা support ticket, password reset page এবং আপনার পড়া অন্য সব কিছুর পূর্ণ text। Project documentation-এ বিষয়টি সরাসরি বলা আছে: "Hister আপনার সম্পূর্ণ browsing history, page content-সহ, server-এ পাঠায় এবং server থেকে গ্রহণ করে।"

ফাঁস হওয়া password database এখনও crack করতে হয়। ফাঁস হওয়া personal index plain text অবস্থায় থাকে এবং ইতিমধ্যেই searchable হয়। তাই এটি দেখতে একই ধরনের ছোট self-hosted app-এর চেয়ে বেশি সতর্কতার দাবি রাখে।

এ থেকে দুটি বিষয় স্পষ্ট হয়। Hister out of the box কোনো authentication চায় না। তাই শুধু একটি reverse proxy ব্যবহার করলেই hostname জানা যে কেউ আপনার পড়া বিষয়ের searchable copy দেখতে পারে। MCP endpoint-ও ডিফল্টভাবে /mcp-এ serve করা হয়। Token না থাকলে সেখানে পৌঁছাতে পারা যেকোনো client index-এ search চালাতে পারে।

Service-টি প্রথমবার localhost ছেড়ে বাইরে listen করার আগে authentication configure করুন। একজন user-এর জন্য শুধু app.access_token যথেষ্ট। এটি browser extension, terminal client এবং যেকোনো MCP client থেকে পাঠানো একটি shared secret। একাধিক user-এর ক্ষেত্রে user_handling: true set করুন এবং account তৈরি করুন:

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

Command-টি অন্তত 8 characters-এর password চায়। প্রতিটি account নিজস্ব document এবং personal API token পায়। Owner profile page থেকে অথবা hister update-user-এ --regen-token flag ব্যবহার করে token regenerate করতে পারেন। নতুন token generate করলে আগের token সঙ্গে সঙ্গে invalid হয়ে যায়। তাই ওই account ব্যবহার করা প্রতিটি device পরে update করতে হবে।

আপনার উদ্দেশ্য না থাকলে app.public পরিবর্তন করবেন না। Public mode-এ unauthenticated search, preview, file serving এবং MCP search চালু থাকে। তবে write, history access এবং admin operation তখনও blocked থাকে।

Reverse proxy, TLS এবং firewall

Hister নিজে HTTPS পরিবেশন করে না। তাই এর সামনে TLS (transport layer security) termination করুন। Caddy ব্যবহার করাই সবচেয়ে সহজ পদ্ধতি, কারণ এটি ACME (automatic certificate management environment) ব্যবহার করে নিজে certificate-এর অনুরোধ করে এবং renew করে।

hister.example.com {
    reverse_proxy 127.0.0.1:4433
}

sudo systemctl reload caddy দিয়ে এটি reload করুন। Certificate ইস্যু হওয়ার আগে দুটি শর্ত পূরণ হতে হবে: hister.example.com-এর A record-কে এই server-এর দিকে নির্দেশ করতে হবে, এবং port 80 খোলা থাকতে হবে, কারণ HTTP-01 challenge-এর উত্তর সেখানেই দেওয়া হয়। যেকোনো একটি শর্ত পূরণ না হলে browser page-এর বদলে TLS error দেখায় এবং Caddy log-এ ব্যর্থ challenge বারবার দেখা যায়।

এরপর অন্য সবকিছু বন্ধ করুন।

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

Port 4433 ইচ্ছাকৃতভাবে ওই তালিকায় নেই। প্রবেশের একমাত্র উপায় public hostname নয়। একই loopback port-এ নির্দেশ করা একটি onion service ব্যবহার করেও নিজের device থেকে index-এ পৌঁছানো যায়, কোনো DNS record বা inbound port খোলা ছাড়াই।

server.base_url-এ browser-এ লেখা address-টির scheme-সহ হুবহু মিল থাকতে হবে। মিল না হলে interface unstyled text এবং missing image-সহ load হয়, কারণ server base_url থেকে asset link তৈরি করে, আর browser সেগুলো এমন একটি origin থেকে চায় যেটি উত্তর দেয় না। একই URL browser extension-এও দিতে হবে।

ইনডেক্স পূরণ করা

ব্রাউজার extension-টি প্রধান collector। এটি Mozilla Add-ons বা Chrome Web Store থেকে install করুন, এর options page খুলুন, server URL হিসেবে https://hister.example.com সেট করুন এবং access token paste করুন। এরপর আপনি যে প্রতিটি page visit করেন, extension-টি তার title, পূর্ণ text, HTML এবং favicon সংগ্রহ করে আপনার server-এ পাঠায়। Extraction client side-এ, browser-এর ভেতরেই হয়। Extension-টি কোনো third party-এর সঙ্গে যোগাযোগ করে না। এটি যে একমাত্র বাইরের request পাঠায়, সেটি page favicon-এর জন্য।

Client-side extraction-এর কারণেই private index তৈরি করা সম্ভব। Login এবং rendering-এর পরে extension-টি page-কে ঠিক আপনার দেখা অবস্থায় পায়। তাই internal wiki page বা paid article সঠিকভাবে index হয়, অথচ আপনার server-এর credentials-এর প্রয়োজন হয় না। এর অর্থ, আপনি যা দেখেন তার সবই index-এর candidate। তাই আরও content যোগ করার আগে skip rule নির্ধারণ করা জরুরি।

Single-user install-এ skip rule rules.json-এ থাকে। একাধিক user থাকলে এগুলো database-এ user-ভিত্তিকভাবে থাকে। Web interface-এর Rules tab থেকে এগুলো edit করা সবচেয়ে সহজ। এগুলো full URL-এর সঙ্গে মিলিয়ে দেখা Go regular expression:

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

^mail.example.com-এর মতো pattern কখনও match করবে না, কারণ পরীক্ষিত string https:// দিয়ে শুরু হয়। Query string থাকা কোনো URL-এ শেষের $-ও ব্যর্থ হবে, কারণ matching-এর সময় query parameter রাখা হয়।

Browser-এর নিজস্ব database পড়ে বিদ্যমান history import করা হয়। তাই এই command browser profile থাকা machine-এ চালাতে হবে। সেটি আপনার laptop, VPS নয়। সেখানে একই binary install করে server-এর দিকে নির্দেশ করুন:

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

Import browser-import-YYYY-MM-DD নামের resumable job হিসেবে চলে। তাই এটি interrupt করে পরে আবার শুরু করা যায়। Bookmark service-গুলোও একইভাবে import করা যায়। এর মধ্যে Linkwarden, Karakeep, Wallabag, Linkding, Readeck এবং Shaarli রয়েছে। পুনরায় import করলে আগের import-এর পর নতুন হওয়া data-ই শুধু fetch করা হয়।

Config-এ directory-এর নাম উল্লেখ করে server-এর file index করা যায়:

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

PDF, DOCX, Markdown, Org mode এবং valid UTF-8 text file পূর্ণ text হিসেবে পড়া হয়। Photo ও video এই তালিকায় নেই। তাই image library-এর জন্য text-এর বদলে face, স্থান এবং date index করতে পারে এমন server প্রয়োজন। এই কাজের জন্য সাধারণত PhotoPrism এবং Immich-এর তুলনা করা হয়। hister index https://example.com দিয়ে একটি নির্দিষ্ট page যোগ করা যায়। অন্য tool-এর জন্য পুরো site-কে পরিষ্কার text-এ রূপান্তর করা আলাদা কাজ। এটি page-কে পরিষ্কার text-এ রূপান্তরকারী self-hosted crawler দিয়ে করা হয়।

Search field-ভিত্তিক। তাই query language পড়তে দশ মিনিট সময় দেওয়া উপকারী:

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

MCP-এর মাধ্যমে আপনার নিজস্ব index-এ coding agent নির্দেশ করুন

MCP (model context protocol) হলো এমন একটি interface, যার মাধ্যমে assistant কোনো server-এ tool call করে। Hister একই base URL-এর অধীনে streamable HTTP transport ব্যবহার করে এটিকে POST /mcp-এ পরিবেশন করে এবং search, get_preview ও get_history প্রকাশ করে। Authentication-এর জন্য API-এর অন্যান্য অংশের মতো একই bearer token ব্যবহার করা হয়। Tool calling আপনার কাছে নতুন হলে, নিজে একটি ছোট agent loop লেখা এই ধরনের endpoint আসলে assistant-কে কী দেয়, তা বোঝার দ্রুততম উপায়।

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

Authorization-এর বিকল্প হিসেবে X-Access-Token header ব্যবহার করা যায়।

এখানে মূল সুবিধা হলো agent কী অনুসন্ধান করে। Open web search বর্তমানে যে ফলাফল বেশি rank করে তা ফেরত দেয়। দ্রুত পরিবর্তনশীল software-এর ক্ষেত্রে সেটি প্রায়ই এমন version-এর documentation হয়, যা আপনি ব্যবহার করছেন না। আপনার নিজস্ব index আপনি আগে পড়ে সংরক্ষণ করার সিদ্ধান্ত নেওয়া page ফেরত দেয়, আর get_preview সংরক্ষিত copy পরিবেশন করে। ফলে মূল page offline হয়ে গেলেও উত্তরটি পাওয়া যায়। Public result-ও চাইলে agent-কে উভয় source দিন: SearXNG-নির্ভর browser search skill open web-কে আলাদা tool হিসেবে যুক্ত করে। একটির বেশি endpoint চালালে VPS-এ MCP server host করা পড়া উপযোগী, কারণ প্রতিটির ক্ষেত্রেই এই exposure সমস্যা থাকে।

ডিস্ক, ব্যাকআপ এবং রক্ষণাবেক্ষণ

Documentation অনুযায়ী, compressed preview-সহ একটি indexed page-এর আকার প্রায় 100 KB। তাই এক লক্ষ page-এর জন্য প্রায় 10 GB disk space লাগে। কোনো quota system নেই। দুটি setting-কে প্রায়ই এক মনে করা হয়: indexer.max_file_size_mb (default হিসেবে 1 MiB) একটি watched file-এর সর্বোচ্চ আকার নির্ধারণ করে, আর server.max_batch_body_size (default হিসেবে 40 MiB) একটি API request-এর সর্বোচ্চ আকার নির্ধারণ করে।

app.directory যে directory-কে নির্দেশ করে, সেখানে প্রতি ভাষার index file-সহ index.db, account ও job-এর জন্য db.sqlite3, preview-এর জন্য data/html/ এবং rules.json থাকে। Backup নিতে হলে service বন্ধ করে ওই সম্পূর্ণ directory এবং config file-এর একটি copy রাখতে হবে। hister export backup.json migration-এর জন্য document-গুলো JSON হিসেবে লেখে; এটি server backup নয়।

দুটি maintenance command জানা দরকার। hister reindex search index পুনর্নির্মাণ করে। Indexer setting পরিবর্তনের পরে এটি চালানো আবশ্যক। বড় import-এর সময় memory use বাড়তে থাকলে indexer section-এ detect_languages: false সেট করে reindex করুন। hister cleanup deletion-এর পরে পড়ে থাকা orphaned preview ও favicon file মুছে দেয়।

Deletion একটি query হিসেবে কাজ করে। তাই আগে dry mode-এ চালান:

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

কোনো collector যদি এখনও page-টি submit করে, তাহলে deleted page আবার ফিরে আসবে। তাই deletion-এর আগে skip rule যোগ করুন।

আপনি code পরিবর্তন করলেই AGPLv3 প্রযোজ্য হয়। কোনো পরিবর্তন না করে নিজের ব্যবহারের জন্য copy চালালে অতিরিক্ত কোনো বাধ্যবাধকতা নেই। আপনি Hister পরিবর্তন করে network-এর মাধ্যমে অন্যদের আপনার version ব্যবহার করতে দিলে, licence অনুযায়ী তাদের modified source code দেওয়ার ব্যবস্থা করতে হবে।

ব্যর্থতার ধরন এবং যে বার্তাগুলো দেখবেন

সার্ভার চালু হয় না। হয় port 4433 ইতিমধ্যে ব্যবহৃত হচ্ছে, অথবা config file-এ YAML syntax error আছে। কোন process portটি ব্যবহার করছে তা sudo ss -lntp | grep 4433 দেখায়, আর journalctl -u hister -n 50 --no-pager parse error প্রিন্ট করে।

ইন্টারফেস লোড হয়, কিন্তু ভাঙা দেখায়। এলোমেলো text এবং অনুপস্থিত image-এর অর্থ হলো server.base_url address bar-এ থাকা URL-এর সঙ্গে মেলে না। শেষের slash থাকলেও সেটি mismatch হিসেবে গণ্য হয়।

Extension সংযোগ করে না। Extension-এ থাকা server URL-কে base_url-এর সমান হতে হবে। Server-টিও চালু ও হালনাগাদ থাকতে হবে। মাঝখানে থাকা firewall কোনো page message না দেখিয়েই সংযোগটি block করতে পারে। Firefox extension log সাধারণ console-এ রাখে না। about:debugging#/runtime/this-firefox খুলে Hister extension পরীক্ষা করুন।

Container startup-এর সময় বন্ধ হয়ে যায়। ./data-এ permission error দেখালে বোঝায়, directory-টির মালিকানা 1000 ছাড়া অন্য কোনো UID-এর। Default image-এর ভেতরের account হিসেবে 1000 ব্যবহৃত হয়।

Admin route থেকে 403 Forbidden দেখায়। User handling চালু থাকলে POST /api/reindex এবং POST /api/cleanup শুধু admin-এর জন্য নির্ধারিত থাকে। তাই সাধারণ account-এর অনুরোধ প্রত্যাখ্যান করা হয়।

Import চলার সময় memory বাড়তে থাকে। বড় history-র ওপর language detection চালানোই সাধারণত এর কারণ। detect_languages: false সেট করুন এবং পরে hister reindex চালান।

FAQ

Hister এবং SearXNG-এর মধ্যে পার্থক্য কী?

SearXNG একটি metasearch proxy। এটি আপনার query public engine-এ পাঠায় এবং tracking সরিয়ে তাদের ফলাফল ফেরত দেয়। তাই index ওই engine-গুলোর থাকে। Hister আপনার দেখা page এবং সংরক্ষণ করা file-এর নিজস্ব full-text index তৈরি করে। তাই Hister উত্তর দেয়, “আমি এটি কোথায় পড়েছিলাম”, আর SearXNG উত্তর দেয়, “ওয়েব কী বলছে”। তারা ভিন্ন সমস্যার সমাধান করে। অনেকে একই server-এ দুটিই চালান।

আমার সম্পূর্ণ browsing history VPS-এ রাখা কি নিরাপদ?

আগে exposure-এর ব্যবস্থা না করলে নয়। Hister 127.0.0.1:4433-এ bind করে এবং default অবস্থায় authentication প্রয়োজন হয় না। app.access_token বা user_handling: true সেট করুন, সামনে TLS-সহ একটি reverse proxy রাখুন, এবং firewall-এ port 4433 বন্ধ রাখুন। আপনার পড়া বিষয়ের full-text index plain text হিসেবে থাকে। তাই port-এ পৌঁছাতে পারা যে কেউ কোনো কিছু crack না করেই সব পড়তে পারে।

Browser extension কি আবশ্যক, নাকি শুধু আমার history import করতে পারি?

Import একবারের backfill কাজ। এটি browser-এর নিজস্ব history database পড়ে। তাই এটি server-এ নয়, browser profile থাকা computer-এ চলে। এরপর extension index-কে হালনাগাদ রাখে। Page render হওয়ার পরে browser-এ content extract করে বলে এটি login-এর আড়ালে থাকা page-ও সংগ্রহ করতে পারে। সাধারণ setup হলো একবার import করা, তারপর extension ব্যবহার করা।

হ্যাঁ। Hister আপনার base URL-এর POST /mcp-এ একটি MCP (model context protocol) server হিসেবে চলে। এটি search, get_preview এবং get_history প্রকাশ করে। Authorization: Bearer header-এ আপনার access token রেখে client-কে https://your-host/mcp-এ নির্দেশ করুন। এরপর agent আপনি বাস্তবে যে documentation পড়েছেন, আপনি যে version পড়েছেন সেই version-এ তা search করবে। আজ public search engine-এ যা rank করছে, তার ওপর এটি নির্ভর করবে না।