browser-use + ollamaでローカルサイト(Zabbix)を操作してみた

前回に引き続き、browser-use関連です。自宅にGPUもあるんだしせっかくならbrowser-useをローカルLLMで試してみます。browser-use-webuiを利用する例は、ググればたくさんでてくるのですが、逆にbrowser-use-webuiを使わないパターンはなさそうだったので、トライすることにしてみました。また今回はコンテナ上で起動しているZabbixをbrowser-useを使って操作しています。

#### 環境イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/173a2473-6a16-481f-83b4-946961ce72d7.png)


前回構成した環境をそのまま利用していますので、まずは下記記事をご確認ください。

https://qiita.com/nw-engineer/items/9f42aec98e5f61de9cd2

# 前提
OS：Ubuntu 22.04.5 LTS
Docker version： 27.3.1, build ce12230
Docker Compose version： v2.29.7
GPU: GEFORCE RTX 4090
NVIDIA-SMI: 560.35.03
Driver Version: 560.35.03
CUDA Version: 12.6
nvidia-container-toolkit：1.17.2
LLM：qwen2.5:32b-instruct-q4_K_M
Zabbix：7.2.3


# 1. Zabbixサーバ用コンテナ作成

任意のディレクトリにdocker-compose.ymlを作成します。

```yaml:docker-compose.yml
services:
  mysql:
    image: mysql:8.0
    container_name: zabbix-mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_password
    volumes:
      - mysql_data:/var/lib/mysql
    command: --default-authentication-plugin=mysql_native_password
    networks:
      - zabbix-net

  zabbix-server:
    image: zabbix/zabbix-server-mysql:latest
    container_name: zabbix-server
    restart: always
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_password
    depends_on:
      - mysql
    ports:
      - "10051:10051"
    networks:
      - zabbix-net

  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:latest
    container_name: zabbix-web
    restart: always
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: zabbix_password
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: "Asia/Tokyo"
    depends_on:
      - mysql
      - zabbix-server
    ports:
      - "8080:8080"
    networks:
      - zabbix-net

  zabbix-agent:
    image: zabbix/zabbix-agent:latest
    container_name: zabbix-agent
    restart: always
    environment:
      ZBX_HOSTNAME: "zabbix-agent"
      ZBX_SERVER_HOST: "zabbix-server"
    depends_on:
      - zabbix-server
    networks:
      - zabbix-net

networks:
  zabbix-net:
    driver: bridge

volumes:
  mysql_data:
```

Zabbix関連のコンテナを起動します。
```bash
docker-compose up -d
```

このままではZabbix-serverが起動しない為、必要なデータを公式サイトからダウンロードし、zabbix-mysqlコンテナに転送します。
```bash
wget https://cdn.zabbix.com/zabbix/sources/stable/7.2/zabbix-7.2.3.tar.gz
tar zxvf zabbix-7.2.3.tar.gz
cd zabbix-7.2.3/database/mysql/
docker cp images.sql zabbix-mysql:/tmp/
docker cp data.sql zabbix-mysql:/tmp/
```

