This commit includes: - Django backend with multi-tenancy (django-tenants) - React + TypeScript frontend with Vite - Platform administration API with role-based access control - Authentication system with token-based auth - Quick login dev tools for testing different user roles - CORS and CSRF configuration for local development - Docker development environment setup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
185 lines
5.4 KiB
Bash
185 lines
5.4 KiB
Bash
#!/bin/bash
|
|
|
|
# Smooth Schedule - Multi-Tenant SaaS Platform Setup Script
|
|
# This script initializes a production-grade Django project with strict multi-tenancy
|
|
|
|
set -e # Exit on any error
|
|
|
|
echo "=================================================="
|
|
echo "Smooth Schedule - Project Initialization"
|
|
echo "=================================================="
|
|
|
|
# Color definitions for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Check if cookiecutter is installed
|
|
if ! command -v cookiecutter &> /dev/null; then
|
|
echo -e "${RED}Error: cookiecutter is not installed${NC}"
|
|
echo "Install it with: pip install cookiecutter"
|
|
exit 1
|
|
fi
|
|
|
|
# Project configuration
|
|
PROJECT_NAME="Smooth Schedule"
|
|
PROJECT_SLUG="smoothschedule"
|
|
AUTHOR_NAME="Smooth Schedule Team"
|
|
EMAIL="admin@smoothschedule.com"
|
|
DESCRIPTION="Multi-Tenant SaaS Resource Orchestration Platform"
|
|
DOMAIN_NAME="smoothschedule.com"
|
|
|
|
echo -e "${GREEN}Step 1: Running cookiecutter-django...${NC}"
|
|
|
|
# Run cookiecutter with non-interactive mode
|
|
cookiecutter gh:cookiecutter/cookiecutter-django \
|
|
--no-input \
|
|
project_name="${PROJECT_NAME}" \
|
|
project_slug="${PROJECT_SLUG}" \
|
|
description="${DESCRIPTION}" \
|
|
author_name="${AUTHOR_NAME}" \
|
|
email="${EMAIL}" \
|
|
domain_name="${DOMAIN_NAME}" \
|
|
version="0.1.0" \
|
|
open_source_license="MIT" \
|
|
timezone="UTC" \
|
|
windows="n" \
|
|
use_pycharm="n" \
|
|
use_docker="y" \
|
|
postgresql_version="14" \
|
|
cloud_provider="AWS" \
|
|
mail_service="Mailgun" \
|
|
use_async="n" \
|
|
use_drf="y" \
|
|
frontend_pipeline="None" \
|
|
use_celery="y" \
|
|
use_mailhog="y" \
|
|
use_sentry="y" \
|
|
use_whitenoise="y" \
|
|
use_heroku="n" \
|
|
ci_tool="Github" \
|
|
keep_local_envs_in_vcs="y" \
|
|
debug="n"
|
|
|
|
cd "${PROJECT_SLUG}"
|
|
|
|
echo -e "${GREEN}Step 2: Aggressive De-bloating...${NC}"
|
|
|
|
# Remove templates directory (we're using React frontend)
|
|
if [ -d "${PROJECT_SLUG}/templates" ]; then
|
|
echo -e "${YELLOW}Removing templates/ directory...${NC}"
|
|
rm -rf "${PROJECT_SLUG}/templates"
|
|
echo "✓ Removed templates/"
|
|
fi
|
|
|
|
# Remove pages app (standard About/Home views)
|
|
if [ -d "${PROJECT_SLUG}/pages" ]; then
|
|
echo -e "${YELLOW}Removing pages app...${NC}"
|
|
rm -rf "${PROJECT_SLUG}/pages"
|
|
echo "✓ Removed pages app"
|
|
fi
|
|
|
|
# Remove allauth account templates (we're using DRF for auth)
|
|
if [ -d "${PROJECT_SLUG}/templates/account" ]; then
|
|
echo -e "${YELLOW}Removing allauth account templates...${NC}"
|
|
rm -rf "${PROJECT_SLUG}/templates/account"
|
|
echo "✓ Removed allauth templates"
|
|
fi
|
|
|
|
# Remove contrib directory if it exists (often contains page views)
|
|
if [ -d "${PROJECT_SLUG}/contrib" ]; then
|
|
echo -e "${YELLOW}Removing contrib directory...${NC}"
|
|
rm -rf "${PROJECT_SLUG}/contrib"
|
|
echo "✓ Removed contrib/"
|
|
fi
|
|
|
|
# Clean up settings to remove references to deleted apps
|
|
echo -e "${YELLOW}Cleaning up settings files...${NC}"
|
|
|
|
# Remove pages from INSTALLED_APPS in all settings files
|
|
for settings_file in config/settings/*.py; do
|
|
if [ -f "$settings_file" ]; then
|
|
sed -i '/pages/d' "$settings_file" 2>/dev/null || true
|
|
sed -i '/contrib/d' "$settings_file" 2>/dev/null || true
|
|
fi
|
|
done
|
|
|
|
# Remove pages URLs if they exist
|
|
if [ -f "config/urls.py" ]; then
|
|
sed -i '/pages/d' "config/urls.py" 2>/dev/null || true
|
|
fi
|
|
|
|
echo -e "${GREEN}Step 3: Installing additional dependencies...${NC}"
|
|
|
|
# Create requirements directory if it doesn't exist
|
|
mkdir -p requirements
|
|
|
|
# Add django-tenants to base requirements
|
|
if [ -f "requirements/base.txt" ]; then
|
|
echo "" >> requirements/base.txt
|
|
echo "# Multi-Tenancy" >> requirements/base.txt
|
|
echo "django-tenants==3.5.0" >> requirements/base.txt
|
|
echo "" >> requirements/base.txt
|
|
echo "# Security & Masquerading" >> requirements/base.txt
|
|
echo "django-hijack==3.4.1" >> requirements/base.txt
|
|
echo "✓ Added django-tenants and django-hijack to requirements"
|
|
fi
|
|
|
|
echo -e "${GREEN}Step 4: Creating core application structure...${NC}"
|
|
|
|
# Create core app
|
|
python manage.py startapp core
|
|
|
|
# Create additional required directories
|
|
mkdir -p core/migrations
|
|
mkdir -p core/management/commands
|
|
mkdir -p logs
|
|
|
|
# Create __init__.py files
|
|
touch core/__init__.py
|
|
touch core/management/__init__.py
|
|
touch core/management/commands/__init__.py
|
|
|
|
echo "✓ Created core app structure"
|
|
|
|
echo -e "${GREEN}Step 5: Verification...${NC}"
|
|
|
|
# Verify Django Admin is intact
|
|
if [ -f "config/urls.py" ]; then
|
|
if grep -q "admin.site.urls" "config/urls.py"; then
|
|
echo "✓ Django Admin is preserved"
|
|
else
|
|
echo -e "${RED}Warning: Django Admin may not be properly configured${NC}"
|
|
fi
|
|
fi
|
|
|
|
# Verify de-bloat
|
|
if [ ! -d "${PROJECT_SLUG}/templates" ]; then
|
|
echo "✓ Templates directory removed"
|
|
else
|
|
echo -e "${RED}Warning: Templates directory still exists${NC}"
|
|
fi
|
|
|
|
if [ ! -d "${PROJECT_SLUG}/pages" ]; then
|
|
echo "✓ Pages app removed"
|
|
else
|
|
echo -e "${RED}Warning: Pages app still exists${NC}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "=================================================="
|
|
echo -e "${GREEN}Smooth Schedule Project Initialization Complete!${NC}"
|
|
echo "=================================================="
|
|
echo ""
|
|
echo "Next Steps:"
|
|
echo "1. cd ${PROJECT_SLUG}"
|
|
echo "2. Review the generated settings in config/settings/"
|
|
echo "3. Set up your .env file with database credentials"
|
|
echo "4. Run: docker-compose build"
|
|
echo "5. Run: docker-compose up"
|
|
echo ""
|
|
echo "Note: Django Admin is accessible at /admin/"
|
|
echo " (This is the only HTML interface allowed)"
|
|
echo ""
|