能書き
前回は自分のマシン上にコンテナを作ってllama.cppをインストールし、モデル Qwen3.5-9B-UD-Q4_K_XL を動かしてみました。
今回はllama.cppとは別コンテナにOpenCodeをインストールして、前回のllama.cppに接続してみます。
なおOpenCodeの何たるかについては語りません。他に詳しい解説記事が沢山ありますし。
前提
- 私のマシンにはProxmoxVE(9.1.5)をインストールしてあり、既に幾つかのサーバーを立てている(私の過去記事を参照)
- 私のAIコーディングの知識はまだまだ入門にも至っていなくて、頑張って学習中
目標
- ProxmoxVE上にコンテナを作成してOpenCodeをインストール
- コンテナのOSはUbuntu24.04
- OpenCodeを私のローカルLLM(llama.cpp)に接続する
参考文献
インストールは下記が公式かな。ありがたい事に日本語の文書がありました。
私のマシンにローカルLLMとしてllama.cppをインストールしてあります。
接続に関しては下記を参考にさせていただきました。が、結局うまく行きませんでした。バージョンが上がってファイル名やら書き方やらが変わったのかも知れません。
我が家の細々した設定など。
- ProxmoxVEのswap設定 - Qiita
- 我が家のIPアドレス体系(再掲) - 私的サーバー構築日誌:dhcpサーバー冗長化・Ubuntu 24.04 LTS in MicroServer N54L - Qiita
- おうちサーバー構築報告:AnsibleでProxmoxVEのゲストマシン4台それぞれ/etcをSubversion管理 - Qiita
準備
コンテナを用意します。私の流儀で、手順がちょっと長いです。
踏み台
我が家のProxmoxサーバーでは、コンテナへの接続は172.16.1.100を踏み台としています。ユーザーはansibleです。
ssh ansible@172.16.1.100
これの公開鍵を表示しておきます。
cd
cat .ssh/id_ed25519.pub
コンテナ作成
下記スペックでProxmox上にコンテナを用意します。なおコンテナIDが107になる事から、我が家のIPアドレス体系に従って、IPアドレスは172.16.1.107/16にします。
- ホスト名: opencode
- SSH公開鍵: 上述の、踏み台ユーザー
ansibleの公開鍵 - 非特権コンテナ: チェック
- ネスト: チェック
- テンプレート: ubuntu-24.04-standard_24.04-2_amd64.tar.zst
- ディスクサイズ: 64GiB
- CPUコア: 2
- メモリ: 2048MiB(=2GiB)
- スワップ: 0MiB(SSD対策でスワップ無しとする)
- IPv4/CIDR:
172.16.1.107/16 - ゲートウェイ(IPv4):
172.16.2.1(我が家のゲートウェイのIPアドレス) - DNSドメイン: 空欄(ホスト設定を使用)
- DNSサーバ: 空欄(ホスト設定を使用)
コンテナを構築して開始したら、踏み台172.16.1.100からsshログインを試みます。同時に踏み台の.ssh/known_hostsへ登録します。
ssh root@172.16.1.107
SSD対策で、私のProxmoxホストマシンはswapinessを10にしています。それを確認。
sysctl vm.swappiness
下記のように、60ではなくて10と表示されます。
# sysctl vm.swappiness
vm.swappiness = 10
確認できたらコンテナ172.16.1.107から抜けましょう。
exit
Ansibleで基本設定
私の流儀で、Ansibleを利用して/etcをSubversion管理するように設定します。/etcのSubversion管理をしないなら、このAnsible実行は省略して大丈夫です。次のユーザー作成へどうぞ。
なおetckeeperを使わないのはSubversion好きの私の我儘です。
インベントリについて。ここで動かすプレイブックには冪等性が無いので、今回のコンテナのIPアドレス(172.16.1.107)だけを記したインベントリを作る必要があります。
cd
cd svn_etc
cat <<___ >inventory_107.ini
[servers]
172.16.1.107
[servers:vars]
ansible_user=root
___
インベントリの確認の為にpingしてみましょう。
ansible all -m ping -i inventory_107.ini
確認できたらAnsibleを実行します。
ansible-playbook -i inventory_107.ini playbook.yaml
タイムゾーン
準備したコンテナ(IPアドレス172.16.1.107)に踏み台(172.16.1.100)から入ります。
ssh root@172.16.1.107
開発用マシンとなるコンテナなので、タイムゾーンを日本にしておきます。
timedatectl set-timezone Asia/Tokyo
私の流儀で、/etcをSubversionにコミットします。
cd /etc
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"set timezone"
svn up
ロケール
日本語で読み書きできるようにします。
locale-gen ja_JP.UTF-8
update-locale LANG=ja_JP.UTF-8
ここでも/etcをSubversionにコミットします。
cd /etc
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"set locale"
svn up
ユーザー作成
開発用の一般ユーザーを作成します。ここでは私の名前でkatzとします。
useradd -m -s /bin/bash katz
そしてパスワードを設定。
passwd katz
sudoは、今回は不要でしょうかね。必要ならばrootでログインし直す事にしましょう。
ユーザーを作成したら、私の流儀で、/etcをSubversionにコミットします。
cd /etc
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"added user 'katz'"
svn up
最後に一つだけ。curlコマンドをインストールしておきます。
apt install -y curl
svn st | grep "^?" | cut -b9- | xargs -rt svn add
svn ci -m"installed curl command"
svn up
以上でコンテナを用意できました。
exit
OpenCode
インストール
スクリプトをざっと眺めると、どうやら$HOME/.opencode/binディレクトリを作って、そこにバイナリを置くようです。なのでopencodeを実行するユーザーでログインしてから実行します。
ssh katz@172.16.1.107
公式に従ってインストールします。このinstallスクリプトの中でcurlコマンドを呼んでいるようです。先程curlをインストールしたのはこの為です。
curl -fsSL https://opencode.ai/install | bash
インストールが問題無く成功したら、一旦ログアウトします。環境変数を設定する都合です。
exit
接続
開発用ユーザーでログイン。これで環境変数が反映されます。
ssh katz@172.16.1.107
一旦OpenCodeを起動します。
opencode
画面上、「Build」の表記の右に、現在のLLMとして「Big Pickle OpenCode Zen」が表示されています。
すぐに/exitコマンドを実行して終了。そうすると$HOME/.configディレクトリが作成されます。
OpenCodeの設定ファイル($HOME/.config/opencode/opencode.jsonc)に追記して下記のようにします。内容に関しては前回の構築を参照してください。
cd
vi .config/opencode/opencode.jsonc
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"llama.cpp": {
"npm": "@ai-sdk/openai-compatible",
"name": "llama-server (local)",
"options": {
"baseURL": "http://172.16.1.106:8080/v1"
},
"models": {
"Qwen3.5-9B": {
"name": "Qwen3.5-9B (local)",
"limit": {
"context": 262144,
"output": 32768
}
}
}
}
}
}
もう一度OpenCodeを起動。
opencode
/connectを指示。
そうするとデフォルトとしてOpenCode Zen (Recommended)が選択されていますが……
カーソルキーの↓を押していくとllama-server (local)にもチェックが入っていますので、これを選択し、enterキーを押します。
API keyですが、特に設定していないので何を入力しても構いません。とりあえずdummyとでも入力しましょう。そしてenterキー。
下記のようなモデル選択(?)画面になりますので、そのままenterキーを押します。
そうするとローカルLLMのllama.cppに接続して、画面上「Build」の右に「Qwen3.5-9B (local) llama-server (local)」と表示されます。
ここで「あなたのLLMは何ですか」と聞いてみましょう。
うまくいったようです!しかし反応が遅いですね……体感で百倍って感じです。
仕舞い
OpenCodeをインストールして、前回のローカルLLMと接続しました。動作が遅いとは言え、うまく接続できたようです。やったね![]()







