Commit Graph
100 Commits
Author SHA1 Message Date
Lizandro GuarnizoandClaude Sonnet 4.6 cb9d984ee8 fix: capturar subid de LabsMobile como MsgID en logs de SMS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 18:36:14 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 8a9235631c feat: mostrar API Key en panel WebSMS
Agrega sección visible en /app/websms con el secret_key
y botón de copiar, para facilitar el uso del endpoint externo.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 23:17:45 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 704664afe7 feat: API pública para envío de SMS vía WebSMS
Agrega POST /api/sms/send autenticado con Bearer token (secret_key
auto-generado en WebSmsConfig). Recibe numero y mensaje, llama a
LabsMobile y registra el resultado en websms_log.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-23 23:13:57 -05:00
Lizandro Guarnizo df1eb75bdd feat: importar datos de BALANCE.numbers (facturas, IVA, retencion, cobros, pagos, consolidado) 2026-06-23 00:43:27 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 2136c46f42 fix: tratar code != 0 de LabsMobile como error
La API devuelve HTTP 200 con code:"401" para credenciales inválidas.
Ahora el service retorna error cuando code != "0".

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 17:16:24 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f3d9794096 fix: corregir URL del API de LabsMobile
URL incorrecta: https://websms.labsmobile.com/SY0204/api
URL correcta:   https://api.labsmobile.com/json/send

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 17:05:20 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e5c6dba787 fix: exponer cuerpo real de respuesta en error de websms
El error "unmarshal: invalid character '<'" ocultaba qué devolvía
LabsMobile. Ahora el error incluye Content-Type y los primeros 200
bytes del cuerpo para diagnóstico.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 16:59:49 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 ab4e3252b1 fix: fidelizar websms_config con el diseño del resto del proyecto
Agrega bloque <style> con btn-primary, input-field, label, badge-* que
faltaban. Badge de status ahora muestra "Enviado"/"Error" en vez del
código numérico. Botones de copiar en la sección de webhooks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 16:50:53 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 f94d01c089 fix: agregar bloque <style> faltante en todas las vistas de contabilidad
Los modales y controles no tenían estilos (btn-primary, btn-secondary,
btn-danger, btn-icon, input-field, label, badge-*) porque el bloque
<style> nunca fue incluido al crear estas vistas. También corregido
text-slate-800 en h2 de modales para alinearse con el patrón del proyecto.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 16:37:27 -05:00
Lizandro Guarnizo 24c4f6b26f fix: modales contabilidad/websms alineados con diseño del proyecto (text-slate-800, gap-4, SVG, mt-5, color input) 2026-06-22 16:04:22 -05:00
Lizandro Guarnizo 39f56372c3 fix: tickets filtrados por proyecto, vistas contabilidad/websms en resources/view 2026-06-22 10:23:28 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 1d152b6de0 remove: eliminar GeoIP completamente, no era necesario
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 10:25:05 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 d66fe95514 fix: GeoIP opcional, no paniquea si falta GeoLite2-City.mmdb
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 10:22:55 -05:00
Lizandro GuarnizoandClaude Sonnet 4.6 e28e2823dc fix: compilar agent/dist en builder stage y agregar módulos contabilidad/websms
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-20 10:13:17 -05:00
Lizandro Guarnizo ca6a44f64e up 2026-06-18 16:48:49 -05:00
Lizandro Guarnizo fd410b3afc Update vcard_api.html 2026-06-11 20:16:47 -05:00
Lizandro Guarnizo 89021f2e77 modificaciones de mejora 2026-06-11 18:06:21 -05:00
Lizandro Guarnizo fa0991eed7 Update oss_service.go 2026-06-11 17:47:46 -05:00
Lizandro Guarnizo cf078a6e5f S3: add public_url, fix Content-Disposition, add oss-file proxy 2026-06-10 09:34:17 -05:00
Lizandro Guarnizo 0fc7b8b94d contrato: M2M infra linking (servidores, conx_dbs, ai_configs) 2026-06-10 00:18:42 -05:00
Lizandro Guarnizo 03eb6d874e contrato: M2M infra linking (servidores, conx_dbs, ai_configs) 2026-06-10 00:18:31 -05:00
Lizandro Guarnizo 478c2bde00 up 2026-06-10 00:18:20 -05:00
Lizandro Guarnizo d701534537 Update hostinger.html 2026-06-06 21:57:30 -05:00
Lizandro Guarnizo 8bf6f19e54 Update install.sh 2026-06-06 10:32:57 -05:00
Lizandro Guarnizo 12c645b4b7 Update servidor.go 2026-06-06 09:34:58 -05:00
Lizandro Guarnizo 30dd4be9b2 Update contratos.html 2026-06-04 23:02:51 -05:00
Lizandro Guarnizo 7329bac898 up 2026-06-04 22:49:16 -05:00
Lizandro Guarnizo 72744a1325 Update oss_service.go 2026-06-03 23:49:00 -05:00
Lizandro Guarnizo 0d4151e6dd Update oss_api.go 2026-06-03 23:42:27 -05:00
Lizandro Guarnizo 357d9e3404 Update oss_service.go 2026-06-03 23:01:15 -05:00
Lizandro Guarnizo 320b72c0b3 Update main.go 2026-06-03 22:55:03 -05:00
Lizandro Guarnizo a9703300ab Update oss_api_controller.go 2026-06-03 22:48:24 -05:00
Lizandro Guarnizo ff72bd0269 up 2026-06-03 22:39:58 -05:00
Lizandro Guarnizo 35a384eeba Update Dockerfile 2026-06-03 21:49:48 -05:00
Lizandro Guarnizo b2617c1906 Update oss_service.go 2026-06-03 21:41:42 -05:00
Lizandro Guarnizo c05a2a8137 up 2026-06-03 21:32:50 -05:00
Lizandro Guarnizo f087fd46f1 up 2026-06-03 20:10:22 -05:00
Lizandro Guarnizo 1e1ba682b0 up 2026-06-02 15:41:20 -05:00
Lizandro Guarnizo c5603c51f8 up 2026-06-02 13:27:45 -05:00
Lizandro Guarnizo 28d0eae715 up 2026-06-02 13:13:29 -05:00
Lizandro Guarnizo ba76754331 up 2026-06-02 10:35:37 -05:00
Lizandro Guarnizo f8b352eb03 add logo_url to landing questions; add color/foto_perfil extraction to vcard 2026-05-28 22:44:42 -05:00
Lizandro Guarnizo 52ce8638a8 replace cta with social_media question; add SocialMedia field to landing_session 2026-05-28 20:49:35 -05:00
Lizandro Guarnizo 06d85dc0bf up 2026-05-27 10:16:28 -05:00
Lizandro Guarnizo 5d07fac02d Update main.go 2026-05-27 09:47:59 -05:00
Lizandro Guarnizo 498e1d5743 up 2026-05-27 09:34:21 -05:00
Lizandro Guarnizo 36c9e0a6d5 up 2026-05-26 21:55:48 -05:00
Lizandro Guarnizo d8f38a6669 up 2026-05-26 21:28:35 -05:00
Lizandro Guarnizo 7a374340c1 up 2026-05-26 20:54:10 -05:00
Lizandro GuarnizoandCopilot 39f4641540 fix: agrega coma faltante en método openAppDeployments del componente Alpine
El objeto Alpine.js tenía un } sin coma al final de openAppDeployments,
causando un error de sintaxis JS que impedía la inicialización del componente
y hacía que la página /app/coolify apareciera completamente en blanco.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-26 14:20:55 -05:00
Lizandro Guarnizo 553252508f up 2026-05-26 14:06:38 -05:00
Lizandro Guarnizo e9548e13ae up 2026-05-26 11:42:41 -05:00
Lizandro Guarnizo d1a668e229 Update coolify.html 2026-05-26 11:36:38 -05:00
Lizandro Guarnizo 304aa33a99 Update coolify.html 2026-05-26 10:12:07 -05:00
Lizandro Guarnizo a489844c73 up 2026-05-26 10:05:01 -05:00
Lizandro Guarnizo 6bcbe58a9a Merge branch 'copilot/vcard-api-integraciones-anlisis' 2026-05-25 22:04:25 -05:00
Lizandro GuarnizoandCopilot 0f386ad456 fix: botones start/stop/restart usan POST; agrega webhook Coolify
- CoolifyApplicationStart/Stop/Restart cambian GET → POST (Coolify API requiere POST)
- Nuevo endpoint público POST /webhooks/coolify para recibir notificaciones
  de deployment/restart desde Coolify Settings → Notifications → Webhook
