Files
vikingowl 107f9e1f14 feat(deploy): add Dockerfile, K8s manifests, and bootstrap script
Multi-stage Alpine build pinned to python:3.14-alpine, with libolm pulled
in only for the runtime layer. K8s manifests cover ServiceAccount, Role
(scoped to a single named Secret), RoleBinding, ConfigMap, RWO PVC, and
the CronJob itself (concurrencyPolicy=Forbid, runAsNonRoot, dropped caps,
readOnlyRootFilesystem). Kustomize overlay targets the tenant-2 namespace.
bootstrap-local.sh prepares ./local/ from a Claude install (honors
CLAUDE_CONFIG_DIR for work/priv splits) and prompts for the Matrix bot
credentials.
2026-05-18 17:23:24 +02:00

113 lines
3.8 KiB
Bash
Executable File

#!/bin/sh
# bootstrap-local.sh — prepares ./local/ for `docker run` smoke testing.
#
# Slurps Anthropic OAuth tokens out of a Claude install and prompts for Matrix
# bot credentials. Source path can come from:
#
# 1. first positional arg ./bootstrap-local.sh ~/.claude-priv
# 2. $CLAUDE_CONFIG_DIR env var CLAUDE_CONFIG_DIR=~/.claude-work ./bootstrap-local.sh
# 3. default ~/.claude
#
# Idempotent. Safe to re-run after a token refresh.
set -eu
CLAUDE_DIR="${1:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"
CREDS="$CLAUDE_DIR/.credentials.json"
if ! command -v jq >/dev/null 2>&1; then
echo "error: jq not installed" >&2
exit 1
fi
if [ ! -f "$CREDS" ]; then
echo "error: $CREDS not found" >&2
echo "" >&2
echo "Override the Claude config dir if your install is elsewhere:" >&2
echo " $0 ~/.claude-priv" >&2
echo " CLAUDE_CONFIG_DIR=\$HOME/.claude-work $0" >&2
exit 1
fi
if ! jq -e '.claudeAiOauth.accessToken' "$CREDS" >/dev/null 2>&1; then
echo "error: $CREDS missing .claudeAiOauth.accessToken — is this a Claude credentials file?" >&2
exit 1
fi
# Determine project root (so the script works from anywhere)
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT"
echo "Using Claude credentials from: $CREDS"
echo "Writing to: $ROOT/local/"
echo ""
mkdir -p local/oauth-tokens local/matrix-bot local/state
# --- Anthropic OAuth tokens ---
jq -r .claudeAiOauth.accessToken "$CREDS" > local/oauth-tokens/accessToken
jq -r .claudeAiOauth.refreshToken "$CREDS" > local/oauth-tokens/refreshToken
jq -r .claudeAiOauth.expiresAt "$CREDS" > local/oauth-tokens/expiresAt
# --- Matrix bot credentials (interactive) ---
existing_hs=""
[ -f local/matrix-bot/homeserver_url ] && existing_hs=$(cat local/matrix-bot/homeserver_url 2>/dev/null || true)
existing_uid=""
[ -f local/matrix-bot/user_id ] && existing_uid=$(cat local/matrix-bot/user_id 2>/dev/null || true)
existing_did=""
[ -f local/matrix-bot/device_id ] && existing_did=$(cat local/matrix-bot/device_id 2>/dev/null || true)
echo "Matrix bot credentials (press Enter to keep existing values shown in brackets)"
# Prompt for a value, storing the result in $REPLY_VALUE. Using a global instead of
# command substitution because $() captures the prompt itself, hiding it from the user.
prompt_value() {
# $1 = label, $2 = current/default
label="$1"
default="$2"
if [ -n "$default" ]; then
printf " %s [%s]: " "$label" "$default"
else
printf " %s: " "$label"
fi
read -r REPLY_VALUE
if [ -z "$REPLY_VALUE" ]; then
REPLY_VALUE="$default"
fi
}
prompt_value "homeserver_url" "$existing_hs"; hs="$REPLY_VALUE"
prompt_value "user_id" "$existing_uid"; uid="$REPLY_VALUE"
printf " access_token (will not echo, Enter to keep existing): "
stty -echo 2>/dev/null || true
read -r at
stty echo 2>/dev/null || true
printf "\n"
if [ -z "$at" ] && [ -f local/matrix-bot/access_token ]; then
at=$(cat local/matrix-bot/access_token)
fi
prompt_value "device_id" "$existing_did"; did="$REPLY_VALUE"
if [ -z "$hs" ] || [ -z "$uid" ] || [ -z "$at" ] || [ -z "$did" ]; then
echo "error: all four Matrix fields are required" >&2
exit 1
fi
printf "%s" "$hs" > local/matrix-bot/homeserver_url
printf "%s" "$uid" > local/matrix-bot/user_id
printf "%s" "$at" > local/matrix-bot/access_token
printf "%s" "$did" > local/matrix-bot/device_id
chmod 600 local/oauth-tokens/* local/matrix-bot/*
echo ""
echo "Local bootstrap ready in $ROOT/local/"
echo "Run:"
echo " docker run --rm -e LOCAL_MODE=1 -e MATRIX_ROOM_ID='!yourroom:hs' \\"
echo " -v \"\$PWD/local/oauth-tokens:/var/run/secrets/oauth-tokens\" \\"
echo " -v \"\$PWD/local/matrix-bot:/var/run/secrets/matrix-bot:ro\" \\"
echo " -v \"\$PWD/local/state:/state\" \\"
echo " claude-matrix-bot:dev"