--- name: rsync_deploy kind: function lang: bash domain: infra version: "1.0.0" purity: impure signature: "rsync_deploy(local_dir: string, ssh_alias: string, remote_dir: string) -> json" description: "Sincroniza un directorio local a un host remoto via rsync+SSH. Excluye archivos de desarrollo y bases de datos locales. Crea el directorio remoto si no existe." tags: [rsync, deploy, sync, ssh, remote, infra] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: local_dir desc: "ruta al directorio local a sincronizar (ej: apps/dag_engine/)" - name: ssh_alias desc: "alias SSH del host destino definido en ~/.ssh/config (ej: myserver)" - name: remote_dir desc: "ruta absoluta del directorio destino en el host remoto (ej: /opt/apps/dag_engine)" output: "JSON con files_transferred (int), total_size (string), ssh_alias (string), remote_dir (string)" tested: false tests: [] test_file_path: "" file_path: "bash/functions/infra/rsync_deploy.sh" --- ## Ejemplo ```bash source bash/functions/infra/rsync_deploy.sh # Deploy de una app al servidor de producción result=$(rsync_deploy "apps/dag_engine/" "prod-server" "/opt/apps/dag_engine") echo "$result" # {"files_transferred": 12, "total_size": "1.23 MB", "ssh_alias": "prod-server", "remote_dir": "/opt/apps/dag_engine"} # Deploy con ruta absoluta local rsync_deploy "$HOME/fn_registry/apps/myapp/" "myserver" "/opt/myapp" ``` ## Notas - Usa `rsync -avz --delete`: archivos borrados localmente se borran también en el remoto. - Antes del rsync crea el directorio remoto con `ssh mkdir -p` para evitar errores si no existe. - Archivos excluidos: `.git`, `operations.db*`, `*.exe`, `node_modules`, `.venv`, `__pycache__`, `build/`, `*.db-shm`, `*.db-wal`. - El JSON de salida va a stdout; los mensajes de progreso y errores van a stderr. - Exit code 1 si rsync falla o si el directorio local no existe. - El `ssh_alias` se resuelve con la configuración de `~/.ssh/config`, incluyendo host, user, identityfile y puerto.