Skip to content

Commit 02fe332

Browse files
authored
deploy: add pluggable env backend and sync workflow (#98)
1 parent a7e8893 commit 02fe332

11 files changed

Lines changed: 767 additions & 11 deletions

File tree

AGENTS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,13 @@ sudo baudbot rollback previous
124124
# Register a server with Slack broker (after OAuth callback)
125125
sudo baudbot broker register --broker-url https://broker.example.com --workspace-id T0123ABCD --auth-code <code>
126126

127+
# Rotate an API key after setup (prompts hidden input)
128+
sudo baudbot env set ANTHROPIC_API_KEY --restart
129+
130+
# Optional: use external secret source instead of ~/.baudbot/.env
131+
sudo baudbot env backend set-command 'your-secret-tool export baudbot-prod'
132+
sudo baudbot env sync --restart
133+
127134
# Launch agent directly (debug/dev)
128135
sudo -u baudbot_agent ~/runtime/start.sh
129136

CONFIGURATION.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,34 @@ BAUDBOT_SOURCE_DIR=/home/your_username/baudbot
218218

219219
## Applying Configuration
220220

221-
After editing `~/.config/.env`:
221+
Quick key updates after setup (recommended):
222+
223+
```bash
224+
# Update a key in file backend (and mirror runtime when run with sudo)
225+
sudo baudbot env set ANTHROPIC_API_KEY
226+
227+
# Optional: pass value inline + restart automatically
228+
sudo baudbot env set OPENAI_API_KEY sk-... --restart
229+
```
230+
231+
### Optional: move source-of-truth away from `~/.baudbot/.env`
232+
233+
`baudbot env` supports a pluggable source backend:
234+
235+
```bash
236+
# Show active backend
237+
baudbot env backend show
238+
239+
# Use command backend (command must output KEY=VALUE lines)
240+
sudo baudbot env backend set-command 'your-secret-tool export baudbot-prod'
241+
242+
# Sync rendered source env into runtime .env and restart
243+
sudo baudbot env sync --restart
244+
```
245+
246+
This keeps runtime compatibility (`~/.config/.env` is still rendered for varlock/startup) while moving authoritative storage to an external source.
247+
248+
Manual edits also work. After editing `~/.config/.env` directly:
222249

223250
```bash
224251
# Re-deploy config and restart cleanly

README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,20 @@ sudo baudbot broker register \
9494
--auth-code <auth-code-from-oauth-callback>
9595
```
9696

97+
Need to rotate/update a key later?
98+
99+
```bash
100+
sudo baudbot env set ANTHROPIC_API_KEY
101+
# or: sudo baudbot env set OPENAI_API_KEY sk-... --restart
102+
```
103+
104+
Want to move source-of-truth off `~/.baudbot/.env` later?
105+
106+
```bash
107+
sudo baudbot env backend set-command 'your-secret-tool export baudbot-prod'
108+
sudo baudbot env sync --restart
109+
```
110+
97111
See [CONFIGURATION.md](CONFIGURATION.md) for required environment variables and secret setup.
98112

99113
## Core agents

bin/baudbot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ usage() {
112112
echo " install Bootstrap install from GitHub (download script, then escalate)"
113113
echo " setup One-time system setup (user, deps, firewall, systemd; --experimental enables risky integrations)"
114114
echo " config Interactive secrets and config setup"
115+
echo " env Manage env vars and backend source (set/get/sync/backend)"
115116
echo " deploy Deploy source + config to agent runtime"
116117
echo " broker Slack broker commands (register workspace linkage)"
117118
echo ""
@@ -706,6 +707,11 @@ case "${1:-}" in
706707
exec "$BAUDBOT_ROOT/bin/config.sh" "$@"
707708
;;
708709

710+
env)
711+
shift
712+
exec "$BAUDBOT_ROOT/bin/env.sh" "$@"
713+
;;
714+
709715
broker)
710716
shift
711717
case "${1:-}" in

bin/deploy.sh

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,24 @@ else
4343
fi
4444
DEPLOY_HOME=$(getent passwd "$DEPLOY_USER" | cut -d: -f6 2>/dev/null || echo "")
4545
ADMIN_CONFIG="$DEPLOY_HOME/.baudbot/.env"
46+
RENDER_ENV_SCRIPT="$BAUDBOT_SRC/bin/render-env.sh"
47+
48+
source_env_value() {
49+
local key="$1"
50+
if [ -x "$RENDER_ENV_SCRIPT" ]; then
51+
BAUDBOT_ADMIN_HOME="$DEPLOY_HOME" BAUDBOT_CONFIG_USER="$DEPLOY_USER" "$RENDER_ENV_SCRIPT" --get "$key" 2>/dev/null || true
52+
return 0
53+
fi
54+
if [ -f "$ADMIN_CONFIG" ]; then
55+
grep -E "^${key}=" "$ADMIN_CONFIG" | tail -n 1 | cut -d= -f2- || true
56+
return 0
57+
fi
58+
return 0
59+
}
4660

