「障害ログやコード断片を貼ってAIに相談したいが、クラウドAIサービスのSlack連携では機密データが外に出てしまう」
そんな課題を抱えるインフラエンジニアや情シス担当者は多い。この記事では、OllamaのREST APIとPythonの公式ライブラリ slack-bolt を組み合わせて、すべての推論処理を社内Linuxサーバーで完結させるSlackボットの構築手順を解説する。
Slack Socket Modeを使うためNginxのリバースプロキシも外部ポート開放も不要だ。Pythonコードの実装からsystemdサービス化による常時起動まで一通りカバーする。
この記事のポイント
・slack-boltとOllama REST APIを組み合わせれば社内SlackにローカルAIを追加できる
・Socket Modeを使えばポート開放もNginxも不要でボットサーバーを動かせる
・すべての推論が社内Linuxサーバーで完結するため機密データは外部AIに渡らない
・systemdのEnvironmentFileディレクティブでSlackトークンを安全に管理する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜSlackボットにローカルLLMを使うのか
社内チャンネルに流れる情報には、プロジェクト名・顧客名・障害ログ・コード断片など機密性の高い内容が多く含まれる。ChatGPTやClaudeのSlack連携アプリを使うと、これらのテキストがそのままAPIリクエストに乗って外部サーバーへ転送される。ローカルLLMを使えば、Slackのサーバーにはユーザーの質問テキストが届くが、その内容を外部AIへ送る処理がなくなる。推論はすべて社内ネットワーク上のLinuxサーバーで完結する。社内でChatGPTが使えないときの代替手段の記事でも触れているとおり、データガバナンスを理由にローカルLLMを選ぶ企業は増えている。
運用コストの面では、GPU非搭載のCPUオンリーサーバーでも Phi-4 14B や Gemma 3 4B 程度なら30秒前後で返答が返る。業務中の軽い質問応答であればこれで十分だ。チームへの社内PoC(概念実証)として低コストで始めたい場合にも向いている。
今回構築するシステムの全体像は次のとおりだ。
・Slackユーザーがボットをメンション → Slackサーバーがイベントを送信
・ボットサーバー(Python)がSocket Mode経由でイベントを受け取る
・ボットサーバーがOllama REST APIに問い合わせ → Ollamaが推論を実行
・ボットサーバーが応答をSlackに投稿
LLMへの問い合わせは社内ネットワーク内で閉じており、外部サービスに送られるのはSlackの通信のみだ。
事前準備:Ollama稼働確認とSlack Appの作成
1. Ollamaの稼働確認
ボットサーバーと同じLinuxホスト、またはLAN内の別ホストでOllamaが動いていることを確認する。Ubuntu ServerへのOllamaセットアップ手順はUbuntu ServerでローカルLLMを構築する方法を参照してほしい。# OllamaのAPI疎通確認 $ curl -s http://localhost:11434/api/tags | python3 -m json.tool | head -10 { "models": [ { "name": "llama3.3:70b-instruct-q4_0", "modified_at": "2026-07-01T10:00:00.000000000Z", "size": 43000000000 } ] }
2. Slack Appの作成とSocket Mode有効化
Slackにボットを追加するには、Slack APIコンソール(https://api.slack.com/apps)でAppを作成する必要がある。・「Create New App」→「From scratch」→ App名(例: OllamaBot)とワークスペースを指定して作成
・左メニュー「Socket Mode」を開き「Enable Socket Mode」をオン。App-Level Tokenの生成画面が出るのでスコープに `connections:write` を付けてトークンを生成する。このトークンを `SLACK_APP_TOKEN` として控えておく(`xapp-` で始まる文字列)
・左メニュー「OAuth & Permissions」→「Bot Token Scopes」に `app_mentions:read`・`chat:write`・`channels:history` を追加する
・「Install to Workspace」でワークスペースにインストールし、Bot User OAuth Token(`xoxb-` から始まる)を `SLACK_BOT_TOKEN` として控える
・左メニュー「Event Subscriptions」をオンにして「Subscribe to bot events」に `app_mention` を追加する。Socket Modeが有効なためRequest URLの入力は不要だ
Socket ModeではSlackからボットサーバーへWebSocket接続が張られる。ボット側から外部への接続を開始する形なので、ポート開放もNginxも不要だ。
Python環境のセットアップ
1. 仮想環境の作成と必要ライブラリのインストール
Pythonのバージョンは3.10以上を推奨する。Ubuntu 24.04 LTSには標準で3.12が同梱されているためそのまま使える。# 作業ディレクトリの作成と仮想環境のセットアップ $ sudo mkdir -p /opt/ollama-slack-bot $ sudo chown $USER:$USER /opt/ollama-slack-bot $ cd /opt/ollama-slack-bot $ python3 -m venv .venv $ source .venv/bin/activate $ pip install slack-bolt requests
インストール後にバージョンを確認しておく。
# インストール確認 $ pip show slack-bolt requests | grep -E "^Name|^Version" Name: slack-bolt Version: 1.21.3 Name: requests Version: 2.32.3
OllamaのAPIを呼び出すコアモジュールの実装
1. Ollamaクライアントモジュールの作成
OllamaのREST APIとの通信は `/api/generate` エンドポイントへのPOSTリクエストで行う。`stream: false` を指定すると推論完了時にまとめてレスポンスが返ってくるため、Slackへの返信実装がシンプルになる。# /opt/ollama-slack-bot/ollama_client.py import requests OLLAMA_URL = "http://localhost:11434/api/generate" MODEL = "llama3.3:70b-instruct-q4_0" def ask_ollama(prompt: str, timeout: int = 120) -> str: payload = { "model": MODEL, "prompt": prompt, "stream": False } resp = requests.post(OLLAMA_URL, json=payload, timeout=timeout) resp.raise_for_status() return resp.json().get("response", "").strip()
`timeout=120` はCPU推論のケースを想定した値だ。GPU環境なら30秒程度に短縮してよい。VRAMが少ないサーバーでは Gemma 3 4B や Phi-4 14B の小型モデルが現実的だ。
2. 単体テストで動作確認
# Ollamaクライアント単体テスト $ cd /opt/ollama-slack-bot && source .venv/bin/activate $ python3 -c "from ollama_client import ask_ollama; print(ask_ollama('Linuxとは何か1文で答えてください'))" LinuxはLinus Torvaldsが開発したオープンソースのUnix系カーネルを基盤とするOSです。
Slack Eventsをリッスンするボットサーバーの実装
1. ボットのメインスクリプト
slack-boltの `App` クラスがSocket Modeのコネクションを管理する。`@app.event("app_mention")` デコレータでボットへのメンションを受け取ったときの処理を定義する。# /opt/ollama-slack-bot/bot.py import os, re from slack_bolt import App from slack_bolt.adapter.socket_mode import SocketModeHandler from ollama_client import ask_ollama SLACK_BOT_TOKEN = os.environ["SLACK_BOT_TOKEN"] SLACK_APP_TOKEN = os.environ["SLACK_APP_TOKEN"] app = App(token=SLACK_BOT_TOKEN) @app.event("app_mention") def handle_mention(event, say): # メンション部分(<@UXXXXXXXX>)を除去してプロンプトを抽出 text = re.sub(r"<@[A-Z0-9]+>", "", event["text"]).strip() if not text: say("質問内容を入力してください。") return response = ask_ollama(text) say(response) if __name__ == "__main__": handler = SocketModeHandler(app, SLACK_APP_TOKEN) handler.start()
`say()` で投稿した返信はメンションと同じチャンネルに届く。スレッド内に返信したい場合は `say(text=response, thread_ts=event["ts"])` を使う。
2. テスト起動と動作確認
# テスト起動(Ctrl+C で停止) $ export SLACK_BOT_TOKEN="xoxb-xxxx-xxxx-xxxx" $ export SLACK_APP_TOKEN="xapp-1-xxxx-xxxx-xxxx" $ source /opt/ollama-slack-bot/.venv/bin/activate $ python3 /opt/ollama-slack-bot/bot.py Bolt app is running!
トークンの安全な管理と環境設定
トークンをスクリプトにハードコーディングすると、Gitリポジトリに誤ってコミットするリスクがある。専用の環境変数ファイルに切り出して管理する。# /opt/ollama-slack-bot/.env の作成(パーミッション600) $ cat > /opt/ollama-slack-bot/.env << 'EOF' SLACK_BOT_TOKEN=xoxb-xxxx-xxxx-xxxx SLACK_APP_TOKEN=xapp-1-xxxx-xxxx-xxxx EOF $ chmod 600 /opt/ollama-slack-bot/.env $ ls -la /opt/ollama-slack-bot/.env -rw------- 1 ubuntu ubuntu 89 Jul 17 10:00 /opt/ollama-slack-bot/.env
# .gitignore に .env を追加 $ echo ".env" >> /opt/ollama-slack-bot/.gitignore
systemdサービスとしてSlackボットを常時起動させる
1. systemdユニットファイルの作成
# /etc/systemd/system/ollama-slack-bot.service [Unit] Description=Ollama Slack Bot After=network-online.target ollama.service Wants=network-online.target [Service] Type=simple User=ubuntu WorkingDirectory=/opt/ollama-slack-bot EnvironmentFile=/opt/ollama-slack-bot/.env ExecStart=/opt/ollama-slack-bot/.venv/bin/python3 /opt/ollama-slack-bot/bot.py Restart=on-failure RestartSec=15 [Install] WantedBy=multi-user.target
2. サービスの有効化と起動
# systemdへの登録・有効化・起動 $ sudo systemctl daemon-reload $ sudo systemctl enable ollama-slack-bot $ sudo systemctl start ollama-slack-bot $ sudo systemctl status ollama-slack-bot * ollama-slack-bot.service - Ollama Slack Bot Loaded: loaded (/etc/systemd/system/ollama-slack-bot.service; enabled) Active: active (running) since Thu 2026-07-17 10:00:00 JST Main PID: 9876 (python3) Memory: 62.1M
ログはjournalctlで確認できる。
# リアルタイムでログを確認 $ journalctl -u ollama-slack-bot -f Jul 17 10:00:05 server01 python3[9876]: Bolt app is running! Jul 17 10:05:12 server01 python3[9876]: mention received: Linuxのinodeとは何ですか
よくあるエラーと対処法
「slack_sdk.errors.SlackApiError: invalid_auth」
`SLACK_BOT_TOKEN` が不正か期限切れになっている。Slack APIコンソールで「OAuth & Permissions」を開き、Bot User OAuth Tokenを再発行する。スコープを後から追加した場合は「Reinstall to Workspace」でアプリを再インストールしないと新しいスコープが有効にならない点に注意だ。# 環境変数が正しく読み込まれているか確認 $ sudo systemctl show ollama-slack-bot --property=Environment Environment=SLACK_BOT_TOKEN=xoxb-xxxx... SLACK_APP_TOKEN=xapp-1-xxxx...
「requests.exceptions.ConnectionError: Failed to establish a new connection」
Ollamaがポート11434を開いていない。まずOllamaサービスの状態を確認する。# Ollamaサービスの確認とポートの確認 $ systemctl status ollama $ ss -tlnp | grep 11434 LISTEN 0 128 0.0.0.0:11434 0.0.0.0:* users:(("ollama",pid=1234,fd=3))
メンションしても応答しない(ログにイベントが来ていない)
最も多い原因はボットをチャンネルに招待していないケースだ。Slackのチャンネルで `/invite @OllamaBot` を実行してから再試行する。それでも応答しない場合は「Event Subscriptions」で `app_mention` が追加されているかを確認する。# 直近5分のログでイベント受信状況を確認 $ journalctl -u ollama-slack-bot --since "5 minutes ago"
まとめ
slack-boltのSocket ModeでSlackイベントを受け取り、Ollama REST APIに問い合わせて返信を投稿するシンプルな構成だ。社内ネットワーク内の推論に閉じているため、質問テキストが外部AIサービスに渡ることはない。| やりたいこと | コマンド・設定 |
|---|---|
| Ollama疎通確認 | curl -s http://localhost:11434/api/tags |
| 仮想環境作成 | python3 -m venv /opt/ollama-slack-bot/.venv |
| ライブラリインストール | pip install slack-bolt requests |
| テスト起動 | python3 /opt/ollama-slack-bot/bot.py |
| トークンファイル保護 | chmod 600 /opt/ollama-slack-bot/.env |
| systemd有効化 | systemctl enable ollama-slack-bot |
| サービス起動 | systemctl start ollama-slack-bot |
| ログ確認 | journalctl -u ollama-slack-bot -f |
OllamaのSlack連携を2日間のハンズオンで実機体験する
この記事の構成を実際のLinuxサーバーで手を動かして試したい方には、「ローカルAIマスターセミナー」が役立つ。Ollama環境の構築からSlackなど社内ツール連携の実装まで、実機GPU環境で体験できる。実機GPU環境で手を動かしながら習得したい方向けに、「ローカルAIマスターセミナー」を開催しています。
少人数(最大8名)ZOOMハンズオン形式で実施しています。
・Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
・社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
・ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:OllamaでドキュメントをローカルLLMバッチ処理する方法|シェルスクリプトとPythonで社内文書・ログを自動要約する手順
- この記事の属するカテゴリ:ローカルLLMへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます