Migración a Coolify estándar: web WordPress + CRM Relaticle (+ correo Zoho pendiente) #3

Open
opened 2026-06-30 13:01:11 +00:00 by rafa · 2 comments
Owner

Migración a arquitectura estándar Coolify (web + CRM) + correo Zoho

Fecha: 2026-06-30
Motivo: El CRM Relaticle y la web se habían montado a mano (docker-compose + labels Traefik a pelo en /home/rafa/apps/), saltándose Coolify. Eso provocó fallo tras fallo (CRM caído por falta de traefik.docker.network, IPs hardcodeadas, aqtalent.es sin cert). Decisión: llevar todo a Coolify (gestiona Traefik, red, certs y dominios) y correo a Zoho (gestionado, no self-hosted). Descartado panel de hosting white-label (cPanel/Hestia): no hay cliente autogestionando web/ftp y un panel reclama los puertos 80/443/25, incompatible con Coolify.

Supera #1 y #2.

Estado final de dominios

Dominio Estado Servicio
aqtalent.es (+ www) 200, cert LE ✓ WordPress (Coolify)
ayqtalent.com 301 → aqtalent.es redirect
crm.aqtalent.es 200, cert LE ✓ Relaticle CRM (Coolify)
crm.triptykdsb.com 200, cert LE ✓ Relaticle CRM (Coolify)
gitea.feadulta.com 200, cert LE ✓ sin tocar

Web — WordPress

  • Servicio Coolify aqtalent-web (WordPress+MariaDB), uuid fr9v89w8g1nsyrc4718du5r7.
  • Dominio principal aqtalent.es; ayqtalent.com y www → 301 a aqtalent.es (mu-plugin aq-canonical-redirect.php + WP_HOME/SITEURL).
  • Diseño = HTML original servido tal cual mediante tema custom aqtalent (index.php = HTML + wp_head/wp_footer, functions.php limpia el head). Idéntico al original (10 secciones). No editable por panel.
  • Favicon = logo A&Q (Site Icon de WP, attachment 5).

CRM — Relaticle

  • Servicio Coolify triptyk-crm (Service compose: app+horizon+scheduler+postgres+redis), uuid hqt9vm56ijhfcsxhais61yge.
  • Dominios crm.aqtalent.es (AYQTalent) + crm.triptykdsb.com (Triptyk). APP_URL canónico = crm.triptykdsb.com. crm.ayqtalent.com retirado.
  • Datos restaurados del stack viejo: 624 empresas, 71 contactos, 4 usuarios, 2 teams (dump ~/backups/relaticle-20260630.dump).
  • Compose limpio (sin extra_hosts hardcoded, sin labels Traefik a mano, sin ipam fijo). Coolify gestiona red y labels.

Detalles técnicos / lecciones

  • Coolify API token (claude-code-mig, root) creado vía php artisan tinker (necesita team en sesión por team_id NOT NULL).
  • WORDPRESS_CONFIG_EXTRA multilínea NO puede ir como env var del .env de Coolify (rompe el parser) → va inline en el environment: del compose con $$ escapado.
  • El FQDN de un sub-servicio Coolify se persiste en service_applications.fqdn; la env SERVICE_FQDN_* no lo propaga sola. Cambiarlo requiere recrear el contenedor (un restart no regenera los labels); encadenar stop+start por API muy rápido desordena la cola (provoca 503 transitorio) → mejor un solo start tras confirmar el stop.
  • wp media import en contenedor cli efímero: el fichero debe estar dentro del volumen (/var/www/html), y correr --user 33:33 (www-data) para escribir en uploads.

Pendientes

  • Correo Zoho Mail (DNS MX/SPF/DKIM en cdmon) — requiere cuenta Zoho del cliente.
  • Limpieza: borrar stacks manuales apagados (/home/rafa/apps/ayqtalent-web, /home/rafa/apps/triptyk-crm) y backups .bak.
  • Web: teléfono real, email, formulario contacto, banner RGPD, favicon (hecho), fotos equipo.
