All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 14s
144 lines
4.2 KiB
Bash
Executable File
144 lines
4.2 KiB
Bash
Executable File
#!/bin/bash
|
|
source "${AGENT_PATH}/common.sh"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
_check_required_env_vars "CONTAINER_NAME" "IMAGE_REGISTRY" "IMAGE_REPO" "IMAGE_TAG" "DATA_PATH" "GATEWAY_PORT"
|
|
|
|
# Require at least one LLM provider
|
|
if [ -z "$ANTHROPIC_API_KEY" ] && [ -z "$OPENROUTER_API_KEY" ]; then
|
|
_die "At least one LLM API key must be set (ANTHROPIC_API_KEY or OPENROUTER_API_KEY) in config/service.env"
|
|
fi
|
|
|
|
_check_docker_installed || _die "Docker test failed, aborting installation..."
|
|
|
|
# Create data directories
|
|
mkdir -p "${DATA_PATH}/config"
|
|
mkdir -p "${DATA_PATH}/workspace"
|
|
|
|
# Set ownership to node user (uid 1000) used by the OpenClaw container
|
|
chown -R 1000:1000 "${DATA_PATH}"
|
|
|
|
# Generate gateway token if one doesn't already exist
|
|
TOKEN_FILE="${DATA_PATH}/gateway.token"
|
|
if [ -f "$TOKEN_FILE" ]; then
|
|
GATEWAY_TOKEN=$(cat "$TOKEN_FILE")
|
|
else
|
|
GATEWAY_TOKEN=$(openssl rand -hex 32)
|
|
echo -n "$GATEWAY_TOKEN" > "$TOKEN_FILE"
|
|
chown 1000:1000 "$TOKEN_FILE"
|
|
fi
|
|
|
|
# Generate openclaw.json configuration
|
|
CONFIG_FILE="${DATA_PATH}/config/openclaw.json"
|
|
|
|
# Build model configuration
|
|
MODEL_PRIMARY="${DEFAULT_MODEL:-anthropic/claude-sonnet-4-5}"
|
|
MODEL_FALLBACK="${FALLBACK_MODEL:-openrouter/anthropic/claude-sonnet-4-5}"
|
|
|
|
# Build channels section
|
|
TELEGRAM_CONFIG=""
|
|
if [ -n "$TELEGRAM_BOT_TOKEN" ]; then
|
|
TELEGRAM_CONFIG=$(cat <<TGEOF
|
|
"telegram": {
|
|
"enabled": true,
|
|
"token": "${TELEGRAM_BOT_TOKEN}",
|
|
"dmPolicy": "${DM_POLICY:-pairing}"
|
|
}
|
|
TGEOF
|
|
)
|
|
fi
|
|
|
|
# Build env section for API keys
|
|
ENV_ENTRIES=""
|
|
if [ -n "$ANTHROPIC_API_KEY" ]; then
|
|
ENV_ENTRIES="\"ANTHROPIC_API_KEY\": \"${ANTHROPIC_API_KEY}\""
|
|
fi
|
|
if [ -n "$OPENROUTER_API_KEY" ]; then
|
|
[ -n "$ENV_ENTRIES" ] && ENV_ENTRIES="${ENV_ENTRIES},"
|
|
ENV_ENTRIES="${ENV_ENTRIES}
|
|
\"OPENROUTER_API_KEY\": \"${OPENROUTER_API_KEY}\""
|
|
fi
|
|
|
|
# Build fallbacks array
|
|
FALLBACKS_JSON=""
|
|
if [ -n "$OPENROUTER_API_KEY" ] && [ -n "$ANTHROPIC_API_KEY" ]; then
|
|
FALLBACKS_JSON="\"fallbacks\": [\"${MODEL_FALLBACK}\"],"
|
|
fi
|
|
|
|
cat > "$CONFIG_FILE" <<CFGEOF
|
|
{
|
|
"env": {
|
|
${ENV_ENTRIES}
|
|
},
|
|
"agents": {
|
|
"defaults": {
|
|
"model": {
|
|
"primary": "${MODEL_PRIMARY}",
|
|
${FALLBACKS_JSON}
|
|
"params": {}
|
|
}
|
|
}
|
|
},
|
|
"channels": {
|
|
${TELEGRAM_CONFIG}
|
|
},
|
|
"gateway": {
|
|
"token": "${GATEWAY_TOKEN}",
|
|
"bind": "lan",
|
|
"auth": {
|
|
"mode": "password"
|
|
}
|
|
}
|
|
}
|
|
CFGEOF
|
|
|
|
chown 1000:1000 "$CONFIG_FILE"
|
|
|
|
# Export variables for docker compose
|
|
export CONTAINER_NAME DATA_PATH GATEWAY_PORT
|
|
export IMAGE_REGISTRY IMAGE_REPO IMAGE_TAG
|
|
export ANTHROPIC_API_KEY OPENROUTER_API_KEY
|
|
|
|
cd "$SCRIPT_DIR" || _die "Failed to change to script directory"
|
|
|
|
# Pull images
|
|
docker compose -p "${CONTAINER_NAME}" pull || _die "Failed to pull images"
|
|
|
|
# Stop existing containers
|
|
docker compose -p "${CONTAINER_NAME}" down 2>/dev/null || true
|
|
|
|
# Start containers
|
|
docker compose -p "${CONTAINER_NAME}" up -d || _die "Failed to start containers"
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo "OpenClaw installation complete!"
|
|
echo "=========================================="
|
|
echo ""
|
|
echo "Gateway Token (save this!):"
|
|
echo " ${GATEWAY_TOKEN}"
|
|
echo ""
|
|
echo "Web Dashboard:"
|
|
echo " http://localhost:${GATEWAY_PORT}"
|
|
echo " Paste the gateway token above into Settings to authenticate."
|
|
echo ""
|
|
if [ -n "$TELEGRAM_BOT_TOKEN" ]; then
|
|
echo "Telegram: Enabled - send a message to your bot to start!"
|
|
fi
|
|
if [ -n "$GMAIL_ADDRESS" ] && [ -n "$GMAIL_APP_PASSWORD" ]; then
|
|
echo ""
|
|
echo "Gmail: To enable email, install the IMAP skill after the gateway is running:"
|
|
echo " docker exec ${CONTAINER_NAME} openclaw skills install imap-smtp-email"
|
|
echo " Then configure it in the Control UI (http://localhost:${GATEWAY_PORT})"
|
|
echo " IMAP: imap.gmail.com:993 (TLS) | SMTP: smtp.gmail.com:587 (STARTTLS)"
|
|
echo " Username: ${GMAIL_ADDRESS}"
|
|
echo " Password: (your app password from service.env)"
|
|
fi
|
|
echo ""
|
|
echo "WebChat: Always available at http://localhost:${GATEWAY_PORT}"
|
|
echo ""
|
|
echo "To add WhatsApp (interactive, requires QR code):"
|
|
echo " docker exec -it ${CONTAINER_NAME} openclaw channels login"
|
|
echo ""
|
|
echo "Check status: ds status <server> openclaw"
|
|
echo "View logs: ds logs <server> openclaw"
|