4761
EXPERIMENTAL_MODE="${BAUDBOT_EXPERIMENTAL:-}"
48-
if [ -z "$EXPERIMENTAL_MODE" ] && [ -f "$ADMIN_CONFIG" ]; then
49-
EXPERIMENTAL_MODE=$(grep '^BAUDBOT_EXPERIMENTAL=' "$ADMIN_CONFIG" | head -1 | cut -d= -f2- || true)
62+
if [ -z "$EXPERIMENTAL_MODE" ]; then
63+
EXPERIMENTAL_MODE="$(source_env_value BAUDBOT_EXPERIMENTAL)"
5064
fi
5165
case "$EXPERIMENTAL_MODE" in
5266
1|true|TRUE|yes|YES|on|ON) EXPERIMENTAL_MODE=1 ;;
@@ -320,12 +334,22 @@ fi
320334

321335
echo "Deploying config..."
322336

323-
# Uses admin config resolved near script start (ADMIN_CONFIG).
337+
# Uses admin env source resolved near script start.
324338

325-
if [ -f "$ADMIN_CONFIG" ]; then
339+
if [ -x "$RENDER_ENV_SCRIPT" ] && BAUDBOT_ADMIN_HOME="$DEPLOY_HOME" BAUDBOT_CONFIG_USER="$DEPLOY_USER" "$RENDER_ENV_SCRIPT" --check >/dev/null 2>&1; then
340+
if [ "$DRY_RUN" -eq 0 ]; then
341+
as_agent bash -c "mkdir -p '$BAUDBOT_HOME/.config'"
342+
# Stream rendered config directly to agent-owned target to avoid staging secrets in /tmp.
343+
BAUDBOT_ADMIN_HOME="$DEPLOY_HOME" BAUDBOT_CONFIG_USER="$DEPLOY_USER" "$RENDER_ENV_SCRIPT" | as_agent bash -c "cat > '$BAUDBOT_HOME/.config/.env'"
344+
as_agent chmod 600 "$BAUDBOT_HOME/.config/.env"
345+
log "✓ env source → ~/.config/.env (600)"
346+
else
347+
log "would render env source → ~/.config/.env"
348+
fi
349+
elif [ -f "$ADMIN_CONFIG" ]; then
350+
# Backward-compatible fallback for older checkouts without render-env.sh.
326351
if [ "$DRY_RUN" -eq 0 ]; then
327352
as_agent bash -c "mkdir -p '$BAUDBOT_HOME/.config'"
328-
# Stream directly to agent-owned target to avoid staging secrets in /tmp.
329353
as_agent bash -c "cat > '$BAUDBOT_HOME/.config/.env'" < "$ADMIN_CONFIG"
330354
as_agent chmod 600 "$BAUDBOT_HOME/.config/.env"
331355
log "✓ .env → ~/.config/.env (600)"
@@ -335,9 +359,9 @@ if [ -f "$ADMIN_CONFIG" ]; then
335359
else
336360
# Fallback: check if agent already has a .env (written directly by old install.sh)
337361
if as_agent test -f "$BAUDBOT_HOME/.config/.env" 2>/dev/null; then
338-
log "- .env: using existing agent config (no ~/.baudbot/.env found)"
362+
log "- .env: using existing agent config (no env source found)"
339363
else
340-
log "⚠ no config found — run: baudbot config"
364+
log "⚠ no config source found — run: baudbot config or configure 'baudbot env backend'"
341365
fi
342366
fi
343367

bin/doctor.sh

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,24 @@ fi
9292
echo ""
9393
echo "Admin config:"
9494

95-
# Check for admin config dir
95+
# Check for admin config/env source
9696
ADMIN_USER="${SUDO_USER:-$(whoami)}"
9797
ADMIN_HOME=$(getent passwd "$ADMIN_USER" | cut -d: -f6 2>/dev/null || echo "")
9898
ADMIN_CONFIG="$ADMIN_HOME/.baudbot/.env"
99+
BACKEND_CONF="$ADMIN_HOME/.baudbot/env-store.conf"
100+
RENDER_ENV_SCRIPT="${BAUDBOT_ROOT:-$(cd "$(dirname "$0")/.." && pwd)}/bin/render-env.sh"
99101

100-
if [ -n "$ADMIN_HOME" ] && [ -f "$ADMIN_CONFIG" ]; then
102+
ADMIN_BACKEND="file"
103+
if [ -f "$BACKEND_CONF" ]; then
104+
ADMIN_BACKEND=$(grep -E '^BAUDBOT_ENV_BACKEND=' "$BACKEND_CONF" | tail -n1 | cut -d= -f2- || echo "file")
105+
fi
106+
107+
if [ -n "$ADMIN_HOME" ] && [ -x "$RENDER_ENV_SCRIPT" ] && BAUDBOT_ADMIN_HOME="$ADMIN_HOME" BAUDBOT_CONFIG_USER="$ADMIN_USER" "$RENDER_ENV_SCRIPT" --check >/dev/null 2>&1; then
108+
pass "admin env source is configured (backend: $ADMIN_BACKEND)"
109+
elif [ -n "$ADMIN_HOME" ] && [ -f "$ADMIN_CONFIG" ]; then
101110
pass "admin config exists ($ADMIN_CONFIG)"
102111
else
103-
warn "admin config not found at $ADMIN_CONFIG (run: baudbot config)"
112+
warn "admin env source not found (run: baudbot config, or configure: baudbot env backend ...)"
104113
fi
105114

106115
echo ""

0 commit comments

Comments
 (0)