Add openclaw dropshell template for personal AI assistant
All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 14s
All checks were successful
Test and Publish Templates / test-and-publish (push) Successful in 14s
This commit is contained in:
126
openclaw/README.txt
Normal file
126
openclaw/README.txt
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
OpenClaw - Personal AI Assistant
|
||||||
|
=================================
|
||||||
|
|
||||||
|
OpenClaw is an open-source AI assistant that runs on your own server and
|
||||||
|
communicates via messaging platforms you already use. It connects to LLM
|
||||||
|
providers (Claude, GPT, etc.) and can interact via Telegram, email, WhatsApp,
|
||||||
|
Signal, Discord, and many more channels.
|
||||||
|
|
||||||
|
Website: https://openclaw.ai/
|
||||||
|
GitHub: https://github.com/openclaw/openclaw
|
||||||
|
|
||||||
|
Prerequisites
|
||||||
|
-------------
|
||||||
|
|
||||||
|
1. An Anthropic API key (https://console.anthropic.com/settings/keys)
|
||||||
|
and/or an OpenRouter API key (https://openrouter.ai/settings/keys)
|
||||||
|
|
||||||
|
2. For Telegram: a bot token from @BotFather on Telegram
|
||||||
|
|
||||||
|
3. For Gmail: a Gmail App Password (NOT your real password)
|
||||||
|
- Enable 2FA on your Google account
|
||||||
|
- Go to: https://myaccount.google.com/apppasswords
|
||||||
|
- Create an app password for "Mail"
|
||||||
|
|
||||||
|
Configuration
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Required settings in service.env:
|
||||||
|
|
||||||
|
ANTHROPIC_API_KEY - Anthropic API key (primary LLM provider)
|
||||||
|
OPENROUTER_API_KEY - OpenRouter API key (fallback provider)
|
||||||
|
At least one of these must be set.
|
||||||
|
|
||||||
|
Optional channel settings:
|
||||||
|
|
||||||
|
TELEGRAM_BOT_TOKEN - Telegram bot token from @BotFather
|
||||||
|
GMAIL_ADDRESS - Gmail address for email integration
|
||||||
|
GMAIL_APP_PASSWORD - Gmail App Password (16-character code)
|
||||||
|
|
||||||
|
Security settings:
|
||||||
|
|
||||||
|
DM_POLICY - "pairing" (default), "allowlist", or "open"
|
||||||
|
|
||||||
|
Ports
|
||||||
|
-----
|
||||||
|
|
||||||
|
GATEWAY_PORT (default: 18789) - Web dashboard, WebChat, and API
|
||||||
|
|
||||||
|
Setup
|
||||||
|
-----
|
||||||
|
|
||||||
|
1. Configure your service.env with API keys and channel credentials
|
||||||
|
|
||||||
|
2. Install the service:
|
||||||
|
ds install <server> openclaw
|
||||||
|
|
||||||
|
3. Note the gateway token printed during installation - you need it
|
||||||
|
to access the web dashboard
|
||||||
|
|
||||||
|
4. Open the web dashboard:
|
||||||
|
http://<server-ip>:18789
|
||||||
|
|
||||||
|
5. Paste the gateway token in Settings to authenticate
|
||||||
|
|
||||||
|
Channel Setup
|
||||||
|
-------------
|
||||||
|
|
||||||
|
TELEGRAM (automated):
|
||||||
|
Set TELEGRAM_BOT_TOKEN in service.env before install.
|
||||||
|
After install, send a message to your bot on Telegram.
|
||||||
|
|
||||||
|
WEBCHAT (always available):
|
||||||
|
Access via the web dashboard at http://<server-ip>:18789
|
||||||
|
|
||||||
|
EMAIL / GMAIL (post-install):
|
||||||
|
After install, set up the email skill:
|
||||||
|
1. docker exec <container> openclaw skills install imap-smtp-email
|
||||||
|
2. Configure in the Control UI with:
|
||||||
|
IMAP: imap.gmail.com:993 (TLS)
|
||||||
|
SMTP: smtp.gmail.com:587 (STARTTLS)
|
||||||
|
Username: your Gmail address
|
||||||
|
Password: your Gmail App Password
|
||||||
|
|
||||||
|
WHATSAPP (interactive, post-install):
|
||||||
|
Requires scanning a QR code with your phone:
|
||||||
|
docker exec -it <container> openclaw channels login
|
||||||
|
|
||||||
|
SIGNAL (interactive, post-install):
|
||||||
|
Requires phone number verification:
|
||||||
|
docker exec -it <container> openclaw channels add --channel signal
|
||||||
|
|
||||||
|
Security Notes
|
||||||
|
--------------
|
||||||
|
|
||||||
|
- API keys are stored in openclaw.json inside the data directory
|
||||||
|
- Gmail App Passwords are scoped credentials, not your real password
|
||||||
|
- Telegram bot tokens only control the bot, not your Telegram account
|
||||||
|
- WhatsApp/Signal use session-based auth, no passwords stored
|
||||||
|
- Set DM_POLICY="pairing" (default) to require a pairing code
|
||||||
|
before the bot responds to new contacts
|
||||||
|
- The gateway token controls dashboard access - keep it secret
|
||||||
|
|
||||||
|
Data Storage
|
||||||
|
------------
|
||||||
|
|
||||||
|
All data is stored in: ${DATA_PATH}
|
||||||
|
config/ - OpenClaw configuration (openclaw.json)
|
||||||
|
workspace/ - Agent workspace and session data
|
||||||
|
|
||||||
|
The gateway token is saved in: ${DATA_PATH}/gateway.token
|
||||||
|
|
||||||
|
Retrieving Your Gateway Token
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
If you lose your gateway token:
|
||||||
|
cat ${DATA_PATH}/gateway.token
|
||||||
|
|
||||||
|
Or check the config file:
|
||||||
|
cat ${DATA_PATH}/config/openclaw.json | grep token
|
||||||
|
|
||||||
|
More Information
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Documentation: https://docs.openclaw.ai/
|
||||||
|
Channel Guide: https://docs.openclaw.ai/gateway/configuration
|
||||||
|
Docker Guide: https://docs.openclaw.ai/install/docker
|
||||||
7
openclaw/_volumes.sh
Executable file
7
openclaw/_volumes.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Define volume items for openclaw container
|
||||||
|
# These are used across backup, restore, create, and destroy operations
|
||||||
|
|
||||||
|
get_openclaw_volumes() {
|
||||||
|
echo "path:data:${DATA_PATH}"
|
||||||
|
}
|
||||||
24
openclaw/backup.sh
Executable file
24
openclaw/backup.sh
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
source "${SCRIPT_DIR}/_volumes.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_PATH"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
# Stop containers for consistent backup
|
||||||
|
docker compose -p "${CONTAINER_NAME}" stop
|
||||||
|
|
||||||
|
# Backup using dropshell's backup system
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
backup_items $(get_openclaw_volumes) || _die "Failed to create backup"
|
||||||
|
|
||||||
|
# Restart containers
|
||||||
|
docker compose -p "${CONTAINER_NAME}" start
|
||||||
|
|
||||||
|
echo "Backup created successfully"
|
||||||
66
openclaw/config/service.env
Normal file
66
openclaw/config/service.env
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
# OpenClaw - Personal AI Assistant
|
||||||
|
# https://openclaw.ai/
|
||||||
|
|
||||||
|
CONTAINER_NAME=openclaw
|
||||||
|
SSH_USER="root"
|
||||||
|
IMAGE_TAG="latest"
|
||||||
|
|
||||||
|
# Data path - stores OpenClaw config, workspace, and session data
|
||||||
|
DATA_PATH="/home/dropshell/openclaw"
|
||||||
|
|
||||||
|
# Gateway port (web dashboard + WebChat + API)
|
||||||
|
GATEWAY_PORT=18789
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# LLM Provider API Keys
|
||||||
|
# REQUIRED: At least one of these must be set
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Anthropic API key (PRIMARY) - recommended for best results
|
||||||
|
# Get from: https://console.anthropic.com/settings/keys
|
||||||
|
ANTHROPIC_API_KEY=
|
||||||
|
|
||||||
|
# OpenRouter API key (FALLBACK) - routes to multiple LLM providers
|
||||||
|
# Get from: https://openrouter.ai/settings/keys
|
||||||
|
OPENROUTER_API_KEY=
|
||||||
|
|
||||||
|
# Primary model to use (format: provider/model-name)
|
||||||
|
DEFAULT_MODEL="anthropic/claude-sonnet-4-5"
|
||||||
|
|
||||||
|
# Fallback model (used when primary is unavailable)
|
||||||
|
FALLBACK_MODEL="openrouter/anthropic/claude-sonnet-4-5"
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Telegram Bot Channel
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Create a bot via @BotFather on Telegram and paste the token here
|
||||||
|
# Leave empty to disable Telegram
|
||||||
|
# Steps: 1. Open Telegram, search @BotFather
|
||||||
|
# 2. Send /newbot, follow prompts
|
||||||
|
# 3. Copy the bot token
|
||||||
|
TELEGRAM_BOT_TOKEN=
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Gmail Email Integration (IMAP/SMTP)
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Uses a Gmail App Password - NOT your real Gmail password!
|
||||||
|
# Steps: 1. Enable 2FA on your Google account
|
||||||
|
# 2. Go to: https://myaccount.google.com/apppasswords
|
||||||
|
# 3. Create an app password for "Mail"
|
||||||
|
# 4. Paste the 16-character app password below
|
||||||
|
GMAIL_ADDRESS=
|
||||||
|
GMAIL_APP_PASSWORD=
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Security Settings
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# DM policy for messaging channels
|
||||||
|
# "pairing" - require a pairing code before responding (most secure)
|
||||||
|
# "allowlist" - only respond to approved senders
|
||||||
|
# "open" - respond to anyone (least secure)
|
||||||
|
DM_POLICY="pairing"
|
||||||
|
|
||||||
|
TEMPLATE=openclaw
|
||||||
21
openclaw/destroy.sh
Executable file
21
openclaw/destroy.sh
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
source "${SCRIPT_DIR}/_volumes.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_PATH"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
# Stop and remove containers
|
||||||
|
docker compose -p "${CONTAINER_NAME}" down
|
||||||
|
|
||||||
|
# Destroy data
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
destroy_items $(get_openclaw_volumes) || _die "Failed to destroy data"
|
||||||
|
|
||||||
|
echo "Destroyed ${CONTAINER_NAME} and all data"
|
||||||
19
openclaw/docker-compose.yml
Normal file
19
openclaw/docker-compose.yml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
services:
|
||||||
|
openclaw:
|
||||||
|
image: ${IMAGE_REGISTRY}/${IMAGE_REPO}:${IMAGE_TAG}
|
||||||
|
container_name: ${CONTAINER_NAME}
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "${GATEWAY_PORT}:18789"
|
||||||
|
volumes:
|
||||||
|
- ${DATA_PATH}/config:/home/node/.openclaw
|
||||||
|
- ${DATA_PATH}/workspace:/home/node/workspace
|
||||||
|
environment:
|
||||||
|
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}
|
||||||
|
OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-sf", "http://localhost:18789/healthz"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
13
openclaw/install-pre.sh
Executable file
13
openclaw/install-pre.sh
Executable file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME"
|
||||||
|
|
||||||
|
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"
|
||||||
|
docker compose -p "${CONTAINER_NAME}" pull || echo "Warning: pre-pull failed, install.sh will retry"
|
||||||
|
|
||||||
|
echo "Pre-install complete"
|
||||||
143
openclaw/install.sh
Executable file
143
openclaw/install.sh
Executable file
@@ -0,0 +1,143 @@
|
|||||||
|
#!/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"
|
||||||
12
openclaw/logs.sh
Executable file
12
openclaw/logs.sh
Executable file
@@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
docker compose -p "${CONTAINER_NAME}" logs "$@"
|
||||||
5
openclaw/ports.sh
Executable file
5
openclaw/ports.sh
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
_check_required_env_vars "GATEWAY_PORT"
|
||||||
|
|
||||||
|
echo "$GATEWAY_PORT"
|
||||||
35
openclaw/restore.sh
Executable file
35
openclaw/restore.sh
Executable file
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
source "${SCRIPT_DIR}/_volumes.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_PATH"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
# Stop and remove containers before restore
|
||||||
|
docker compose -p "${CONTAINER_NAME}" down
|
||||||
|
|
||||||
|
# Restore files using dropshell's restore system
|
||||||
|
# shellcheck disable=SC2046
|
||||||
|
restore_items $(get_openclaw_volumes) || _die "Failed to restore data from backup file"
|
||||||
|
|
||||||
|
# Fix ownership after restore
|
||||||
|
chown -R 1000:1000 "${DATA_PATH}"
|
||||||
|
|
||||||
|
# Start containers
|
||||||
|
docker compose -p "${CONTAINER_NAME}" up -d
|
||||||
|
|
||||||
|
echo "Restore complete! Service is running."
|
||||||
|
echo ""
|
||||||
|
echo "Your gateway token:"
|
||||||
|
if [ -f "${DATA_PATH}/gateway.token" ]; then
|
||||||
|
cat "${DATA_PATH}/gateway.token"
|
||||||
|
echo ""
|
||||||
|
else
|
||||||
|
echo " (check ${DATA_PATH}/config/openclaw.json)"
|
||||||
|
fi
|
||||||
14
openclaw/start.sh
Executable file
14
openclaw/start.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME" "DATA_PATH"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
docker compose -p "${CONTAINER_NAME}" up -d || _die "Failed to start containers"
|
||||||
|
|
||||||
|
echo "Container ${CONTAINER_NAME} started"
|
||||||
25
openclaw/status.sh
Executable file
25
openclaw/status.sh
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME"
|
||||||
|
|
||||||
|
if ! docker ps -a --format "{{.Names}}" | grep -q "^${CONTAINER_NAME}$"; then
|
||||||
|
echo "Unknown"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
STATE=$(docker inspect -f '{{.State.Status}}' "$CONTAINER_NAME" 2>/dev/null)
|
||||||
|
case "$STATE" in
|
||||||
|
running)
|
||||||
|
if docker inspect -f '{{.State.Health.Status}}' "$CONTAINER_NAME" 2>/dev/null | grep -q "unhealthy"; then
|
||||||
|
echo "Error"
|
||||||
|
else
|
||||||
|
echo "Running"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
exited|stopped)
|
||||||
|
echo "Stopped"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
14
openclaw/stop.sh
Executable file
14
openclaw/stop.sh
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
docker compose -p "${CONTAINER_NAME}" stop || _die "Failed to stop containers"
|
||||||
|
|
||||||
|
echo "Container ${CONTAINER_NAME} stopped"
|
||||||
14
openclaw/template_info.env
Normal file
14
openclaw/template_info.env
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# DO NOT EDIT THIS FILE FOR YOUR SERVICE!
|
||||||
|
# This file is replaced from the template whenever there is an update.
|
||||||
|
# Edit the service.env file to make changes.
|
||||||
|
|
||||||
|
# Template to use - always required!
|
||||||
|
TEMPLATE=openclaw
|
||||||
|
REQUIRES_HOST_ROOT=false
|
||||||
|
REQUIRES_DOCKER=true
|
||||||
|
REQUIRES_DOCKER_ROOT=false
|
||||||
|
|
||||||
|
# Docker image settings
|
||||||
|
IMAGE_REGISTRY="ghcr.io"
|
||||||
|
IMAGE_REPO="openclaw/openclaw"
|
||||||
|
IMAGE_TAG="latest"
|
||||||
17
openclaw/uninstall.sh
Executable file
17
openclaw/uninstall.sh
Executable file
@@ -0,0 +1,17 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source "${AGENT_PATH}/common.sh"
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
_check_required_env_vars "CONTAINER_NAME"
|
||||||
|
|
||||||
|
# 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"
|
||||||
|
|
||||||
|
# Stop and remove containers (but preserve data)
|
||||||
|
docker compose -p "${CONTAINER_NAME}" down || _die "Failed to stop containers"
|
||||||
|
|
||||||
|
echo "Uninstalled ${CONTAINER_NAME} (data preserved in ${DATA_PATH})"
|
||||||
|
echo "Note: Your gateway token and configuration are still in ${DATA_PATH}"
|
||||||
Reference in New Issue
Block a user