zabbix-mysqlコンテナにログインして、転送したsqlを適用します。(パスワードはzabbix_password）
```bash
docker exec -it zabbix-mysql /bin/bash
mysql -u root -p zabbix < /tmp/images.sql
mysql -u root -p zabbix < /tmp/data.sql
exit
```

Zabbix関連のコンテナステータスがすべてUPとなっていることを確認します。
```bash
root@docker001:~# docker ps
CONTAINER ID   IMAGE                                  COMMAND                  CREATED          STATUS                  PORTS                                                 NAMES
13927cb8f1c2   ollama/ollama                          "/bin/ollama serve"      54 minutes ago   Up 50 minutes           0.0.0.0:11434->11434/tcp, :::11434->11434/tcp         ollama
96bbad4fb83e   zabbix/zabbix-web-nginx-mysql:latest   "docker-entrypoint.sh"   20 hours ago     Up 20 hours (healthy)   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp, 8443/tcp   zabbix-web
57975519b94f   zabbix/zabbix-agent:latest             "/usr/bin/docker-ent…"   20 hours ago     Up 20 hours             10050/tcp                                             zabbix-agent
50a7e97e17e4   zabbix/zabbix-server-mysql:latest      "/usr/bin/docker-ent…"   20 hours ago     Up 20 hours             0.0.0.0:10051->10051/tcp, :::10051->10051/tcp         zabbix-server
557f7db4b1f1   mysql:8.0                              "docker-entrypoint.s…"   20 hours ago     Up 20 hours             3306/tcp, 33060/tcp                                   zabbix-mysql
```



# 2. ollama用コンテナ作成
次にローカルLLMを利用するためにollamaコンテナを作成します。
```bash
docker run -d --runtime=nvidia --gpus=all --ulimit memlock=-1:-1 -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
```

コンテナ作成の次はモデルをダウンロードします。（qwen2.5:32b-instruct-q4_K_Mは19GBあります）
```bash
docker exec -it ollama /bin/bash
ollama pull qwen2.5:32b-instruct-q4_K_M
```

ollama listコマンドでモデル一覧からqwen2.5:32b-instruct-q4_K_Mが存在していることを確認します。
```bash
ollama list
NAME                           ID              SIZE      MODIFIED
qwen2.5:32b-instruct-q4_K_M    9f13ba1299af    19 GB     4 seconds ago
```


# 3. Browser_UseでZabbix画面を操作

Zabbixおよびollamaが準備できましたので、Browser_Useを実行するコンテナにログインしましょう。
```bash
docker exec -it ubuntu-rdp-desktop /bin/bash
cd ~
source browser_use/bin/activate
```

BrowserUse実行用コードを作成します。Taskに日本語を設定すると失敗するため、指示は英語にしました。

```python:ollama_zabbix.py
import asyncio
import certifi
import os
from browser_use import Agent
from browser_use.agent.views import AgentHistoryList
from langchain_ollama import ChatOllama

os.environ['REQUESTS_CA_BUNDLE'] = './myCA.pem'          # Proxy CA

os.environ['http_proxy'] = 'http://10.x.x.x:8080'        # Proxyアドレス
os.environ['https_proxy'] = 'http://10.x.x.x:8080'       # Proxyアドレス
os.environ['NO_PROXY'] = 'localhost,127.0.0.1,10.x.x.x'  # ローカルアドレスをProxy経由にさせない

certifi.where = lambda: '/etc/ssl/certs/ca-certificates.crt'

async def run_search() -> AgentHistoryList:
    agent = Agent(
        task=(
            "Please access 'http://10.x.x.x:8080/' and log in with Username: Admin, Password: zabbix to obtain the site title."
        ),
        llm=ChatOllama(
            model='qwen2.5:32b-instruct-q4_K_M',
            base_url="http://10.x.x.x:11434",           # Dockerホストのアドレス
            num_ctx=32000,
        ),
    )
    await agent.run()

if __name__ == '__main__':
    asyncio.run(run_search())

```

ではDesktop上で実行しましょう
```bash
python3 ollama_zabbix.py
```

Zabbixログインページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/b7f1c15c-119f-4a0d-ba09-a3be17d2c85f.png)

しばらくすると、IDとパスワードが自動入力されて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/9ea8e08e-7663-4171-bc94-0ec1f6ab7330.png)

ログイン画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/a4347f05-e0a3-4e16-8b08-d2984c1cc44c.png)

タスク指示にあるとおり、サイトのタイトルを取得していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/4fec1aac-b254-46a3-b05d-f895bd49d1aa.png)


ollamaコンテナのログをモニタリングした結果は以下の通りでした。
```
[GIN] 2025/02/12 - 21:53:20 | 200 | 33.282570628s |      172.17.0.1 | POST     "/api/chat"
[GIN] 2025/02/12 - 21:53:58 | 200 | 36.270584965s |      172.17.0.1 | POST     "/api/chat"
[GIN] 2025/02/12 - 21:54:50 | 200 | 44.702575504s |      172.17.0.1 | POST     "/api/chat"
```