# Multi-User System Setup Guide This guide explains how to configure QuantDinger for multi-user mode with PostgreSQL database. ## Architecture Overview ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ Frontend │────▶│ Backend API │────▶│ PostgreSQL │ │ (Vue.js) │ │ (Flask) │ │ Database │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ┌──────┴──────┐ │ User Auth │ │ JWT Token │ │ Role-based │ │ Access │ └─────────────┘ ``` ## Quick Start (Docker) ### 1. Update docker-compose.yml The new `docker-compose.yml` already includes PostgreSQL. Just set the password: ```bash # Create .env file in project root cat > .env << EOF POSTGRES_USER=quantdinger POSTGRES_PASSWORD=your_secure_password_here POSTGRES_DB=quantdinger EOF ``` ### 2. Start Services ```bash docker-compose up -d ``` This will: - Start PostgreSQL database - Initialize schema automatically (via `init.sql`) - Start backend API connected to PostgreSQL - Start frontend ### 3. Default Credentials - **Username**: `admin` - **Password**: `admin123` **Important**: Change the admin password immediately after first login! ## Manual Setup (Development) ### 1. Install PostgreSQL ```bash # Ubuntu/Debian sudo apt install postgresql postgresql-contrib # macOS brew install postgresql # Windows # Download from https://www.postgresql.org/download/windows/ ``` ### 2. Create Database ```bash # Connect to PostgreSQL sudo -u postgres psql # Create database and user CREATE DATABASE quantdinger; CREATE USER quantdinger WITH ENCRYPTED PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE quantdinger TO quantdinger; \q ``` ### 3. Initialize Schema ```bash # Run init.sql psql -U quantdinger -d quantdinger -f backend_api_python/migrations/init.sql ``` ### 4. Configure Backend Create/update `backend_api_python/.env`: ```bash # Database Configuration DB_TYPE=postgresql DATABASE_URL=postgresql://quantdinger:your_password@localhost:5432/quantdinger # Disable single-user legacy mode SINGLE_USER_MODE=false ``` ### 5. Install Dependencies ```bash cd backend_api_python pip install -r requirements.txt ``` ### 6. Start Backend ```bash python run.py ``` ## Migration from SQLite If you have existing data in SQLite: ```bash # Set environment variables export DATABASE_URL=postgresql://quantdinger:your_password@localhost:5432/quantdinger # Run migration script python scripts/migrate_sqlite_to_postgres.py ``` ## User Roles & Permissions | Role | Permissions | |---------|-------------| | admin | Full access, user management, settings | | manager | Strategy, backtest, portfolio, settings | | user | Strategy, backtest, portfolio (own data) | | viewer | View only (dashboard) | ## API Endpoints ### Authentication ``` POST /api/user/login - Login POST /api/user/logout - Logout GET /api/user/info - Get current user info ``` ### User Management (Admin only) ``` GET /api/users/list - List all users GET /api/users/detail?id= - Get user detail POST /api/users/create - Create user PUT /api/users/update?id= - Update user DELETE /api/users/delete?id= - Delete user POST /api/users/reset-password - Reset user password GET /api/users/roles - Get available roles ``` ### Self-Service ``` GET /api/users/profile - Get own profile PUT /api/users/profile/update - Update own profile POST /api/users/change-password - Change own password ``` ## Security Recommendations 1. **Change default admin password** immediately 2. **Use strong passwords** (min 12 characters) 3. **Enable HTTPS** in production 4. **Restrict database access** to backend only 5. **Regular backups** of PostgreSQL data ## Troubleshooting ### Cannot connect to PostgreSQL ```bash # Check PostgreSQL is running sudo systemctl status postgresql # Check connection psql -U quantdinger -d quantdinger -c "SELECT 1" ``` ### Migration fails ```bash # Check SQLite path ls -la backend_api_python/data/quantdinger.db # Check PostgreSQL tables psql -U quantdinger -d quantdinger -c "\dt" ``` ### Token invalid after restart JWT tokens are validated using `SECRET_KEY`. Ensure the same key is used: ```bash # Generate a secure key python -c "import secrets; print(secrets.token_hex(32))" # Set in .env SECRET_KEY=your_generated_key ``` ## Legacy Support The system now requires PostgreSQL for multi-user support. SQLite is no longer supported. If you need to migrate from an older SQLite-based installation, contact the project maintainers for assistance.