TALK IS CHEAP Link to heading

🙇優しく扱っていただけると幸いです。🙇

🔗 https://cutie.randx.tokyo
🆔 [email protected]
🔑 Guest@2026

ハードウェア Link to heading

  • PC:Lenovo G510(2013年発売)
  • CPU:Intel Core i5-4200M(2.5GHz)
  • メモリ:8GB
  • ストレージ:500GB HDD

テックスタック Link to heading

  • Debian 13:ホストOS
  • Nginx:リバースプロキシ、リクエスト制限
  • llama.cpp:オープンソースLLM推論エンジン
  • Cloudflare Tunnel:トンネリング
  • Cloudflare Workers:サーバーレス環境
  • Cloudflare Pages:Webアプリ(Flutter)のホスティング
  • Supabase Auth:ユーザー認証
  • Hono:Cloudflare Workers向けフレームワーク
  • Flutter:Webクライアントの作成

AIモデル Link to heading

  • 開発元:Qwen2.5-3B-Q4_K_M
  • 開発元:Alibaba Cloud
  • リリース時期:2024年9月
  • パラメーター数:約30.9億(3.09B)
  • 量子化フォーマット:GGUF形式
  • ファイルサイズ:約1.93 GB
  • ライセンス:独自のQwenライセンス
  • コンテキスト長:最大32K
  • 最大出力:最大8,000トークン
  • 対応言語:日本語、英語、中国語を含む29以上の言語対応
  • 得意分野:プログラミング、数学、構造化データ(JSON形式など)の出力

メリット Link to heading

  • 無限トークン
  • 十分な日本語理解力
  • 低ハードウェア要件

制約 Link to heading

  • 推論能力限界がある
  • ハルシネーションしやすい
  • 学習データが古い(2024年9月以降の情報がわからない)

ワークフロー Link to heading

  1. 画面表示:ユーザーがWebアプリ(Flutter)にアクセス。
  2. 認証:ユーザーがログインし、トークン(JWT)を取得。
  3. リクエスト:ユーザーがチャットを送信し、Cloudflare WorkersがJWTを検証。
  4. トンネル通過:正常なリクエストのみがCloudflare Tunnelを通って安全に自宅のPCへ転送。
  5. 流量制限:Nginxがリクエストの頻度をチェックし、問題なければllama.cppへ転送。
  6. AI推論:lama.cppがQwen2.5-3Bを動かして回答を生成。
  7. 返却:生成された回答が、逆のルートを通ってWebアプリにストリーミング(リアルタイム)で表示される。

構築手順 Link to heading

ステップ1:初期セットアップ & 依存パッケージ導入 Link to heading

システムを最新化し、llama.cppのビルドやCloudflareの連携に必要な開発ツールをインストールします。

# ルート権限(またはsudo)で実行
sudo apt-get update && sudo apt-get upgrade -y

# 必須開発ツール・コマンドのインストール
sudo apt-get install -y git build-essential cmake wget curl python3-pip

ステップ2:AIモデルファイルのダウンロード Link to heading

Hugging Faceのコマンドラインツール hf でモデルを取得します。

mkdir -p ~/models
cd ~/models

pip install --user -U huggingface_hub --break-system-packages

# パスを反映(~/.local/bin にコマンドが配置されるため)
export PATH=PATH:HOME/.local/bin
echo 'export PATH=PATH:HOME/.local/bin' >> ~/.bashrc

# GGUFモデルを実ファイルとして取得
hf download bartowski/Qwen2.5-3B-GGUF \
    --include "Qwen2.5-3B-Q4_K_M.gguf" \
    --local-dir ./

ステップ3:llama.cpp のビルド Link to heading

CMakeを用いてネイティブコンパイルを行います。

cd ~
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp

cmake -B build
cmake --build build --config Release

ステップ4:ローカル環境での動作テスト Link to heading

バックグラウンド化(サービス化)の前に、ビルドしたバイナリが正常に動作するか確認します。

1. CLIでの一発応答確認 Link to heading

./build/bin/llama-cli -m ~/models/Qwen2.5-3B-Q4_K_M.gguf -c 8192 -t 2 --mlock --no-mmap -p "You are a helpful assistant. Say hello and tell me you are ready."

画面にAIからの挨拶メッセージ(「Hello! I am ready…」など)が出力されれば成功です。

