#!/bin/bash # scripts/dev-entrypoint.sh # ============================================================================ # Development Container Entrypoint # ============================================================================ # This script starts all development services when the container starts, # both with VS Code Dev Containers and with plain podman-compose. # # Services started: # - Nginx (HTTPS proxy: Vite 5173 -> 443, Bugsink 8000 -> 8443, API 3001) # - Bugsink (error tracking) on port 8000 # - Logstash (log aggregation) # - PM2 (process manager) running: # - flyer-crawler-api-dev: API server (port 3001) # - flyer-crawler-worker-dev: Background job worker # - flyer-crawler-vite-dev: Vite frontend dev server (port 5173) # # ADR-014: This architecture matches production (PM2 managing processes) # ADR-050: Logs are written to /var/log/pm2 for Logstash integration # ============================================================================ set -e echo "Starting Flyer Crawler Dev Container..." # ============================================================================ # Timezone Configuration # ============================================================================ # Ensure TZ is set for consistent log timestamps across all services. # TZ should be set via compose.dev.yml environment (default: America/Los_Angeles) # ============================================================================ if [ -n "$TZ" ]; then echo "Timezone configured: $TZ" # Link timezone data if available (for date command and other tools) if [ -f "/usr/share/zoneinfo/$TZ" ]; then ln -sf "/usr/share/zoneinfo/$TZ" /etc/localtime echo "$TZ" > /etc/timezone echo "System timezone set to: $(date +%Z) ($(date))" else echo "Warning: Timezone data not found for $TZ, using TZ environment variable only" fi else echo "Warning: TZ environment variable not set, using container default timezone" fi # Configure Bugsink HTTPS (ADR-015) echo "Configuring Bugsink HTTPS..." mkdir -p /etc/bugsink/ssl if [ ! -f "/etc/bugsink/ssl/localhost+2.pem" ]; then cd /etc/bugsink/ssl && mkcert localhost 127.0.0.1 ::1 > /dev/null 2>&1 fi # Create nginx config for Bugsink HTTPS cat > /etc/nginx/sites-available/bugsink <<'NGINX_EOF' server { listen 8443 ssl http2; listen [::]:8443 ssl http2; server_name localhost; ssl_certificate /etc/bugsink/ssl/localhost+2.pem; ssl_certificate_key /etc/bugsink/ssl/localhost+2-key.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_buffering off; client_max_body_size 20M; } } NGINX_EOF ln -sf /etc/nginx/sites-available/bugsink /etc/nginx/sites-enabled/bugsink # Copy the dev nginx config from mounted volume to nginx sites-available echo "Copying nginx dev config..." cp /app/docker/nginx/dev.conf /etc/nginx/sites-available/default # Ensure PM2 log directory exists with correct permissions echo "Setting up PM2 log directory..." mkdir -p /var/log/pm2 chmod 755 /var/log/pm2 # Start nginx in background (if installed) if command -v nginx &> /dev/null; then echo "Starting nginx (HTTPS: Vite 5173 -> 443, Bugsink 8000 -> 8443, API 3001 -> /api/)..." nginx & fi # Start Bugsink in background echo "Starting Bugsink error tracking..." /usr/local/bin/start-bugsink.sh > /var/log/bugsink/server.log 2>&1 & # Wait for Bugsink to initialize, then run snappea migrations echo "Waiting for Bugsink to initialize..." sleep 5 echo "Running Bugsink snappea database migrations..." cd /opt/bugsink/conf && \ export DATABASE_URL="postgresql://bugsink:bugsink_dev_password@postgres:5432/bugsink" && \ export SECRET_KEY="dev-bugsink-secret-key-minimum-50-characters-for-security" && \ /opt/bugsink/bin/bugsink-manage migrate --database=snappea > /dev/null 2>&1 # Start Snappea task worker echo "Starting Snappea task worker..." cd /opt/bugsink/conf && \ export DATABASE_URL="postgresql://bugsink:bugsink_dev_password@postgres:5432/bugsink" && \ export SECRET_KEY="dev-bugsink-secret-key-minimum-50-characters-for-security" && \ /opt/bugsink/bin/bugsink-manage runsnappea > /var/log/bugsink/snappea.log 2>&1 & # Start Logstash in background echo "Starting Logstash..." /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/bugsink.conf > /var/log/logstash/logstash.log 2>&1 & # Wait for services to initialize sleep 3 # Change to app directory cd /app # ============================================================================ # Start PM2 (ADR-014: Production-like process management) # ============================================================================ # PM2 manages all Node.js processes: # - API server (tsx watch server.ts) # - Background worker (tsx watch src/services/worker.ts) # - Vite dev server (vite --host) # # Logs are written to /var/log/pm2 for Logstash integration (ADR-050) # ============================================================================ echo "Starting PM2 with development configuration..." echo " - API Server: http://localhost:3001 (proxied via nginx)" echo " - Frontend: https://localhost (nginx HTTPS -> Vite on 5173)" echo " - Bugsink: https://localhost:8443 (nginx HTTPS -> Bugsink on 8000)" echo " - PM2 Logs: /var/log/pm2/*.log" echo "" echo "Note: Accept the self-signed certificate warnings in your browser" echo "" # Delete any existing PM2 processes (clean start) pm2 delete all 2>/dev/null || true # Start PM2 with the dev ecosystem config pm2 start /app/ecosystem.dev.config.cjs # Show PM2 status echo "" echo "--- PM2 Process Status ---" pm2 status echo "-------------------------" echo "" echo "PM2 Commands:" echo " pm2 logs # View all logs (tail -f style)" echo " pm2 logs api # View API logs only" echo " pm2 restart all # Restart all processes" echo " pm2 status # Show process status" echo "" # Keep the container running by tailing PM2 logs # This ensures: # 1. Container stays alive # 2. Logs are visible in docker logs / podman logs # 3. PM2 processes continue running exec pm2 logs --raw