BalanceBoard - Clean release
- Docker deployment ready
- Content aggregation and filtering
- User authentication
- Polling service for updates
🤖 Generated with Claude Code
This commit is contained in:
165
start_server.py
Executable file
165
start_server.py
Executable file
@@ -0,0 +1,165 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
BalanceBoard - Startup Script
|
||||
Starts the Flask server with PostgreSQL/SQLAlchemy
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import signal
|
||||
from pathlib import Path
|
||||
|
||||
# Configuration
|
||||
FLASK_PORT = 5021
|
||||
|
||||
|
||||
def print_color(text, color='blue'):
|
||||
"""Print colored text"""
|
||||
colors = {
|
||||
'red': '\033[0;31m',
|
||||
'green': '\033[0;32m',
|
||||
'yellow': '\033[1;33m',
|
||||
'blue': '\033[0;34m',
|
||||
'reset': '\033[0m'
|
||||
}
|
||||
print(f"{colors.get(color, '')}{text}{colors['reset']}")
|
||||
|
||||
|
||||
def cleanup(signum=None, frame=None):
|
||||
"""Cleanup: stop Flask server"""
|
||||
print()
|
||||
print_color("Shutting down...", 'yellow')
|
||||
print_color("Goodbye!", 'green')
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def is_port_in_use(port):
|
||||
"""Check if a port is already in use"""
|
||||
try:
|
||||
import socket
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||||
return s.connect_ex(('localhost', port)) == 0
|
||||
except:
|
||||
return False
|
||||
|
||||
|
||||
def check_postgres_connection():
|
||||
"""Check if PostgreSQL is available"""
|
||||
try:
|
||||
import psycopg2
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
# Get database connection details
|
||||
db_host = os.getenv('POSTGRES_HOST', 'localhost')
|
||||
db_port = os.getenv('POSTGRES_PORT', '5432')
|
||||
db_name = os.getenv('POSTGRES_DB', 'balanceboard')
|
||||
db_user = os.getenv('POSTGRES_USER', 'balanceboard')
|
||||
db_password = os.getenv('POSTGRES_PASSWORD', 'changeme')
|
||||
|
||||
# Try to connect
|
||||
conn = psycopg2.connect(
|
||||
host=db_host,
|
||||
port=db_port,
|
||||
database=db_name,
|
||||
user=db_user,
|
||||
password=db_password
|
||||
)
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print_color(f"PostgreSQL connection error: {e}", 'red')
|
||||
return False
|
||||
|
||||
|
||||
def start_flask():
|
||||
"""Start Flask server"""
|
||||
print_color("Starting Flask server...", 'blue')
|
||||
|
||||
# Check virtual environment
|
||||
if not Path('venv').exists():
|
||||
print_color("Error: Virtual environment not found!", 'red')
|
||||
print("Run: python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt")
|
||||
return False
|
||||
|
||||
# Check PostgreSQL connection
|
||||
if not check_postgres_connection():
|
||||
print_color("Error: Cannot connect to PostgreSQL!", 'red')
|
||||
print()
|
||||
print("Please ensure PostgreSQL is running and configured:")
|
||||
print("1. Install PostgreSQL: sudo apt install postgresql postgresql-contrib")
|
||||
print("2. Create database: sudo -u postgres createdb balanceboard")
|
||||
print("3. Create user: sudo -u postgres createuser balanceboard")
|
||||
print("4. Set password: sudo -u postgres psql -c \"ALTER USER balanceboard PASSWORD 'changeme';\"")
|
||||
print("5. Update .env file with your database settings")
|
||||
print()
|
||||
return False
|
||||
|
||||
# Create .env if it doesn't exist
|
||||
if not Path('.env').exists():
|
||||
print_color("Creating .env from .env.example...", 'yellow')
|
||||
import secrets
|
||||
with open('.env.example', 'r') as f:
|
||||
env_content = f.read()
|
||||
secret_key = secrets.token_hex(32)
|
||||
env_content = env_content.replace('your-secret-key-here-change-this', secret_key)
|
||||
with open('.env', 'w') as f:
|
||||
f.write(env_content)
|
||||
print_color("✓ .env created with random SECRET_KEY", 'green')
|
||||
|
||||
print()
|
||||
print_color("=" * 60, 'green')
|
||||
print_color("BalanceBoard is running!", 'green')
|
||||
print_color("=" * 60, 'green')
|
||||
print()
|
||||
print_color(f" Main Feed: http://localhost:{FLASK_PORT}", 'blue')
|
||||
print_color(f" Login: http://localhost:{FLASK_PORT}/login", 'blue')
|
||||
print_color(f" Sign Up: http://localhost:{FLASK_PORT}/signup", 'blue')
|
||||
print_color(f" Admin Panel: http://localhost:{FLASK_PORT}/admin", 'blue')
|
||||
print()
|
||||
print_color("Database: PostgreSQL with SQLAlchemy", 'blue')
|
||||
print_color("Authentication: bcrypt + Flask-Login", 'blue')
|
||||
print()
|
||||
print_color("Press Ctrl+C to stop the server", 'yellow')
|
||||
print()
|
||||
|
||||
# Import and run Flask app
|
||||
try:
|
||||
from app import app
|
||||
print_color("✓ Flask app imported successfully", 'green')
|
||||
print_color("✓ Database initialized with SQLAlchemy", 'green')
|
||||
print_color("✓ User authentication ready", 'green')
|
||||
print()
|
||||
|
||||
# Run Flask
|
||||
app.run(host='0.0.0.0', port=FLASK_PORT, debug=True, use_reloader=False)
|
||||
|
||||
except Exception as e:
|
||||
print_color(f"✗ Failed to start Flask app: {e}", 'red')
|
||||
return False
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point"""
|
||||
# Register signal handlers
|
||||
signal.signal(signal.SIGINT, cleanup)
|
||||
signal.signal(signal.SIGTERM, cleanup)
|
||||
|
||||
print_color("=" * 60, 'blue')
|
||||
print_color("BalanceBoard - PostgreSQL + SQLAlchemy", 'blue')
|
||||
print_color("=" * 60, 'blue')
|
||||
print()
|
||||
|
||||
# Start Flask (blocks until Ctrl+C)
|
||||
try:
|
||||
start_flask()
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
finally:
|
||||
cleanup()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user