feat: add optional home volume and extra mounts
This commit is contained in:
committed by
Peter Steinberger
parent
56b11ad5a8
commit
b5cd758c21
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
node_modules
|
node_modules
|
||||||
.env
|
.env
|
||||||
|
docker-compose.extra.yml
|
||||||
dist
|
dist
|
||||||
*.bun-build
|
*.bun-build
|
||||||
pnpm-lock.yaml
|
pnpm-lock.yaml
|
||||||
|
|||||||
@@ -3,7 +3,10 @@ set -euo pipefail
|
|||||||
|
|
||||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
COMPOSE_FILE="$ROOT_DIR/docker-compose.yml"
|
COMPOSE_FILE="$ROOT_DIR/docker-compose.yml"
|
||||||
|
EXTRA_COMPOSE_FILE="$ROOT_DIR/docker-compose.extra.yml"
|
||||||
IMAGE_NAME="${CLAWDBOT_IMAGE:-clawdbot:local}"
|
IMAGE_NAME="${CLAWDBOT_IMAGE:-clawdbot:local}"
|
||||||
|
EXTRA_MOUNTS="${CLAWDBOT_EXTRA_MOUNTS:-}"
|
||||||
|
HOME_VOLUME_NAME="${CLAWDBOT_HOME_VOLUME:-}"
|
||||||
|
|
||||||
require_cmd() {
|
require_cmd() {
|
||||||
if ! command -v "$1" >/dev/null 2>&1; then
|
if ! command -v "$1" >/dev/null 2>&1; then
|
||||||
@@ -41,6 +44,75 @@ PY
|
|||||||
fi
|
fi
|
||||||
export CLAWDBOT_GATEWAY_TOKEN
|
export CLAWDBOT_GATEWAY_TOKEN
|
||||||
|
|
||||||
|
COMPOSE_FILES=("$COMPOSE_FILE")
|
||||||
|
COMPOSE_ARGS=()
|
||||||
|
|
||||||
|
write_extra_compose() {
|
||||||
|
local mounts_csv="$1"
|
||||||
|
local home_volume="$2"
|
||||||
|
local -a mounts=()
|
||||||
|
local mount
|
||||||
|
|
||||||
|
# Split on commas; ignore empty entries.
|
||||||
|
IFS=',' read -r -a mounts <<<"$mounts_csv"
|
||||||
|
|
||||||
|
cat >"$EXTRA_COMPOSE_FILE" <<'YAML'
|
||||||
|
services:
|
||||||
|
clawdbot-gateway:
|
||||||
|
volumes:
|
||||||
|
YAML
|
||||||
|
|
||||||
|
if [[ -n "$home_volume" ]]; then
|
||||||
|
printf ' - %s:/home/node\n' "$home_volume" >>"$EXTRA_COMPOSE_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for mount in "${mounts[@]}"; do
|
||||||
|
mount="${mount#"${mount%%[![:space:]]*}"}"
|
||||||
|
mount="${mount%"${mount##*[![:space:]]}"}"
|
||||||
|
if [[ -z "$mount" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
printf ' - %s\n' "$mount" >>"$EXTRA_COMPOSE_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
cat >>"$EXTRA_COMPOSE_FILE" <<'YAML'
|
||||||
|
clawdbot-cli:
|
||||||
|
volumes:
|
||||||
|
YAML
|
||||||
|
|
||||||
|
if [[ -n "$home_volume" ]]; then
|
||||||
|
printf ' - %s:/home/node\n' "$home_volume" >>"$EXTRA_COMPOSE_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
for mount in "${mounts[@]}"; do
|
||||||
|
mount="${mount#"${mount%%[![:space:]]*}"}"
|
||||||
|
mount="${mount%"${mount##*[![:space:]]}"}"
|
||||||
|
if [[ -z "$mount" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
printf ' - %s\n' "$mount" >>"$EXTRA_COMPOSE_FILE"
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -n "$home_volume" ]]; then
|
||||||
|
cat >>"$EXTRA_COMPOSE_FILE" <<YAML
|
||||||
|
volumes:
|
||||||
|
${home_volume}:
|
||||||
|
YAML
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ -n "$EXTRA_MOUNTS" || -n "$HOME_VOLUME_NAME" ]]; then
|
||||||
|
write_extra_compose "$EXTRA_MOUNTS" "$HOME_VOLUME_NAME"
|
||||||
|
COMPOSE_FILES+=("$EXTRA_COMPOSE_FILE")
|
||||||
|
fi
|
||||||
|
for compose_file in "${COMPOSE_FILES[@]}"; do
|
||||||
|
COMPOSE_ARGS+=("-f" "$compose_file")
|
||||||
|
done
|
||||||
|
COMPOSE_HINT="docker compose"
|
||||||
|
for compose_file in "${COMPOSE_FILES[@]}"; do
|
||||||
|
COMPOSE_HINT+=" -f ${compose_file}"
|
||||||
|
done
|
||||||
|
|
||||||
ENV_FILE="$ROOT_DIR/.env"
|
ENV_FILE="$ROOT_DIR/.env"
|
||||||
upsert_env() {
|
upsert_env() {
|
||||||
local file="$1"
|
local file="$1"
|
||||||
@@ -84,7 +156,9 @@ upsert_env "$ENV_FILE" \
|
|||||||
CLAWDBOT_BRIDGE_PORT \
|
CLAWDBOT_BRIDGE_PORT \
|
||||||
CLAWDBOT_GATEWAY_BIND \
|
CLAWDBOT_GATEWAY_BIND \
|
||||||
CLAWDBOT_GATEWAY_TOKEN \
|
CLAWDBOT_GATEWAY_TOKEN \
|
||||||
CLAWDBOT_IMAGE
|
CLAWDBOT_IMAGE \
|
||||||
|
CLAWDBOT_EXTRA_MOUNTS \
|
||||||
|
CLAWDBOT_HOME_VOLUME
|
||||||
|
|
||||||
echo "==> Building Docker image: $IMAGE_NAME"
|
echo "==> Building Docker image: $IMAGE_NAME"
|
||||||
docker build -t "$IMAGE_NAME" -f "$ROOT_DIR/Dockerfile" "$ROOT_DIR"
|
docker build -t "$IMAGE_NAME" -f "$ROOT_DIR/Dockerfile" "$ROOT_DIR"
|
||||||
@@ -98,21 +172,21 @@ echo " - Gateway token: $CLAWDBOT_GATEWAY_TOKEN"
|
|||||||
echo " - Tailscale exposure: Off"
|
echo " - Tailscale exposure: Off"
|
||||||
echo " - Install Gateway daemon: No"
|
echo " - Install Gateway daemon: No"
|
||||||
echo ""
|
echo ""
|
||||||
docker compose -f "$COMPOSE_FILE" run --rm clawdbot-cli onboard --no-install-daemon
|
docker compose "${COMPOSE_ARGS[@]}" run --rm clawdbot-cli onboard --no-install-daemon
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "==> Provider setup (optional)"
|
echo "==> Provider setup (optional)"
|
||||||
echo "WhatsApp (QR):"
|
echo "WhatsApp (QR):"
|
||||||
echo " docker compose -f $COMPOSE_FILE run --rm clawdbot-cli providers login"
|
echo " ${COMPOSE_HINT} run --rm clawdbot-cli providers login"
|
||||||
echo "Telegram (bot token):"
|
echo "Telegram (bot token):"
|
||||||
echo " docker compose -f $COMPOSE_FILE run --rm clawdbot-cli providers add --provider telegram --token <token>"
|
echo " ${COMPOSE_HINT} run --rm clawdbot-cli providers add --provider telegram --token <token>"
|
||||||
echo "Discord (bot token):"
|
echo "Discord (bot token):"
|
||||||
echo " docker compose -f $COMPOSE_FILE run --rm clawdbot-cli providers add --provider discord --token <token>"
|
echo " ${COMPOSE_HINT} run --rm clawdbot-cli providers add --provider discord --token <token>"
|
||||||
echo "Docs: https://docs.clawd.bot/providers"
|
echo "Docs: https://docs.clawd.bot/providers"
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "==> Starting gateway"
|
echo "==> Starting gateway"
|
||||||
docker compose -f "$COMPOSE_FILE" up -d clawdbot-gateway
|
docker compose "${COMPOSE_ARGS[@]}" up -d clawdbot-gateway
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "Gateway running with host port mapping."
|
echo "Gateway running with host port mapping."
|
||||||
@@ -122,5 +196,5 @@ echo "Workspace: $CLAWDBOT_WORKSPACE_DIR"
|
|||||||
echo "Token: $CLAWDBOT_GATEWAY_TOKEN"
|
echo "Token: $CLAWDBOT_GATEWAY_TOKEN"
|
||||||
echo ""
|
echo ""
|
||||||
echo "Commands:"
|
echo "Commands:"
|
||||||
echo " docker compose -f $COMPOSE_FILE logs -f clawdbot-gateway"
|
echo " ${COMPOSE_HINT} logs -f clawdbot-gateway"
|
||||||
echo " docker compose -f $COMPOSE_FILE exec clawdbot-gateway node dist/index.js health --token \"$CLAWDBOT_GATEWAY_TOKEN\""
|
echo " ${COMPOSE_HINT} exec clawdbot-gateway node dist/index.js health --token \"$CLAWDBOT_GATEWAY_TOKEN\""
|
||||||
|
|||||||
@@ -61,6 +61,51 @@ docker compose run --rm clawdbot-cli onboard
|
|||||||
docker compose up -d clawdbot-gateway
|
docker compose up -d clawdbot-gateway
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Extra mounts (optional)
|
||||||
|
|
||||||
|
If you want to mount additional host directories into the containers, set
|
||||||
|
`CLAWDBOT_EXTRA_MOUNTS` before running `docker-setup.sh`. This accepts a
|
||||||
|
comma-separated list of Docker bind mounts and applies them to both
|
||||||
|
`clawdbot-gateway` and `clawdbot-cli` by generating `docker-compose.extra.yml`.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export CLAWDBOT_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
|
||||||
|
./docker-setup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- Paths must be shared with Docker Desktop on macOS/Windows.
|
||||||
|
- If you edit `CLAWDBOT_EXTRA_MOUNTS`, rerun `docker-setup.sh` to regenerate the
|
||||||
|
extra compose file.
|
||||||
|
|
||||||
|
### Persist the entire container home (optional)
|
||||||
|
|
||||||
|
If you want `/home/node` to persist across container recreation, set a named
|
||||||
|
volume via `CLAWDBOT_HOME_VOLUME`. This creates a Docker volume and mounts it at
|
||||||
|
`/home/node`, while keeping the standard config/workspace bind mounts.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export CLAWDBOT_HOME_VOLUME="clawdbot_home"
|
||||||
|
./docker-setup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
You can combine this with extra mounts:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
export CLAWDBOT_HOME_VOLUME="clawdbot_home"
|
||||||
|
export CLAWDBOT_EXTRA_MOUNTS="$HOME/.codex:/home/node/.codex:ro,$HOME/github:/home/node/github:rw"
|
||||||
|
./docker-setup.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
- If you change `CLAWDBOT_HOME_VOLUME`, rerun `docker-setup.sh` to regenerate the
|
||||||
|
extra compose file.
|
||||||
|
- The named volume persists until removed with `docker volume rm <name>`.
|
||||||
|
|
||||||
### Faster rebuilds (recommended)
|
### Faster rebuilds (recommended)
|
||||||
|
|
||||||
To speed up rebuilds, order your Dockerfile so dependency layers are cached.
|
To speed up rebuilds, order your Dockerfile so dependency layers are cached.
|
||||||
|
|||||||
Reference in New Issue
Block a user