#!/usr/bin/env bash set -euo pipefail # Load .env.local if it exists SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="$SCRIPT_DIR/.env.local" if [[ -f "$ENV_FILE" ]]; then # Export only the vars we care about, ignoring comments and blank lines set -o allexport # shellcheck source=/dev/null source <(grep -E '^(DEPLOY_USER|DEPLOY_HOST|DEPLOY_SSH_KEY)=' "$ENV_FILE") set +o allexport fi # Prompt for any missing values if [[ -z "${DEPLOY_USER:-}" ]]; then read -rp "SSH username: " DEPLOY_USER fi if [[ -z "${DEPLOY_HOST:-}" ]]; then read -rp "Server IP/hostname: " DEPLOY_HOST fi if [[ -z "${DEPLOY_SSH_KEY:-}" ]]; then read -rp "SSH key path [~/.ssh/id_ed25519]: " DEPLOY_SSH_KEY DEPLOY_SSH_KEY="${DEPLOY_SSH_KEY:-~/.ssh/id_ed25519}" fi SSH_OPTS="-i $DEPLOY_SSH_KEY" echo "→ Deploying to $DEPLOY_USER@$DEPLOY_HOST using key $DEPLOY_SSH_KEY" # 1. Build frontend (uses indexLocal.html — no Crisp; see vite --mode nocrisp) ( cd "$SCRIPT_DIR" npm run build:local ) # Fail if the bundle still embeds Crisp (wrong vite mode or stale build/) INDEX_HTML="$SCRIPT_DIR/build/index.html" if [[ ! -f "$INDEX_HTML" ]]; then echo "error: missing $INDEX_HTML after build:local" >&2 exit 1 fi if grep -qiE 'crisp\.chat|\$crisp|CRISP_WEBSITE_ID|CRISP_RUNTIME_CONFIG' "$INDEX_HTML"; then echo "error: build/index.html still references Crisp; expected nocrisp build (indexLocal.html)" >&2 exit 1 fi # 2. Build container image docker build -t webui:local -f Dockerfile . # 3. Transfer image docker save webui:local | ssh $SSH_OPTS "$DEPLOY_USER@$DEPLOY_HOST" docker load # 4. SCP compose file scp $SSH_OPTS docker-compose.local.yml "$DEPLOY_USER@$DEPLOY_HOST:~/" # 5. Deploy — then force service recreate. Swarm often keeps the old task when the tag stays # webui:local after docker load, so without --force you still see the previous HTML/JS. STACK_NAME="${LOCAL_DOCKER_STACK_NAME:-webui}" SERVICE_NAME="${STACK_NAME}_webui" ssh $SSH_OPTS "$DEPLOY_USER@$DEPLOY_HOST" \ "docker stack deploy -c docker-compose.local.yml $STACK_NAME && docker service update --force $SERVICE_NAME"