2. サーバーモードの起動確認 Link to heading

./build/bin/llama-server -m ~/models/Qwen2.5-3B-Q4_K_M.gguf --host 127.0.0.1 --port 8080 -c 8192 -np 1 -t 2 --mlock --no-mmap --log-disable

起動を確認したら別のターミナル画面を開き、以下の curl コマンドで疎通確認を行います。

curl http://127.0.0

正常にレスポンス({"status":"ok"})が返ってきたら成功です。確認後は元のターミナルで Ctrl + C を押してサーバーを一度停止させてください。

ステップ5:Systemdによる永続化設定(自動起動 & メモリ制御) Link to heading

OS起動時に自動でバックグラウンド実行され、指定のメモリバウンダリ(4G〜6G)で安全に動作するように設定します。

# サービスファイルの作成(ルート権限で実行)
sudo nano /etc/systemd/system/llama.service

ファイル中身

[Unit]
Description=Llama.cpp Server Service
After=network.target

[Service]
User=username
WorkingDirectory=/home/username/llama.cpp
ExecStart=/home/username/llama.cpp/build/bin/llama-server \
    -m /home/username/models/Qwen2.5-3B-Q4_K_M.gguf \
    -t 2 \
    -c 8192 \
    -np 1 \
    --mlock \
    --no-mmap \
    --log-disable \
    --host 127.0.0.1 \
    --port 8080

Restart=always
RestartSec=10

MemoryHigh=4G
MemoryMax=6G

サービスの登録・有効化:

sudo systemctl daemon-reload
sudo systemctl enable llama
sudo systemctl start llama

# 稼働状態の確認(Active:active (running) になっていれば常駐化成功です)
sudo systemctl status llama

ステップ6:cloudflared インストール & Cloudflare連携設定 Link to heading

ローカルのLLMサーバー(127.0.0.1:8080)をポート開放なしでCloudflareに安全にバイパスするためのトンネル構築します。

1. cloudflared パッケージのインストール Link to heading

# 公式キーリングの作成と公開鍵の登録
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://cloudflare.com | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

# Cloudflare公式APTリポジトリの追加
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://cloudflare.com any main" | sudo tee /etc/apt/sources.list.d/cloudflared.list

# インストール
sudo apt-get update && sudo apt-get install cloudflared -y

2. Cloudflare認証とトンネルの作成 Link to heading

外部と接続を確立するための紐付けを行います。

# 1. 認証プロセスの開始(画面にURLが表示されるので、ブラウザでアクセスしてログインし、対象のドメインを選択してください)
cloudflared tunnel login

# 2. 新規トンネルの作成(例としてトンネル名を「llama-tunnel」とします)
# 実行後、トンネルの「UUID」と「認証用JSONファイルのパス」が出力されるのでメモしてください
cloudflared tunnel create llama-tunnel

3. トンネル設定ファイル(config.yml)の記述 Link to heading

作成したトンネルが、どのドメイン宛てのリクエストをローカルのどのポートに転送するかを設定します。

mkdir -p ~/.cloudflared
nano ~/.cloudflared/config.yml

ファイル中身

tunnel:<ここにステップ6.2で生成されたトンネルのUUIDを記述>
credentials-file:/home/username/.cloudflared/<UUID>.json

ingress:
  - hostname:<Workersからアクセスさせたいカスタムサブドメイン。例えば、https://yourdomain.com>
    service:http://127.0.0.1:8080
  - service:http_status:404

4. ルーティングの確定と常駐起動 Link to heading

設定したカスタムドメインとトンネルをDNSで紐付け、最後にcloudflaredをDebianのシステムサービスとして登録・稼働させます。

# CloudflareのDNSにCNAMEレコードを自動登録
cloudflared tunnel route dns llama-tunnel <設定したカスタムサブドメイン。例えば、https://yourdomain.com>

# cloudflaredをDebianのシステムサービスとしてインストールして永続化(ルート権限で実行)
sudo cloudflared service install

# サービスの起動と自動起動有効化
sudo systemctl enable cloudflared
sudo systemctl start cloudflared

# 正常稼働の確認
sudo systemctl status cloudflared

これで、どこからでも安全に自宅のPC上のローカルLLMへAPIリクエストを流し込めるエンドポイントが完成しました。

参考資料 Link to heading