145 lines
5.2 KiB
Python
145 lines
5.2 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
GasFlux Web API Server using Waitress WSGI server.
|
|
|
|
This is the production server entry point for the GasFlux Web API.
|
|
Includes full GasFlux processing capabilities with task pool management.
|
|
|
|
Features:
|
|
- File upload and processing (.xlsx, .xls)
|
|
- Asynchronous task processing with background workers
|
|
- Task pool management with pagination and filtering
|
|
- Real-time task status monitoring
|
|
- Report generation and file download
|
|
- Health monitoring and statistics
|
|
|
|
API Endpoints:
|
|
- /upload - File upload and processing initiation
|
|
- /task/<task_id> - Task status management
|
|
- /tasks - Task pool management (NEW)
|
|
- /download/<filename> - File download
|
|
- /reports - Report listing
|
|
- /health - Health monitoring
|
|
- /stats - System statistics
|
|
- /config - Configuration info
|
|
- / - Web interface
|
|
|
|
Usage:
|
|
python server_waitress.py
|
|
|
|
Or package with PyInstaller:
|
|
pyinstaller --onefile --name GasFluxAPI server_waitress.py
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add the project root and src directory to PYTHONPATH
|
|
project_root = Path(__file__).parent.absolute()
|
|
src_dir = project_root / "src"
|
|
|
|
sys.path.insert(0, str(project_root))
|
|
sys.path.insert(0, str(src_dir))
|
|
|
|
# Set environment variables for production
|
|
os.environ['FLASK_APP'] = 'src/gasflux/app.py'
|
|
os.environ['FLASK_ENV'] = 'production'
|
|
|
|
def main():
|
|
"""Main entry point for the GasFlux Web API server."""
|
|
print("Starting GasFlux Web API with Waitress...")
|
|
|
|
try:
|
|
# Import the Flask app
|
|
import gasflux.app as gasflux_app
|
|
from src.gasflux.app import Config
|
|
|
|
app = gasflux_app.app
|
|
print("✓ GasFlux app imported successfully")
|
|
print("✓ Task pool management enabled")
|
|
print("✓ All blueprints loaded: upload, tasks, task_pool, download, reports, health, stats, config, web")
|
|
|
|
# Import waitress
|
|
from waitress import serve
|
|
print("✓ Waitress WSGI server imported")
|
|
|
|
# Server configuration from INI file (with environment variable fallbacks)
|
|
host = Config.HOST
|
|
port = Config.PORT
|
|
threads = Config.THREADS
|
|
connection_limit = Config.CONNECTION_LIMIT
|
|
channel_timeout = Config.CHANNEL_TIMEOUT
|
|
base_url = Config.BASE_URL
|
|
|
|
print(f"Starting Waitress server on {host}:{port}")
|
|
print(f"- Threads: {threads}")
|
|
print(f"- Connection limit: {connection_limit}")
|
|
print(f"- Channel timeout: {channel_timeout}s")
|
|
print(f"- Base URL: {base_url}")
|
|
print(f"- Upload folder: {Config.UPLOAD_FOLDER}")
|
|
print(f"- Output folder: {Config.OUTPUT_FOLDER}")
|
|
print("Press Ctrl+C to stop the server")
|
|
print("=" * 50)
|
|
print("Available API endpoints:")
|
|
print(" POST /upload - Upload files for processing")
|
|
print(" GET /task/<id> - Get task status")
|
|
print(" PUT /task/<id> - Update task status")
|
|
print(" DEL /task/<id> - Delete task")
|
|
print(" GET /tasks - List tasks (paginated)")
|
|
print(" GET /tasks/stats - Task pool statistics")
|
|
print(" GET /tasks/active - Active tasks")
|
|
print(" GET /tasks/queue - Queued tasks")
|
|
print(" GET /download/<file> - Download files")
|
|
print(" GET /reports - List reports")
|
|
print(" GET /health - Health check")
|
|
print(" GET /stats - System stats")
|
|
print(" GET /config - Configuration")
|
|
print(" GET / - Web interface")
|
|
print("=" * 50)
|
|
|
|
# Display configuration source info
|
|
try:
|
|
from src.gasflux.config_reader import config_reader
|
|
print("Configuration loaded from INI file:")
|
|
print(f" - Config file: {config_reader._get_config_file_path() or 'gasflux.ini (default)'}")
|
|
print(f" - Uploads path: {config_reader.uploads_path}")
|
|
print(f" - Outputs path: {config_reader.outputs_path}")
|
|
|
|
# Check API keys
|
|
from src.gasflux.app import app
|
|
with app.app_context():
|
|
from src.gasflux.db import get_db
|
|
db = get_db()
|
|
key_count = db.execute("SELECT COUNT(*) FROM api_keys WHERE revoked = 0").fetchone()[0]
|
|
print(f" - API keys: {key_count} active")
|
|
|
|
if key_count == 0:
|
|
print("\n⚠️ No active API keys found!")
|
|
print(" Run 'python create_api_key.py' to create your first API key")
|
|
print(" Or use bootstrap key in API requests: -H 'X-Admin-Bootstrap-Key: bootstrap_key_2024'")
|
|
except Exception as e:
|
|
print(f"Configuration info error: {e}")
|
|
|
|
print(f"\nFull configuration: {Config.to_dict()}")
|
|
|
|
# Start the server with valid Waitress parameters
|
|
serve(
|
|
app,
|
|
host=host,
|
|
port=port,
|
|
threads=threads,
|
|
connection_limit=connection_limit,
|
|
channel_timeout=channel_timeout,
|
|
)
|
|
|
|
except KeyboardInterrupt:
|
|
print("\nServer stopped by user")
|
|
except Exception as e:
|
|
print(f"✗ Error starting GasFlux app: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |