Duplicado de imagen docker para sync. de factuges y sync. de verifactu.

This commit is contained in:
David Arranz 2025-12-18 16:03:06 +01:00
parent 238196ff7b
commit 99c02db1b2
9 changed files with 330 additions and 68 deletions

View File

@ -1 +0,0 @@
2025-11-30 18:28:15

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_VERSION="2.0.2"
SCRIPT_VERSION="2.3"
# ================================================
# FACTUGES SYNC - Docker Build Script (Simplificado)
@ -21,6 +21,17 @@ COMPANY="$1"
LOAD=false
[[ "${2:-}" == "--load" ]] && LOAD=true
SSH_USER="rodax"
SSH_HOST="vps-2.rodax-software.com"
SSH_PORT="49152"
# Override por compañía específica
if [[ "$COMPANY" == "rodax" ]]; then
SSH_USER="rodax"
SSH_HOST="factuges.rodax-software.local"
SSH_PORT="22"
fi
# ---------- 2. Directorios ----------
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(realpath "${SCRIPT_DIR}/..")"
@ -38,10 +49,6 @@ IMAGE_VERSION=$(sed -n 's/^version[[:space:]]*=[[:space:]]*\(.*\)$/\1/p' \
"$PROJECT_DIR/setup.cfg" | head -n1)
IMAGE_VERSION="${IMAGE_VERSION:-0.0.0}"
IMAGE_NAME="factuges-sync"
TAG_VERSION="${IMAGE_NAME}:${COMPANY}-${IMAGE_VERSION}"
TAG_LATEST="${IMAGE_NAME}:${COMPANY}-latest"
echo ""
echo "-------------------------------------------------------"
echo " FACTUGES SYNC Build Script v${SCRIPT_VERSION}"
@ -49,31 +56,54 @@ echo " Compañía: ${COMPANY}"
echo " Versión: ${IMAGE_VERSION}"
echo " Fecha: ${DATE}"
echo " Carga: ${LOAD}"
echo " Modos: factuges + verifactu"
echo "-------------------------------------------------------"
echo ""
# ---------- 4. Build único ----------
echo "📦 Construyendo imagen Docker..."
#docker build --no-cache \
docker build \
-t "${TAG_VERSION}" \
-t "${TAG_LATEST}" \
--build-arg COMPANY="${COMPANY}" \
-f "${PROJECT_DIR}/Dockerfile" "${PROJECT_DIR}"
# ---------- 4. Función build ----------
build_image() {
local MODE="$1" # factuges | verifactu
local IMAGE_NAME="factuges-sync-${MODE}"
echo "✅ Imagen construida: ${TAG_VERSION}"
local TAG_VERSION="${IMAGE_NAME}:${COMPANY}-${IMAGE_VERSION}"
local TAG_LATEST="${IMAGE_NAME}:${COMPANY}-latest"
# ---------- 5. Save tar ----------
TAR_V="${OUT_DIR}/${IMAGE_NAME}-${COMPANY}-v${IMAGE_VERSION}-${DATE}.tar"
TAR_LATEST="${OUT_DIR}/${IMAGE_NAME}-${COMPANY}-latest.tar"
echo "📦 Construyendo imagen Docker (${MODE})..."
docker save -o "${TAR_V}" "${TAG_VERSION}" "${TAG_LATEST}"
cp -f "${TAR_V}" "${TAR_LATEST}"
docker build --no-cache \
-t "${TAG_VERSION}" \
-t "${TAG_LATEST}" \
--build-arg COMPANY="${COMPANY}" \
-f "${PROJECT_DIR}/Dockerfile.${MODE}" "${PROJECT_DIR}"
echo "✅ Imagen construida: ${TAG_VERSION}"
local TAR_V="${OUT_DIR}/${IMAGE_NAME}-${COMPANY}-v${IMAGE_VERSION}-${DATE}.tar"
local TAR_LATEST="${OUT_DIR}/${IMAGE_NAME}-${COMPANY}-latest.tar"
docker save -o "${TAR_V}" "${TAG_VERSION}" "${TAG_LATEST}"
cp -f "${TAR_V}" "${TAR_LATEST}"
echo "📦 Imagen guardada:"
echo " - ${TAR_V}"
echo " - ${TAR_LATEST}"
# Devuelve SOLO datos (para uso posterior)
echo "${TAR_V}|${TAR_LATEST}"
}
# ---------- 5. Builds ----------
FACTUGES_OUT=$(build_image "factuges")
FACTUGES_TAR_V="${FACTUGES_OUT%%|*}"
FACTUGES_TAR_LATEST="${FACTUGES_OUT##*|}"
VERIFACTU_OUT=$(build_image "verifactu")
VERIFACTU_TAR_V="${VERIFACTU_OUT%%|*}"
VERIFACTU_TAR_LATEST="${VERIFACTU_OUT##*|}"
VERIFACTU_TAR_LATEST=$(build_image "verifactu" | sed -n '2p')
echo "📦 Imagen guardada:"
echo " - ${TAR_V}"
echo " - ${TAR_LATEST}"
# ---------- 6. Manifest ----------
MANIFEST_FILE="${OUT_DIR}/manifest-${IMAGE_VERSION}-${DATE}.json"
@ -83,9 +113,13 @@ cat > "${MANIFEST_FILE}" <<EOF
"version": "${IMAGE_VERSION}",
"build_time": "${ISO_DATE}",
"docker_images": {
"sync": {
"versioned": "$(basename "${TAR_V}")",
"latest": "$(basename "${TAR_LATEST}")"
"factuges": {
"versioned": "$(basename "${FACTUGES_TAR_V}")",
"latest": "$(basename "${FACTUGES_TAR_LATEST}")"
},
"verifactu": {
"versioned": "$(basename "${VERIFACTU_TAR_V}")",
"latest": "$(basename "${VERIFACTU_TAR_LATEST}")"
}
}
}
@ -95,27 +129,33 @@ echo ""
echo "📄 Manifest generado: ${MANIFEST_FILE}"
echo ""
# ---------- 7. LOAD opcional ----------
if [[ "$LOAD" == true ]]; then
echo "📥 Subiendo imágenes al servidor..."
echo "📥 Subiendo imágenes al servidor ${SSH_HOST}..."
scp -P 49152 "${OUT_DIR}"/*.* \
rodax@vps-2.rodax-software.com:/opt/factuges/${COMPANY}/sync/
ssh -p "${SSH_PORT}" "${SSH_USER}@${SSH_HOST}" \
"mkdir -p /opt/factuges/${COMPANY}/sync"
scp -P "${SSH_PORT}" "${OUT_DIR}"/*.tar \
"${SSH_USER}@${SSH_HOST}:/opt/factuges/${COMPANY}/sync/"
echo "📥 Cargando imágenes en Docker remoto..."
ssh -p 49152 rodax@vps-2.rodax-software.com <<EOF
docker load -i /opt/factuges/${COMPANY}/sync/$(basename "${TAR_V}")
docker load -i /opt/factuges/${COMPANY}/sync/$(basename "${TAR_LATEST}")
ssh -p "${SSH_PORT}" "${SSH_USER}@${SSH_HOST}" <<EOF
docker load -i /opt/factuges/${COMPANY}/sync/$(basename "${FACTUGES_TAR_V}")
docker load -i /opt/factuges/${COMPANY}/sync/$(basename "${VERIFACTU_TAR_V}")
EOF
echo "✔ Imágenes cargadas"
echo "✔ Imágenes cargadas correctamente"
fi
# ---------- 8. Resumen ----------
echo ""
echo "-------------------------------------------------------"
echo "🎯 BUILD COMPLETADO PARA '${COMPANY}'"
[[ "$LOAD" == true ]] && echo "✔ Load OK en ${SSH_HOST}"
echo "🧩 Script version: ${SCRIPT_VERSION}"
echo "-------------------------------------------------------"
echo ""

72
scripts/check-cron.sh Normal file
View File

@ -0,0 +1,72 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_VERSION="1.0"
# ================================================
# FACTUGES SYNC - Valida entorno antes de cron
# -----------------------------------------------
# Este script:
# - Que Docker está instalado y accesible
# - Que existen las imágenes Docker necesarias
# - Que existen las compañías en companies.list
# - Que las imágenes latest están cargadas
# ================================================
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMPANIES_FILE="${SCRIPT_DIR}/companies.list"
echo "🔍 Comprobaciones previas para FactuGES Sync cron"
echo ""
# ---- 1. Docker disponible ----
if ! command -v docker >/dev/null 2>&1; then
echo "❌ Docker no está instalado o no está en PATH"
exit 1
fi
echo "✔ Docker disponible"
# ---- 2. companies.list existe ----
if [[ ! -f "$COMPANIES_FILE" ]]; then
echo "❌ No existe ${COMPANIES_FILE}"
exit 1
fi
echo "✔ companies.list encontrado"
# ---- 3. Validar imágenes por compañía ----
ERRORS=0
while read -r COMPANY; do
[[ -z "$COMPANY" ]] && continue
[[ "$COMPANY" == \#* ]] && continue
echo ""
echo "→ Comprobando compañía: ${COMPANY}"
for MODE in factuges verifactu; do
IMAGE="factuges-sync-${MODE}:${COMPANY}-latest"
if docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo " ✔ Imagen encontrada: ${IMAGE}"
else
echo " ❌ Imagen NO encontrada: ${IMAGE}"
ERRORS=$((ERRORS + 1))
fi
done
done < "$COMPANIES_FILE"
# ---- 4. Resultado final ----
if [[ "$ERRORS" -gt 0 ]]; then
echo ""
echo "❌ Hay ${ERRORS} errores. No es seguro instalar cron."
exit 1
fi
echo ""
echo "---------------------------------------------"
echo "✅ Todas las comprobaciones OK"
echo "👉 Puedes ejecutar deploy-cron.sh con seguridad"
echo "🧩 Script version: ${SCRIPT_VERSION}"
echo "---------------------------------------------"
echo ""

View File

@ -1,13 +0,0 @@
# ===== FACTUGES SYNC JOBS =====
# Sincronización FactuGES → cada 5 minutos
*/5 * * * * docker run --rm \
-e ENV=production \
factuges-sync-factuges:acme-latest \
>> /var/log/factuges-sync/factuges.log 2>&1
# Sincronización Verifactu → cada 7 minutos
*/7 * * * * docker run --rm \
-e ENV=production \
factuges-sync-verifactu:acme-latest \
>> /var/log/factuges-sync/verifactu.log 2>&1

