環境構築のメモです。この構成であれば、ハードウェア無くても、月5000円くらいで維持できます。
流行りに乗ってみただけですが、かなり簡単に構築できました。
ちょっと使ってみてますが、これガチでエグいですね。指示したらコード書いてくれて何でもしてくれる。。
手順
仮想サーバ起動
KAGOYA CLOUD VPSのアカウントは作成済みの想定で行きます。
コントロールパネルにログインし「インスタンス作成」をクリックします。
サーバは「Ubuntu 24.04 LTS Server」を選びます。
セットアップで「Claude Code」を選ぶと、KAGOYA側で入れてくれるので、そうしました。
スペックは、お試し運用のため「4コア4GB」にしました。
「インスタンス追加」を押すと、サーバの起動が開始します。
「作成中」と表示されます。起動に3分程度かかりました。
仮想サーバログイン
ssh -i {インスタンス作成時に作った.keyファイル} ubuntu@{IPアドレス}
と.keyファイルを使ってログインすると、サーバに入れます。
(任意)パスワードでのログインを禁止
不正アクセスされたくないので、、パスワードでのログインを禁止しました。
サーバ上で sudo vim /etc/ssh/sshd_config して、
PasswordAuthentication no(#があれば消し、yesをnoにする)
PubkeyAuthentication yes(もしあればyesにする)
以下のファイルもあったので編集(上記をいくら変えても上書きされてしまう) sudo vim /etc/ssh/sshd_config.d/50-cloud-init.conf
編集が終わったら sudo systemctl restart ssh する
claude設定
KAGOYA側でClaude Codeはインストールしてくれたので、初期設定します。
claude
画面の指示に従って設定します。
Discord設定
サーバ上でclaudeコマンドで動かすのが一番便利なのですが、、
外出先でスマホから操作したい(VPSに構築したゆえん)ので、Discordを入れます。
Slackなどでも可能ですが、Discordが圧倒的に簡単でオススメらしいです。
やり方はGeminiそのままです。
Geminiの設定方法(このままで動きました)
ステップ 1: Discord Developer Portal で Bot を作成する
まずは Discord 側の「器」を作ります。
Discord Developer Portal にアクセスしてログインします。
「New Application」 をクリックし、適当な名前(例: MyClaudeBot)を付けて作成します。
左メニューの 「Bot」 を選択し、「Reset Token」 を押してトークンを発行します。
重要: このトークンは後で使うのでメモしておいてください(他人に教えないでください)。
同じ「Bot」ページの下方にある 「Privileged Gateway Intents」 セクションで、以下の3つを ON にします。
PRESENCE INTENT
SERVER MEMBERS INTENT
MESSAGE CONTENT INTENT (これが重要です)
左メニュー 「OAuth2」 → 「URL Generator」 を選択。
scopes で bot にチェック。
bot permissions で Administrator(テスト用ならこれが楽です)にチェック。
生成された URL をブラウザで開き、自分の Discord サーバーに Bot を招待します。
ステップ 2: Ubuntu サーバーの準備
サーバー側で Bot を動かすためのライブラリをインストールします。
# ライブラリのインストール
pip install discord.py
ステップ 3: 連携スクリプトの作成
サーバー上の適当な場所に claude_bot.py というファイルを作成します。
import discord
import subprocess
import os
# 先ほどメモしたトークンをここに貼り付けます
TOKEN = 'YOUR_DISCORD_BOT_TOKEN'
client = discord.Client(intents=discord.Intents.all())
@client.event
async def on_ready():
print(f'Logged in as {client.user}')
@client.event
async def on_message(message):
# Bot自身の発言には反応しない
if message.author == client.user:
return
# メッセージに画像(添付ファイル)がある場合
temp_image_path = None
if message.attachments:
for attachment in message.attachments:
if any(attachment.filename.lower().endswith(ext) for ext in ['png', 'jpg', 'jpeg', 'webp']):
temp_image_path = f"./{attachment.filename}"
await attachment.save(temp_image_path)
break
# Claude Code を呼び出すコマンドの構築
# -p は非対面(prompt)モード
user_input = message.content
if temp_image_path:
# 画像がある場合は、画像パスも含めて Claude に渡す
cmd = ["claude", "-p", f"{user_input} (添付画像: {temp_image_path})"]
else:
cmd = ["claude", "-p", user_input]
try:
# 実行中であることを伝える
async with message.channel.typing():
# Claude Code を実行
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
response = result.stdout
# Discordの文字数制限(2000文字)対策
if len(response) > 1900:
response = response[:1900] + "\n...(省略)"
await message.reply(response if response else "処理が完了しました(返答なし)")
except subprocess.CalledProcessError as e:
await message.reply(f"エラーが発生しました:\n{e.stderr}")
finally:
# 保存した一時画像を削除
if temp_image_path and os.path.exists(temp_image_path):
os.remove(temp_image_path)
client.run(TOKEN)
ステップ 4: Bot の起動
python3 claude_bot.py
これで、Discord のチャンネルで Bot に向かってメッセージを送ったり、画像をアップロードしたりすると、裏側で claude -p が走り、結果が Discord に返ってきます。
次のステップへのアドバイス
バックグラウンド実行: screen や tmux、あるいは systemd を使うと、SSHを閉じても Bot が動き続けます。
tmuxを使って、ターミナルを閉じても維持されるようにしました。
動作確認
Gemini曰く、
まずは試しに、Discordで以下のように送ってみてはいかがでしょうか?
「このサーバーの ~/claude-bot/claude_bot.py の中身を読んで、改善点を1つ提案して」
とのことだったので、これで動作確認しました。
使いやすいようにいっぱいチャットでやり取りしました・・・(claude_bot.pyの再起動は自分でやる必要がありますが・・・)



