Spaces:
Sleeping
Sleeping
import subprocess | |
import sys | |
import time | |
import os | |
import signal | |
import atexit | |
# Global process references | |
processes = [] | |
def cleanup_processes(): | |
"""Clean up all processes""" | |
print("\nπ§Ή Cleaning up processes...") | |
# Kill our spawned processes | |
for proc in processes: | |
try: | |
if proc and proc.poll() is None: | |
proc.terminate() | |
proc.wait(timeout=5) | |
except: | |
pass | |
# Kill any remaining processes by name | |
os.system("pkill -f 'uvicorn' 2>/dev/null") | |
os.system("pkill -f 'streamlit' 2>/dev/null") | |
print("β Cleanup completed") | |
def signal_handler(signum, frame): | |
"""Handle shutdown signals""" | |
print(f"\nβ οΈ Received signal {signum}, shutting down...") | |
cleanup_processes() | |
sys.exit(0) | |
def main(): | |
print("π Starting GitHub Activity Feed...") | |
# Register cleanup function | |
atexit.register(cleanup_processes) | |
# Set up signal handlers | |
signal.signal(signal.SIGINT, signal_handler) | |
signal.signal(signal.SIGTERM, signal_handler) | |
# Clean up any existing processes | |
cleanup_processes() | |
time.sleep(2) | |
try: | |
# Start FastAPI in background | |
print("π‘ Starting FastAPI webhook server...") | |
fastapi_process = subprocess.Popen([ | |
sys.executable, "-c", """ | |
import uvicorn | |
from api import app | |
import socket | |
def find_free_port(start=7861): | |
for port in range(start, start + 20): | |
try: | |
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: | |
s.bind(('', port)) | |
print(f'FastAPI running on port {port}') | |
return port | |
except OSError: | |
continue | |
return 8000 | |
port = find_free_port() | |
uvicorn.run(app, host='0.0.0.0', port=port, log_level='warning', access_log=False) | |
""" | |
], stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
processes.append(fastapi_process) | |
# Wait for FastAPI to start | |
print("β³ Waiting for FastAPI to initialize...") | |
time.sleep(8) | |
# Start Streamlit | |
print("π₯οΈ Starting Streamlit dashboard...") | |
streamlit_process = subprocess.Popen([ | |
"streamlit", "run", "app.py", | |
"--server.port=8501", | |
"--server.address=0.0.0.0", | |
"--server.headless=true", | |
"--global.disableWatchdogWarning=true", | |
"--server.enableCORS=false", | |
"--server.enableXsrfProtection=false", | |
"--browser.gatherUsageStats=false" | |
], stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
processes.append(streamlit_process) | |
print("β Both services started successfully!") | |
print("π‘ FastAPI webhook server is running") | |
print("π₯οΈ Streamlit dashboard available on port 8501") | |
print("π Monitoring services...") | |
# Monitor processes | |
while True: | |
# Check if processes are still running | |
if fastapi_process.poll() is not None: | |
print("β FastAPI process stopped") | |
break | |
if streamlit_process.poll() is not None: | |
print("β Streamlit process stopped") | |
break | |
time.sleep(10) | |
except KeyboardInterrupt: | |
print("\nβ οΈ Received keyboard interrupt") | |
cleanup_processes() | |
except Exception as e: | |
print(f"β Error: {e}") | |
cleanup_processes() | |
sys.exit(1) | |
if __name__ == "__main__": | |
main() |