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?

  1. PostgreSQL thay vì SQLite: SQLite mặc định thường gặp lỗi database locked khi chạy nhiều worker đồng thời, và hay gặp lỗi thư viện better-sqlite3 trên chip M1. PostgreSQL ổn định hơn nhiều.
  2. 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í.
  3. 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 .env

AE 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:8080

Tạ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 searxng

Bướ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.yml

Dá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

  1. 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.
  1. Khởi chạy:
docker compose up -d --build
  1. 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

  1. Lỗi Unsupported database type: postgres:
    • Nguyên nhân: Bạn set ANYCRAWL_API_DB_TYPE là postgres.
    • Fix: Đổi thành postgresql.
  2. 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_ENGINES chỉ chứa searxng.
  3. 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.
  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: - json chư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é.

Duy Nghiện
Hãy làm khán giả, đừng làm nhân vật chính :)

You may also like

Nhận thông báo qua email
Nhận thông báo cho
guest

0 Bình luận
Mới nhất
Cũ nhất Nhiều like nhất
Phản hồi nội tuyến
Xem tất cả bình luận