在 Ubuntu 24 上安裝 FireCrawl

在 Ubuntu 24 上安裝 FireCrawl

4 min read

本教學的最終目標是完成以下架構。

  1. 在 Ubuntu 24 上安裝 FireCrowl(API 伺服器 & 工作程式)
  2. 將 Node.js 安裝於系統全域,並全域使用 pnpm 指令
  3. 導入 Rust 工具鏈(rustup 等),編譯 FireCrawl 以 Rust 撰寫的 HTML 轉換函式庫(html-transformer)
  4. 安裝 Playwright 的相依套件,並建立自訂的 Playwright 微服務指令碼
  5. 建立兩個用於啟動 FireCrowl 的 systemd 服務(伺服器用 & 工作程式用),
    • OS 啟動時自動啟動
    • 可透過手動執行 sudo systemctl restart firecrowl-server / sudo systemctl restart firecrowl-workers 等指令控制
                                          (Optional)
                                     +-----------------+
                                     |      Dify       |
                                     +-----------------+
                                              |
                                              | HTTP / REST API
                                              v
    +------------------------------------------------------------------+
    | FireCrawl (Node.js, TypeScript, pnpm)                            |
    |  Directory: /home/firecrawl/apps/api                              |
    |                                                                  |
    |  +----------------------+      (pnpm run start)                 |
    |  |   API Server         |-----------------------------------------+
    |  | - Express            |                                         |
    |  | - BullMQ Dashboard   |                                         |
    |  +----------------------+                                         |
    |             ^                                                    |
    |             | (Queue tasks)                                      |
    |  +----------------------+      (pnpm run workers)                |
    |  |   Workers            |-----------------------------------------+
    |  | - Scraping, parsing, |                                         |
    |  |   indexing           |                                         |
    |  +----------------------+                                         |
    |                                                                  |
    |  - .env 中設定的各項選項(API 金鑰、PORT、HOST、                |
    |    PLAYWRIGHT_MICROSERVICE_URL等)                                 |
    |                                                                  |
    |  - Rust HTML Transformer:                                        |
    |      -> Built via Cargo in:                                      |
    |         /home/firecrawl/apps/api/sharedLibs/html-transformer       |
    |      -> Generates: libhtml_transformer.so                         |
    |      -> Used by FireCrawl for fast HTML parsing (or falls back to   |
    |         Cheerio)                                                 |
    +------------------------------------------------------------------+
                                              |
                                              | Task Queue / Rate Limit
                                              v
    +----------------------------------+
    |        Redis (localhost)         |
    |  - Used by BullMQ for job queuing|
    +----------------------------------+
    
    
    +---------------------------------------------+
    | systemd (Ubuntu 24)                        |
    |                                             |
    |  +--------------------------+               |
    |  | firecrowl-server         |               |
    |  | - ExecStart=pnpm run start|               |
    |  +--------------------------+               |
    |  +--------------------------+               |
    |  | firecrowl-workers        |               |
    |  | - ExecStart=pnpm run     |               |
    |  |   workers                |               |
    |  +--------------------------+               |
    |  +--------------------------+               |
    |  | firecrowl-playwright     |               |
    |  | - ExecStart=pnpm run     |               |
    |  |   playwright-service     |               |
    |  +--------------------------+               |
    |  (Automatic start at boot, process monitoring,|
    |   logs managed via systemd)                  |
    +---------------------------------------------+
    

    前提條件:

    • 在 Ubuntu 24(代號 “noble”)上不使用 Docker 執行
    • OS 使用者可以管理員權限操作
    • 預計將 FireCrowl 儲存庫複製(clone)至 /home/firecrawl 目錄
    • Redis 已安裝(sudo apt install -y redis-server)並正在執行

    STEP1. 系統準備與安裝 Node.js / pnpm #

    STEP1.1 系統更新與安裝開發工具 #

    sudo apt update
    sudo apt install -y build-essential pkg-config curl git libssl-dev
    

    STEP1.2 從 NodeSource 安裝 Node.js #

    curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
    sudo apt-get install -y nodejs
    

    STEP1.3 全域安裝 pnpm #

    sudo npm install -g pnpm
    

    ※請以 which pnpm 確認執行路徑(例如:/usr/local/bin/pnpm)。


    STEP2. 複製 FireCrawl 儲存庫並安裝相依套件 #

    STEP2.1 複製 FireCrawl #

    cd /home/firecrawl
    git clone https://github.com/mendableai/firecrawl.git
    

    STEP2.2 安裝相依套件 #

    cd /home/firecrawl/apps/api
    pnpm install
    

    STEP2.3 設定 .env 檔案 #

    建立或編輯 /home/firecrawl/apps/api/.env,設定所需的環境變數。範例:

    # ===== Required ENVS ======
    NUM_WORKERS_PER_QUEUE=8
    PORT=3002
    HOST=0.0.0.0
    REDIS_URL=redis://localhost:6379
    REDIS_RATE_LIMIT_URL=redis://localhost:6379
    PLAYWRIGHT_MICROSERVICE_URL=http://localhost:3000/html
    USE_DB_AUTHENTICATION=false
    
    # ===== Optional ENVS ======
    TEST_API_KEY=fc-bestnet
    BULL_AUTH_KEY=fc-bestnet
    ...(其他選項視需求添加)
    

    STEP3. 導入 Rust 工具鏈並編譯 HTML Transformer #

    STEP3.1 安裝 Rust 工具鏈 #

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
    source $HOME/.cargo/env
    rustc --version
    cargo --version
    

    STEP3.2 確認 FireCrawl 內的 Rust 函式庫目錄 #

    在儲存庫根目錄執行以下指令,尋找 Cargo.toml 所在的目錄。

    cd /home/firecrawl
    find . -type f -name Cargo.toml | grep -i html-transformer
    

    例如:找到 ./sharedLibs/html-transformer/Cargo.toml 後,切換至該目錄。

    STEP3.3 編譯 Rust 函式庫 #

    cd /home/firecrawl/sharedLibs/html-transformer
    cargo build --release
    

    編譯成功後會產生 target/release/libhtml_transformer.so。確認方式:

    ls target/release/libhtml_transformer.so
    

    STEP3.4 配置函式庫或設定環境變數 #

    • 方法 A:若 FireCrawl 的 Node.js 程式碼以相對路徑讀取,則不需額外作業
    • 方法 B:視需要將其加入 LD_LIBRARY_PATH 中
    export LD_LIBRARY_PATH=/home/firecrawl/sharedLibs/html-transformer/target/release:$LD_LIBRARY_PATH
    

    若要在 systemd 中自動設定,請在服務檔案中加入
    Environment=LD_LIBRARY_PATH=...。


    STEP4. 設定 Playwright 並建立微服務指令碼 #

    STEP4.1 安裝 Playwright 相依套件 #

    Ubuntu 24.04 適用的相依函式庫範例:

    sudo apt-get install -y libnss3 libnspr4 libatk1.0-0 libatk-bridge2.0-0 libcups2 \
        libdrm2 libxkbcommon0 libgtk-3-0 libpango-1.0-0 libcairo2 libgdk-pixbuf2.0-0 \
        libgbm1 libatspi2.0-0 libx11-xcb1 libxcomposite1 libxdamage1 libxfixes3 \
        libxrandr2 libxrender1 libxtst6 libxcb1 libxi6 libxcursor1 ca-certificates \
        fonts-liberation xdg-utils
    

    STEP4.2 安裝 Playwright 瀏覽器 #

    pnpm exec playwright install
    

    STEP4.3 建立 Playwright 微服務指令碼 #

    在 /home/firecrawl/apps/api 建立 playwright-service.js,貼上以下範例程式碼。

    // playwright-service.js
    const http = require('http');
    const { chromium } = require('playwright');
    
    const PORT = 3000;
    
    const server = http.createServer(async (req, res) => {
      if (req.method === 'GET' && req.url.startsWith('/html')) {
        try {
          const urlParam = new URL(req.url, `http://localhost:${PORT}`).searchParams.get('url');
          if (!urlParam) {
            res.writeHead(400, { 'Content-Type': 'text/plain' });
            return res.end('Missing ?url parameter');
          }
          const browser = await chromium.launch({ headless: true });
          const page = await browser.newPage();
          await page.goto(urlParam, { waitUntil: 'networkidle' });
          const content = await page.content();
          res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
          res.end(content);
          await browser.close();
        } catch (err) {
          console.error('Playwright microservice error:', err);
          res.writeHead(500, { 'Content-Type': 'text/plain' });
          res.end('Playwright error occurred');
        }
      } else {
        res.writeHead(404, { 'Content-Type': 'text/plain' });
        res.end('Not found');
      }
    });
    
    server.listen(PORT, '0.0.0.0', () => {
      console.log(`Playwright microservice listening on http://0.0.0.0:${PORT}/html`);
    });
    

    STEP4.4 在 package.json 中新增指令碼 #

    請在 /home/firecrawl/apps/api/package.json 的 "scripts" 中新增下列內容(與現有項目合併)。

    "playwright-service": "node playwright-service.js"
    

    STEP5. 設定 Systemd 服務 #

    為了讓 FireCrawl 伺服器、工作程式、Playwright 微服務能自動啟動,需要建立 systemd 單元檔案。

    STEP5.1 FireCrawl 伺服器服務 (/etc/systemd/system/firecrowl-server.service) #

    [Unit]
    Description=FireCrowl Server
    After=network.target
    
    [Service]
    User=firecrawl
    Group=firecrawl
    WorkingDirectory=/home/firecrawl/apps/api
    Environment=PATH=/usr/local/bin:/usr/bin:/bin
    ExecStart=/bin/bash -c 'pnpm run start'
    Restart=always
    RestartSec=5
    Type=simple
    
    [Install]
    WantedBy=multi-user.target
    

    STEP5.2 FireCrawl 工作程式服務 (/etc/systemd/system/firecrowl-workers.service) #

    [Unit]
    Description=FireCrowl Workers
    After=network.target
    
    [Service]
    User=firecrawl
    Group=firecrawl
    WorkingDirectory=/home/firecrawl/apps/api
    Environment=PATH=/usr/local/bin:/usr/bin:/bin
    ExecStart=/bin/bash -c 'pnpm run workers'
    Restart=always
    RestartSec=5
    Type=simple
    
    [Install]
    WantedBy=multi-user.target
    

    STEP5.3 Playwright 微服務服務 (/etc/systemd/system/firecrowl-playwright.service) #

    [Unit]
    Description=FireCrowl Playwright Microservice
    After=network.target
    
    [Service]
    User=firecrawl
    Group=firecrawl
    WorkingDirectory=/home/firecrawl/apps/api
    Environment=PATH=/home/firecrawl/.nvm/versions/node/v20.18.3/bin:/usr/local/bin:/usr/bin:/bin
    ExecStart=/bin/bash -c 'pnpm run playwright-service'
    Restart=always
    RestartSec=5
    Type=simple
    
    [Install]
    WantedBy=multi-user.target
    

    注意:

    • 若使用 User=firecrawl,需事先建立 firecrawl 使用者,並以 sudo chown -R firecrawl:firecrawl /home/firecrawl 等指令設定擁有權。
    • Environment=PATH=... 中設定的是透過 nvm 安裝的 Node.js 路徑,請依實際環境修改。
    • 若未以相對路徑讀取 Rust 函式庫,則也需要設定 LD_LIBRARY_PATH。

    STEP5.4 啟用並啟動 Systemd 服務 #

    sudo systemctl daemon-reload
    sudo systemctl enable firecrowl-server
    sudo systemctl enable firecrowl-workers
    sudo systemctl enable firecrowl-playwright
    sudo systemctl start firecrowl-server
    sudo systemctl start firecrowl-workers
    sudo systemctl start firecrowl-playwright
    

    請以 sudo systemctl status <service> 確認各服務是否為 active (running) 狀態。


    STEP6. 重新啟動 FireCrawl 並驗證 #

    1. 確認 .env 設定:
      請特別確認 PLAYWRIGHT_MICROSERVICE_URL 是否為 http://localhost:3000/html 設定
    2. FireCrawl 的伺服器與工作程式已啟動:
      若日誌中出現「Scrape via fetch…」等訊息,表示 HTTP 請求運作正常
    3. 確認 Playwright 服務運作狀況:
      在瀏覽器中存取 http://<伺服器IP>:3000/html?url=https://example.com,若能取得回傳的 HTML 即為正常

    STEP7. 最終確認 #

    • Rust 函式庫:
      確認 target/release/libhtml_transformer.so 存在,且日誌中沒有錯誤訊息
    • Playwright 微服務:
      測試是否正確啟動並執行 JavaScript 轉譯
    • 整體連動:
      最終確認 FireCrawl 伺服器、工作程式、Playwright 是否協同運作,並能正常回應來自 Dify 等的請求
Updated on 2026年6月9日

What are your feelings

  • Happy
  • Normal
  • Sad

©2020 BESTNET.LLC . All Rights Reserved.