social-reporting-tool/deploy/setup.sh
DJP c5c40aa4e5 Add server deployment: Apache proxy, static frontend, deploy script
- Static frontend (index.html, login.html, config.js) for Apache serving
- JSON-based auth API endpoints (/api/login, /api/auth, /api/logout)
- Apache config with ProxyPass for /social-reports path
- deploy/setup.sh for Ubuntu + Apache + Docker deployment
- docker-compose.prod.yml binds ports to 127.0.0.1 only
- Configurable API base URL via frontend/config.js

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 11:23:47 -04:00

144 lines
5.3 KiB
Bash
Executable file

#!/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 "════════════════════════════════════════════════════"