## Migración a arquitectura estándar Coolify (web + CRM) + correo Zoho **Fecha:** 2026-06-30 **Motivo:** El CRM Relaticle y la web se habían montado a mano (`docker-compose` + labels Traefik a pelo en `/home/rafa/apps/`), saltándose Coolify. Eso provocó fallo tras fallo (CRM caído por falta de `traefik.docker.network`, IPs hardcodeadas, `aqtalent.es` sin cert). Decisión: **llevar todo a Coolify** (gestiona Traefik, red, certs y dominios) y **correo a Zoho** (gestionado, no self-hosted). Descartado panel de hosting white-label (cPanel/Hestia): no hay cliente autogestionando web/ftp y un panel reclama los puertos 80/443/25, incompatible con Coolify. Supera #1 y #2. ### Estado final de dominios | Dominio | Estado | Servicio | |---|---|---| | aqtalent.es (+ www) | 200, cert LE ✓ | WordPress (Coolify) | | ayqtalent.com | 301 → aqtalent.es | redirect | | crm.aqtalent.es | 200, cert LE ✓ | Relaticle CRM (Coolify) | | crm.triptykdsb.com | 200, cert LE ✓ | Relaticle CRM (Coolify) | | gitea.feadulta.com | 200, cert LE ✓ | sin tocar | ### Web — WordPress - Servicio Coolify `aqtalent-web` (WordPress+MariaDB), uuid `fr9v89w8g1nsyrc4718du5r7`. - Dominio principal `aqtalent.es`; `ayqtalent.com` y `www` → 301 a aqtalent.es (mu-plugin `aq-canonical-redirect.php` + WP_HOME/SITEURL). - Diseño = HTML original servido tal cual mediante tema custom `aqtalent` (`index.php` = HTML + wp_head/wp_footer, `functions.php` limpia el head). Idéntico al original (10 secciones). No editable por panel. - Favicon = logo A&Q (Site Icon de WP, attachment 5). ### CRM — Relaticle - Servicio Coolify `triptyk-crm` (Service compose: app+horizon+scheduler+postgres+redis), uuid `hqt9vm56ijhfcsxhais61yge`. - Dominios `crm.aqtalent.es` (AYQTalent) + `crm.triptykdsb.com` (Triptyk). APP_URL canónico = crm.triptykdsb.com. `crm.ayqtalent.com` retirado. - Datos restaurados del stack viejo: **624 empresas, 71 contactos, 4 usuarios, 2 teams** (dump `~/backups/relaticle-20260630.dump`). - Compose limpio (sin `extra_hosts` hardcoded, sin labels Traefik a mano, sin ipam fijo). Coolify gestiona red y labels. ### Detalles técnicos / lecciones - Coolify API token (`claude-code-mig`, root) creado vía `php artisan tinker` (necesita team en sesión por `team_id` NOT NULL). - `WORDPRESS_CONFIG_EXTRA` multilínea NO puede ir como env var del `.env` de Coolify (rompe el parser) → va inline en el `environment:` del compose con `$$` escapado. - El FQDN de un sub-servicio Coolify se persiste en `service_applications.fqdn`; la env `SERVICE_FQDN_*` no lo propaga sola. Cambiarlo requiere **recrear** el contenedor (un `restart` no regenera los labels); encadenar `stop`+`start` por API muy rápido desordena la cola (provoca 503 transitorio) → mejor un solo `start` tras confirmar el stop. - `wp media import` en contenedor cli efímero: el fichero debe estar dentro del volumen (`/var/www/html`), y correr `--user 33:33` (www-data) para escribir en uploads. ### Pendientes - [ ] Correo Zoho Mail (DNS MX/SPF/DKIM en cdmon) — requiere cuenta Zoho del cliente. - [ ] Limpieza: borrar stacks manuales apagados (`/home/rafa/apps/ayqtalent-web`, `/home/rafa/apps/triptyk-crm`) y backups `.bak`. - [ ] Web: teléfono real, email, formulario contacto, banner RGPD, favicon (hecho), fotos equipo.
Author
Owner

Correo — EN PAUSA (2026-06-30)

Se descarta de momento empezar el correo: hay que decidir entre buzones reales vs reenvío, y evaluar opciones gratis.

Limitación del plan gratis de Zoho: Forever Free (5 buzones, 5 GB) es solo webmail + app móvil, sin IMAP/POP → no se puede usar con Outlook/Apple Mail. Para IMAP, Mail Lite ~1 €/usuario/mes.

Opciones gratuitas con dominio propio a evaluar:

Opción Qué es Límite
Zoho Mail Free Buzones reales, 5 cuentas, webmail+app Sin IMAP
Cloudflare Email Routing Solo reenvío a Gmail No buzón; exige mover DNS a Cloudflare; enviar = "Send as" en Gmail
ImprovMX Reenvío, funciona con DNS en cdmon (solo MX) No buzón; reenvío

Descartadas: Proton/Tuta (dominio propio de pago), self-hosting (mantenimiento).

Decisión pendiente: ¿buzones reales (Zoho Free) o solo recibir/responder desde Gmail (ImprovMX/Cloudflare)?

### Correo — EN PAUSA (2026-06-30) Se descarta de momento empezar el correo: hay que decidir entre buzones reales vs reenvío, y evaluar opciones gratis. **Limitación del plan gratis de Zoho:** Forever Free (5 buzones, 5 GB) es **solo webmail + app móvil, sin IMAP/POP** → no se puede usar con Outlook/Apple Mail. Para IMAP, Mail Lite ~1 €/usuario/mes. **Opciones gratuitas con dominio propio a evaluar:** | Opción | Qué es | Límite | |---|---|---| | Zoho Mail Free | Buzones reales, 5 cuentas, webmail+app | Sin IMAP | | Cloudflare Email Routing | Solo reenvío a Gmail | No buzón; exige mover DNS a Cloudflare; enviar = "Send as" en Gmail | | ImprovMX | Reenvío, funciona con DNS en cdmon (solo MX) | No buzón; reenvío | Descartadas: Proton/Tuta (dominio propio de pago), self-hosting (mantenimiento). **Decisión pendiente:** ¿buzones reales (Zoho Free) o solo recibir/responder desde Gmail (ImprovMX/Cloudflare)?
Author
Owner

Limpieza hecha (2026-06-30)

Borrados los stacks manuales viejos: directorios /home/rafa/apps/ayqtalent-web y /home/rafa/apps/triptyk-crm + volúmenes triptyk-crm_postgres/redis/storage. Dump de seguridad conservado en ~/backups/relaticle-20260630.dump. Nuevos servicios Coolify corriendo OK.

Migración a Coolify cerrada. Único pendiente: correo (en pausa, ver comentario anterior).

### Limpieza hecha (2026-06-30) Borrados los stacks manuales viejos: directorios `/home/rafa/apps/ayqtalent-web` y `/home/rafa/apps/triptyk-crm` + volúmenes `triptyk-crm_postgres/redis/storage`. Dump de seguridad conservado en `~/backups/relaticle-20260630.dump`. Nuevos servicios Coolify corriendo OK. Migración a Coolify **cerrada**. Único pendiente: correo (en pausa, ver comentario anterior).
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/server#3