Major refactor: Fix SQLite concurrency, remove rate limiting, simplify architecture
- 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
This commit is contained in:
83
production.py
Executable file
83
production.py
Executable file
@@ -0,0 +1,83 @@
|
||||
#!/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()
|
||||
Reference in New Issue
Block a user