1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude CodeをVPS(KAGOYA)環境に構築したときのメモ

1
Posted at

環境構築のメモです。この構成であれば、ハードウェア無くても、月5000円くらいで維持できます。
流行りに乗ってみただけですが、かなり簡単に構築できました。
ちょっと使ってみてますが、これガチでエグいですね。指示したらコード書いてくれて何でもしてくれる。。

手順

仮想サーバ起動

KAGOYA CLOUD VPSのアカウントは作成済みの想定で行きます。
コントロールパネルにログインし「インスタンス作成」をクリックします。

image.png

サーバは「Ubuntu 24.04 LTS Server」を選びます。
セットアップで「Claude Code」を選ぶと、KAGOYA側で入れてくれるので、そうしました。
スペックは、お試し運用のため「4コア4GB」にしました。
「インスタンス追加」を押すと、サーバの起動が開始します。

「作成中」と表示されます。起動に3分程度かかりました。

image.png

仮想サーバログイン

ssh -i {インスタンス作成時に作った.keyファイル} ubuntu@{IPアドレス}

と.keyファイルを使ってログインすると、サーバに入れます。

image.png

(任意)パスワードでのログインを禁止

不正アクセスされたくないので、、パスワードでのログインを禁止しました。

サーバ上で 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の再起動は自分でやる必要がありますが・・・)

image.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?