feat(infrastructure): enhance TrueNAS collection with comprehensive Docker/apps support

- Added collect-truenas-apps.sh script for standalone app/container collection
- Enhanced collect-truenas-config.sh with Docker container, image, network, and volume collection
- Fixed JSON format issues (converted newline-delimited JSON to proper arrays using jq/sed)
- Added dynamic SSH user detection (tries root, admin, truenas_admin)
- Implemented file size validation to prevent false success messages
- Added container logs collection (last 500 lines per container)
- Added Docker Compose file extraction from running containers
- Added individual app configs collection from /mnt/.ix-apps/app_configs/
- Updated CLAUDE.md to reflect TrueNAS repository scope and strict agent routing rules
- Restored sub-agent definitions (backend-builder, lab-operator, librarian, scribe)
- Added SCRIPT_UPDATES.md with detailed changelog and testing instructions
- Updated .gitignore to exclude Windows Zone.Identifier files

These changes enable complete disaster recovery exports including all Docker/app configurations,
logs, and metadata that were previously missing from TrueNAS infrastructure snapshots.

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-16 14:05:05 -07:00
parent 52e1822de8
commit ddef5cfaa2
9 changed files with 700 additions and 89 deletions

View File

@@ -286,6 +286,114 @@ main() {
echo
fi
# Docker/Apps Collection (all levels)
echo -e "${CYAN}=== Docker & Apps ===${NC}"
mkdir -p "$OUTPUT_DIR/exports/apps"
mkdir -p "$OUTPUT_DIR/configs/apps"
# Detect SSH user (try common TrueNAS usernames)
SSH_USER=""
for user in root admin truenas_admin; do
if command -v ssh &>/dev/null && ssh -o ConnectTimeout=5 -o BatchMode=yes "${user}@${TRUENAS_HOST}" "echo test" &>/dev/null 2>&1; then
SSH_USER="$user"
break
fi
done
# Check if we can access Docker via SSH
if [[ -n "$SSH_USER" ]]; then
log INFO "SSH access available as ${SSH_USER}@${TRUENAS_HOST}"
# Docker containers (convert newline-delimited JSON to proper JSON array)
if ssh "${SSH_USER}@${TRUENAS_HOST}" "command -v docker &>/dev/null && sudo docker ps -a --format '{{json .}}' 2>/dev/null | jq -s '.' 2>/dev/null || sudo docker ps -a --format '{{json .}}' 2>/dev/null | sed '1s/^/[/; \$!s/\$/,/; \$s/\$/]/'" > "$OUTPUT_DIR/exports/apps/docker-containers.json" 2>/dev/null && [[ -s "$OUTPUT_DIR/exports/apps/docker-containers.json" ]]; then
log OK "Docker containers list"
else
log WARN "Docker containers (command failed or no containers)"
fi
# Docker human-readable list
if ssh "${SSH_USER}@${TRUENAS_HOST}" "command -v docker &>/dev/null && sudo docker ps -a 2>/dev/null" > "$OUTPUT_DIR/exports/apps/docker-containers.txt" 2>/dev/null && [[ -s "$OUTPUT_DIR/exports/apps/docker-containers.txt" ]]; then
log OK "Docker containers (text format)"
else
log WARN "Docker containers text list (command failed)"
fi
# Docker images
if ssh "${SSH_USER}@${TRUENAS_HOST}" "command -v docker &>/dev/null && sudo docker images --format '{{json .}}' 2>/dev/null | jq -s '.' 2>/dev/null || sudo docker images --format '{{json .}}' 2>/dev/null | sed '1s/^/[/; \$!s/\$/,/; \$s/\$/]/'" > "$OUTPUT_DIR/exports/apps/docker-images.json" 2>/dev/null && [[ -s "$OUTPUT_DIR/exports/apps/docker-images.json" ]]; then
log OK "Docker images"
else
log WARN "Docker images (command failed)"
fi
# Docker networks
if ssh "${SSH_USER}@${TRUENAS_HOST}" "command -v docker &>/dev/null && sudo docker network ls --format '{{json .}}' 2>/dev/null | jq -s '.' 2>/dev/null || sudo docker network ls --format '{{json .}}' 2>/dev/null | sed '1s/^/[/; \$!s/\$/,/; \$s/\$/]/'" > "$OUTPUT_DIR/exports/apps/docker-networks.json" 2>/dev/null && [[ -s "$OUTPUT_DIR/exports/apps/docker-networks.json" ]]; then
log OK "Docker networks"
else
log WARN "Docker networks (command failed)"
fi
# Docker volumes
if ssh "${SSH_USER}@${TRUENAS_HOST}" "command -v docker &>/dev/null && sudo docker volume ls --format '{{json .}}' 2>/dev/null | jq -s '.' 2>/dev/null || sudo docker volume ls --format '{{json .}}' 2>/dev/null | sed '1s/^/[/; \$!s/\$/,/; \$s/\$/]/'" > "$OUTPUT_DIR/exports/apps/docker-volumes.json" 2>/dev/null && [[ -s "$OUTPUT_DIR/exports/apps/docker-volumes.json" ]]; then
log OK "Docker volumes"
else
log WARN "Docker volumes (command failed)"
fi
# TrueNAS app metadata
if ssh "${SSH_USER}@${TRUENAS_HOST}" "sudo cat /mnt/.ix-apps/metadata.yaml 2>/dev/null" > "$OUTPUT_DIR/configs/apps/metadata.yaml" 2>/dev/null && [[ -s "$OUTPUT_DIR/configs/apps/metadata.yaml" ]]; then
log OK "TrueNAS app metadata"
else
log WARN "TrueNAS app metadata (file not found)"
fi
# TrueNAS user config
if ssh "${SSH_USER}@${TRUENAS_HOST}" "sudo cat /mnt/.ix-apps/user_config.yaml 2>/dev/null" > "$OUTPUT_DIR/configs/apps/user_config.yaml" 2>/dev/null && [[ -s "$OUTPUT_DIR/configs/apps/user_config.yaml" ]]; then
log OK "TrueNAS user config"
else
log WARN "TrueNAS user config (file not found)"
fi
# App configs directory listing
if ssh "${SSH_USER}@${TRUENAS_HOST}" "sudo ls -laR /mnt/.ix-apps/app_configs/ 2>/dev/null" > "$OUTPUT_DIR/exports/apps/app_configs_list.txt" 2>/dev/null && [[ -s "$OUTPUT_DIR/exports/apps/app_configs_list.txt" ]]; then
log OK "App configs directory listing"
else
log WARN "App configs listing (directory not accessible)"
fi
# Docker storage sizes
if ssh "${SSH_USER}@${TRUENAS_HOST}" "sudo du -sh /mnt/.ix-apps/docker/* 2>/dev/null" > "$OUTPUT_DIR/exports/apps/docker_sizes.txt" 2>/dev/null && [[ -s "$OUTPUT_DIR/exports/apps/docker_sizes.txt" ]]; then
log OK "Docker storage sizes"
else
log WARN "Docker storage sizes (directory not accessible)"
fi
else
log WARN "Docker/Apps collection (SSH not configured - see manual collection instructions)"
cat > "$OUTPUT_DIR/exports/apps/MANUAL_COLLECTION.md" << 'MANUAL_EOF'
# Manual Docker/Apps Collection Instructions
SSH access is not configured. To collect Docker and app information, run these commands on your TrueNAS server:
```bash
# 1. Export Docker containers
sudo docker ps -a --format '{{json .}}' | jq -s '.' > /tmp/docker-containers.json
# 2. Export TrueNAS app metadata
sudo cp /mnt/.ix-apps/metadata.yaml /tmp/
sudo cp /mnt/.ix-apps/user_config.yaml /tmp/
# 3. List app configs
sudo ls -laR /mnt/.ix-apps/app_configs/ > /tmp/app_configs_list.txt
# 4. Copy files to collection directory
# Transfer these files to your disaster-recovery export
```
Then copy the files to: exports/apps/
MANUAL_EOF
log INFO "Created manual collection instructions"
fi
echo
# Generate summary
cat > "$OUTPUT_DIR/SUMMARY.md" << EOF
# TrueNAS Scale Export Summary