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