- Switch to single Gunicorn worker to eliminate SQLite database locking issues - Remove Flask-Limiter and all rate limiting complexity - Remove Cloudflare proxy setup and dependencies - Simplify configuration and remove unnecessary features - Update all templates and static files for streamlined operation - Clean up old files and documentation - Restore stable database from backup - System now runs fast and reliably without database locks
83 lines
2.5 KiB
Python
Executable File
83 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Production launcher for ircquotes using Gunicorn
|
|
Reads all configuration from config.json
|
|
"""
|
|
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
from config_loader import config
|
|
|
|
def main():
|
|
"""Launch Gunicorn with settings from config.json"""
|
|
|
|
print("Starting ircquotes in production mode with Gunicorn...")
|
|
|
|
# Get configuration values from config.json
|
|
host = config.app_host
|
|
port = config.app_port
|
|
workers = config.get('gunicorn.workers', 1) # Default to 1 to avoid SQLite locking
|
|
timeout = config.get('gunicorn.timeout', 30)
|
|
keepalive = config.get('gunicorn.keepalive', 5)
|
|
max_requests = config.get('gunicorn.max_requests', 1000)
|
|
preload = config.get('gunicorn.preload', True)
|
|
|
|
# Use virtual environment's gunicorn if available
|
|
script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
venv_gunicorn = os.path.join(script_dir, '.venv', 'bin', 'gunicorn')
|
|
|
|
if os.path.exists(venv_gunicorn):
|
|
gunicorn_cmd = venv_gunicorn
|
|
print(f"Using virtual environment Gunicorn: {venv_gunicorn}")
|
|
else:
|
|
gunicorn_cmd = 'gunicorn'
|
|
print("Using system Gunicorn")
|
|
|
|
# Build Gunicorn command with all config.json settings
|
|
cmd = [
|
|
gunicorn_cmd,
|
|
'--bind', f'{host}:{port}',
|
|
'--workers', str(workers),
|
|
'--timeout', str(timeout),
|
|
'--keep-alive', str(keepalive), # Fixed: --keep-alive not --keepalive
|
|
'--max-requests', str(max_requests),
|
|
'--max-requests-jitter', '100',
|
|
'--access-logfile', '-', # Log to stdout
|
|
'--error-logfile', '-', # Log to stderr
|
|
'--log-level', 'info'
|
|
]
|
|
|
|
# Add preload option if enabled
|
|
if preload:
|
|
cmd.append('--preload')
|
|
|
|
# Add the app module at the end
|
|
cmd.append('app:app')
|
|
|
|
print(f"Configuration:")
|
|
print(f" Host: {host}")
|
|
print(f" Port: {port}")
|
|
print(f" Workers: {workers}")
|
|
print(f" Timeout: {timeout}s")
|
|
print(f" Max Requests: {max_requests}")
|
|
print(f" Preload: {preload}")
|
|
print()
|
|
print(f"Gunicorn command: {' '.join(cmd)}")
|
|
print()
|
|
|
|
# Execute Gunicorn
|
|
try:
|
|
subprocess.run(cmd, check=True)
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"Error starting Gunicorn: {e}")
|
|
sys.exit(1)
|
|
except KeyboardInterrupt:
|
|
print("\nStopping Gunicorn...")
|
|
sys.exit(0)
|
|
except FileNotFoundError:
|
|
print("Error: Gunicorn not found. Please install it with: pip install gunicorn")
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |