OllamaをSlackボットに組み込む方法|社内SlackにローカルAIアシスタントをLinuxサーバーで構築する手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)ローカルLLM > OllamaをSlackボットに組み込む方法|社内SlackにローカルAIアシスタントをLinuxサーバーで構築する手順
「社内のSlackチャンネルにAIアシスタントを入れたいが、会話内容がOpenAIのサーバーに送られるのは困る」
「障害ログやコード断片を貼って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トークンを安全に管理する


OllamaをSlackボットに組み込む方法|社内SlackにローカルAIアシスタントをLinuxサーバーで構築する手順

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜ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 } ] }

`models` 配列に使いたいモデルが出てくれば疎通確認は完了だ。

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

`slack-bolt` はSlackの公式Pythonライブラリだ。Socket Modeのコネクション管理も内包されており、Flask・FastAPIなどのフレームワークは別途不要だ。

インストール後にバージョンを確認しておく。

# インストール確認 $ 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()

`MODEL` に入れる値は量子化タグをサフィックス形式で指定する(例: `llama3.3:70b-instruct-q4_0`、`phi4:14b-q8_0`)。`:q4_0` 単独表記は実在しないので注意だ。モデルの選び方についてはローカルLLMのモデルを比較する方法を参考にしてほしい。

`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です。

このように日本語で応答が返ってくれば、Ollamaとの通信は正常だ。

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()

正規表現 `<@[A-Z0-9]+>` はSlackのメンション記法(例: `<@U01234ABCDE>`)を除去するパターンだ。これを除かないとメンション文字列がそのままOllamaへのプロンプトに含まれてしまう。

`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!

「Bolt app is running!」が表示されたら起動成功だ。SlackのチャンネルにボットをInvite(`/invite @OllamaBot`)してからメンションすると返答が来る。CPU環境での初回推論は1分前後かかることがある。

トークンの安全な管理と環境設定

トークンをスクリプトにハードコーディングすると、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

Gitで管理している場合は `.gitignore` に `.env` を追加しておく。

# .gitignore に .env を追加 $ echo ".env" >> /opt/ollama-slack-bot/.gitignore

systemdサービスからこのファイルを読み込む際は `EnvironmentFile=` ディレクティブを使う。パーミッションが600であれば、サービスを実行するユーザーのみがトークンにアクセスできる。

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

`After=ollama.service` を指定することで、Ollamaが起動してからボットが立ち上がる順序が保証される。`Restart=on-failure` と `RestartSec=15` で、予期せぬクラッシュ時に15秒後に自動再起動する。

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

`Active: active (running)` が確認できればボットは常時稼働状態だ。サーバーを再起動しても自動的に起動する。

ログは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))

ポートが見えない場合は `systemctl start ollama` で起動する。Ollamaが別ホストで動いている場合は `OLLAMA_URL` の `localhost` をそのホストのIPアドレスに書き換える。

メンションしても応答しない(ログにイベントが来ていない)

最も多い原因はボットをチャンネルに招待していないケースだ。Slackのチャンネルで `/invite @OllamaBot` を実行してから再試行する。それでも応答しない場合は「Event Subscriptions」で `app_mention` が追加されているかを確認する。

# 直近5分のログでイベント受信状況を確認 $ journalctl -u ollama-slack-bot --since "5 minutes ago"

ログに何も出ていなければイベントがボットに届いていない(チャンネル未招待またはスコープ不足)。ログにエラーが出ている場合はOllama接続エラーかAPI認証エラーを疑う。

まとめ

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
今回はシングルターン応答の最小実装に絞った。拡張として、Slackのスレッド履歴を取得してOllamaに渡せば会話文脈を保持するマルチターン対話も実現できる。まずこの構成でチームのSlackに導入し、使い勝手を見ながら機能を足していくのが現実的だ。

OllamaのSlack連携を2日間のハンズオンで実機体験する

この記事の構成を実際のLinuxサーバーで手を動かして試したい方には、「ローカルAIマスターセミナー」が役立つ。Ollama環境の構築からSlackなど社内ツール連携の実装まで、実機GPU環境で体験できる。実機GPU環境で手を動かしながら習得したい方向けに、「ローカルAIマスターセミナー」を開催しています。
少人数(最大8名)ZOOMハンズオン形式で実施しています。

>> ローカルAIマスターセミナーの詳細を確認する
ローカルLLMの構築・運用に関する関連記事もあわせて参考にしてください。

Ubuntu ServerでローカルLLMを構築する方法|Ollamaで機密データを外に出さず業務AIを動かす完全ガイド
社内でChatGPTが使えないときの代替手段|機密データを守るローカルLLMという選択肢
ローカルLLMのモデルを比較する方法|Llama3.3・Mistral・Gemma・Phi-4をUbuntuで使い分けるポイント

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。