Files

309 lines
7.5 KiB
Markdown

# SaaS Architecture Backend
A multi-tenant SaaS backend built with FastAPI, PostgreSQL, and SQLAlchemy.
## Features
- 🔐 **Authentication & Authorization**: JWT-based authentication with role-based access control (RBAC)
- 👥 **Multi-Tenancy**: Complete tenant isolation with tenant-scoped data
- 🎨 **Theming**: Color palette management per tenant
- 🔄 **Database Migrations**: Alembic for schema version control
- 🌍 **Multi-Environment**: Support for local, development, production, and testing environments
## Tech Stack
- **Framework**: FastAPI 0.122.0
- **Database**: PostgreSQL with SQLAlchemy 2.0.44
- **Migrations**: Alembic 1.17.2
- **Authentication**: JWT (PyJWT) + bcrypt
- **Server**: Uvicorn
## Prerequisites
- Python 3.12+
- PostgreSQL 12+
- Python 3.10+
- PostgreSQL 12+
## Getting Started
### 1. Clone and Setup
```bash
cd "c:/Users/furqa/OneDrive/Work/Maskan/SaaS Architecture/App/backend"
```
### 2. Create Virtual Environment
```bash
python -m venv venv
.\venv\Scripts\activate # Windows
# source venv/bin/activate # Linux/Mac
```
### 3. Install Dependencies
```bash
pip install -r requirements.txt
pip install -r requirements.txt
```
### 4. Environment Configuration
Create environment-specific configuration files:
- `.env.local` - Local development
- `.env.development` - Development server
- `.env.production` - Production
- `.env.testing` - Testing environment
**Minimum required variables** (see `app/config/settings.py` for all options):
```env
# Server
APP_ENV=local
HOST=0.0.0.0
PORT=8000
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
# Security
SECRET_KEY=your-secret-key-here
ACCESS_TOKEN_SECRET=your-access-token-secret
REFRESH_TOKEN_SECRET=your-refresh-token-secret
# Frontend
FRONTEND_URL=http://localhost:5173
CORS_ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000
# Email
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASSWORD=your-app-password
EMAIL_FROM=noreply@yourapp.com
# Super Admin (for initial setup)
SUPER_ADMIN_EMAIL=admin@yourapp.com
SUPER_ADMIN_PASSWORD=SecurePassword123!
SUPER_ADMIN_FIRST_NAME=Admin
SUPER_ADMIN_LAST_NAME=User
```
### 5. Database Migrations
Alembic is configured to work with your multi-environment setup. It automatically:
- Loads the correct `.env.{APP_ENV}` file
- Uses the `DATABASE_URL` from your settings
- Imports all models for autogenerate support
#### Create Initial Migration
```bash
# Set environment (local, development, production, testing)
$env:APP_ENV="local" # Windows PowerShell
# export APP_ENV=local # Linux/Mac
# Create initial migration
alembic revision --autogenerate -m "Initial schema"
```
#### Run Migrations
```bash
# Using manage.py (recommended - handles APP_ENV automatically)
python manage.py migrate --env local
python manage.py migrate --env development
python manage.py migrate --env production
python manage.py migrate --env testing
# Or using alembic directly
$env:APP_ENV="local" # Set environment first
alembic upgrade head
```
#### Other Migration Commands
```bash
# Check current migration version
alembic current
# View migration history
alembic history
# Downgrade one version
alembic downgrade -1
# Downgrade to specific version
alembic downgrade <revision_id>
# View SQL without running
alembic upgrade head --sql
```
### 6. Seed Database
After running migrations, seed the database with initial data:
```bash
# Seed super admin user
python manage.py seed superadmin --env local
# Seed default color palettes
python manage.py seed palettes --env local
```
### 7. Run the Application
```bash
# Using manage.py (recommended)
python manage.py run --env local # Local environment
python manage.py run --env development # Development environment
python manage.py run --env production # Production environment
python manage.py run --env testing # Testing environment
# Or using Python directly
python run.py
```
The API will be available at `http://localhost:8000`
## API Documentation
Once the application is running, visit:
- **Swagger UI**: http://localhost:8000/docs
- **ReDoc**: http://localhost:8000/redoc
- **OpenAPI JSON**: http://localhost:8000/openapi.json
## Project Structure
```
backend/
├── alembic/ # Database migrations
│ ├── versions/ # Migration scripts
│ └── env.py # Alembic environment config
├── app/
│ ├── config/ # Configuration
│ │ ├── database.py # Database connection
│ │ └── settings.py # Application settings
│ ├── controllers/ # Business logic controllers
│ │ ├── auth/
│ │ └── theme/
│ ├── middleware/ # Custom middleware
│ ├── models/ # SQLAlchemy models
│ │ ├── auth/ # User, Tenant, Role, Access
│ │ └── theme/ # ColorPalette
│ ├── routes/ # API endpoints
│ │ ├── auth/
│ │ └── theme/
│ ├── schemas/ # Pydantic schemas
│ │ ├── auth/
│ │ └── theme/
│ ├── services/ # Service layer
│ │ ├── auth/
│ │ └── theme/
│ └── __init__.py # FastAPI app factory
├── scripts/ # Utility scripts
│ ├── seed_palettes.py
│ └── seed_superadmin.py
├── alembic.ini # Alembic configuration
├── alembic.ini # Alembic configuration
├── manage.py # Management CLI script
├── requirements.txt # Python dependencies
└── run.py # Application entry point
```
## Database Models
### Authentication & Authorization
- **Tenant**: Multi-tenant isolation
- **User**: User accounts (tenant-scoped)
- **Role**: User roles (tenant-scoped)
- **Access**: Permission definitions (hierarchical)
- **RoleAccess**: Role-to-permission mapping
### Theming
- **ColorPalette**: Tenant color themes
## Health Check
The application includes a health check endpoint:
```bash
curl http://localhost:8000/health
```
Response:
```json
{
"status": "healthy",
"environment": "local",
"database": "healthy",
"version": "1.0.0"
}
```
## Development Notes
### Environment Variables Loading Order
The application loads environment variables in this order (later overrides earlier):
1. Root `.env`
2. Backend `.env`
3. Root `.env.{APP_ENV}`
4. Backend `.env.{APP_ENV}`
### Multi-Tenancy
The system implements tenant isolation at the database level:
- Each tenant has their own users and roles
- Color palettes can be tenant-specific or global
- The super admin user is tenant-independent
### Role-Based Access Control
The RBAC system supports:
- Hierarchical permissions (Access has parent-child relationships)
- Category-based organization
- Flexible role-to-permission mapping
- Tenant-scoped roles
## Troubleshooting
### Database Connection Issues
1. Verify PostgreSQL is running
2. Check `DATABASE_URL` in your `.env.{APP_ENV}` file
3. Ensure database exists: `createdb your_database_name`
4. Check database user permissions
### Migration Issues
1. Ensure `APP_ENV` is set correctly
2. Verify database connection works
3. Check that all models are imported in `alembic/env.py`
4. Delete `alembic/versions/*.py` and recreate if needed
### Import Errors
1. Ensure virtual environment is activated
2. Install all dependencies: `pip install -r requirements.txt`
3. Check Python version (3.10+ required)
## License
[Your License Here]
## Support
For issues and questions, please contact [your-email@example.com]