- 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>
144 lines
5.3 KiB
Bash
Executable file
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 "════════════════════════════════════════════════════"
|