Nếu anh em đang dùng Mac Mini M4 để làm homelab và muốn tự host AnyCrawl (một nền tảng Crawl dữ liệu mạnh mẽ dành cho AI Agent) ae có thể sẽ gặp khá nhiều “kiếp nạn”: từ lỗi thư viện C++ của SQLite, vấn đề architecture amd64 vs arm64, cho đến việc bị Google chặn IP khi search.
Bài viết này sẽ hướng dẫn ae cách build một bản AnyCrawl “bất tử” trên macOS, thay thế SQLite bằng PostgreSQL (để tránh lỗi lock database) và tích hợp SearXNG (để search Google miễn phí không cần Proxy).
Tại sao lại là cấu hình này?
- PostgreSQL thay vì SQLite: SQLite mặc định thường gặp lỗi
database lockedkhi chạy nhiều worker đồng thời, và hay gặp lỗi thư việnbetter-sqlite3trên chip M1. PostgreSQL ổn định hơn nhiều. - SearXNG Local: AnyCrawl mặc định dùng Google Search trực tiếp sẽ yêu cầu Proxy trả phí. Tự host SearXNG giúp ae bypass việc này, tốc độ nhanh và hoàn toàn miễn phí.
- Loại bỏ Puppeteer: Puppeteer trên Docker M1 chạy rất chậm và hay lỗi. Chúng ta sẽ chuyển hoàn toàn sang Playwright và Cheerio.
Bước 1: Chuẩn bị
Đầu tiên, hãy clone source code về máy:
git clone https://github.com/any4ai/AnyCrawl.git
cd AnyCrawl
cp .env.example .envAE cần thêm một vài biến trong file .env nữa nhé, vì cấu hình mình sắp triển khai nó hơi khác với cấu hình mặc định. File .env mẫu cho ae tham khảo:
ANYCRAWL_NAME=AnyCrawl
ANYCRAWL_DOMAIN=http://localhost:8880
ANYCRAWL_API_PORT=8880
ANYCRAWL_API_KEY="thay-doi-cai-nay-7MOXfLPvhEOXoPGrvIv27QVEc5r4aOXx"
NODE_ENV=production
ANYCRAWL_HEADLESS=true
ANYCRAWL_PROXY_URL=
ANYCRAWL_PROXY_STEALTH_URL=
ANYCRAWL_PROXY_CONFIG=
ANYCRAWL_KEEPALIVE=true
ANYCRAWL_AVAILABLE_ENGINES=playwright,cheerio
ANYCRAWL_API_DB_TYPE=postgresql
ANYCRAWL_IGNORE_SSL_ERROR=true
ANYCRAWL_API_AUTH_ENABLED=true
ANYCRAWL_API_CREDITS_ENABLED=false
ANYCRAWL_REDIS_URL=redis://127.0.0.1:6379
# Do not configure unless you know what you're doing.
ANYCRAWL_MAX_CONCURRENCY=50
ANYCRAWL_MIN_CONCURRENCY=50
# if not configured, will use the browser us
ANYCRAWL_USER_AGENT=AnyCrawl
ANYCRAWL_NAME_KEY_VALUE_STORE=AnyCrawl
ANYCRAWL_S3_BUCKET=
ANYCRAWL_S3_REGION=us-east-1
ANYCRAWL_S3_ENDPOINT=
ANYCRAWL_S3_ACCESS_KEY=
ANYCRAWL_S3_SECRET_ACCESS_KEY=
# AI feature
# ANYCRAWL_AI_CONFIG_PATH=
# if set ANYCRAWL_AI_CONFIG_PATH, the coming ai env will be disabled.
# AI for extracting
# format: openai/gpt-40
# Connect the provider name and the model name with a "/", such as openai:gpt-4o-mini, openrouter:openai/gpt-4o-mini, custom/glm-4.5
DEFAULT_LLM_MODEL=custom/gemini-3-flash-preview
DEFAULT_EXTRACT_MODEL=custom/gemini-3-flash-preview
DEFAULT_EMBEDDING_MODEL=custom/gemini-3-flash-preview
# Support configuring many providers, and decide by model name.
# Provide your OpenAI API key here to enable AI features
# OPENAI_API_KEY=
# OpenRouter
# OPENROUTER_API_KEY=
# OpenAI-compatible API, the provider name is: "custom"
# Mình đang dùng CLIProxy cho đỡ tốn tiền API
CUSTOM_BASE_URL=http://cli-proxy-api.cliproxyapi.orb.local:8317/v1
CUSTOM_API_KEY="sk-cliproxy-vnrom-net"
ANYCRAWL_EXTRACT_JSON_CREDITS=5
ANYCRAWL_PROXY_STEALTH_CREDITS=5
ANYCRAWL_TEMPLATE_EXECUTION_TIMEOUT=600_000
ANYCRAWL_REQUEST_HANDLER_TIMEOUT_SECS=600_000
ANYCRAWL_TEMPLATE_CACHE_TTL_MS=0
ANYCRAWL_SCHEDULER_ENABLED=true
ANYCRAWL_SCHEDULER_SYNC_INTERVAL_MS=10000 # Polling interval to detect new tasks (default: 10 seconds)
ANYCRAWL_WEBHOOKS_ENABLED=true
ANYCRAWL_WEBHOOKS_QUEUE_CONCURRENCY=10
ALLOW_LOCAL_WEBHOOKS=false # Set to true only for testing
# Postgres
POSTGRES_USER=postgres_user
POSTGRES_PASSWORD=StrongPasswordVeryLongggggg
POSTGRES_DB=postgres_db
# SEARCH
ANYCRAWL_SEARCH_DEFAULT_ENGINE=searxng
ANYCRAWL_SEARCH_ENABLED_ENGINES=searxng
ANYCRAWL_SEARXNG_URL=http://searxng:8080Tạo trước các thư mục cần thiết để tránh lỗi quyền hạn (Permission denied):
mkdir -p storage searxngBước 2: Cấu hình SearXNG (Quan trọng)
Để AnyCrawl có thể “nói chuyện” được với SearXNG, chúng ta cần bật định dạng JSON.
Tạo file searxng/settings.yml:
nano searxng/settings.ymlDán nội dung sau vào file searxng/settings.yml:
use_default_settings: true
server:
secret_key: "ultrasecretkey" # Bắt buộc phải có, nhưng đổi đi nhé
limiter: false
image_proxy: true
search:
formats:
- html
- json # QUAN TRỌNG: Để AnyCrawl đọc được kết quả
engines:
- name: google
engine: google
use_mobile_ui: false
disabled: false
- name: bing
engine: bing
disabled: false
- name: duckduckgo
engine: duckduckgo
disabled: false
Bước 3: File Docker Compose
Đây là phần quan trọng nhất. Hãy thay thế toàn bộ nội dung file docker-compose.yml gốc bằng nội dung dưới đây.
File này đã được tối ưu:
- Bật
platform: linux/arm64. - Chuyển DB sang PostgreSQL 17.
- Tích hợp SearXNG.
- Fix lỗi kết nối Redis.
services:
anycrawl:
container_name: anycrawl_all_in_one
build:
context: .
dockerfile: Dockerfile
target: runtime
environment:
# --- Cấu hình chung ---
NODE_ENV: ${NODE_ENV:-production}
ANYCRAWL_API_PORT: ${ANYCRAWL_API_PORT}
# --- Cấu hình Engine Crawl ---
# Apple Silicon chạy Playwright/Cheerio mượt hơn Puppeteer
ANYCRAWL_HEADLESS: ${ANYCRAWL_HEADLESS:-true}
ANYCRAWL_AVAILABLE_ENGINES: ${ANYCRAWL_AVAILABLE_ENGINES}
ANYCRAWL_IGNORE_SSL_ERROR: ${ANYCRAWL_IGNORE_SSL_ERROR}
# --- Redis (Dùng internal) ---
ANYCRAWL_REDIS_URL: ${ANYCRAWL_REDIS_URL}
# --- DATABASE: POSTGRESQL ---
ANYCRAWL_API_DB_TYPE: ${ANYCRAWL_API_DB_TYPE}
ANYCRAWL_API_DB_CONNECTION: "${ANYCRAWL_API_DB_TYPE}://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}"
# --- SEARCH ENGINE (Dùng SearXNG Local) ---
ANYCRAWL_SEARCH_DEFAULT_ENGINE: ${ANYCRAWL_SEARCH_DEFAULT_ENGINE}
ANYCRAWL_SEARCH_ENABLED_ENGINES: ${ANYCRAWL_SEARCH_ENABLED_ENGINES}
ANYCRAWL_SEARXNG_URL: ${ANYCRAWL_SEARXNG_URL}
DEFAULT_LLM_MODEL: ${DEFAULT_LLM_MODEL}
CUSTOM_BASE_URL: ${CUSTOM_BASE_URL}
CUSTOM_API_KEY: ${CUSTOM_API_KEY}
ports:
- "8880:8880"
volumes:
- ./storage:/usr/src/app/storage
depends_on:
- postgres
- searxng
platform: linux/arm64
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8880/health"]
interval: 30s
timeout: 30s
retries: 3
start_period: 10s
postgres:
image: postgres:17-alpine
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgres-data:/var/lib/postgresql/data
platform: linux/arm64
searxng:
image: searxng/searxng:latest
environment:
- SEARXNG_BASE_URL=http://localhost:8080/
volumes:
- ./searxng:/etc/searxng:rw
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
logging:
driver: "json-file"
options:
max-size: "1m"
volumes:
postgres-data:Bước 4: Build và Khởi chạy
- Dọn dẹp môi trường cũ (Nếu đã từng chạy lỗi):
docker compose down -v
# Lệnh -v rất quan trọng để xóa sạch volume database cũ bị lỗi.- Khởi chạy:
docker compose up -d --build- Chạy Migration Database (Bắt buộc): Mặc dù script khởi động có lệnh migrate, nhưng đôi khi nó chạy trước khi Postgres sẵn sàng. Để chắc chắn 100% không gặp lỗi
relation "jobs" does not exist, hãy chạy thủ công lệnh này sau khi container đã lên:
docker compose exec anycrawl sh -c "cd packages/db && npx drizzle-kit migrate"
# Khi thấy thông báo [✓] ... là thành công.Bước 5: Kiểm tra thành quả
Bây giờ ae có thể test hệ thống.
1. Test Search (Thông qua SearXNG):
- URL:
POST http://localhost:8880/v1/search - Body:
{ "query": "AnyCrawl GitHub", "limit": 5 } - Kết quả: Trả về JSON chứa danh sách link mà không bị lỗi
PROXY_REQUIRED.
2. Test Crawl:
- URL:
POST http://localhost:8880/v1/crawl - Body:
{ "url": "https://vnrom.net" }
Các lỗi thường gặp và cách fix
- Lỗi
Unsupported database type: postgres:- Nguyên nhân: Bạn set
ANYCRAWL_API_DB_TYPElàpostgres. - Fix: Đổi thành
postgresql.
- Nguyên nhân: Bạn set
- Lỗi
PROXY_REQUIRED:- Nguyên nhân: AnyCrawl đang cố search Google trực tiếp.
- Fix: Đảm bảo biến
ANYCRAWL_SEARCH_ENABLED_ENGINESchỉ chứasearxng.
- Lỗi
relation "jobs" does not exist:- Nguyên nhân: Chưa chạy migration tạo bảng.
- Fix: Chạy lệnh
npx drizzle-kit migrateở Bước 4.
- Lỗi Search trả về
data: []:- Nguyên nhân: SearXNG bị chặn hoặc chưa bật format JSON.
- Fix: Kiểm tra file
searxng/settings.ymlđã cóformats: - jsonchưa.
Chúc các ae cài đặt thành công và có trải nghiệm mượt mà với AnyCrawl trên macOS! Nếu có thắc mắc, hãy để lại bình luận nhé.








