| |
| """ |
| Simplified Production Deployment Script for Atom AI Assistant |
| |
| This script creates all necessary configuration files and scripts |
| for production deployment of the OAuth authentication system. |
| |
| Usage: |
| python deploy_production_simple.py |
| """ |
|
|
| from datetime import datetime |
| import json |
| import os |
| import secrets |
|
|
|
|
| def create_oauth_config(): |
| """Create OAuth configuration for remaining services""" |
| config = { |
| "production_domain": "your-production-domain.com", |
| "remaining_services": ["outlook", "teams", "github"], |
| "oauth_config": { |
| "outlook": { |
| "client_id": "YOUR_OUTLOOK_CLIENT_ID", |
| "client_secret": "YOUR_OUTLOOK_CLIENT_SECRET", |
| "redirect_uri": "https://your-production-domain.com/api/auth/outlook/oauth2callback", |
| "scopes": [ |
| "https://graph.microsoft.com/Mail.Read", |
| "https://graph.microsoft.com/Calendars.Read", |
| ], |
| "setup_url": "https://portal.azure.com", |
| }, |
| "teams": { |
| "client_id": "YOUR_TEAMS_CLIENT_ID", |
| "client_secret": "YOUR_TEAMS_CLIENT_SECRET", |
| "redirect_uri": "https://your-production-domain.com/api/auth/teams/oauth2callback", |
| "scopes": ["https://graph.microsoft.com/Team.ReadBasic.All"], |
| "setup_url": "https://portal.azure.com", |
| }, |
| "github": { |
| "client_id": "YOUR_GITHUB_CLIENT_ID", |
| "client_secret": "YOUR_GITHUB_CLIENT_SECRET", |
| "redirect_uri": "https://your-production-domain.com/api/auth/github/oauth2callback", |
| "scopes": ["repo", "user", "read:org"], |
| "setup_url": "https://github.com/settings/developers", |
| }, |
| }, |
| } |
|
|
| with open("oauth_production_config.json", "w") as f: |
| json.dump(config, f, indent=2) |
|
|
| print("✅ Created oauth_production_config.json") |
|
|
|
|
| def create_production_env(): |
| """Create production environment file""" |
| env_content = f"""# Production Environment Configuration |
| # Generated: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} |
| |
| # Application Settings |
| FLASK_ENV=production |
| DEBUG=False |
| SECRET_KEY={secrets.token_urlsafe(32)} |
| |
| # Server Configuration |
| HOST=0.0.0.0 |
| PORT=5058 |
| PRODUCTION_DOMAIN=your-production-domain.com |
| |
| # Database Configuration |
| DATABASE_URL=sqlite:///./data/atom_production.db |
| |
| # Security Configuration |
| ATOM_OAUTH_ENCRYPTION_KEY={secrets.token_urlsafe(32)} |
| CSRF_ENABLED=True |
| SESSION_SECURE=True |
| |
| # OAuth Services - Update with real credentials |
| GOOGLE_CLIENT_ID=your_google_client_id |
| GOOGLE_CLIENT_SECRET=your_google_client_secret |
| SLACK_CLIENT_ID=your_slack_client_id |
| SLACK_CLIENT_SECRET=your_slack_client_secret |
| TRELLO_API_KEY=your_trello_api_key |
| TRELLO_API_SECRET=your_trello_api_secret |
| ASANA_CLIENT_ID=your_asana_client_id |
| ASANA_CLIENT_SECRET=your_asana_client_secret |
| NOTION_CLIENT_ID=your_notion_client_id |
| NOTION_CLIENT_SECRET=your_notion_client_secret |
| DROPBOX_CLIENT_ID=your_dropbox_client_id |
| DROPBOX_CLIENT_SECRET=your_dropbox_client_secret |
| |
| # Remaining OAuth Services - TODO: Configure |
| OUTLOOK_CLIENT_ID=YOUR_OUTLOOK_CLIENT_ID |
| OUTLOOK_CLIENT_SECRET=YOUR_OUTLOOK_CLIENT_SECRET |
| TEAMS_CLIENT_ID=YOUR_TEAMS_CLIENT_ID |
| TEAMS_CLIENT_SECRET=YOUR_TEAMS_CLIENT_SECRET |
| GITHUB_CLIENT_ID=YOUR_GITHUB_CLIENT_ID |
| GITHUB_CLIENT_SECRET=YOUR_GITHUB_CLIENT_SECRET |
| |
| # AI Provider Configuration |
| OPENAI_API_KEY=your_openai_api_key |
| ANTHROPIC_API_KEY=your_anthropic_api_key |
| |
| # Monitoring |
| ENABLE_METRICS=True |
| LOG_LEVEL=INFO |
| HEALTH_CHECK_INTERVAL=30 |
| """ |
|
|
| with open(".env.production", "w") as f: |
| f.write(env_content) |
|
|
| print("✅ Created .env.production") |
|
|
|
|
| def create_setup_script(): |
| """Create OAuth setup script""" |
| script_content = f"""#!/bin/bash |
| # OAuth Service Setup Script |
| # Generated: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} |
| |
| echo "🚀 Setting up OAuth Services for Production" |
| echo "==========================================" |
| |
| echo "" |
| echo "📋 Remaining Services to Configure:" |
| echo " - Microsoft Outlook" |
| echo " - Microsoft Teams" |
| echo " - GitHub" |
| echo "" |
| |
| echo "🔧 Setup Instructions:" |
| echo "" |
| echo "1. Microsoft Azure (Outlook & Teams):" |
| echo " - Go to: https://portal.azure.com" |
| echo " - Create app registration" |
| echo " - Add redirect URIs:" |
| echo " - https://your-production-domain.com/api/auth/outlook/oauth2callback" |
| echo " - https://your-production-domain.com/api/auth/teams/oauth2callback" |
| echo " - Configure API permissions:" |
| echo " - Mail.Read, Calendars.Read, Team.ReadBasic.All" |
| echo "" |
| |
| echo "2. GitHub:" |
| echo " - Go to: https://github.com/settings/developers" |
| echo " - Create OAuth App" |
| echo " - Set callback URL:" |
| echo " - https://your-production-domain.com/api/auth/github/oauth2callback" |
| echo " - Configure scopes: repo, user, read:org" |
| echo "" |
| |
| echo "📝 Update .env.production with:" |
| echo "OUTLOOK_CLIENT_ID=your_microsoft_client_id" |
| echo "OUTLOOK_CLIENT_SECRET=your_microsoft_client_secret" |
| echo "TEAMS_CLIENT_ID=your_teams_client_id" |
| echo "TEAMS_CLIENT_SECRET=your_teams_client_secret" |
| echo "GITHUB_CLIENT_ID=your_github_client_id" |
| echo "GITHUB_CLIENT_SECRET=your_github_client_secret" |
| echo "" |
| |
| echo "✅ After configuration:" |
| echo " - Restart backend server" |
| echo " - Run: python test_oauth_validation.py" |
| echo " - Verify all 10 services show as connected" |
| echo "" |
| |
| echo "🎉 Setup script completed" |
| """ |
|
|
| with open("setup_oauth.sh", "w") as f: |
| f.write(script_content) |
|
|
| |
| os.chmod("setup_oauth.sh", 0o755) |
| print("✅ Created setup_oauth.sh") |
|
|
|
|
| def create_backup_script(): |
| """Create database backup script""" |
| script_content = f"""#!/bin/bash |
| # Database Backup Script |
| # Generated: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} |
| |
| BACKUP_DIR="./backups" |
| DATE=$(date +%Y%m%d_%H%M%S) |
| DB_FILE="./data/atom_production.db" |
| |
| echo "💾 Starting database backup..." |
| |
| # Create backup directory |
| mkdir -p "$BACKUP_DIR" |
| |
| # Backup SQLite database |
| if [ -f "$DB_FILE" ]; then |
| sqlite3 "$DB_FILE" ".backup $BACKUP_DIR/atom_backup_$DATE.db" |
| echo "✅ Database backed up to: $BACKUP_DIR/atom_backup_$DATE.db" |
| else |
| echo "❌ Database file not found: $DB_FILE" |
| exit 1 |
| fi |
| |
| # Backup configuration files |
| tar -czf "$BACKUP_DIR/config_backup_$DATE.tar.gz" \\ |
| .env.production \\ |
| oauth_production_config.json |
| |
| echo "✅ Configuration files backed up" |
| |
| # Clean up old backups (keep last 7 days) |
| find "$BACKUP_DIR" -name "*.db" -mtime +7 -delete |
| find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete |
| |
| echo "🧹 Old backups cleaned up" |
| echo "🎉 Backup completed successfully" |
| """ |
|
|
| with open("backup_database.sh", "w") as f: |
| f.write(script_content) |
|
|
| |
| os.chmod("backup_database.sh", 0o755) |
| print("✅ Created backup_database.sh") |
|
|
|
|
| def create_deployment_plan(): |
| """Create deployment plan""" |
| plan = { |
| "deployment_id": f"atom_production_{datetime.now().strftime('%Y%m%d_%H%M%S')}", |
| "timestamp": datetime.now().isoformat(), |
| "status": "configuration_ready", |
| "current_state": { |
| "oauth_services_connected": 7, |
| "oauth_services_total": 10, |
| "remaining_services": ["outlook", "teams", "github"], |
| "backend_operational": True, |
| "security_implemented": True, |
| }, |
| "deployment_steps": [ |
| { |
| "step": 1, |
| "name": "Configure OAuth Services", |
| "description": "Setup Microsoft Azure and GitHub OAuth applications", |
| "status": "pending", |
| "estimated_time": "1-2 hours", |
| }, |
| { |
| "step": 2, |
| "name": "Setup Production Domain", |
| "description": "Configure DNS and SSL/TLS certificates", |
| "status": "pending", |
| "estimated_time": "1 hour", |
| }, |
| { |
| "step": 3, |
| "name": "Deploy to Production", |
| "description": "Deploy application to production server", |
| "status": "pending", |
| "estimated_time": "30 minutes", |
| }, |
| { |
| "step": 4, |
| "name": "Configure Monitoring", |
| "description": "Setup health monitoring and alerting", |
| "status": "pending", |
| "estimated_time": "1 hour", |
| }, |
| { |
| "step": 5, |
| "name": "Setup Backups", |
| "description": "Configure automated database backups", |
| "status": "pending", |
| "estimated_time": "30 minutes", |
| }, |
| ], |
| "success_criteria": [ |
| "10/10 OAuth services operational", |
| "Production domain accessible via HTTPS", |
| "All health endpoints responding correctly", |
| "Monitoring and alerting configured", |
| "Automated backups running", |
| ], |
| } |
|
|
| with open("production_deployment_plan.json", "w") as f: |
| json.dump(plan, f, indent=2) |
|
|
| print("✅ Created production_deployment_plan.json") |
|
|
|
|
| def create_monitoring_script(): |
| """Create simple monitoring script""" |
| script_content = '''#!/usr/bin/env python3 |
| """ |
| Simple Service Monitoring Script |
| |
| Checks health endpoints and logs status. |
| |
| Usage: |
| python monitor_services.py |
| """ |
| |
| import requests |
| import time |
| import json |
| from datetime import datetime |
| |
| BASE_URL = "http://localhost:5058" |
| ENDPOINTS = [ |
| "/healthz", |
| "/api/services/status", |
| "/api/auth/oauth-status" |
| ] |
| |
| def check_endpoint(endpoint): |
| """Check a single endpoint""" |
| try: |
| start = time.time() |
| response = requests.get(f"{BASE_URL}{endpoint}", timeout=5) |
| response_time = (time.time() - start) * 1000 |
| |
| return { |
| "endpoint": endpoint, |
| "status_code": response.status_code, |
| "response_time": response_time, |
| "success": response.status_code == 200, |
| "timestamp": datetime.now().isoformat() |
| } |
| except Exception as e: |
| return { |
| "endpoint": endpoint, |
| "status_code": None, |
| "response_time": None, |
| "success": False, |
| "error": str(e), |
| "timestamp": datetime.now().isoformat() |
| } |
| |
| def main(): |
| """Main monitoring function""" |
| print("🔍 Atom AI Assistant Service Monitor") |
| print("=" * 40) |
| |
| results = [] |
| for endpoint in ENDPOINTS: |
| result = check_endpoint(endpoint) |
| results.append(result) |
| |
| if result["success"]: |
| print(f"✅ {endpoint}: {result['response_time']:.1f}ms") |
| else: |
| print(f"❌ {endpoint}: {result.get('error', 'Unknown error')}") |
| |
| # Save results |
| with open("monitoring_results.json", "w") as f: |
| json.dump({ |
| "timestamp": datetime.now().isoformat(), |
| "results": results |
| }, f, indent=2) |
| |
| print(f"📊 Monitoring completed: {sum(1 for r in results if r['success'])}/{len(results)} endpoints OK") |
| |
| if __name__ == "__main__": |
| main() |
| ''' |
|
|
| with open("monitor_services.py", "w") as f: |
| f.write(script_content) |
|
|
| print("✅ Created monitor_services.py") |
|
|
|
|
| def main(): |
| """Main execution function""" |
| print("🚀 Starting Production Deployment Setup") |
| print("=" * 50) |
| print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") |
| print("=" * 50) |
|
|
| try: |
| |
| create_oauth_config() |
| create_production_env() |
| create_setup_script() |
| create_backup_script() |
| create_deployment_plan() |
| create_monitoring_script() |
|
|
| print("") |
| print("🎉 PRODUCTION DEPLOYMENT SETUP COMPLETED") |
| print("=" * 50) |
| print("📁 Created Files:") |
| print(" - oauth_production_config.json") |
| print(" - .env.production") |
| print(" - setup_oauth.sh") |
| print(" - backup_database.sh") |
| print(" - production_deployment_plan.json") |
| print(" - monitor_services.py") |
| print("") |
| print("💡 Next Steps:") |
| print(" 1. Run: bash setup_oauth.sh") |
| print(" 2. Configure OAuth credentials in .env.production") |
| print(" 3. Deploy to production server") |
| print(" 4. Setup monitoring and backups") |
| print("") |
| print("✅ System is ready for production deployment!") |
|
|
| except Exception as e: |
| print(f"❌ Setup failed: {e}") |
| return 1 |
|
|
| return 0 |
|
|
|
|
| if __name__ == "__main__": |
| exit(main()) |
|
|