From 05d1a8c13373ad4ad8a04e8026c0e473384816a1 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 3 Sep 2026 05:24:51 +0000 Subject: [PATCH] migrate: rechazar CONTAINER ID y fallar si el host no resuelve MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coolify no imprime stdout de Liquibase; el job migrate seguía saliendo 1 por DNS. Preflight deja el host JDBC en los logs del contenedor y corta si parece un ID de 12 caracteres. Co-authored-by: alberto.martinez --- db/update.sh | 42 ++++++++++++++++++++++++++++++++++++++++++ docs/coolify.md | 10 +++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/db/update.sh b/db/update.sh index 43ece0a..042c0c1 100755 --- a/db/update.sh +++ b/db/update.sh @@ -9,6 +9,7 @@ # DATABASE_URL_CORE_OWNER (jdbc: panels_product, schema core) # # Formato esperado: postgresql://usuario:password@host:puerto/basededatos +# (también se acepta postgres://). El host NO puede ser un CONTAINER ID. # # Uso: # set -a && source .env.dev-local && set +a && ./db/update.sh all @@ -39,12 +40,52 @@ done # postgresql://user:pass@host:port/db -> jdbc:postgresql://host:port/db + user/pass parse_url() { local url="$1" + url="${url#"${url%%[![:space:]]*}"}" + url="${url%"${url##*[![:space:]]}"}" + url="${url#\'}"; url="${url%\'}" + url="${url#\"}"; url="${url%\"}" + if [[ "$url" == postgres://* ]]; then + url="postgresql://${url#postgres://}" + fi + if [[ "$url" != postgresql://* ]]; then + echo "ERROR: la URL debe empezar por postgresql:// o postgres://" >&2 + exit 1 + fi local rest="${url#postgresql://}" local userinfo="${rest%%@*}" local hostpart="${rest#*@}" + if [[ "$userinfo" == "$rest" || -z "$hostpart" ]]; then + echo "ERROR: URL sin host (falta user:pass@host)" >&2 + exit 1 + fi PARSED_USER="${userinfo%%:*}" PARSED_PASS="${userinfo#*:}" PARSED_JDBC="jdbc:postgresql://${hostpart}" + local hp="${hostpart%%\?*}" + hp="${hp%%/*}" + PARSED_HOST="${hp%%:*}" +} + +preflight_host() { + echo "==> host JDBC: ${PARSED_HOST}" + if [[ "$PARSED_HOST" =~ ^[0-9a-f]{12}$ ]]; then + echo "ERROR: '${PARSED_HOST}' es un CONTAINER ID de Docker, no un hostname." >&2 + echo "En Coolify copia Postgres URL (internal): el texto entre @ y :5432." >&2 + echo "Pon ese hostname en las 6 DATABASE_URL_* (mismo host) y conecta el" >&2 + echo "compose a la red predefined 'coolify'." >&2 + exit 1 + fi + if [[ "$PARSED_HOST" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + return 0 + fi + if command -v getent >/dev/null 2>&1; then + if ! getent hosts "$PARSED_HOST" >/dev/null 2>&1; then + echo "ERROR: no se resuelve el host '${PARSED_HOST}' (DNS)." >&2 + echo "Usa el hostname de Postgres URL (internal), no el ID del contenedor." >&2 + echo "El stack PANELS debe estar en la misma red Docker que Postgres (coolify)." >&2 + exit 1 + fi + fi } run_one() { @@ -57,6 +98,7 @@ run_one() { fi parse_url "$url" echo "==> Liquibase $LB_COMMAND: $name ($PARSED_JDBC)" + preflight_host ( cd "$ROOT/db/$name" "$LIQUIBASE" \ diff --git a/docs/coolify.md b/docs/coolify.md index a50dd10..2c3f161 100644 --- a/docs/coolify.md +++ b/docs/coolify.md @@ -102,7 +102,15 @@ Usa el hostname de **Postgres URL (internal)** / **Redis URL (internal)** en Coo Además, el recurso Docker Compose de PANELS debe estar en la **misma red** que Postgres y Redis (Connect to Predefined Network, a menudo `coolify`). Si no, el hostname interno existe pero el contenedor `migrate` no lo ve. -Tras corregir las URLs, redesplegar y revisar `docker logs` del contenedor `migrate-*` (debe terminar con Liquibase `Update has been successful` o similar, exit 0). El `docker stop … No such container` del helper de Coolify es ruido de limpieza, no la causa. +El log de deploy de Coolify **no** incluye stdout de Liquibase. Si `service "migrate" didn't complete successfully: exit 1`, el error real está en: + +```bash +sudo docker logs migrate-- +``` + +Ejemplo de este entorno: `sudo docker logs migrate-pdyrt8ccp804tfmutefau0k6-052025710094`. Debe verse `==> host JDBC: …` y el error de Liquibase. Un host de 12 caracteres hex (`c72dde7d6b47`) es el CONTAINER ID — cámbialo. `Liquibase OK` + exit 0 = bien. + +El `docker stop … No such container` del helper de Coolify es ruido de limpieza, no la causa. El build de imágenes puede ser OK y el deploy igual falla en `migrate`. ### Coolify pide `PLATFORM_OWNER_PASSWORD`, `IAM_APP_PASSWORD`, `*_REDIS_PASSWORD`…