extracted all domains, URLS, secrets, etc. to .env and wrote a deploy script to deploy on server
This commit is contained in:
parent
b972f024db
commit
bd857ae015
11 changed files with 636 additions and 26 deletions
29
.env.example
Normal file
29
.env.example
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
# Domain Configuration
|
||||
# The domain where your application will be deployed (without protocol)
|
||||
DOMAIN=yourdomain.com
|
||||
|
||||
# The base path for the application (must start and end with /)
|
||||
BASE_PATH=/dashboard/
|
||||
|
||||
# Azure AD Configuration
|
||||
# Get these values from your Azure AD app registration
|
||||
# Portal: https://portal.azure.com > Azure Active Directory > App registrations
|
||||
AZURE_TENANT_ID=your-tenant-id-here
|
||||
AZURE_CLIENT_ID=your-client-id-here
|
||||
|
||||
# Backend Configuration
|
||||
# Port on which the backend server will run
|
||||
BACKEND_PORT=5001
|
||||
|
||||
# Make.com Webhook
|
||||
# The webhook URL that provides your data
|
||||
MAKE_WEBHOOK_URL=https://hook.eu1.make.celonis.com/your-webhook-id
|
||||
|
||||
# Frontend Build Configuration (used by Vite)
|
||||
# These VITE_ prefixed variables are embedded at build time
|
||||
# They should match the values above
|
||||
VITE_DOMAIN=yourdomain.com
|
||||
VITE_BASE_PATH=/dashboard/
|
||||
VITE_BACKEND_PORT=5001
|
||||
VITE_AZURE_TENANT_ID=your-tenant-id-here
|
||||
VITE_AZURE_CLIENT_ID=your-client-id-here
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -59,6 +59,8 @@ frontend/.vite/
|
|||
.env.test.local
|
||||
.env.production.local
|
||||
*.env
|
||||
# Keep .env.example tracked
|
||||
!.env.example
|
||||
|
||||
# IDE / Editor
|
||||
.vscode/
|
||||
|
|
|
|||
57
CLAUDE.md
57
CLAUDE.md
|
|
@ -20,11 +20,34 @@ Oliver Agency Reporting Module - A web-based analytics dashboard for displaying
|
|||
- Filtering happens client-side after data fetch
|
||||
- CSV export uses PapaParse library
|
||||
|
||||
## Setup
|
||||
|
||||
### Environment Configuration
|
||||
|
||||
1. Copy the example environment file:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. Edit `.env` and configure the following:
|
||||
- `DOMAIN`: Your deployment domain
|
||||
- `BASE_PATH`: Your application path (keep `/dashboard/` or change as needed)
|
||||
- `AZURE_TENANT_ID`: Your Azure AD tenant ID (from Azure portal)
|
||||
- `AZURE_CLIENT_ID`: Your Azure AD application ID (from Azure portal)
|
||||
- `MAKE_WEBHOOK_URL`: Your Make.com webhook URL
|
||||
- Duplicate the above values to their `VITE_` prefixed equivalents
|
||||
|
||||
3. Register your Azure AD application:
|
||||
- Go to Azure Portal > Azure Active Directory > App registrations
|
||||
- Create a new registration or update an existing one
|
||||
- Add redirect URIs for your domain (e.g., `https://yourdomain.com/dashboard/`)
|
||||
- Note the Tenant ID and Client ID for your `.env` file
|
||||
|
||||
## Development Commands
|
||||
|
||||
### Full Application
|
||||
```bash
|
||||
# Start both backend and frontend simultaneously
|
||||
# Start both backend and frontend simultaneously (loads .env automatically)
|
||||
./run.sh
|
||||
```
|
||||
|
||||
|
|
@ -65,19 +88,35 @@ npm run preview # Preview production build
|
|||
|
||||
## Environment Configuration
|
||||
|
||||
**API URLs:**
|
||||
- Development: `http://localhost:5001/api`
|
||||
- Production: `https://baic.oliver.solutions/dashboard/back/api`
|
||||
The application is configured using environment variables defined in a `.env` file at the project root. Copy `.env.example` to `.env` and configure for your deployment.
|
||||
|
||||
**Environment Variables:**
|
||||
- `MAKE_WEBHOOK_URL`: Make.com webhook endpoint (defaults to production URL)
|
||||
**Required Environment Variables:**
|
||||
|
||||
**Domain & Path:**
|
||||
- `DOMAIN`: Your deployment domain (e.g., `yourdomain.com`)
|
||||
- `BASE_PATH`: Base path for the application (e.g., `/dashboard/`)
|
||||
|
||||
**Azure AD Configuration:**
|
||||
- `AZURE_TENANT_ID`: Azure AD tenant identifier
|
||||
- `AZURE_CLIENT_ID`: Azure AD application (client) identifier
|
||||
|
||||
**Backend Configuration:**
|
||||
- `BACKEND_PORT`: Port for the backend server (default: `5001`)
|
||||
- `MAKE_WEBHOOK_URL`: Make.com webhook endpoint for data source
|
||||
|
||||
**Frontend Configuration (Vite):**
|
||||
- `VITE_DOMAIN`: Same as DOMAIN (for frontend build)
|
||||
- `VITE_BASE_PATH`: Same as BASE_PATH (for frontend build)
|
||||
- `VITE_AZURE_TENANT_ID`: Same as AZURE_TENANT_ID (for frontend auth)
|
||||
- `VITE_AZURE_CLIENT_ID`: Same as AZURE_CLIENT_ID (for frontend auth)
|
||||
|
||||
**API URLs (constructed from environment variables):**
|
||||
- Development: `http://localhost:{BACKEND_PORT}/api`
|
||||
- Production: `https://{DOMAIN}{BASE_PATH}back/api`
|
||||
|
||||
## Authentication
|
||||
|
||||
**Azure AD (MSAL) Configuration:**
|
||||
- Tenant ID: `e519c2e6-bc6d-4fdf-8d9c-923c2f002385`
|
||||
- Client ID: `014547f2-21c1-4245-881f-97f49543d963`
|
||||
- Redirect URI: `https://baic.oliver.solutions/dashboard/`
|
||||
|
||||
**Frontend Authentication:**
|
||||
- Uses `@azure/msal-react` and `@azure/msal-browser`
|
||||
|
|
|
|||
39
README.md
39
README.md
|
|
@ -7,8 +7,40 @@ A web-based reporting module to display usage analytics for conversations and me
|
|||
- `/backend`: Python Flask backend API
|
||||
- `/frontend`: React + Vite frontend application
|
||||
|
||||
## Environment Setup
|
||||
|
||||
Before running the application, you need to configure environment variables:
|
||||
|
||||
1. Copy the example environment file:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. Edit `.env` with your configuration:
|
||||
- **DOMAIN**: Your deployment domain (e.g., `yourdomain.com`)
|
||||
- **BASE_PATH**: Application base path (default: `/dashboard/`)
|
||||
- **AZURE_TENANT_ID**: Azure AD tenant identifier
|
||||
- **AZURE_CLIENT_ID**: Azure AD application (client) identifier
|
||||
- **BACKEND_PORT**: Backend server port (default: `5001`)
|
||||
- **MAKE_WEBHOOK_URL**: Make.com webhook endpoint
|
||||
- **VITE_*** variables: Duplicate the above values with `VITE_` prefix for frontend
|
||||
|
||||
3. Azure AD Setup:
|
||||
- Create an app registration in Azure Portal
|
||||
- Add redirect URIs for your deployment domain
|
||||
- Copy the Tenant ID and Client ID to your `.env` file
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Quick Start (Recommended)
|
||||
|
||||
Run both backend and frontend together:
|
||||
```bash
|
||||
./run.sh
|
||||
```
|
||||
|
||||
This script automatically loads environment variables from `.env` and starts both servers.
|
||||
|
||||
### Backend
|
||||
|
||||
1. Navigate to the backend directory:
|
||||
|
|
@ -26,12 +58,15 @@ A web-based reporting module to display usage analytics for conversations and me
|
|||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
4. Start the development server:
|
||||
4. Load environment variables and start the development server:
|
||||
```
|
||||
# Load environment variables
|
||||
set -a && source ../.env && set +a
|
||||
# Start server
|
||||
python app.py
|
||||
```
|
||||
|
||||
The API will be available at http://localhost:5001.
|
||||
The API will be available at `http://localhost:{BACKEND_PORT}` (default: 5001).
|
||||
|
||||
### Frontend
|
||||
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ app.config["APPLICATION_ROOT"] = application_root
|
|||
MAKE_WEBHOOK_URL = os.environ.get("MAKE_WEBHOOK_URL", "https://hook.eu1.make.celonis.com/h8gjldwnp4u5cvc0io474zq4u7vwb9zw")
|
||||
|
||||
# Azure AD configuration
|
||||
TENANT_ID = "e519c2e6-bc6d-4fdf-8d9c-923c2f002385"
|
||||
CLIENT_ID = "014547f2-21c1-4245-881f-97f49543d963"
|
||||
TENANT_ID = os.environ.get("AZURE_TENANT_ID", "e519c2e6-bc6d-4fdf-8d9c-923c2f002385")
|
||||
CLIENT_ID = os.environ.get("AZURE_CLIENT_ID", "014547f2-21c1-4245-881f-97f49543d963")
|
||||
JWKS_URL = f"https://login.microsoftonline.com/{TENANT_ID}/discovery/v2.0/keys"
|
||||
|
||||
def get_public_keys():
|
||||
|
|
@ -333,10 +333,11 @@ if __name__ == "__main__":
|
|||
|
||||
# Configure Hypercorn
|
||||
config = Config()
|
||||
config.bind = ["0.0.0.0:5001"] # Port for backend
|
||||
port = os.environ.get("BACKEND_PORT", "5001")
|
||||
config.bind = [f"0.0.0.0:{port}"] # Port for backend
|
||||
config.use_reloader = False
|
||||
config.root_path = application_root
|
||||
|
||||
|
||||
# Run the application with Hypercorn
|
||||
logger.warning("Starting Oliver Agency Reporting Backend with Hypercorn on port 5001")
|
||||
logger.warning(f"Starting Oliver Agency Reporting Backend with Hypercorn on port {port}")
|
||||
asyncio.run(serve(app, config))
|
||||
478
deploy.sh
Executable file
478
deploy.sh
Executable file
|
|
@ -0,0 +1,478 @@
|
|||
#!/bin/bash
|
||||
|
||||
################################################################################
|
||||
# BAIC Dashboard Deployment Script
|
||||
#
|
||||
# This script automates the deployment of the BAIC Dashboard application
|
||||
# on an Ubuntu server with Apache and systemd.
|
||||
#
|
||||
# Prerequisites:
|
||||
# - Repository cloned to /opt/baic_dashboard
|
||||
# - .env file configured in repository root
|
||||
# - Run this script from /opt/baic_dashboard directory
|
||||
# - Execute with sudo/root privileges
|
||||
#
|
||||
# Usage: sudo bash deploy.sh
|
||||
################################################################################
|
||||
|
||||
set -e # Exit on any error
|
||||
|
||||
# Color codes for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Expected deployment directory
|
||||
EXPECTED_DIR="/opt/baic_dashboard"
|
||||
SERVICE_NAME="baic-dashboard"
|
||||
SERVICE_USER="www-data"
|
||||
|
||||
################################################################################
|
||||
# Helper Functions
|
||||
################################################################################
|
||||
|
||||
print_header() {
|
||||
echo -e "\n${BLUE}========================================${NC}"
|
||||
echo -e "${BLUE}$1${NC}"
|
||||
echo -e "${BLUE}========================================${NC}\n"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✓ $1${NC}"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}✗ ERROR: $1${NC}"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}⚠ WARNING: $1${NC}"
|
||||
}
|
||||
|
||||
print_info() {
|
||||
echo -e "${BLUE}ℹ $1${NC}"
|
||||
}
|
||||
|
||||
exit_with_error() {
|
||||
print_error "$1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
################################################################################
|
||||
# Pre-flight Checks
|
||||
################################################################################
|
||||
|
||||
print_header "Pre-flight Checks"
|
||||
|
||||
# Check if running as root
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
exit_with_error "This script must be run as root (use sudo)"
|
||||
fi
|
||||
print_success "Running as root"
|
||||
|
||||
# Check if we're in the correct directory
|
||||
CURRENT_DIR=$(pwd)
|
||||
if [[ "$CURRENT_DIR" != "$EXPECTED_DIR" ]]; then
|
||||
exit_with_error "Script must be run from $EXPECTED_DIR (currently in $CURRENT_DIR)"
|
||||
fi
|
||||
print_success "Running from correct directory: $EXPECTED_DIR"
|
||||
|
||||
# Check for required commands
|
||||
REQUIRED_COMMANDS=("python3" "npm" "systemctl")
|
||||
for cmd in "${REQUIRED_COMMANDS[@]}"; do
|
||||
if ! command -v $cmd &> /dev/null; then
|
||||
exit_with_error "$cmd is not installed. Please install it first."
|
||||
fi
|
||||
print_success "$cmd is installed"
|
||||
done
|
||||
|
||||
# Check if .env file exists
|
||||
if [[ ! -f ".env" ]]; then
|
||||
exit_with_error ".env file not found in current directory. Please create it before running this script."
|
||||
fi
|
||||
print_success ".env file found"
|
||||
|
||||
# Check if apache2 is installed (warn if not, but don't fail)
|
||||
if ! command -v apache2 &> /dev/null; then
|
||||
print_warning "apache2 is not installed. You'll need to install and configure it manually."
|
||||
else
|
||||
print_success "apache2 is installed"
|
||||
fi
|
||||
|
||||
################################################################################
|
||||
# Backend Setup
|
||||
################################################################################
|
||||
|
||||
print_header "Backend Setup"
|
||||
|
||||
# Create Python virtual environment
|
||||
print_info "Creating Python virtual environment..."
|
||||
if [[ -d "venv" ]]; then
|
||||
print_warning "Virtual environment already exists. Removing and recreating..."
|
||||
rm -rf venv
|
||||
fi
|
||||
|
||||
python3 -m venv venv
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to create virtual environment"
|
||||
fi
|
||||
print_success "Virtual environment created"
|
||||
|
||||
# Activate virtual environment and install dependencies
|
||||
print_info "Installing Python dependencies from requirements.txt..."
|
||||
source venv/bin/activate
|
||||
|
||||
if [[ ! -f "backend/requirements.txt" ]]; then
|
||||
exit_with_error "backend/requirements.txt not found"
|
||||
fi
|
||||
|
||||
pip install --upgrade pip > /dev/null 2>&1
|
||||
pip install -r backend/requirements.txt
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to install Python dependencies"
|
||||
fi
|
||||
print_success "Python dependencies installed"
|
||||
|
||||
# Test that Flask can be imported
|
||||
python3 -c "import flask" 2>/dev/null
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Flask installation verification failed"
|
||||
fi
|
||||
print_success "Flask installation verified"
|
||||
|
||||
deactivate
|
||||
|
||||
# Set ownership to www-data
|
||||
print_info "Setting ownership to $SERVICE_USER..."
|
||||
chown -R $SERVICE_USER:$SERVICE_USER venv
|
||||
chown -R $SERVICE_USER:$SERVICE_USER backend
|
||||
print_success "Ownership set to $SERVICE_USER"
|
||||
|
||||
################################################################################
|
||||
# Frontend Build
|
||||
################################################################################
|
||||
|
||||
print_header "Frontend Build"
|
||||
|
||||
# Check if frontend directory exists
|
||||
if [[ ! -d "frontend" ]]; then
|
||||
exit_with_error "frontend directory not found"
|
||||
fi
|
||||
|
||||
cd frontend
|
||||
|
||||
# Install npm dependencies
|
||||
print_info "Installing npm dependencies..."
|
||||
npm install
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to install npm dependencies"
|
||||
fi
|
||||
print_success "npm dependencies installed"
|
||||
|
||||
# Build frontend
|
||||
print_info "Building frontend for production (this may take a minute)..."
|
||||
npm run build
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Frontend build failed"
|
||||
fi
|
||||
|
||||
# Verify dist directory was created
|
||||
if [[ ! -d "dist" ]]; then
|
||||
exit_with_error "Build completed but dist/ directory not found"
|
||||
fi
|
||||
print_success "Frontend built successfully"
|
||||
|
||||
cd ..
|
||||
|
||||
################################################################################
|
||||
# Frontend Deployment
|
||||
################################################################################
|
||||
|
||||
print_header "Frontend Deployment"
|
||||
|
||||
# Prompt user for frontend deployment path
|
||||
echo -e "${BLUE}Please enter the full path where the frontend files should be deployed${NC}"
|
||||
echo -e "${BLUE}(e.g., /var/www/html/dashboard or /var/www/mysite.com/dashboard)${NC}"
|
||||
read -p "Deployment path: " FRONTEND_DEPLOY_PATH
|
||||
|
||||
# Validate input
|
||||
if [[ -z "$FRONTEND_DEPLOY_PATH" ]]; then
|
||||
exit_with_error "No deployment path provided"
|
||||
fi
|
||||
|
||||
# Create directory if it doesn't exist
|
||||
if [[ ! -d "$FRONTEND_DEPLOY_PATH" ]]; then
|
||||
print_info "Creating directory: $FRONTEND_DEPLOY_PATH"
|
||||
mkdir -p "$FRONTEND_DEPLOY_PATH"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to create deployment directory"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Copy frontend files
|
||||
print_info "Copying frontend files to $FRONTEND_DEPLOY_PATH..."
|
||||
cp -r frontend/dist/* "$FRONTEND_DEPLOY_PATH/"
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to copy frontend files"
|
||||
fi
|
||||
print_success "Frontend files copied"
|
||||
|
||||
# Set ownership and permissions
|
||||
print_info "Setting ownership and permissions..."
|
||||
chown -R $SERVICE_USER:$SERVICE_USER "$FRONTEND_DEPLOY_PATH"
|
||||
find "$FRONTEND_DEPLOY_PATH" -type d -exec chmod 755 {} \;
|
||||
find "$FRONTEND_DEPLOY_PATH" -type f -exec chmod 644 {} \;
|
||||
print_success "Ownership and permissions set"
|
||||
|
||||
################################################################################
|
||||
# Systemd Service Creation
|
||||
################################################################################
|
||||
|
||||
print_header "Systemd Service Setup"
|
||||
|
||||
# Read BACKEND_PORT from .env or use default
|
||||
BACKEND_PORT=$(grep "^BACKEND_PORT=" .env | cut -d'=' -f2 | tr -d ' ')
|
||||
if [[ -z "$BACKEND_PORT" ]]; then
|
||||
BACKEND_PORT="5001"
|
||||
print_warning "BACKEND_PORT not found in .env, using default: 5001"
|
||||
else
|
||||
print_info "Using BACKEND_PORT from .env: $BACKEND_PORT"
|
||||
fi
|
||||
|
||||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||||
|
||||
print_info "Creating systemd service file: $SERVICE_FILE"
|
||||
|
||||
cat > "$SERVICE_FILE" << EOF
|
||||
[Unit]
|
||||
Description=BAIC Dashboard Backend Service
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=$SERVICE_USER
|
||||
Group=$SERVICE_USER
|
||||
WorkingDirectory=$EXPECTED_DIR/backend
|
||||
EnvironmentFile=$EXPECTED_DIR/.env
|
||||
ExecStart=$EXPECTED_DIR/venv/bin/python app.py
|
||||
|
||||
# Restart policy
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
# Security settings
|
||||
NoNewPrivileges=true
|
||||
PrivateTmp=true
|
||||
|
||||
# Logging
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=$SERVICE_NAME
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to create systemd service file"
|
||||
fi
|
||||
print_success "Systemd service file created"
|
||||
|
||||
################################################################################
|
||||
# Service Management
|
||||
################################################################################
|
||||
|
||||
print_header "Service Management"
|
||||
|
||||
# Reload systemd daemon
|
||||
print_info "Reloading systemd daemon..."
|
||||
systemctl daemon-reload
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to reload systemd daemon"
|
||||
fi
|
||||
print_success "Systemd daemon reloaded"
|
||||
|
||||
# Enable service
|
||||
print_info "Enabling service to start on boot..."
|
||||
systemctl enable $SERVICE_NAME
|
||||
if [[ $? -ne 0 ]]; then
|
||||
exit_with_error "Failed to enable service"
|
||||
fi
|
||||
print_success "Service enabled"
|
||||
|
||||
# Start service
|
||||
print_info "Starting service..."
|
||||
systemctl start $SERVICE_NAME
|
||||
if [[ $? -ne 0 ]]; then
|
||||
print_error "Failed to start service. Check logs with: journalctl -u $SERVICE_NAME -n 50"
|
||||
exit 1
|
||||
fi
|
||||
print_success "Service started"
|
||||
|
||||
# Wait a moment for service to initialize
|
||||
sleep 2
|
||||
|
||||
# Check service status
|
||||
print_info "Checking service status..."
|
||||
if systemctl is-active --quiet $SERVICE_NAME; then
|
||||
print_success "Service is running"
|
||||
echo ""
|
||||
systemctl status $SERVICE_NAME --no-pager -l
|
||||
else
|
||||
print_error "Service failed to start properly"
|
||||
print_info "Showing recent logs:"
|
||||
journalctl -u $SERVICE_NAME -n 20 --no-pager
|
||||
exit 1
|
||||
fi
|
||||
|
||||
################################################################################
|
||||
# Apache Configuration Generation
|
||||
################################################################################
|
||||
|
||||
print_header "Apache Configuration"
|
||||
|
||||
# Get domain and base path from .env
|
||||
DOMAIN=$(grep "^DOMAIN=" .env | cut -d'=' -f2 | tr -d ' ')
|
||||
BASE_PATH=$(grep "^BASE_PATH=" .env | cut -d'=' -f2 | tr -d ' ')
|
||||
|
||||
if [[ -z "$DOMAIN" ]]; then
|
||||
DOMAIN="yourdomain.com"
|
||||
print_warning "DOMAIN not found in .env, using placeholder in config"
|
||||
fi
|
||||
|
||||
if [[ -z "$BASE_PATH" ]]; then
|
||||
BASE_PATH="/dashboard/"
|
||||
print_warning "BASE_PATH not found in .env, using default: /dashboard/"
|
||||
fi
|
||||
|
||||
# Remove trailing slash from BASE_PATH for cleaner config
|
||||
BASE_PATH_NO_SLASH=${BASE_PATH%/}
|
||||
|
||||
APACHE_CONFIG_FILE="$EXPECTED_DIR/apache-config.conf"
|
||||
|
||||
print_info "Generating Apache configuration: $APACHE_CONFIG_FILE"
|
||||
|
||||
cat > "$APACHE_CONFIG_FILE" << EOF
|
||||
# Apache Configuration for BAIC Dashboard
|
||||
#
|
||||
# Add this configuration to your Apache virtual host file
|
||||
# (e.g., /etc/apache2/sites-available/000-default.conf or your custom site config)
|
||||
#
|
||||
# Required Apache modules (enable with a2enmod):
|
||||
# - proxy
|
||||
# - proxy_http
|
||||
# - headers
|
||||
# - rewrite
|
||||
#
|
||||
# Enable modules:
|
||||
# sudo a2enmod proxy proxy_http headers rewrite
|
||||
# sudo systemctl restart apache2
|
||||
|
||||
<VirtualHost *:443>
|
||||
ServerName $DOMAIN
|
||||
|
||||
# SSL Configuration (adjust paths to your certificates)
|
||||
# SSLEngine on
|
||||
# SSLCertificateFile /etc/letsencrypt/live/$DOMAIN/fullchain.pem
|
||||
# SSLCertificateKeyFile /etc/letsencrypt/live/$DOMAIN/privkey.pem
|
||||
|
||||
# Frontend static files
|
||||
Alias $BASE_PATH_NO_SLASH $FRONTEND_DEPLOY_PATH
|
||||
<Directory $FRONTEND_DEPLOY_PATH>
|
||||
Options -Indexes +FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
|
||||
# Handle client-side routing (React Router)
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
RewriteBase $BASE_PATH_NO_SLASH/
|
||||
RewriteRule ^index\.html$ - [L]
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteRule . $BASE_PATH_NO_SLASH/index.html [L]
|
||||
</IfModule>
|
||||
</Directory>
|
||||
|
||||
# Backend API reverse proxy
|
||||
ProxyPreserveHost On
|
||||
ProxyTimeout 300
|
||||
|
||||
<Location $BASE_PATH_NO_SLASH/back/api>
|
||||
ProxyPass http://localhost:$BACKEND_PORT/api
|
||||
ProxyPassReverse http://localhost:$BACKEND_PORT/api
|
||||
|
||||
# Add headers for proper proxying
|
||||
RequestHeader set X-Forwarded-Proto "https"
|
||||
RequestHeader set X-Forwarded-Port "443"
|
||||
</Location>
|
||||
|
||||
# Error and Access logs
|
||||
ErrorLog \${APACHE_LOG_DIR}/${SERVICE_NAME}-error.log
|
||||
CustomLog \${APACHE_LOG_DIR}/${SERVICE_NAME}-access.log combined
|
||||
</VirtualHost>
|
||||
|
||||
# Optional: Redirect HTTP to HTTPS
|
||||
<VirtualHost *:80>
|
||||
ServerName $DOMAIN
|
||||
Redirect permanent / https://$DOMAIN/
|
||||
</VirtualHost>
|
||||
EOF
|
||||
|
||||
if [[ $? -ne 0 ]]; then
|
||||
print_error "Failed to create Apache configuration file"
|
||||
else
|
||||
print_success "Apache configuration file created"
|
||||
fi
|
||||
|
||||
################################################################################
|
||||
# Deployment Complete
|
||||
################################################################################
|
||||
|
||||
print_header "Deployment Complete!"
|
||||
|
||||
echo -e "${GREEN}✓ Backend virtual environment created and dependencies installed${NC}"
|
||||
echo -e "${GREEN}✓ Frontend built and deployed to: $FRONTEND_DEPLOY_PATH${NC}"
|
||||
echo -e "${GREEN}✓ Systemd service created and started: $SERVICE_NAME${NC}"
|
||||
echo -e "${GREEN}✓ Apache configuration generated: $APACHE_CONFIG_FILE${NC}"
|
||||
|
||||
echo ""
|
||||
print_header "Next Steps"
|
||||
|
||||
echo -e "${YELLOW}1. Review the Apache configuration:${NC}"
|
||||
echo -e " cat $APACHE_CONFIG_FILE"
|
||||
echo ""
|
||||
echo -e "${YELLOW}2. Enable required Apache modules:${NC}"
|
||||
echo -e " sudo a2enmod proxy proxy_http headers rewrite"
|
||||
echo ""
|
||||
echo -e "${YELLOW}3. Add the configuration to your Apache virtual host:${NC}"
|
||||
echo -e " - Edit: /etc/apache2/sites-available/your-site.conf"
|
||||
echo -e " - Or copy: sudo cp $APACHE_CONFIG_FILE /etc/apache2/sites-available/${SERVICE_NAME}.conf"
|
||||
echo -e " - Enable: sudo a2ensite ${SERVICE_NAME}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}4. Test Apache configuration:${NC}"
|
||||
echo -e " sudo apache2ctl configtest"
|
||||
echo ""
|
||||
echo -e "${YELLOW}5. Reload Apache:${NC}"
|
||||
echo -e " sudo systemctl reload apache2"
|
||||
echo ""
|
||||
echo -e "${YELLOW}6. Configure SSL/TLS certificates (if not already done):${NC}"
|
||||
echo -e " sudo apt install certbot python3-certbot-apache"
|
||||
echo -e " sudo certbot --apache -d $DOMAIN"
|
||||
echo ""
|
||||
|
||||
print_header "Useful Commands"
|
||||
|
||||
echo -e "${BLUE}Service Management:${NC}"
|
||||
echo -e " sudo systemctl status $SERVICE_NAME # Check service status"
|
||||
echo -e " sudo systemctl restart $SERVICE_NAME # Restart service"
|
||||
echo -e " sudo systemctl stop $SERVICE_NAME # Stop service"
|
||||
echo -e " sudo journalctl -u $SERVICE_NAME -f # View live logs"
|
||||
echo -e " sudo journalctl -u $SERVICE_NAME -n 100 # View last 100 log lines"
|
||||
echo ""
|
||||
|
||||
print_success "Deployment script completed successfully!"
|
||||
|
||||
exit 0
|
||||
|
|
@ -7,9 +7,10 @@ Pulls data from Make.com endpoint and analyzes unique email addresses for user f
|
|||
import requests
|
||||
import json
|
||||
import re
|
||||
import os
|
||||
from collections import Counter
|
||||
|
||||
MAKE_WEBHOOK_URL = 'https://hook.eu1.make.celonis.com/h8gjldwnp4u5cvc0io474zq4u7vwb9zw'
|
||||
MAKE_WEBHOOK_URL = os.environ.get('MAKE_WEBHOOK_URL', 'https://hook.eu1.make.celonis.com/h8gjldwnp4u5cvc0io474zq4u7vwb9zw')
|
||||
|
||||
def fetch_data(data_type):
|
||||
"""Fetch data from Make.com endpoint"""
|
||||
|
|
|
|||
|
|
@ -1,9 +1,13 @@
|
|||
import { LogLevel } from '@azure/msal-browser';
|
||||
|
||||
// Get Azure AD configuration from environment variables
|
||||
const tenantId = import.meta.env.VITE_AZURE_TENANT_ID || 'e519c2e6-bc6d-4fdf-8d9c-923c2f002385';
|
||||
const clientId = import.meta.env.VITE_AZURE_CLIENT_ID || '014547f2-21c1-4245-881f-97f49543d963';
|
||||
|
||||
export const msalConfig = {
|
||||
auth: {
|
||||
clientId: '014547f2-21c1-4245-881f-97f49543d963',
|
||||
authority: 'https://login.microsoftonline.com/e519c2e6-bc6d-4fdf-8d9c-923c2f002385',
|
||||
clientId: clientId,
|
||||
authority: `https://login.microsoftonline.com/${tenantId}`,
|
||||
redirectUri: window.location.origin,
|
||||
postLogoutRedirectUri: window.location.origin,
|
||||
navigateToLoginRequestUrl: false
|
||||
|
|
|
|||
|
|
@ -4,10 +4,15 @@ import { PublicClientApplication } from '@azure/msal-browser';
|
|||
// Determine the API URL based on the environment
|
||||
const isDevelopment = import.meta.env.DEV;
|
||||
|
||||
// Get configuration from environment variables
|
||||
const domain = import.meta.env.VITE_DOMAIN || 'baic.oliver.solutions';
|
||||
const basePath = import.meta.env.VITE_BASE_PATH || '/dashboard/';
|
||||
const backendPort = import.meta.env.VITE_BACKEND_PORT || '5001';
|
||||
|
||||
// In development mode, use the local URL; in production, use the deployed URL
|
||||
const API_URL = isDevelopment
|
||||
? 'http://localhost:5001/api'
|
||||
: 'https://baic.oliver.solutions/dashboard/back/api';
|
||||
const API_URL = isDevelopment
|
||||
? `http://localhost:${backendPort}/api`
|
||||
: `https://${domain}${basePath}back/api`;
|
||||
|
||||
/**
|
||||
* Get access token from MSAL instance
|
||||
|
|
|
|||
|
|
@ -1,8 +1,14 @@
|
|||
import { defineConfig } from 'vite'
|
||||
import { defineConfig, loadEnv } from 'vite'
|
||||
import react from '@vitejs/plugin-react'
|
||||
|
||||
// https://vite.dev/config/
|
||||
export default defineConfig({
|
||||
plugins: [react()],
|
||||
base: '/dashboard/',
|
||||
export default defineConfig(({ mode }) => {
|
||||
// Load env file based on `mode` in the current working directory.
|
||||
// By default, only env variables prefixed with `VITE_` are exposed.
|
||||
const env = loadEnv(mode, process.cwd(), '')
|
||||
|
||||
return {
|
||||
plugins: [react()],
|
||||
base: env.VITE_BASE_PATH || '/dashboard/',
|
||||
}
|
||||
})
|
||||
|
|
|
|||
10
run.sh
10
run.sh
|
|
@ -1,5 +1,15 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Load environment variables from .env file
|
||||
if [ -f .env ]; then
|
||||
echo "Loading environment variables from .env file..."
|
||||
set -a # automatically export all variables
|
||||
source .env
|
||||
set +a
|
||||
else
|
||||
echo "Warning: .env file not found. Using default values."
|
||||
fi
|
||||
|
||||
# Start the backend server with Hypercorn
|
||||
echo "Starting backend server with Hypercorn..."
|
||||
cd backend
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue