refactor: use Docker registry image instead of local builds

- docker-compose now pulls letsbesolutions/sysadmin-agent:latest
- setup.sh pulls image instead of cloning repo and building
- Removed dev-only volume mounts
- Updated resource limits for production

This enables proper CI/CD: push to repo → Gitea builds image →
tenant servers pull latest image.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Matt 2025-12-08 12:08:32 +01:00
parent f935f7057a
commit 230d861f24
2 changed files with 15 additions and 77 deletions

View File

@ -398,38 +398,8 @@ else
fi fi
if [[ "$tool_name" == "sysadmin" ]]; then if [[ "$tool_name" == "sysadmin" ]]; then
echo "Cloning/updating sysadmin repository..." echo " Pulling latest sysadmin agent image..."
SYSADMIN_DIR="/opt/letsbe/stacks/sysadmin" docker-compose -f "$compose_file" pull
SYSADMIN_REPO="https://code.letsbe.solutions/letsbe/letsbe-sysadmin.git"
# Save our docker-compose.yml before clone
if [[ -f "${SYSADMIN_DIR}/docker-compose.yml" ]]; then
cp "${SYSADMIN_DIR}/docker-compose.yml" /tmp/sysadmin-compose.yml
fi
# Clone or pull the repo
if [[ -d "${SYSADMIN_DIR}/.git" ]]; then
echo " Pulling latest changes..."
cd "${SYSADMIN_DIR}" && git pull origin main || git pull origin master
else
echo " Cloning repository..."
# Clone into temp, then move contents
rm -rf /tmp/letsbe-sysadmin
git clone "${SYSADMIN_REPO}" /tmp/letsbe-sysadmin
# Move repo contents to sysadmin dir (preserving our docker-compose)
cp -r /tmp/letsbe-sysadmin/* "${SYSADMIN_DIR}/" 2>/dev/null || true
cp -r /tmp/letsbe-sysadmin/.* "${SYSADMIN_DIR}/" 2>/dev/null || true
rm -rf /tmp/letsbe-sysadmin
fi
# Restore our docker-compose.yml (with template variables)
if [[ -f /tmp/sysadmin-compose.yml ]]; then
cp /tmp/sysadmin-compose.yml "${SYSADMIN_DIR}/docker-compose.yml"
rm /tmp/sysadmin-compose.yml
fi
echo " Building sysadmin image..."
docker-compose -f "$compose_file" build
fi fi
echo "Starting $tool_name..." echo "Starting $tool_name..."
@ -501,39 +471,16 @@ SYSADMIN_COMPOSE="/opt/letsbe/stacks/sysadmin/docker-compose.yml"
if [[ -f "$SYSADMIN_COMPOSE" ]]; then if [[ -f "$SYSADMIN_COMPOSE" ]]; then
# Check if sysadmin is already running # Check if sysadmin is already running
if docker ps --format '{{.Names}}' | grep -q "agent$"; then if docker ps --format '{{.Names}}' | grep -q "agent$"; then
echo "Sysadmin agent already running, updating..." echo " Sysadmin agent already running, updating..."
fi fi
SYSADMIN_DIR="/opt/letsbe/stacks/sysadmin" echo " Pulling latest sysadmin agent image..."
SYSADMIN_REPO="https://code.letsbe.solutions/letsbe/letsbe-sysadmin.git" docker-compose -f "$SYSADMIN_COMPOSE" pull
# Save our docker-compose.yml before clone
cp "${SYSADMIN_DIR}/docker-compose.yml" /tmp/sysadmin-compose.yml
# Clone or pull the repo
if [[ -d "${SYSADMIN_DIR}/.git" ]]; then
echo " Pulling latest sysadmin changes..."
cd "${SYSADMIN_DIR}" && git pull origin main || git pull origin master || true
else
echo " Cloning sysadmin repository..."
rm -rf /tmp/letsbe-sysadmin
git clone "${SYSADMIN_REPO}" /tmp/letsbe-sysadmin
cp -r /tmp/letsbe-sysadmin/* "${SYSADMIN_DIR}/" 2>/dev/null || true
cp -r /tmp/letsbe-sysadmin/.* "${SYSADMIN_DIR}/" 2>/dev/null || true
rm -rf /tmp/letsbe-sysadmin
fi
# Restore our docker-compose.yml (with template variables replaced)
cp /tmp/sysadmin-compose.yml "${SYSADMIN_DIR}/docker-compose.yml"
rm /tmp/sysadmin-compose.yml
echo " Building sysadmin image..."
docker-compose -f "$SYSADMIN_COMPOSE" build
echo " Starting sysadmin agent..." echo " Starting sysadmin agent..."
docker-compose -f "$SYSADMIN_COMPOSE" up -d docker-compose -f "$SYSADMIN_COMPOSE" up -d
echo "Sysadmin agent deployed successfully." echo " Sysadmin agent deployed successfully."
else else
echo "Warning: Sysadmin docker-compose.yml not found at $SYSADMIN_COMPOSE" echo "Warning: Sysadmin docker-compose.yml not found at $SYSADMIN_COMPOSE"
fi fi

View File

@ -2,9 +2,7 @@ version: "3.8"
services: services:
agent: agent:
build: image: letsbesolutions/sysadmin-agent:latest
context: .
dockerfile: Dockerfile
container_name: {{ customer }}-agent container_name: {{ customer }}-agent
environment: environment:
@ -17,17 +15,13 @@ services:
# credentials are persisted to ~/.letsbe-agent/credentials.json # credentials are persisted to ~/.letsbe-agent/credentials.json
- REGISTRATION_TOKEN={{ sysadmin_registration_token }} - REGISTRATION_TOKEN={{ sysadmin_registration_token }}
# Legacy auth (deprecated - for backward compatibility only)
# Uncomment if using older orchestrator version:
# - AGENT_TOKEN={{ sysadmin_agent_token }}
# Timing (seconds) # Timing (seconds)
- HEARTBEAT_INTERVAL=${HEARTBEAT_INTERVAL:-30} - HEARTBEAT_INTERVAL=${HEARTBEAT_INTERVAL:-30}
- POLL_INTERVAL=${POLL_INTERVAL:-5} - POLL_INTERVAL=${POLL_INTERVAL:-5}
# Logging # Logging
- LOG_LEVEL=${LOG_LEVEL:-DEBUG} - LOG_LEVEL=${LOG_LEVEL:-INFO}
- LOG_JSON=${LOG_JSON:-false} - LOG_JSON=${LOG_JSON:-true}
# Resilience # Resilience
- MAX_CONCURRENT_TASKS=${MAX_CONCURRENT_TASKS:-3} - MAX_CONCURRENT_TASKS=${MAX_CONCURRENT_TASKS:-3}
@ -42,12 +36,9 @@ services:
- SHELL_TIMEOUT=${SHELL_TIMEOUT:-60} - SHELL_TIMEOUT=${SHELL_TIMEOUT:-60}
volumes: volumes:
# Docker socket for docker executor # Docker socket for container management
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
# Hot reload in development
- ./app:/app/app:ro
# Host directory mounts for real infrastructure access # Host directory mounts for real infrastructure access
- /opt/letsbe/env:/opt/letsbe/env - /opt/letsbe/env:/opt/letsbe/env
- /opt/letsbe/stacks:/opt/letsbe/stacks - /opt/letsbe/stacks:/opt/letsbe/stacks
@ -56,8 +47,8 @@ services:
# Credential persistence (survives restarts without re-registration) # Credential persistence (survives restarts without re-registration)
- agent_home:/home/agent/.letsbe-agent - agent_home:/home/agent/.letsbe-agent
# Run as root for Docker socket access in dev # Run as root for Docker socket access
# In production, use Docker group membership instead # TODO: Use Docker group membership instead for better security
user: root user: root
restart: unless-stopped restart: unless-stopped
@ -66,11 +57,11 @@ services:
deploy: deploy:
resources: resources:
limits: limits:
cpus: '0.5' cpus: '1.0'
memory: 256M memory: 512M
reservations: reservations:
cpus: '0.1' cpus: '0.1'
memory: 64M memory: 128M
volumes: volumes:
agent_home: agent_home: