問題の説明
OpenClawゲートウェイを起動する際に、ポート使用中エラーが発生します。
[openclaw:server] Error: listen EADDRINUSE: address already in use :::3000
at Server.setupListenHandle [as _listen2] (node:net:1817:16)
at listenInCluster (node:net:1865:12)
at Server.listen (node:net:1964:7)
またはサービスは起動するが管理ダッシュボードにアクセスできません。
[openclaw:server] Server started on port 3000
$ curl http://localhost:3000/health
curl: (7) Failed to connect to localhost port 3000: Connection refused
OpenClawはデフォルトでポート3000をHTTPゲートウェイサービスに使用し、Webhookコールバックの受信、管理ダッシュボードの提供、REST APIの提供を行います。そのポートが別のプログラムに使用されている場合、OpenClawは起動できません。
診断手順
ポートの使用状況を確認
Linux / macOS:
lsof -i :3000
出力例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12345 user 22u IPv6 123456 0t0 TCP *:3000 (LISTEN)
またはssコマンドを使用:
ss -tlnp | grep 3000
Windows:
netstat -ano | findstr :3000
出力例:
TCP 0.0.0.0:3000 0.0.0.0:0 LISTENING 12345
PIDからポートを占有しているプロセスを特定:
tasklist /FI "PID eq 12345"
残存するOpenClawインスタンスを確認
ps aux | grep openclaw
古いOpenClawプロセスがまだ実行されている場合、適切にシャットダウンされていない可能性があります。
OpenClawの設定ポートを確認
cat ~/.openclaw/openclaw.json | grep port
設定ファイルに設定されたポート番号を確認してください。
解決方法
方法1:ポートを占有しているプロセスを停止する
ポートが古いOpenClawインスタンスに占有されている場合:
openclaw stop
stopコマンドが機能しない場合、プロセスを強制終了します。
Linux / macOS:
# ポート3000を占有しているプロセスを見つけて終了
kill $(lsof -t -i :3000)
# 通常のkillが効かない場合
kill -9 $(lsof -t -i :3000)
Windows:
# PIDを見つける
netstat -ano | findstr :3000
# プロセスを終了(PIDを置き換え)
taskkill /PID 12345 /F
プロセスを終了した後、OpenClawを再起動します。
openclaw start
方法2:OpenClawのポートを変更する
ポート3000が別の重要なサービス(React開発サーバーなど)に占有されている場合、OpenClawのポート設定を変更します。
コマンドライン引数でポートを指定:
openclaw start --port 3001
または設定ファイル ~/.openclaw/openclaw.json を変更:
{
"server": {
"port": 3001,
"host": "0.0.0.0"
}
}
または環境変数で設定:
OPENCLAW_PORT=3001 openclaw start
注意:Webhookベースのメッセージ受信(Telegram Webhookなど)を使用している場合、ポート変更後にWebhook URLのポート番号も更新する必要があります。
方法3:ファイアウォールのブロックを修正する
ポートが別のプログラムに占有されていないにもかかわらず接続が失敗する場合、ファイアウォールが接続をブロックしている可能性があります。
Linux(ufw):
sudo ufw allow 3000/tcp
sudo ufw status
Linux(firewalld):
sudo firewall-cmd --add-port=3000/tcp --permanent
sudo firewall-cmd --reload
Windows:
New-NetFirewallRule -DisplayName "OpenClaw" -Direction Inbound -Port 3000 -Protocol TCP -Action Allow
方法4:リバースプロキシを設定する
本番環境では、NginxまたはCaddyをリバースプロキシとして使用することを推奨します。OpenClawはローカルポートでリッスンし、リバースプロキシを通じて標準ポート80/443を外部に公開します。
Nginx設定例:
server {
listen 80;
server_name bot.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocketサポート
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Caddy設定例(自動HTTPS):
bot.example.com {
reverse_proxy localhost:3000
}
リバースプロキシを使用する場合、OpenClawは127.0.0.1:3000(ローカルアクセスのみ)でリッスンするとセキュリティが向上します。
{
"server": {
"port": 3000,
"host": "127.0.0.1"
}
}
方法5:Unixソケットを使用する(Linux/macOS)
ポート競合が頻繁に発生する場合、OpenClawにTCPポートの代わりにUnixソケットを使用させることができます。
{
"server": {
"socket": "/tmp/openclaw.sock"
}
}
Nginx設定も対応して更新します。
location / {
proxy_pass http://unix:/tmp/openclaw.sock;
}
これによりポート競合の可能性を完全に排除できます。
修正の確認
起動後、サービスが正常に動作していることを確認します。
openclaw start
# サービスのヘルスステータスを確認
curl http://localhost:3000/health
# 期待される出力
# {"status":"ok","version":"x.x.x","uptime":5}
ポートを変更した場合は、コマンドの3000を新しいポート番号に置き換えてください。ブラウザでhttp://localhost:3000(または設定したポート)を開いて管理ダッシュボードにアクセスできることを確認してください。