package infra import "fmt" // VPSSetupApp prepara un host remoto para recibir una app: // crea directorios, usuario de servicio si no existe, y directorio de datos. func VPSSetupApp(conn SSHConn, appName, remoteDir, serviceUser string) error { // Crear directorio de la app y subdirectorios comunes mkdirCmd := fmt.Sprintf("sudo mkdir -p %s/data %s/logs", remoteDir, remoteDir) _, stderr, code, err := SSHExec(conn, mkdirCmd) if err != nil { return fmt.Errorf("vps_setup_app: ssh exec: %w", err) } if code != 0 { return fmt.Errorf("vps_setup_app: mkdir: %s", stderr) } // Crear usuario de servicio si se especificó y no existe if serviceUser != "" { userCmd := fmt.Sprintf("id %s >/dev/null 2>&1 || sudo useradd -r -s /usr/sbin/nologin -d %s %s", serviceUser, remoteDir, serviceUser) _, stderr, code, err = SSHExec(conn, userCmd) if err != nil { return fmt.Errorf("vps_setup_app: ssh exec: %w", err) } if code != 0 { return fmt.Errorf("vps_setup_app: create user: %s", stderr) } // Asignar ownership al usuario de servicio chownCmd := fmt.Sprintf("sudo chown -R %s:%s %s", serviceUser, serviceUser, remoteDir) _, stderr, code, err = SSHExec(conn, chownCmd) if err != nil { return fmt.Errorf("vps_setup_app: ssh exec: %w", err) } if code != 0 { return fmt.Errorf("vps_setup_app: chown: %s", stderr) } } return nil }