loreal-spec-tool/deploy.sh
Phil Dore 21fcf63431 Initial commit — L'Oréal Spec Tool
238 specs (CH/CZ/DE/NORDICS), dark/light theme, cascading filters,
side-by-side comparison, checklist export, admin panel, bulk import.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 18:39:10 +01:00

80 lines
3.1 KiB
Bash

#!/bin/bash
# =============================================================================
# deploy.sh — idempotent deploy for loreal-spec-tool
# Usage: bash /opt/loreal-spec-tool/deploy.sh
# =============================================================================
set -euo pipefail
APP_NAME="loreal-spec-tool"
REPO_DIR="/opt/${APP_NAME}"
WEB_DIR="/var/www/html/${APP_NAME}"
COMPOSE_FILE="${REPO_DIR}/docker-compose.yml"
STATIC_FILES=(index.html script.js specs.json)
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; BOLD='\033[1m'; NC='\033[0m'
log() { echo -e "${GREEN}[deploy]${NC} $1"; }
warn() { echo -e "${YELLOW}[warn]${NC} $1"; }
error() { echo -e "${RED}[error]${NC} $1"; exit 1; }
step() { echo -e "\n${BOLD}$1${NC}"; }
compose() { docker compose -f "$COMPOSE_FILE" "$@"; }
step "Checking prerequisites"
command -v git >/dev/null 2>&1 || error "git is not installed"
command -v docker >/dev/null 2>&1 || error "docker is not installed"
docker compose version >/dev/null 2>&1 || error "docker compose v2 not found"
step "Pulling latest code"
cd "$REPO_DIR"
git pull origin main
log "Code: $(git log -1 --format='%h %s')"
step "Building Docker image"
compose build --pull
log "Build complete"
step "Starting application"
compose up -d app
log "Container started"
step "Deploying static files to ${WEB_DIR}"
rm -rf "${WEB_DIR}"
mkdir -p "${WEB_DIR}"
for f in "${STATIC_FILES[@]}"; do
if [ -f "${REPO_DIR}/${f}" ]; then
cp "${REPO_DIR}/${f}" "${WEB_DIR}/${f}"
log " copied ${f}"
else
warn " ${f} not found — skipped"
fi
done
step "Health check"
sleep 2
HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3101/api/health || echo "000")
[ "$HTTP_STATUS" = "200" ] && log "API OK (HTTP 200)" || error "Health check failed (HTTP ${HTTP_STATUS})"
FIRST_RUN_FLAG="${REPO_DIR}/.deployed"
if [ ! -f "$FIRST_RUN_FLAG" ]; then
touch "$FIRST_RUN_FLAG"
echo ""
echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BOLD} First deploy. Add this to your Apache VirtualHost:${NC}"
echo ""
echo " Alias /loreal-spec-tool /var/www/html/loreal-spec-tool"
echo " <Directory /var/www/html/loreal-spec-tool>"
echo " Options -Indexes"
echo " AllowOverride None"
echo " Require all granted"
echo " </Directory>"
echo " ProxyPass /loreal-spec-tool/api http://localhost:3101/api"
echo " ProxyPassReverse /loreal-spec-tool/api http://localhost:3101/api"
echo ""
echo " Then: sudo a2enmod proxy proxy_http && sudo systemctl reload apache2"
echo -e "${BOLD}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
fi
echo ""
echo -e "${GREEN}${BOLD}Deploy complete${NC}$(date '+%Y-%m-%d %H:%M:%S')"
echo -e " App: http://localhost:3101 | API: http://localhost:3101/api/health"
echo ""