Rebuild openclaw from npm instead of premade image, configure Ollama
- Add Dockerfile using node:22-bookworm-slim + npm install -g openclaw@latest - Update docker-compose.yml: use local build, add OLLAMA_API_KEY=ollama-local, remove legacy OPENCLAW_AGENT_PROVIDER/MODEL/OLLAMA_BASE_URL env vars - Add setup.sh to create openclaw.json with explicit Ollama provider config Key fixes vs previous attempt: - Config file is openclaw.json (not config.json or auth-profiles.json) - models.providers.ollama needs baseUrl with /v1 suffix + explicit model list - OLLAMA_API_KEY env var is required to opt in to Ollama support - reasoning:false on models prevents 400 errors from Ollama
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
FROM node:22-bookworm-slim
|
||||||
|
|
||||||
|
# Install git and ca-certificates required by openclaw's npm dependencies
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends git ca-certificates && rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Rewrite any SSH GitHub URLs to HTTPS so npm install works without SSH keys
|
||||||
|
RUN git config --global url."https://github.com/".insteadOf "ssh://git@github.com/"
|
||||||
|
|
||||||
|
# Install openclaw from npm (same approach as the official docker-setup.sh)
|
||||||
|
RUN npm install -g openclaw@latest --loglevel=error
|
||||||
|
|
||||||
|
ENV HOME=/home/node
|
||||||
|
ENV TERM=xterm-256color
|
||||||
|
|
||||||
|
# Run as non-root node user (uid 1000), same as official image
|
||||||
|
USER node
|
||||||
|
WORKDIR /home/node
|
||||||
@@ -1,25 +1,16 @@
|
|||||||
services:
|
services:
|
||||||
openclaw:
|
openclaw:
|
||||||
container_name: openclaw
|
container_name: openclaw
|
||||||
image: ghcr.io/openclaw/openclaw:main
|
build: .
|
||||||
platform: linux/amd64
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
command: ["node", "openclaw.mjs", "gateway", "--allow-unconfigured", "--bind", "lan"]
|
command: ["openclaw", "gateway", "--allow-unconfigured", "--bind", "lan"]
|
||||||
environment:
|
environment:
|
||||||
- HOME=/home/node
|
- HOME=/home/node
|
||||||
- TERM=xterm-256color
|
- TERM=xterm-256color
|
||||||
- TZ=America/New_York
|
- TZ=America/New_York
|
||||||
- PUID=1000
|
|
||||||
- PGID=1000
|
|
||||||
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
|
- OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
|
||||||
- OPENCLAW_GATEWAY_BIND=lan
|
# Enable Ollama provider (opt-in via env var)
|
||||||
- OPENCLAW_AGENT_PROVIDER=ollama
|
- OLLAMA_API_KEY=ollama-local
|
||||||
- OPENCLAW_AGENT_MODEL=llama3
|
|
||||||
- OPENCLAW_OLLAMA_BASE_URL=http://ollama:11434
|
|
||||||
# Reverse proxy configuration
|
|
||||||
- VIRTUAL_HOST=openclaw.kolpacksoftware.com
|
|
||||||
- VIRTUAL_PORT=18789
|
|
||||||
- LETSENCRYPT_HOST=openclaw.kolpacksoftware.com
|
|
||||||
volumes:
|
volumes:
|
||||||
- /srv/openclaw/config:/home/node/.openclaw
|
- /srv/openclaw/config:/home/node/.openclaw
|
||||||
- /srv/openclaw/workspace:/home/node/.openclaw/workspace
|
- /srv/openclaw/workspace:/home/node/.openclaw/workspace
|
||||||
|
|||||||
Executable
+81
@@ -0,0 +1,81 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# One-time host setup for OpenClaw with Ollama
|
||||||
|
# Run this BEFORE deploying the container.
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== OpenClaw + Ollama Setup ==="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Ensure config dirs exist
|
||||||
|
mkdir -p /srv/openclaw/config
|
||||||
|
mkdir -p /srv/openclaw/workspace
|
||||||
|
|
||||||
|
# Remove old misconfigured files from previous attempts
|
||||||
|
rm -f /srv/openclaw/config/config.json
|
||||||
|
rm -f /srv/openclaw/config/auth-profiles.json
|
||||||
|
rm -f /srv/openclaw/config/agents/main/agent/auth-profiles.json 2>/dev/null || true
|
||||||
|
|
||||||
|
# Write openclaw.json - the correct config file for provider setup
|
||||||
|
cat > /srv/openclaw/config/openclaw.json << 'EOF'
|
||||||
|
{
|
||||||
|
"models": {
|
||||||
|
"providers": {
|
||||||
|
"ollama": {
|
||||||
|
"baseUrl": "http://ollama:11434/v1",
|
||||||
|
"apiKey": "ollama-local",
|
||||||
|
"api": "openai-completions",
|
||||||
|
"models": [
|
||||||
|
{
|
||||||
|
"id": "gemma3:4b",
|
||||||
|
"name": "Gemma 3 4B",
|
||||||
|
"reasoning": false,
|
||||||
|
"input": ["text"],
|
||||||
|
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
|
||||||
|
"contextWindow": 8192,
|
||||||
|
"maxTokens": 8192
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "qwen2.5-coder:7b",
|
||||||
|
"name": "Qwen 2.5 Coder 7B",
|
||||||
|
"reasoning": false,
|
||||||
|
"input": ["text"],
|
||||||
|
"cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 },
|
||||||
|
"contextWindow": 8192,
|
||||||
|
"maxTokens": 8192
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"agents": {
|
||||||
|
"defaults": {
|
||||||
|
"model": {
|
||||||
|
"primary": "ollama/gemma3:4b"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Fix ownership so the node user (uid 1000) inside the container can read/write
|
||||||
|
chown -R 1000:1000 /srv/openclaw
|
||||||
|
|
||||||
|
echo "✓ Created /srv/openclaw/config/openclaw.json"
|
||||||
|
echo "✓ Removed old conflicting config files"
|
||||||
|
echo "✓ Fixed permissions (uid 1000)"
|
||||||
|
echo ""
|
||||||
|
echo "=== Next Steps ==="
|
||||||
|
echo ""
|
||||||
|
echo "1. Build the image:"
|
||||||
|
echo " docker compose -f openclaw/docker-compose.yml build"
|
||||||
|
echo ""
|
||||||
|
echo "2. Start the container:"
|
||||||
|
echo " docker compose -f openclaw/docker-compose.yml up -d"
|
||||||
|
echo ""
|
||||||
|
echo "3. Check logs:"
|
||||||
|
echo " docker logs openclaw -f"
|
||||||
|
echo ""
|
||||||
|
echo "4. Verify Ollama connectivity:"
|
||||||
|
echo " docker exec openclaw curl -s http://ollama:11434/v1/models | head -c 200"
|
||||||
|
echo ""
|
||||||
|
echo "5. Redeploy Portainer stack after pushing to git."
|
||||||
Reference in New Issue
Block a user