#!/bin/bash set -euo pipefail # ═══════════════════════════════════════════════════════ # Social Reporting — Server Deployment Script # Target: Ubuntu + Apache + Docker # URL: https://optical-dev.oliver.solutions/social-reports # ═══════════════════════════════════════════════════════ REPO_URL="${REPO_URL:-}" # Set before running: export REPO_URL="https://x-token-auth:TOKEN@bitbucket.org/zlalani/social-reporting-tool.git" BACKEND_DIR="/opt/social-reporting" FRONTEND_DIR="/var/www/html/social-reporting" APACHE_CONF="/etc/apache2/conf-available/social-reports.conf" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' log() { echo -e "${GREEN}[+]${NC} $1"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; } err() { echo -e "${RED}[x]${NC} $1"; exit 1; } # ─── Pre-checks ─── [[ -z "$REPO_URL" ]] && err "REPO_URL not set. Run: export REPO_URL='https://x-token-auth:YOUR_TOKEN@bitbucket.org/zlalani/social-reporting-tool.git'" command -v docker >/dev/null || err "Docker not installed" command -v docker compose >/dev/null 2>&1 || command -v docker-compose >/dev/null || err "Docker Compose not installed" command -v apache2ctl >/dev/null || err "Apache not installed" # ─── 1. Clone or pull repo ─── if [[ -d "$BACKEND_DIR/.git" ]]; then log "Updating existing repo at $BACKEND_DIR..." cd "$BACKEND_DIR" git remote set-url origin "$REPO_URL" git pull origin main else log "Cloning repo to $BACKEND_DIR..." sudo mkdir -p "$BACKEND_DIR" sudo chown "$(whoami):$(whoami)" "$BACKEND_DIR" git clone "$REPO_URL" "$BACKEND_DIR" fi cd "$BACKEND_DIR" # ─── 2. Create .env if missing ─── if [[ ! -f "$BACKEND_DIR/.env" ]]; then warn ".env file not found — creating template" cat > "$BACKEND_DIR/.env" << 'ENVEOF' APIFY_TOKEN=your_apify_token_here ANTHROPIC_API_KEY=your_anthropic_key_here APIFY_LIVE_APPROVED=true TEST_MODE=false DASHBOARD_PORT=3456 DATABASE_URL=postgresql://sl_user:sl_pass@db:5432/social_listening APIFY_COST_LIMIT=5 DASH_USER=admin DASH_PASS=changeme SESSION_SECRET= ENVEOF # Generate a random session secret SESSION_SECRET=$(openssl rand -hex 32) sed -i "s/^SESSION_SECRET=$/SESSION_SECRET=${SESSION_SECRET}/" "$BACKEND_DIR/.env" warn "Edit $BACKEND_DIR/.env with your API keys and credentials!" warn " APIFY_TOKEN, ANTHROPIC_API_KEY, DASH_USER, DASH_PASS" fi # ─── 3. Deploy frontend ─── log "Deploying frontend to $FRONTEND_DIR..." sudo mkdir -p "$FRONTEND_DIR" sudo cp "$BACKEND_DIR/frontend/index.html" "$FRONTEND_DIR/" sudo cp "$BACKEND_DIR/frontend/login.html" "$FRONTEND_DIR/" sudo cp "$BACKEND_DIR/frontend/config.js" "$FRONTEND_DIR/" sudo chown -R www-data:www-data "$FRONTEND_DIR" log "Frontend deployed: index.html, login.html, config.js" # ─── 4. Apache config ─── log "Setting up Apache config..." sudo cp "$BACKEND_DIR/deploy/apache-social-reports.conf" "$APACHE_CONF" # Enable required modules for mod in proxy proxy_http headers rewrite; do if ! apache2ctl -M 2>/dev/null | grep -q "${mod}_module"; then log "Enabling Apache module: $mod" sudo a2enmod "$mod" fi done # Enable the config sudo a2enconf social-reports 2>/dev/null || true # Test Apache config log "Testing Apache config..." if sudo apache2ctl configtest 2>&1; then log "Apache config OK" else err "Apache config test failed — check $APACHE_CONF" fi # ─── 5. Docker Compose ─── log "Starting Docker containers..." cd "$BACKEND_DIR" # Use the correct docker compose command if command -v "docker compose" >/dev/null 2>&1; then COMPOSE="docker compose" else COMPOSE="docker-compose" fi $COMPOSE -f docker-compose.yml -f docker-compose.prod.yml build $COMPOSE -f docker-compose.yml -f docker-compose.prod.yml up -d # Wait for health log "Waiting for services to be healthy..." sleep 5 if curl -sf http://127.0.0.1:3456/status > /dev/null 2>&1; then log "Backend is running on port 3456" else warn "Backend not responding yet — check: $COMPOSE logs social-listening" fi # ─── 6. Reload Apache ─── log "Reloading Apache..." sudo systemctl reload apache2 # ─── Done ─── echo "" echo "════════════════════════════════════════════════════" echo -e "${GREEN} Deployment complete!${NC}" echo "" echo " Frontend: https://optical-dev.oliver.solutions/social-reports/" echo " Backend: http://127.0.0.1:3456 (Docker)" echo " Login: https://optical-dev.oliver.solutions/social-reports/login.html" echo "" echo " Backend dir: $BACKEND_DIR" echo " Frontend dir: $FRONTEND_DIR" echo " Apache conf: $APACHE_CONF" echo "" echo " To update later:" echo " cd $BACKEND_DIR && git pull" echo " $COMPOSE -f docker-compose.yml -f docker-compose.prod.yml build && $COMPOSE -f docker-compose.yml -f docker-compose.prod.yml up -d" echo " sudo cp frontend/* $FRONTEND_DIR/ && sudo systemctl reload apache2" echo "" echo "════════════════════════════════════════════════════"