- UI: muestra URL del webhook en modal de config para fácil copia

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 22:04:25 -05:00
Lizandro Guarnizo cf4064b072 Merge branch 'copilot/vcard-api-integraciones-anlisis' 2026-05-25 21:40:09 -05:00
Lizandro GuarnizoandCopilot 7bfe7cba5c fix: coolify proxy no retorna 502 para evitar intercepción de Cloudflare
Cambia StatusBadGateway (502) → StatusBadRequest (400) en todos los
errores del proxy Coolify. Cloudflare intercepta respuestas 502 del
origen y muestra su propia pantalla, ocultando el error al frontend.
Con 400, el JSON de error llega al cliente y Alpine.js puede mostrarlo.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 21:40:09 -05:00
Lizandro Guarnizo 10be0443c9 Merge branch 'copilot/vcard-api-integraciones-anlisis' 2026-05-25 21:28:49 -05:00
Lizandro GuarnizoandCopilot e1aba741a7 fix: revert health endpoint to /api/health (not /v1, per Coolify docs)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 21:28:49 -05:00
Lizandro Guarnizo 1048792b34 Merge branch 'copilot/vcard-api-integraciones-anlisis' 2026-05-25 21:22:03 -05:00
Lizandro GuarnizoandCopilot 86d56d0447 fix: use correct Coolify health endpoint /api/v1/healthcheck
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 21:22:03 -05:00
Lizandro Guarnizo 49d1c9d86d Merge branch 'copilot/vcard-api-integraciones-anlisis'
# Conflicts:
#	rest/controllers/coolify_controller.go
2026-05-25 21:02:31 -05:00
Lizandro GuarnizoandCopilot ce2ffff3e8 feat: add missing Coolify controller, view and routes
- rest/controllers/coolify_controller.go: proxy completo hacia API Coolify
- resources/views/coolify.html: interfaz Alpine.js con tabs apps/servers/services/dbs/projects/deployments/team
- rest/routes/user.go: registra todas las rutas /app/coolify/*

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 21:01:58 -05:00
Lizandro Guarnizo 467c3f5e3a Merge branch 'copilot/vcard-api-integraciones-anlisis' 2026-05-25 20:21:19 -05:00
Lizandro GuarnizoandCopilot 5373cebf9c fix: coolify_configs table missing + miniwebs real status
- Add coolify_config.go model (missing from worktree branch)
- Add CoolifyConfig to normal-startup AutoMigrate → creates table on next start
- Fix miniwebs tab: m.activo is not in API response; fallback to
  vcard.estado (true/false) to show real status instead of always Inactiva
- Improve miniwebs row: show url, user name, vcard status badge

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 20:20:50 -05:00
Lizandro Guarnizo c30abb58a6 Update vcard_api.html 2026-05-25 15:47:18 -05:00
Lizandro Guarnizo c82831702e up 2026-05-25 15:14:04 -05:00
Lizandro Guarnizo c46b1317af Update vcard_api.html 2026-05-25 14:58:45 -05:00
Lizandro Guarnizo 497cda97d5 Update vcard_api.html 2026-05-25 14:49:24 -05:00
Lizandro Guarnizo 03c6e74bd6 up 2026-05-25 14:37:59 -05:00
Lizandro Guarnizo 471b2f50c6 up 2026-05-25 14:27:27 -05:00
Lizandro Guarnizo 58d98f23aa Revert "telegram"
This reverts commit 46daf3d4aa.
2026-05-25 12:50:53 -05:00
Lizandro Guarnizo 7b1c260af5 Update notif_dispatch.go 2026-05-25 12:49:19 -05:00
Lizandro Guarnizo 46daf3d4aa telegram 2026-05-25 10:08:40 -05:00
Lizandro Guarnizo b714fa71ac Merge branch 'copilot/vcard-api-integraciones-anlisis' 2026-05-23 08:59:17 -05:00
Lizandro GuarnizoandCopilot 661e02ef9c feat: desactivar usuario + VCards desde tab usuarios
- Botón '🚫 + VCards' abre modal de confirmación
- Modal carga y lista las VCards activas del usuario
- Al confirmar: inactiva cada VCard (PUT estado:false) y desactiva el usuario
- Muestra resumen del resultado antes de cerrar
- Botón 'Ordenar por vencimiento' con colores en filas (rojo/amarillo/verde)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-23 08:57:18 -05:00
Lizandro Guarnizo fb67a308dc Update telegram.html 2026-05-22 00:17:00 -05:00
Lizandro Guarnizo c21fab079d Update telegram.html 2026-05-22 00:03:06 -05:00
Lizandro Guarnizo d8cbf70593 Update main.go 2026-05-21 23:55:34 -05:00
Lizandro Guarnizo 1a96caeb83 ip 2026-05-21 23:49:37 -05:00
Lizandro Guarnizo d80c7a86d3 Update hostinger_controller.go 2026-05-21 23:28:13 -05:00
Lizandro Guarnizo ade52025a7 Update hostinger_controller.go 2026-05-21 23:18:09 -05:00
Lizandro Guarnizo d7bcddc0b3 up 2026-05-21 23:11:01 -05:00
Lizandro Guarnizo 5a8b9320f5 Update servidor_controller.go 2026-05-21 23:02:53 -05:00
Lizandro Guarnizo d121f399ed up 2026-05-21 22:52:24 -05:00
Lizandro Guarnizo 0cf7c6d279 up 2026-05-21 22:37:31 -05:00
Lizandro Guarnizo 154a2fa245 chore: postinstall validation 2026-05-21 21:41:40 -05:00
Lizandro GuarnizoandCopilot 2d6b4d8271 fix: add Users, Roles, Submodules to normal-startup AutoMigrate
Ensures tipo_usuario, EsPortalCliente, and other new columns on core
models are created in Docker deployments that never run --migrate.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 13:19:37 -05:00
Lizandro GuarnizoandCopilot 4fec04e5fe fix: inicializar users/roles en Alpine y null-safety en loadRegister
- Declara users:[] y roles:[] en el estado inicial de Alpine para que
  x-for funcione reactivamente desde el primer render
- Agrega totalPages:0 al estado inicial
- Añade comprobación response.ok antes de parsear JSON
- Usa || [] y || 0 para evitar TypeError si el backend retorna error
- Reemplaza data.Users.length con this.users.length (siempre array)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:30:08 -05:00
Lizandro GuarnizoandCopilot 10639d233b fix: AutoMigrate Servidor, ConxDb y ProvServidor en arranque normal
La tabla prov_servidor_submodules (many2many) solo se creaba con --migrate.
Al agregar ProvServidor al AutoMigrate del arranque normal, GORM crea la
tabla join automáticamente en cada deploy sin necesidad de flags manuales.

También incluye Servidor (agent_token, agent_last_seen, metricas_json)
y ConxDb (host) que tampoco se migraban en el arranque normal.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:08:32 -05:00
Lizandro GuarnizoandCopilot 6cca8e6fcd fix: reactividad Alpine ping — estado en cx directamente
Alpine v3 NO puede rastrear accesos dinámicos pingCargando[cx.ID]
dentro de x-for porque no sabe qué key observar por item.

Solución: estado de ping embebido en cada objeto cx:
- abrirModal inyecta _pingCargando:false y _pingResultado:null en cada cx
- hacerPing muta cx._pingCargando / cx._pingResultado directamente
- template usa cx._pingCargando y cx._pingResultado (proxy reactivo del x-for)

Esto garantiza que el spinner, el botón deshabilitado y el resultado
del ping se actualicen correctamente para cada card.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:06:00 -05:00
Lizandro GuarnizoandCopilot a484676392 fix: copiar agent/install.sh y agent/dist al contenedor Docker
El Dockerfile no incluía el directorio agent/, por eso GET /agent/install.sh
y GET /agent/download/:filename devolvían 404 — los archivos no existían
en /app/agent/ dentro del contenedor.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 12:00:12 -05:00
Lizandro GuarnizoandCopilot 2779c0a15d fix: ping real de BD + campo Host en ConxDb + reactividad Alpine
Problema raíz:
1. El ping TCP usaba Servidor.IpServidor → fallaba si la BD solo escucha
   en localhost del servidor remoto (comportamiento normal en producción)
2. La reactividad Alpine v3.13 no detectaba keys nuevas en objeto vacío {}
   dentro de x-for loops, spinner nunca aparecía

Cambios:
- pkg/models/conx_db.go: nuevo campo Host (vacío = usa Servidor.IpServidor)
  + método HostEfectivo() como fuente única de verdad para host
- pkg/services/query_runner_service.go: todos los puntos (openDynamicDB,
  openDynamicDBWithName, redisConnect, mongoURI) usan c.HostEfectivo()
- rest/controllers/servidor_controller.go: PingConexion reescrito —
  primero prueba conexión real a la BD (no solo TCP), si falla prueba TCP,
  devuelve host+puerto testeado y mensajes de error descriptivos
- servidor_dashboard.html: hacerPing usa spread-replace para forzar
  reactividad + $nextTick, resultado muestra host:puerto testeado y
  mensaje de error completo en múltiples líneas

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:56:12 -05:00
Lizandro GuarnizoandCopilot c3f19991c9 feat: binarios pre-compilados del agente + endpoint de descarga
- Cross-compila usite-agent para linux/amd64, linux/arm64, linux/arm
  Binarios en agent/dist/ (CGO_ENABLED=0, stripped ~6MB c/u)
- GET /agent/download/:filename sirve el binario correcto
  con Content-Disposition attachment y validación anti path-traversal
- install.sh ya apunta a /agent/download/usite-agent-linux-ARCH

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:37:43 -05:00
Lizandro GuarnizoandCopilot d9d3f8a5eb feat: sistema de agente ligero para monitoreo de servidores
Backend:
- Servidor model: AgentToken, AgentLastSeen, MetricasJson nuevos campos
- AgentHeartbeat: endpoint público POST /agent/heartbeat (auth por token)
- GenerateAgentToken: endpoint protegido POST /app/servidor/:id/agent-token
- Ruta pública /agent/install.sh sirve el script de instalación

Agente Go (agent/):
- agent/main.go: binario independiente con gopsutil
  - Recolecta RAM, CPU, Disco, Uptime, OS, Load average
  - Lee agent.yml o flags --api-url / --token
  - Envía POST a /agent/heartbeat cada N segundos
  - Instala como servicio systemd via install.sh
- agent/go.mod: módulo independiente (usite-agent)
- agent/agent.yml.sample: configuración de ejemplo
- agent/install.sh: instalador en 1 curl para Linux (systemd)

Frontend servidor_dashboard.html:
- Cards: badge ● En línea / ● Fuera / ○ Sin agente
- Barras de progreso live: RAM%, CPU%, Disco%
- Valores: GB usado/total, núcleos, uptime, OS real
- Tiempo desde último reporte
- Botón 'Agente' en cada card → modal de configuración
- Modal agente: estado, token con copy, comando curl 1 línea,
  instalación manual/avanzada con collapse, métricas actuales

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:29:24 -05:00
Lizandro GuarnizoandCopilot f52e266527 fix: corregir ping - mutación directa y manejo de cx.ID || cx.id
- Cambia spread+reassign por mutación directa (this.pingCargando[id] = true)
  para garantizar reactividad correcta en Alpine.js 3.x
- Usa (cx.ID || cx.id) en toda la plantilla para compatibilidad con
  ambos formatos de serialización JSON de GORM
- Agrega type="button" y @click.stop en el botón de verificar
- Maneja respuestas HTTP no-OK con mensaje de error explícito
- Muestra mensaje de error real del catch en la UI

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:07:39 -05:00
Lizandro Guarnizo d35398875d fix(PingConexion): reduce TCP connection timeout to 2 seconds and add error message on failure 2026-05-21 10:48:46 -05:00
Lizandro GuarnizoandCopilot 194db3e9ed fix: mejorar UX del ping en servidor_dashboard
- Mueve el resultado del ping directamente bajo los datos de la BD
- Muestra mensaje de error cuando falla la conexión (usa campo error del backend)
- Spinner y texto 'Probando...' durante la espera
- Resultado verde/rojo inline con ✓/✗ y tiempo/mensaje de error
- Etiqueta del botón cambia a 'Verificar' (más descriptivo que 'Ping')

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 10:48:40 -05:00