Vấn Đề Bookmark Mà Ít Ai Nói Đến
Tôi có một folder tên “Đọc Sau” với 847 link. Đến lúc nào đó, “đọc sau” trở thành “không bao giờ đọc.” Quen không?
Vấn đề thực sự không phải là lưu link — mà là tìm lại chúng. Pocket và bookmark trình duyệt đều thất bại ở điểm này. Bạn nhớ mang máng có đọc một bài về Kubernetes networking, nhưng lưu nó cách đây tám tháng với tag mơ hồ kiểu “infra.” Chúc may mắn.
Sau khi Pocket khai tử gói miễn phí và việc Mozilla mua lại khiến tương lai dịch vụ bất ổn, tôi bắt đầu tìm giải pháp self-hosted thực sự giải quyết được bài toán tìm lại — không chỉ bài toán lưu trữ. Đó là lúc tôi tìm thấy Hoarder — một bookmark manager mã nguồn mở với tính năng tóm tắt AI tích hợp sẵn và tìm kiếm toàn văn, chạy gọn trên Docker.
Ba tháng dùng hàng ngày sau đó: cái folder kia thực sự có ích rồi. Đây là cách cài đặt nó.
Hoarder Thực Sự Làm Được Gì
Hoarder tự gọi mình là “AI-first,” và danh sách tính năng xứng đáng với cái tên đó:
- Tự động scrape nội dung — lưu snapshot của từng trang tại thời điểm bookmark, giúp link chết không kéo theo nội dung
- Tóm tắt bằng AI — dùng OpenAI hoặc Ollama chạy local để tóm tắt mỗi trang đã lưu
- Tìm kiếm toàn văn — tìm kiếm bên trong nội dung đã scrape, không chỉ tiêu đề và URL
- Tự động gắn tag — AI gợi ý tag dựa trên nội dung bài
- Tiện ích trình duyệt — extension cho Chrome và Firefox để lưu bookmark chỉ với một click
- Giao diện thân thiện với mobile — truy cập từ bất kỳ thiết bị nào trong mạng nội bộ
Bên dưới là: frontend Next.js, một background worker để crawl, Meilisearch để lập chỉ mục toàn văn, và một tầng AI tùy chọn. Toàn bộ được container hóa.
Cần Chuẩn Bị Gì Trước Khi Bắt Đầu
Bạn sẽ cần:
- Một máy chủ Linux (bare metal hoặc VM) đã cài Docker và Docker Compose
- Ít nhất 2GB RAM — Meilisearch khá ngốn bộ nhớ; khuyến nghị 4GB+ nếu bật AI
- API key OpenAI (tùy chọn nhưng khuyến nghị để dùng tính năng AI), hoặc cài Ollama local
- Tên miền hoặc DNS nội bộ nếu muốn HTTPS — dùng IP local cũng hoạt động bình thường
Cài Đặt Hoarder với Docker Compose
Tạo thư mục làm việc và file compose:
mkdir -p ~/homelab/hoarder && cd ~/homelab/hoarder
nano docker-compose.yml
Dán cấu hình sau vào:
version: "3.8"
services:
web:
image: ghcr.io/hoarder-app/hoarder:release
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- hoarder_data:/data
env_file:
- .env
depends_on:
- meilisearch
- chrome
meilisearch:
image: getmeili/meilisearch:v1.6
restart: unless-stopped
volumes:
- meilisearch_data:/meili_data
environment:
- MEILI_NO_ANALYTICS=true
- MEILI_MASTER_KEY=${MEILI_MASTER_KEY}
chrome:
image: gcr.io/zenika-hub/alpine-chrome:123
restart: unless-stopped
command:
- --no-sandbox
- --disable-gpu
- --disable-dev-shm-usage
- --remote-debugging-address=0.0.0.0
- --remote-debugging-port=9222
- --hide-scrollbars
volumes:
hoarder_data:
meilisearch_data:
Bây giờ tạo secret và ghi toàn bộ file .env trong một lần. Cách này tránh trùng key và lỗi tham chiếu biến:
NEXTAUTH_SECRET=$(openssl rand -base64 36)
MEILI_KEY=$(openssl rand -base64 36)
cat > .env << EOF
NEXTAUTH_SECRET=$NEXTAUTH_SECRET
MEILI_MASTER_KEY=$MEILI_KEY
NEXTAUTH_URL=http://YOUR_SERVER_IP:3000
HOARDER_LOG_LEVEL=info
BROWSER_WEB_URL=http://chrome:9222
MEILISEARCH_URL=http://meilisearch:7700
MEILISEARCH_MASTER_KEY=$MEILI_KEY
OPENAI_API_KEY=sk-your-openai-key-here
OPENAI_BASE_URL=https://api.openai.com/v1
# Tùy chọn: dùng Ollama local thay vì OpenAI
# OLLAMA_BASE_URL=http://YOUR_SERVER_IP:11434
EOF
Lưu ý quan trọng: MEILI_MASTER_KEY và MEILISEARCH_MASTER_KEY phải giống hệt nhau. Biến đầu cấu hình cho Meilisearch; biến sau cho service web của Hoarder biết cách xác thực với Meilisearch. Script trên xử lý việc này tự động.
Khởi động tất cả:
docker compose up -d
docker compose logs -f web
Chờ khoảng 30–60 giây ở lần khởi động đầu tiên. Meilisearch cần một lúc để khởi tạo index. Khi log hiển thị Server running on port 3000, mở http://YOUR_SERVER_IP:3000 trên trình duyệt.
Đăng Nhập Lần Đầu và Cấu Hình Ban Đầu
Lần chạy đầu tiên, Hoarder cho phép bạn tạo tài khoản admin ngay trên trình duyệt. Dùng mật khẩu mạnh — đặc biệt nếu bạn có kế hoạch expose ra internet.
Sau khi đăng nhập, vào Settings → AI để xác nhận API key OpenAI đã được nhận. Lưu một bookmark thử và kiểm tra:
- Nội dung trang đã được scrape (kiểm tra tab “Cached” trên bookmark)
- Bản tóm tắt xuất hiện sau một hoặc hai phút
- Tag được gợi ý tự động
Nếu tóm tắt không xuất hiện, kiểm tra log của worker:
docker compose logs web | grep -i "openai\|summary\|error"
Dùng Ollama Thay Vì OpenAI
Đã chạy Ollama trên HomeLab? Đổi cấu hình AI trong file .env:
# Comment out OpenAI
# OPENAI_API_KEY=...
# Thêm Ollama
OLLAMA_BASE_URL=http://YOUR_OLLAMA_HOST:11434
OLLAMA_MODEL=llama3.2
Khởi động lại stack sau khi thay đổi:
docker compose restart web
Ollama xử lý tóm tắt khá tốt. Về độ chính xác khi tự động gắn tag, llama3.2 hoặc mistral cho kết quả ổn. Không bằng GPT-4, nhưng với một setup miễn phí và riêng tư thì hơn đủ dùng.
Cài Tiện Ích Trình Duyệt
Extension trình duyệt mới là thứ khiến Hoarder thực sự dùng được hàng ngày. Không có nó, bạn phải copy URL thủ công — vừa mất công vừa đánh mất mục đích ban đầu.
- Tìm “Hoarder” trên Chrome Web Store hoặc Firefox Add-ons
- Sau khi cài, click vào icon extension → Settings
- Điền Server URL là địa chỉ Hoarder của bạn:
http://YOUR_SERVER_IP:3000 - Tạo API key trong Hoarder: Settings → API Keys → New Key
- Dán API key vào phần cài đặt extension
Từ đó trở đi, lưu bookmark chỉ cần một click. Extension cũng xem trước tóm tắt AI khi nó được tạo xong.
Mẹo Thực Tế Từ Trải Nghiệm Dùng Hàng Ngày
Tìm Kiếm Mới Là Tính Năng Đắt Giá Nhất
Thôi đừng duyệt danh sách bookmark nữa. Cứ tìm kiếm thẳng. Hoarder lập chỉ mục toàn bộ nội dung trang, nên bạn có thể tìm lại một khái niệm nhớ mang máng dù không nhớ đã lưu ở đâu. Gõ vài từ từ nội dung bài — Meilisearch xử lý cả lỗi đánh máy luôn.
Dùng Lists Cho Từng Dự Án
Tính năng “Lists” của Hoarder hiệu quả hơn folder nhiều khi làm việc liên tục. Tạo một list cho mỗi dự án đang chạy, thêm bookmark liên quan vào đó, archive list lại khi dự án kết thúc. Số bookmark tổng thể vẫn trong tầm kiểm soát.
Cài Reverse Proxy Để Truy Cập Từ Xa
Muốn dùng Hoarder ngoài mạng nhà? Đặt nó sau Nginx Proxy Manager hoặc Caddy với HTTPS. Cấu hình Caddy tối giản:
hoarder.yourdomain.com {
reverse_proxy localhost:3000
}
Đừng expose ra ngoài mà không có HTTPS — API key và bookmark của bạn sẽ truyền đi dưới dạng plaintext.
Backup Các Data Volume
Nội dung đã scrape tích lũy khá nhanh. Instance của tôi đạt ~2GB sau hai tháng. Backup cả hai volume thường xuyên:
# Script backup — thêm vào cron
docker run --rm \
-v hoarder_hoarder_data:/source:ro \
-v /backup/hoarder:/backup \
alpine tar czf /backup/hoarder_data_$(date +%Y%m%d).tar.gz -C /source .
docker run --rm \
-v hoarder_meilisearch_data:/source:ro \
-v /backup/hoarder:/backup \
alpine tar czf /backup/meili_data_$(date +%Y%m%d).tar.gz -C /source .
Cập Nhật Hoarder
docker compose pull
docker compose up -d
Hoarder dùng tag release để theo dõi các bản stable. Kiểm tra trang GitHub releases trước khi pull nếu muốn biết có gì thay đổi.
Lời Kết
Sau ba tháng dùng hàng ngày, cái folder “Đọc Sau” của tôi thực sự có ích rồi. Tìm kiếm toàn văn kết hợp với tóm tắt AI thay đổi hoàn toàn cách bạn tương tác với nội dung đã lưu — nó không còn là bãi chứa link bị bỏ quên nữa mà trở thành một kho kiến thức bạn thực sự truy vấn.
Cài đặt mất khoảng 20 phút. Instance của tôi idle ở mức ~400MB RAM khi không có AI, ~900MB khi Ollama đang chạy. Cập nhật và backup theo đúng quy trình như mọi service khác trong HomeLab — một lệnh docker compose pull và backup volume theo cron đã lên lịch.
Nếu bạn vẫn đang dùng bookmark trình duyệt hoặc một dịch vụ cloud đang hấp hối, cái này xứng đáng để bỏ ra một buổi chiều thử.

