2026-07-28 00:03:31 +02:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
# Fast deploy for LeoCRM.
|
|
|
|
|
# Usage:
|
|
|
|
|
# bash scripts/fast-deploy.sh frontend # Frontend-only: build + copy (~20s)
|
|
|
|
|
# bash scripts/fast-deploy.sh full # Full: Coolify rebuild (~2min)
|
|
|
|
|
# Default: frontend
|
2026-08-04 11:13:44 +02:00
|
|
|
#
|
|
|
|
|
# Environment variables:
|
|
|
|
|
# COOLIFY_API_TOKEN — Coolify API token (required for full deploy)
|
|
|
|
|
# COOLIFY_BASE_URL — Coolify base URL (default: https://server.media-on.de)
|
|
|
|
|
# COOLIFY_APP_UUID — Application UUID (optional, resolved via API if absent)
|
|
|
|
|
# APP_NAME — Application name for API lookup (default: leocrm-api)
|
|
|
|
|
# APP_DOMAIN — App domain (required for full deploy, e.g. https://crm.media-on.de)
|
|
|
|
|
# SSH_KEY — SSH key path (default: /a0/usr/workdir/.ssh/coolify-01-root)
|
|
|
|
|
# SERVER_IP — Server IP (default: 46.225.91.159)
|
2026-07-28 00:03:31 +02:00
|
|
|
|
|
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
SSH_KEY="${SSH_KEY:-/a0/usr/workdir/.ssh/coolify-01-root}"
|
2026-08-04 11:13:44 +02:00
|
|
|
SERVER_IP="${SERVER_IP:-46.225.91.159}"
|
|
|
|
|
SERVER="root@${SERVER_IP}"
|
2026-07-28 00:03:31 +02:00
|
|
|
SSH_OPTS="-o StrictHostKeyChecking=no -i $SSH_KEY"
|
|
|
|
|
MODE="${1:-frontend}"
|
|
|
|
|
|
2026-08-04 11:13:44 +02:00
|
|
|
# Resolve repo root from script location
|
|
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
|
REPO_ROOT="$(pwd)"
|
2026-07-28 00:03:31 +02:00
|
|
|
|
2026-08-04 11:13:44 +02:00
|
|
|
# ─── Helper: Resolve app UUID via Coolify API ────────────────────────
|
|
|
|
|
resolve_app_uuid() {
|
|
|
|
|
local token="${COOLIFY_API_TOKEN:-}"
|
|
|
|
|
local base_url="${COOLIFY_BASE_URL:-https://server.media-on.de}"
|
2026-08-04 12:17:01 +02:00
|
|
|
local app_name="${APP_NAME:-}"
|
|
|
|
|
if [ -z "$app_name" ] && [ -n "${APP_DOMAIN:-}" ]; then
|
|
|
|
|
app_name="$(echo "$APP_DOMAIN" | sed 's|.*://||' | sed 's|\..*||')"
|
|
|
|
|
fi
|
|
|
|
|
app_name="${app_name:-app}"
|
2026-08-04 11:13:44 +02:00
|
|
|
|
|
|
|
|
if [ -z "$token" ]; then
|
|
|
|
|
echo "ERROR: COOLIFY_API_TOKEN not set" >&2
|
|
|
|
|
return 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
curl -sS -H "Authorization: Bearer $token" \
|
|
|
|
|
"${base_url}/api/v1/applications" \
|
|
|
|
|
| python3 -c "
|
|
|
|
|
import sys, json
|
|
|
|
|
apps = json.load(sys.stdin)
|
|
|
|
|
for app in apps:
|
|
|
|
|
if app.get('name') == '${app_name}':
|
|
|
|
|
print(app.get('uuid', ''))
|
|
|
|
|
break
|
|
|
|
|
" 2>/dev/null
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# ─── Full Deploy ─────────────────────────────────────────────────────
|
2026-07-28 00:03:31 +02:00
|
|
|
if [ "$MODE" = "full" ]; then
|
|
|
|
|
echo "[Full Deploy] Triggering Coolify rebuild..."
|
2026-08-04 11:13:44 +02:00
|
|
|
|
|
|
|
|
if [ -z "${COOLIFY_API_TOKEN:-}" ]; then
|
|
|
|
|
echo "ERROR: COOLIFY_API_TOKEN not set" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
if [ -z "${APP_DOMAIN:-}" ]; then
|
|
|
|
|
echo "ERROR: APP_DOMAIN not set (e.g. https://crm.media-on.de)" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
COOLIFY_API_TOKEN="$COOLIFY_API_TOKEN" \
|
|
|
|
|
COOLIFY_BASE_URL="${COOLIFY_BASE_URL:-https://server.media-on.de}" \
|
|
|
|
|
COOLIFY_APP_UUID="${COOLIFY_APP_UUID:-}" \
|
|
|
|
|
COOLIFY_WORKER_UUID="${COOLIFY_WORKER_UUID:-}" \
|
|
|
|
|
APP_NAME="${APP_NAME:-leocrm-api}" \
|
|
|
|
|
WORKER_NAME="${WORKER_NAME:-leocrm-worker}" \
|
|
|
|
|
APP_DOMAIN="$APP_DOMAIN" \
|
2026-07-28 00:03:31 +02:00
|
|
|
SSH_KEY="$SSH_KEY" \
|
2026-08-04 11:13:44 +02:00
|
|
|
SERVER_IP="$SERVER_IP" \
|
|
|
|
|
/opt/venv/bin/python "$REPO_ROOT/scripts/deploy.py"
|
2026-07-28 00:03:31 +02:00
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
2026-08-04 11:13:44 +02:00
|
|
|
# ─── Frontend-only Fast Deploy ──────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
# Resolve app UUID
|
|
|
|
|
APP_UUID="${COOLIFY_APP_UUID:-}"
|
|
|
|
|
if [ -z "$APP_UUID" ]; then
|
|
|
|
|
if [ -z "${COOLIFY_API_TOKEN:-}" ]; then
|
|
|
|
|
echo "ERROR: COOLIFY_APP_UUID or COOLIFY_API_TOKEN must be set" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
echo "[1/6] Resolving app UUID via Coolify API..."
|
|
|
|
|
APP_UUID="$(resolve_app_uuid)"
|
|
|
|
|
if [ -z "$APP_UUID" ]; then
|
|
|
|
|
echo "ERROR: Could not resolve app UUID" >&2
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
echo " App UUID: $APP_UUID"
|
|
|
|
|
fi
|
|
|
|
|
|
2026-07-28 00:03:31 +02:00
|
|
|
echo "[1/5] Building frontend..."
|
2026-08-04 11:13:44 +02:00
|
|
|
cd "$REPO_ROOT/frontend"
|
2026-07-28 00:03:31 +02:00
|
|
|
npm run build 2>&1 | tail -3
|
|
|
|
|
|
|
|
|
|
echo "[2/5] Finding container..."
|
2026-08-07 22:17:06 +02:00
|
|
|
# Coolify containers are named like <service>-<uuid>-<timestamp> (e.g. crm_app-<uuid>-<ts>).
|
|
|
|
|
# Try legacy UUID-prefix first, then fall back to any running container that contains the UUID
|
|
|
|
|
# and has 'app' in its name (covers crm_app-<uuid>-<ts> naming convention).
|
2026-08-04 11:13:44 +02:00
|
|
|
CONTAINER=$(ssh $SSH_OPTS $SERVER "docker ps --format '{{.Names}}' | grep '^${APP_UUID}-' | head -1")
|
2026-07-28 00:03:31 +02:00
|
|
|
if [ -z "$CONTAINER" ]; then
|
2026-08-07 22:17:06 +02:00
|
|
|
CONTAINER=$(ssh $SSH_OPTS $SERVER "docker ps --format '{{.Names}}' | grep '${APP_UUID}' | grep 'app' | head -1")
|
|
|
|
|
fi
|
|
|
|
|
if [ -z "$CONTAINER" ]; then
|
|
|
|
|
echo "ERROR: Could not find app container containing UUID ${APP_UUID}" >&2
|
2026-07-28 00:03:31 +02:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
echo " Container: $CONTAINER"
|
|
|
|
|
|
|
|
|
|
echo "[3/5] Packaging & uploading..."
|
|
|
|
|
tar czf /tmp/frontend-dist.tar.gz -C dist .
|
|
|
|
|
scp $SSH_OPTS /tmp/frontend-dist.tar.gz $SERVER:/tmp/frontend-dist.tar.gz
|
|
|
|
|
|
|
|
|
|
echo "[4/5] Copying into container..."
|
2026-07-30 09:43:29 +02:00
|
|
|
ssh $SSH_OPTS $SERVER "docker cp /tmp/frontend-dist.tar.gz $CONTAINER:/tmp/ && docker exec $CONTAINER sh -c 'cd /app/frontend/dist && rm -f assets/*.js assets/*.css assets/*.map sw.js registerSW.js workbox-*.js && tar xzf /tmp/frontend-dist.tar.gz && rm -f /tmp/frontend-dist.tar.gz' && rm -f /tmp/frontend-dist.tar.gz"
|
2026-07-28 00:03:31 +02:00
|
|
|
|
|
|
|
|
echo "[5/5] Done! Frontend deployed in ~20s."
|
|
|
|
|
echo " No restart needed — static files served directly."
|
|
|
|
|
echo " Browser: Strg+Shift+R for hard reload."
|