- matrix-gateway: POST /internal/matrix/presence/online endpoint - usePresenceHeartbeat hook with activity tracking - Auto away after 5 min inactivity - Offline on page close/visibility change - Integrated in MatrixChatRoom component
427 lines
12 KiB
Bash
Executable File
427 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# ============================================================================
|
|
# MVP Deployment Script for NODE1 (Hetzner GEX44)
|
|
# Deploys: Agents, City, Second Me, MicroDAO services
|
|
# ============================================================================
|
|
|
|
set -e # Exit on error
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
NODE1_IP="144.76.224.179"
|
|
NODE1_USER="root"
|
|
PROJECT_ROOT="/opt/microdao-daarion"
|
|
BACKUP_DIR="/root/backups"
|
|
LOG_FILE="/tmp/mvp-deploy-$(date +%Y%m%d_%H%M%S).log"
|
|
|
|
# Functions
|
|
log() {
|
|
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
error() {
|
|
echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE"
|
|
exit 1
|
|
}
|
|
|
|
warn() {
|
|
echo -e "${YELLOW}[WARN]${NC} $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 0: Pre-flight Checks
|
|
# ============================================================================
|
|
|
|
phase_0_preflight() {
|
|
log "Phase 0: Pre-flight checks..."
|
|
|
|
# Check if running on NODE2 (local)
|
|
if [[ "$(hostname)" == *"MacBook"* ]] || [[ "$(uname)" == "Darwin" ]]; then
|
|
info "Running on NODE2 (MacBook) - will deploy to NODE1"
|
|
|
|
# Check git status
|
|
if [[ -n $(git status --porcelain) ]]; then
|
|
warn "Uncommitted changes detected!"
|
|
read -p "Commit changes? (y/n) " -n 1 -r
|
|
echo
|
|
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
|
git add .
|
|
git commit -m "MVP Phase 1-3: Prepare for NODE1 deployment"
|
|
git push origin main
|
|
log "Changes committed and pushed"
|
|
else
|
|
error "Please commit changes before deployment"
|
|
fi
|
|
fi
|
|
|
|
# Push to GitHub
|
|
log "Pushing to GitHub..."
|
|
git push origin main || warn "Git push failed (maybe already up to date)"
|
|
|
|
else
|
|
error "This script should run on NODE2 (local machine)"
|
|
fi
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 1: SSH to NODE1 and Backup
|
|
# ============================================================================
|
|
|
|
phase_1_backup() {
|
|
log "Phase 1: Connecting to NODE1 and creating backup..."
|
|
|
|
ssh "$NODE1_USER@$NODE1_IP" << 'ENDSSH'
|
|
set -e
|
|
|
|
echo "=== NODE1: Creating backup ==="
|
|
|
|
# Create backup directory
|
|
mkdir -p /root/backups
|
|
|
|
# Backup PostgreSQL
|
|
BACKUP_FILE="/root/backups/daarion_$(date +%Y%m%d_%H%M%S).sql"
|
|
echo "Backing up PostgreSQL to $BACKUP_FILE..."
|
|
docker exec daarion-postgres pg_dump -U postgres daarion > "$BACKUP_FILE"
|
|
|
|
if [[ -f "$BACKUP_FILE" ]]; then
|
|
SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
|
echo "✅ Backup created: $BACKUP_FILE ($SIZE)"
|
|
else
|
|
echo "❌ Backup failed!"
|
|
exit 1
|
|
fi
|
|
|
|
# List existing tables
|
|
echo "=== Existing tables ==="
|
|
docker exec daarion-postgres psql -U postgres -d daarion -c "\dt" | grep -E "agents|microdao|city|secondme" || echo "No MVP tables yet"
|
|
|
|
echo "=== Backup complete ==="
|
|
ENDSSH
|
|
|
|
log "Backup created successfully"
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 2: Sync Code to NODE1
|
|
# ============================================================================
|
|
|
|
phase_2_sync_code() {
|
|
log "Phase 2: Syncing code to NODE1..."
|
|
|
|
ssh "$NODE1_USER@$NODE1_IP" << 'ENDSSH'
|
|
set -e
|
|
|
|
echo "=== NODE1: Syncing code from GitHub ==="
|
|
|
|
cd /opt/microdao-daarion
|
|
|
|
# Check current status
|
|
echo "Current branch:"
|
|
git branch --show-current
|
|
|
|
echo "Last commit:"
|
|
git log --oneline -1
|
|
|
|
# Pull latest changes
|
|
echo "Pulling latest changes..."
|
|
git fetch origin
|
|
git pull origin main
|
|
|
|
echo "New commit:"
|
|
git log --oneline -1
|
|
|
|
# Verify services exist
|
|
echo "=== Verifying services ==="
|
|
for service in agents-service city-service secondme-service microdao-service; do
|
|
if [[ -d "services/$service" ]]; then
|
|
echo "✅ services/$service exists"
|
|
else
|
|
echo "❌ services/$service NOT FOUND!"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# Verify migrations
|
|
echo "=== Verifying migrations ==="
|
|
for migration in 007 008 010; do
|
|
if ls migrations/${migration}_*.sql 1> /dev/null 2>&1; then
|
|
echo "✅ Migration $migration exists"
|
|
else
|
|
echo "❌ Migration $migration NOT FOUND!"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
echo "=== Code sync complete ==="
|
|
ENDSSH
|
|
|
|
log "Code synced successfully"
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 3: Apply Database Migrations
|
|
# ============================================================================
|
|
|
|
phase_3_migrations() {
|
|
log "Phase 3: Applying database migrations..."
|
|
|
|
ssh "$NODE1_USER@$NODE1_IP" << 'ENDSSH'
|
|
set -e
|
|
|
|
echo "=== NODE1: Applying migrations ==="
|
|
|
|
cd /opt/microdao-daarion
|
|
|
|
# Apply migrations one by one
|
|
for migration in 007_create_agents_tables.sql 008_create_microdao_core.sql 010_create_city_backend.sql; do
|
|
echo "Applying migration: $migration"
|
|
|
|
if docker exec -i daarion-postgres psql -U postgres -d daarion < migrations/$migration; then
|
|
echo "✅ Migration $migration applied"
|
|
else
|
|
echo "⚠️ Migration $migration failed (might be already applied)"
|
|
fi
|
|
done
|
|
|
|
# Verify tables
|
|
echo "=== Verifying tables ==="
|
|
docker exec daarion-postgres psql -U postgres -d daarion -c "\dt" | grep -E "agents|microdao|city|secondme"
|
|
|
|
echo "=== Migrations complete ==="
|
|
ENDSSH
|
|
|
|
log "Migrations applied successfully"
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 4: Build Docker Images
|
|
# ============================================================================
|
|
|
|
phase_4_build() {
|
|
log "Phase 4: Building Docker images..."
|
|
|
|
ssh "$NODE1_USER@$NODE1_IP" << 'ENDSSH'
|
|
set -e
|
|
|
|
echo "=== NODE1: Building Docker images ==="
|
|
|
|
cd /opt/microdao-daarion
|
|
|
|
# Build each service
|
|
for service in agents-service city-service secondme-service microdao-service; do
|
|
echo "Building $service..."
|
|
if docker build -t daarion-$service:latest ./services/$service; then
|
|
echo "✅ $service built successfully"
|
|
else
|
|
echo "❌ $service build failed!"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# List images
|
|
echo "=== Docker images ==="
|
|
docker images | grep daarion
|
|
|
|
echo "=== Build complete ==="
|
|
ENDSSH
|
|
|
|
log "Docker images built successfully"
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 5: Start Services
|
|
# ============================================================================
|
|
|
|
phase_5_start_services() {
|
|
log "Phase 5: Starting MVP services..."
|
|
|
|
ssh "$NODE1_USER@$NODE1_IP" << 'ENDSSH'
|
|
set -e
|
|
|
|
echo "=== NODE1: Starting services ==="
|
|
|
|
cd /opt/microdao-daarion
|
|
|
|
# Create minimal docker-compose.mvp.yml if not exists
|
|
cat > docker-compose.mvp.yml << 'EOF'
|
|
version: '3.9'
|
|
|
|
networks:
|
|
daarion_net:
|
|
external: true
|
|
|
|
services:
|
|
agents-service:
|
|
image: daarion-agents-service:latest
|
|
container_name: daarion-agents-service
|
|
environment:
|
|
PORT: "7014"
|
|
DATABASE_URL: "postgresql://postgres:postgres@daarion-postgres:5432/daarion"
|
|
NATS_URL: "nats://daarion-nats:4222"
|
|
networks:
|
|
- daarion_net
|
|
restart: unless-stopped
|
|
|
|
city-service:
|
|
image: daarion-city-service:latest
|
|
container_name: daarion-city-service
|
|
environment:
|
|
PORT: "7001"
|
|
DATABASE_URL: "postgresql://postgres:postgres@daarion-postgres:5432/daarion"
|
|
NATS_URL: "nats://daarion-nats:4222"
|
|
REDIS_URL: "redis://daarion-redis:6379"
|
|
networks:
|
|
- daarion_net
|
|
restart: unless-stopped
|
|
|
|
secondme-service:
|
|
image: daarion-secondme-service:latest
|
|
container_name: daarion-secondme-service
|
|
environment:
|
|
PORT: "7003"
|
|
DATABASE_URL: "postgresql://postgres:postgres@daarion-postgres:5432/daarion"
|
|
AGENTS_SERVICE_URL: "http://daarion-agents-service:7014"
|
|
SECONDME_AGENT_ID: "ag_secondme_global"
|
|
networks:
|
|
- daarion_net
|
|
restart: unless-stopped
|
|
|
|
microdao-service:
|
|
image: daarion-microdao-service:latest
|
|
container_name: daarion-microdao-service
|
|
environment:
|
|
PORT: "7015"
|
|
DATABASE_URL: "postgresql://postgres:postgres@daarion-postgres:5432/daarion"
|
|
NATS_URL: "nats://daarion-nats:4222"
|
|
networks:
|
|
- daarion_net
|
|
restart: unless-stopped
|
|
EOF
|
|
|
|
echo "Docker Compose file created"
|
|
|
|
# Start services
|
|
echo "Starting MVP services..."
|
|
docker compose -f docker-compose.mvp.yml up -d
|
|
|
|
# Wait 10 seconds for services to start
|
|
echo "Waiting 10 seconds for services to start..."
|
|
sleep 10
|
|
|
|
# Check status
|
|
echo "=== Service status ==="
|
|
docker ps | grep -E "agents-service|city-service|secondme|microdao"
|
|
|
|
echo "=== Services started ==="
|
|
ENDSSH
|
|
|
|
log "Services started successfully"
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 6: Health Checks
|
|
# ============================================================================
|
|
|
|
phase_6_health_checks() {
|
|
log "Phase 6: Running health checks..."
|
|
|
|
ssh "$NODE1_USER@$NODE1_IP" << 'ENDSSH'
|
|
set -e
|
|
|
|
echo "=== NODE1: Health checks ==="
|
|
|
|
# Wait a bit more
|
|
sleep 5
|
|
|
|
# Check each service
|
|
echo "City Service (7001):"
|
|
curl -f http://localhost:7001/health || echo "FAILED"
|
|
|
|
echo "Second Me (7003):"
|
|
curl -f http://localhost:7003/health || echo "FAILED"
|
|
|
|
echo "Agents Service (7014):"
|
|
curl -f http://localhost:7014/health || echo "FAILED"
|
|
|
|
echo "MicroDAO Service (7015):"
|
|
curl -f http://localhost:7015/health || echo "FAILED"
|
|
|
|
echo "=== Health checks complete ==="
|
|
ENDSSH
|
|
|
|
log "Health checks completed"
|
|
}
|
|
|
|
# ============================================================================
|
|
# Phase 7: Summary
|
|
# ============================================================================
|
|
|
|
phase_7_summary() {
|
|
log "Phase 7: Deployment summary..."
|
|
|
|
echo ""
|
|
echo "=========================================="
|
|
echo " MVP DEPLOYMENT COMPLETE! 🎉"
|
|
echo "=========================================="
|
|
echo ""
|
|
echo "Deployed services:"
|
|
echo " • City Service (7001)"
|
|
echo " • Second Me (7003)"
|
|
echo " • Agents Service (7014)"
|
|
echo " • MicroDAO Service (7015)"
|
|
echo ""
|
|
echo "Next steps:"
|
|
echo " 1. Update Nginx config (manually or via script)"
|
|
echo " 2. Run smoke tests"
|
|
echo " 3. Monitor logs for 15 minutes"
|
|
echo ""
|
|
echo "Rollback command (if needed):"
|
|
echo " ssh root@144.76.224.179 'cd /opt/microdao-daarion && docker compose -f docker-compose.mvp.yml down'"
|
|
echo ""
|
|
echo "Log file: $LOG_FILE"
|
|
echo "=========================================="
|
|
}
|
|
|
|
# ============================================================================
|
|
# Main Execution
|
|
# ============================================================================
|
|
|
|
main() {
|
|
log "🚀 Starting MVP Deployment to NODE1..."
|
|
log "Target: $NODE1_USER@$NODE1_IP"
|
|
log "Project: $PROJECT_ROOT"
|
|
echo ""
|
|
|
|
read -p "Continue with deployment? (y/n) " -n 1 -r
|
|
echo
|
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
error "Deployment cancelled by user"
|
|
fi
|
|
|
|
phase_0_preflight
|
|
phase_1_backup
|
|
phase_2_sync_code
|
|
phase_3_migrations
|
|
phase_4_build
|
|
phase_5_start_services
|
|
phase_6_health_checks
|
|
phase_7_summary
|
|
|
|
log "✅ MVP Deployment completed successfully!"
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|
|
|