2025-12-22 13:07:32 +01:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
|
|
|
|
# BMC Hub Production Deployment Script
|
|
|
|
|
|
# Usage: ./updateto.sh v1.3.15
|
|
|
|
|
|
|
|
|
|
|
|
set -e # Exit on any error
|
|
|
|
|
|
|
|
|
|
|
|
VERSION=$1
|
|
|
|
|
|
|
2026-01-29 23:07:33 +01:00
|
|
|
|
# This production deployment is designed for ROOTLESS Podman.
|
|
|
|
|
|
# Running with sudo will use a different Podman storage (rootful) and can make it look
|
|
|
|
|
|
# like "data disappeared" because volumes/networks are separate.
|
|
|
|
|
|
if [ "${EUID:-$(id -u)}" -eq 0 ]; then
|
|
|
|
|
|
echo "❌ Fejl: Kør ikke dette script som root (sudo)."
|
|
|
|
|
|
echo " Brug i stedet: sudo -iu bmcadmin && cd /srv/podman/bmc_hub_v1.0 && ./updateto.sh $VERSION"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
PODMAN_COMPOSE_FILE="docker-compose.prod.yml"
|
|
|
|
|
|
|
2025-12-22 13:07:32 +01:00
|
|
|
|
if [ -z "$VERSION" ]; then
|
|
|
|
|
|
echo "❌ Fejl: Ingen version angivet"
|
|
|
|
|
|
echo "Usage: ./updateto.sh v1.3.15"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# SAFETY CHECK: Verify we're on production server
|
|
|
|
|
|
CURRENT_IP=$(hostname -I | awk '{print $1}' 2>/dev/null || echo "unknown")
|
|
|
|
|
|
CURRENT_DIR=$(pwd)
|
|
|
|
|
|
|
2026-03-01 02:56:38 +01:00
|
|
|
|
if [[ "$CURRENT_IP" != "172.16.31.183" ]] && [[ "$CURRENT_DIR" != "/srv/podman/bmc_hub_v2" ]]; then
|
2025-12-22 13:07:32 +01:00
|
|
|
|
echo "⚠️ ADVARSEL: Dette script skal kun køres på PRODUCTION serveren!"
|
|
|
|
|
|
echo " Forventet IP: 172.16.31.183"
|
2026-03-01 02:56:38 +01:00
|
|
|
|
echo " Forventet mappe: /srv/podman/bmc_hub_v2"
|
2025-12-22 13:07:32 +01:00
|
|
|
|
echo " Nuværende IP: $CURRENT_IP"
|
|
|
|
|
|
echo " Nuværende mappe: $CURRENT_DIR"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
read -p "Er du SIKKER på du vil fortsætte? (skriv 'JA' for at fortsætte): " CONFIRM
|
|
|
|
|
|
if [ "$CONFIRM" != "JA" ]; then
|
|
|
|
|
|
echo "❌ Deployment afbrudt"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "🚀 Deploying BMC Hub version: $VERSION"
|
|
|
|
|
|
echo "================================"
|
|
|
|
|
|
|
|
|
|
|
|
# Check if .env exists
|
|
|
|
|
|
if [ ! -f ".env" ]; then
|
|
|
|
|
|
echo "❌ Fejl: .env fil ikke fundet"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2026-01-29 23:07:33 +01:00
|
|
|
|
if [ ! -f "$PODMAN_COMPOSE_FILE" ]; then
|
|
|
|
|
|
echo "❌ Fejl: $PODMAN_COMPOSE_FILE ikke fundet i $(pwd)"
|
|
|
|
|
|
echo " Kør fra /srv/podman/bmc_hub_v1.0"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2026-01-28 07:48:10 +01:00
|
|
|
|
# Load environment variables (DB credentials)
|
|
|
|
|
|
set -a
|
|
|
|
|
|
source .env
|
|
|
|
|
|
set +a
|
|
|
|
|
|
|
2025-12-22 13:07:32 +01:00
|
|
|
|
# Update RELEASE_VERSION in .env
|
|
|
|
|
|
echo "📝 Opdaterer .env med version $VERSION..."
|
|
|
|
|
|
if grep -q "^RELEASE_VERSION=" .env; then
|
|
|
|
|
|
# Replace existing line
|
|
|
|
|
|
sed -i.bak "s/^RELEASE_VERSION=.*/RELEASE_VERSION=$VERSION/" .env
|
|
|
|
|
|
else
|
|
|
|
|
|
# Add if missing
|
|
|
|
|
|
echo "RELEASE_VERSION=$VERSION" >> .env
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
echo "✅ .env opdateret"
|
|
|
|
|
|
|
2026-03-03 23:09:14 +01:00
|
|
|
|
# Guard against host port conflicts before attempting startup
|
|
|
|
|
|
POSTGRES_BIND_ADDR="${POSTGRES_BIND_ADDR:-127.0.0.1}"
|
|
|
|
|
|
POSTGRES_PORT="${POSTGRES_PORT:-5432}"
|
|
|
|
|
|
if podman ps --format '{{.Names}} {{.Ports}}' | grep -E "${POSTGRES_BIND_ADDR}:${POSTGRES_PORT}->5432/tcp" | grep -v "bmc-hub-postgres-prod" >/dev/null 2>&1; then
|
|
|
|
|
|
echo "❌ Fejl: Portkonflikt på ${POSTGRES_BIND_ADDR}:${POSTGRES_PORT} (Postgres host-port)"
|
|
|
|
|
|
echo " Sæt en ledig port i .env, fx POSTGRES_PORT=5433"
|
|
|
|
|
|
podman ps --format 'table {{.Names}}\t{{.Ports}}'
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
2025-12-22 13:07:32 +01:00
|
|
|
|
# Stop containers
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "⏹️ Stopper containere..."
|
2026-01-29 23:07:33 +01:00
|
|
|
|
podman-compose -f "$PODMAN_COMPOSE_FILE" down
|
2025-12-22 13:07:32 +01:00
|
|
|
|
|
|
|
|
|
|
# Pull/rebuild with new version
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "🔨 Bygger nyt image med version $VERSION..."
|
2026-03-03 23:09:14 +01:00
|
|
|
|
if ! podman-compose -f "$PODMAN_COMPOSE_FILE" up -d --build; then
|
|
|
|
|
|
echo "❌ Fejl: podman-compose up fejlede"
|
|
|
|
|
|
echo " Tjek logs med: podman-compose -f $PODMAN_COMPOSE_FILE logs --tail=200"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Validate that key containers are actually running after startup
|
|
|
|
|
|
if ! podman ps --format '{{.Names}}' | grep -q '^bmc-hub-postgres-prod$'; then
|
|
|
|
|
|
echo "❌ Fejl: bmc-hub-postgres-prod kører ikke efter startup"
|
|
|
|
|
|
podman ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if ! podman ps --format '{{.Names}}' | grep -q '^bmc-hub-api-prod$'; then
|
|
|
|
|
|
echo "❌ Fejl: bmc-hub-api-prod kører ikke efter startup"
|
|
|
|
|
|
podman ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
2025-12-22 13:07:32 +01:00
|
|
|
|
|
2026-01-02 14:41:20 +01:00
|
|
|
|
# Sync migrations from container to host
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "📁 Syncer migrations fra container til host..."
|
2026-03-01 02:56:38 +01:00
|
|
|
|
SYNC_OK=false
|
|
|
|
|
|
for i in {1..20}; do
|
|
|
|
|
|
rm -rf ./migrations_temp
|
|
|
|
|
|
if podman cp bmc-hub-api-prod:/app/migrations ./migrations_temp 2>/dev/null; then
|
|
|
|
|
|
rm -rf ./migrations
|
|
|
|
|
|
mv ./migrations_temp ./migrations
|
|
|
|
|
|
chmod -R 755 ./migrations
|
|
|
|
|
|
SYNC_OK=true
|
|
|
|
|
|
echo "✅ Migrations synced"
|
|
|
|
|
|
break
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo "⏳ Venter på API container for migration sync... ($i/20)"
|
|
|
|
|
|
sleep 2
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
if [ "$SYNC_OK" != "true" ]; then
|
|
|
|
|
|
echo "❌ Fejl: Kunne ikke sync'e migrations fra bmc-hub-api-prod:/app/migrations"
|
|
|
|
|
|
echo " Afbryder for at undgå kørsel af gamle migrations"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -f "./migrations/138_customers_economic_unique_constraint.sql" ]; then
|
|
|
|
|
|
echo "❌ Fejl: Forventet migration 138 mangler efter sync"
|
|
|
|
|
|
exit 1
|
2026-01-02 14:41:20 +01:00
|
|
|
|
fi
|
|
|
|
|
|
|
2025-12-22 13:07:32 +01:00
|
|
|
|
# Wait a bit for startup
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "⏳ Venter på container startup..."
|
|
|
|
|
|
sleep 5
|
|
|
|
|
|
|
2026-01-29 23:07:33 +01:00
|
|
|
|
# Database migrations
|
2026-01-28 07:48:10 +01:00
|
|
|
|
echo ""
|
2026-01-29 23:07:33 +01:00
|
|
|
|
echo "🧱 Database migrationer"
|
|
|
|
|
|
echo " NOTE: Scriptet kører ikke længere en hardcoded enkelt-migration automatisk."
|
|
|
|
|
|
echo " Brug migrations-UI'en i BMC Hub, eller sæt RUN_MIGRATIONS=true for at køre alle .sql i /docker-entrypoint-initdb.d/ i sorteret rækkefølge."
|
2026-01-28 07:48:10 +01:00
|
|
|
|
|
2026-01-29 23:07:33 +01:00
|
|
|
|
if [ "${RUN_MIGRATIONS:-false}" = "true" ]; then
|
|
|
|
|
|
if [ -z "$POSTGRES_USER" ] || [ -z "$POSTGRES_DB" ]; then
|
|
|
|
|
|
echo "❌ Fejl: POSTGRES_USER/POSTGRES_DB mangler i .env"
|
|
|
|
|
|
exit 1
|
2026-01-28 07:48:10 +01:00
|
|
|
|
fi
|
|
|
|
|
|
|
2026-01-29 23:07:33 +01:00
|
|
|
|
for i in {1..30}; do
|
2026-03-03 22:37:48 +01:00
|
|
|
|
if podman exec bmc-hub-postgres-prod pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB" >/dev/null 2>&1; then
|
2026-01-29 23:07:33 +01:00
|
|
|
|
break
|
|
|
|
|
|
fi
|
|
|
|
|
|
echo "⏳ Venter på postgres... ($i/30)"
|
|
|
|
|
|
sleep 2
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
echo "📄 Kører alle migrations fra /docker-entrypoint-initdb.d (sorteret)..."
|
|
|
|
|
|
podman exec bmc-hub-postgres-prod sh -lc "ls -1 /docker-entrypoint-initdb.d/*.sql 2>/dev/null | sort" \
|
|
|
|
|
|
| while read -r file; do
|
|
|
|
|
|
[ -z "$file" ] && continue
|
|
|
|
|
|
echo "➡️ $file"
|
|
|
|
|
|
podman exec -i bmc-hub-postgres-prod psql -v ON_ERROR_STOP=1 -U "$POSTGRES_USER" -d "$POSTGRES_DB" -f "$file"
|
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
echo "✅ Migrations kørt"
|
|
|
|
|
|
else
|
|
|
|
|
|
echo "ℹ️ RUN_MIGRATIONS=false (default)"
|
|
|
|
|
|
fi
|
2026-01-28 07:48:10 +01:00
|
|
|
|
|
2025-12-22 13:07:32 +01:00
|
|
|
|
# Show logs
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "📋 Logs fra startup:"
|
|
|
|
|
|
echo "================================"
|
2025-12-22 13:15:13 +01:00
|
|
|
|
podman logs --tail 50 bmc-hub-api-prod
|
2025-12-22 13:07:32 +01:00
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "✅ Deployment fuldført!"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "🔍 Tjek status med:"
|
2026-01-29 23:07:33 +01:00
|
|
|
|
echo " podman-compose -f $PODMAN_COMPOSE_FILE ps"
|
2025-12-22 13:07:32 +01:00
|
|
|
|
echo " podman logs -f bmc-hub-api-prod"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "🌐 Test health endpoint:"
|
|
|
|
|
|
echo " curl http://localhost:8000/health"
|
2025-12-22 13:15:13 +01:00
|
|
|
|
echo ""
|
|
|
|
|
|
echo "📊 Sync kunder fra e-conomic:"
|
|
|
|
|
|
echo " curl -X POST http://localhost:8000/api/v1/system/sync/economic"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "🔗 Link vTiger til kunder:"
|
|
|
|
|
|
echo " curl -X POST http://localhost:8000/api/v1/system/sync/vtiger"
|