Files
sharey/production.py
2025-09-27 17:45:52 +01:00

108 lines
2.9 KiB
Python

#!/usr/bin/env python3
"""
Production runner for Sharey using Gunicorn
"""
import sys
import os
import subprocess
from pathlib import Path
def check_gunicorn():
"""Check if gunicorn is installed"""
try:
import gunicorn
return True
except ImportError:
return False
def install_gunicorn():
"""Install gunicorn"""
print("📦 Installing gunicorn...")
try:
subprocess.check_call([sys.executable, "-m", "pip", "install", "gunicorn"])
print("✅ Gunicorn installed successfully")
return True
except subprocess.CalledProcessError:
print("❌ Failed to install gunicorn")
return False
def start_production_server():
"""Start Sharey with Gunicorn"""
# Add src directory to Python path
src_path = Path(__file__).parent / "src"
if str(src_path) not in sys.path:
sys.path.insert(0, str(src_path))
# Check if gunicorn is available
if not check_gunicorn():
print("⚠️ Gunicorn not found")
if input("📦 Install gunicorn? (y/n): ").lower().startswith('y'):
if not install_gunicorn():
return False
else:
print("❌ Cannot start production server without gunicorn")
return False
print("🚀 Starting Sharey with Gunicorn (Production Mode)")
print("=" * 60)
# Load configuration
try:
from config import config
host = config.get('flask.host', '0.0.0.0')
port = config.get('flask.port', 8866)
print(f"🌐 Host: {host}")
print(f"🔌 Port: {port}")
print(f"📁 Working directory: {Path.cwd()}")
print("=" * 60)
except Exception as e:
print(f"❌ Error loading configuration: {e}")
return False
# Gunicorn command arguments
gunicorn_args = [
sys.executable, "-m", "gunicorn",
"--bind", f"{host}:{port}",
"--workers", "4",
"--worker-class", "sync",
"--timeout", "120",
"--max-requests", "1000",
"--max-requests-jitter", "100",
"--access-logfile", "-",
"--error-logfile", "-",
"--log-level", "info",
"--pythonpath", str(src_path),
"wsgi:app"
]
try:
print("🎯 Starting server...")
print("Press Ctrl+C to stop")
print("=" * 60)
subprocess.run(gunicorn_args)
except KeyboardInterrupt:
print("\n👋 Server stopped by user")
except Exception as e:
print(f"❌ Error starting server: {e}")
return False
return True
def main():
"""Main entry point"""
print("🏭 Sharey Production Server")
print("=" * 40)
if start_production_server():
print("✅ Server stopped gracefully")
else:
print("❌ Server failed to start")
sys.exit(1)
if __name__ == "__main__":
main()