All checks were successful
Deploy to Test Environment / deploy-to-test (push) Successful in 19m4s
171 lines
6.3 KiB
Bash
171 lines
6.3 KiB
Bash
#!/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
|