View File

@ -1,45 +1,77 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_VERSION="1.0"
# ================================================
# FACTUGES SYNC - Deploy cron jobs
# FACTUGES SYNC - Deploy cron jobs (MULTI COMPANY)
# -----------------------------------------------
# Este script:
# - Crea /var/log/factuges-sync
# - Instala los cron jobs de producción
# - Mantiene los cron jobs idempotentes
# - Lee la lista de compañías desde companies.list
# - Genera automáticamente los CRON de cada compañía
# - Instala un CRON único con todas las compañías
# - Crea directorios de logs por compañía
# ================================================
COMPANY="${1:-acme}"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
COMPANIES_FILE="${SCRIPT_DIR}/companies.list"
CRON_FILE="/tmp/factuges-sync-cron-${COMPANY}.txt"
if [[ ! -f "$COMPANIES_FILE" ]]; then
echo "❌ ERROR: No existe ${COMPANIES_FILE}"
exit 1
fi
echo "📄 Generando cron file temporal: ${CRON_FILE}"
CRON_FILE="/tmp/factuges-sync-cron-all.txt"
mkdir -p /var/log/factuges-sync
echo ""
echo "-------------------------------------------------------"
echo " FACTUGES SYNC - Deploy cron jobs (MULTI COMPANY) v${SCRIPT_VERSION}"
echo "-------------------------------------------------------"
echo ""
cat > "$CRON_FILE" <<EOF
echo "📄 Generando CRON multi-compañía..."
echo "" > "$CRON_FILE"
while read -r COMPANY; do
[[ -z "$COMPANY" ]] && continue # saltar líneas vacías
[[ "$COMPANY" == \#* ]] && continue # saltar comentarios
LOG_DIR="/var/log/factuges-sync/${COMPANY}"
echo "→ Añadiendo compañía: ${COMPANY}"
echo " Logs en: ${LOG_DIR}"
# Crear directorio de logs por compañía
sudo mkdir -p "$LOG_DIR"
cat >> "$CRON_FILE" <<EOF
# ===== FACTUGES SYNC JOBS (${COMPANY}) =====
# Sincronización FactuGES → cada 5 minutos
# Sincronización FactuGES (cada 5 min)
*/5 * * * * docker run --rm \
-e ENV=production \
-e ENV=prod \
factuges-sync-factuges:${COMPANY}-latest \
>> /var/log/factuges-sync/factuges.log 2>&1
>> ${LOG_DIR}/factuges.log 2>&1
# Sincronización Verifactu → cada 7 minutos
# Sincronización Verifactu (cada 7 min)
*/7 * * * * docker run --rm \
-e ENV=production \
-e ENV=prod \
factuges-sync-verifactu:${COMPANY}-latest \
>> /var/log/factuges-sync/verifactu.log 2>&1
>> ${LOG_DIR}/verifactu.log 2>&1
EOF
echo "📥 Instalando cron jobs del sistema..."
done < "$COMPANIES_FILE"
crontab "$CRON_FILE"
echo "📥 Instalando CRON final..."
sudo crontab "$CRON_FILE"
echo ""
echo "---------------------------------------------"
echo "✔ Cron jobs instalados correctamente"
echo "✔ Logs → /var/log/factuges-sync/"
echo "✔ Puedes comprobar con: crontab -l"
echo "🎯 CRON multi-compañía instalado correctamente"
echo "✔ companies.list leído desde: ${COMPANIES_FILE}"
echo "✔ Ver crontab: sudo crontab -l"
echo "✔ Logs: /var/log/factuges-sync/<company>/"
echo "🧩 Script version: ${SCRIPT_VERSION}"
echo "---------------------------------------------"
echo ""

View File

@ -0,0 +1,90 @@
services:
factuges_sync:
image: "factuges-sync-factuges:rodax-latest"
container_name: "factuges_rodax_sync_factuges"
restart: "no"
environment:
ENV: "production"
LOCAL_TZ: "Europe/Madrid"
STATE_PATH: "${STATE_PATH}"
FACTUGES_HOST: "${FACTUGES_HOST}"
FACTUGES_PORT: "${FACTUGES_PORT}"
FACTUGES_DATABASE: "${FACTUGES_DATABASE}"
FACTUGES_USER: "${FACTUGES_USER}"
FACTUGES_PASSWORD: "${FACTUGES_PASSWORD}"
FWEB_MYSQL_HOST: "db"
FWEB_MYSQL_PORT: "${DB_PORT}"
FWEB_MYSQL_DATABASE: "${DB_NAME}"
FWEB_MYSQL_USER: "${DB_USER}"
FWEB_MYSQL_PASSWORD: "${DB_PASS}"
CTE_COMPANY_ID: "${CTE_COMPANY_ID}"
CTE_SERIE: "${CTE_SERIE}"
CTE_STATUS_INVOICE: "${CTE_STATUS_INVOICE}"
CTE_IS_PROFORMA: "${CTE_IS_PROFORMA}"
CTE_STATUS_VERIFACTU: "${CTE_STATUS_VERIFACTU}"
CTE_LANGUAGE_CODE: "${CTE_LANGUAGE_CODE}"
CTE_COUNTRY_CODE: "${CTE_COUNTRY_CODE}"
CTE_IS_COMPANY: "${CTE_IS_COMPANY}"
CTE_SYNC_RESULT_OK: "${CTE_SYNC_RESULT_OK}"
CTE_SYNC_RESULT_FAIL: "${CTE_SYNC_RESULT_FAIL}"
VERIFACTU_API_KEY: "${VERIFACTU_API_KEY}"
VERIFACTU_BASE_URL: "${VERIFACTU_BASE_URL}"
VERIFACTU_NIFS_API_KEY: "${VERIFACTU_NIFS_API_KEY}"
depends_on:
db:
condition: service_healthy
networks:
- internal
- edge
volumes:
- ./volumes/db_sync:/app/rodax
verifactu_sync:
image: "factuges-sync-verifactu:rodax-latest"
container_name: "factuges_rodax_sync_verifactu"
restart: "no"
environment:
ENV: "production"
LOCAL_TZ: "Europe/Madrid"
STATE_PATH: "${STATE_PATH}"
FACTUGES_HOST: "${FACTUGES_HOST}"
FACTUGES_PORT: "${FACTUGES_PORT}"
FACTUGES_DATABASE: "${FACTUGES_DATABASE}"
FACTUGES_USER: "${FACTUGES_USER}"
FACTUGES_PASSWORD: "${FACTUGES_PASSWORD}"
FWEB_MYSQL_HOST: "db"
FWEB_MYSQL_PORT: "${DB_PORT}"
FWEB_MYSQL_DATABASE: "${DB_NAME}"
FWEB_MYSQL_USER: "${DB_USER}"
FWEB_MYSQL_PASSWORD: "${DB_PASS}"
CTE_COMPANY_ID: "${CTE_COMPANY_ID}"
CTE_SERIE: "${CTE_SERIE}"
CTE_STATUS_INVOICE: "${CTE_STATUS_INVOICE}"
CTE_IS_PROFORMA: "${CTE_IS_PROFORMA}"
CTE_STATUS_VERIFACTU: "${CTE_STATUS_VERIFACTU}"
CTE_LANGUAGE_CODE: "${CTE_LANGUAGE_CODE}"
CTE_COUNTRY_CODE: "${CTE_COUNTRY_CODE}"
CTE_IS_COMPANY: "${CTE_IS_COMPANY}"
CTE_SYNC_RESULT_OK: "${CTE_SYNC_RESULT_OK}"
CTE_SYNC_RESULT_FAIL: "${CTE_SYNC_RESULT_FAIL}"
VERIFACTU_API_KEY: "${VERIFACTU_API_KEY}"
VERIFACTU_BASE_URL: "${VERIFACTU_BASE_URL}"
VERIFACTU_NIFS_API_KEY: "${VERIFACTU_NIFS_API_KEY}"
depends_on:
db:
condition: service_healthy
networks:
- internal
- edge
volumes:
- ./volumes/db_sync:/app/rodax

View File

@ -27,6 +27,7 @@ CTE_IS_COMPANY = 1
CTE_SYNC_RESULT_OK = 1
CTE_SYNC_RESULT_FAIL = 2
VERIFACTU_API_KEY = vf_test_C03HL2F0X5OXSDRunjNFoMxD4IrRfK3kCC8PfcvCENI=
#VERIFACTU_API_KEY = vf_test_C03HL2F0X5OXSDRunjNFoMxD4IrRfK3kCC8PfcvCENI=
#VERIFACTU_API_KEY = vf_prod_yfjonNPv2E4Fij+5J0hct0zCgUeFYT2dZzb23UZlM+Q=
VERIFACTU_BASE_URL = https://api.verifacti.com/
VERIFACTU_NIFS_API_KEY = vfn_osYpNdqSzAdTAHpazXG2anz4F3o0gfbSb5FFrCBZcno=

41
scripts/undeploy-cron.sh Normal file
View File

@ -0,0 +1,41 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_VERSION="1.0"
# ================================================
# FACTUGES SYNC - Undeploy cron jobs
# -----------------------------------------------
# Este script:
# - Elimina el crontab instalado por deploy-cron.sh
# - NO borra logs
# - NO toca imágenes Docker
# - Seguro de ejecutar varias veces
# ================================================
TMP_CRON="/tmp/current-cron.txt"
TMP_FILTERED="/tmp/filtered-cron.txt"
echo ""
echo "-------------------------------------------------------"
echo " FACTUGES SYNC - Undeploy cron jobs v${SCRIPT_VERSION}"
echo "-------------------------------------------------------"
echo ""
echo "🧹 Eliminando cron jobs de FactuGES Sync..."
# Guardar cron actual (si existe)
crontab -l > "$TMP_CRON" 2>/dev/null || true
# Eliminar bloques FACTUGES SYNC
grep -v "FACTUGES SYNC JOBS" "$TMP_CRON" \
| grep -v "factuges-sync-factuges" \
| grep -v "factuges-sync-verifactu" \
> "$TM
echo ""
echo "---------------------------------------------"
echo "🎯 Terminado correctamente
echo "🧩 Script version: ${SCRIPT_VERSION}"
echo "---------------------------------------------"
echo ""

View File

@ -1,6 +1,6 @@
[metadata]
name = factuges-sync
version = 0.1.5
version = 0.1.6
description = ETL job to sync data from legacy DB to MariaDB
author = Rodax Software
author_email = info@rodax-software.com