ai_qc/MIGRATION_GUIDE.md
nickviljoen b7b7f57b35 Add production deployment migration guide and configuration files
Added comprehensive migration documentation and configuration files for restructuring the application to split frontend/backend:

New Documentation:
- MIGRATION_GUIDE.md: Complete step-by-step migration instructions
- MIGRATION_SUMMARY.md: Quick reference guide for deployment
- MIGRATION_CHECKLIST.md: Printable checklist for migration day
- DEPLOYMENT_RESTRUCTURE.md: Architecture overview and benefits

New Configuration Files:
- run_api_server.py: Production WSGI server wrapper using Waitress
- ai_qc.service: Systemd service configuration for backend
- apache_config.conf: Apache virtual host configuration template

Updated Files:
- requirements.txt: Added waitress>=2.1.2 for production WSGI server
- README.md: Added deployment documentation section

Migration Overview:
- Split current monolithic structure into separate frontend/backend
- Move backend to /opt/ai_qc/ (following server standards)
- Keep frontend in /var/www/html/ai_qc/ (single index.html)
- Use Apache reverse proxy to connect frontend to backend API
- Implement systemd service for reliable backend process management

Benefits:
- Improved security (backend code not in web root)
- Better separation of concerns
- Follows industry best practices
- Matches existing server app patterns (/opt/veo3, /opt/voice2text)
- Easier independent updates of frontend/backend

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 11:45:31 +02:00

12 KiB

Visual AI QC Migration Guide

Moving from Web Root to /opt/ Structure

This guide provides step-by-step instructions for migrating the Visual AI QC application from /var/www/html/ai_qc/ to a split frontend/backend structure.


Current vs. New Structure

Current Structure

/var/www/html/ai_qc/
├── api_server.py              # Backend
├── run_api_server.py          # Backend launcher
├── web_ui.html                # Frontend
├── visual_qc_apps/            # Backend
├── profiles/                  # Backend
├── brand_guidelines/          # Backend
├── uploads/                   # Backend data
├── output/                    # Backend data
├── venv/                      # Backend dependencies
└── ... (all other files)

New Structure

Frontend: /var/www/html/ai_qc/
└── index.html                 # Renamed from web_ui.html

Backend: /opt/ai_qc/
├── api_server.py
├── run_api_server.py
├── llm_config.py
├── profile_config.py
├── jwt_validator.py
├── auth_middleware.py
├── visual_qc_apps/
├── profiles/
├── brand_guidelines/
├── config/
├── uploads/
├── output/
├── venv/
└── ... (all Python/backend files)

Prerequisites

Before starting, ensure you have:

  1. SSH access to the server with sudo privileges
  2. Backup of current deployment
  3. Maintenance window scheduled (estimated 15-30 minutes downtime)
  4. Apache restart permissions

Step-by-Step Migration

Step 0: Preparation (On your server via SSH)

# Check current service name
sudo systemctl list-units --type=service | grep ai_qc

# Check current Apache configuration
ls -la /etc/apache2/sites-enabled/ | grep ai_qc

# Backup current deployment
cd /var/www/html/ai_qc
sudo tar -czf ~/ai_qc_backup_$(date +%Y%m%d_%H%M%S).tar.gz .
echo "Backup created at: ~/ai_qc_backup_$(date +%Y%m%d_%H%M%S).tar.gz"

Step 1: Stop Current Service

# Find the service name (likely ai_qc or ai_qc.service)
sudo systemctl list-units --type=service | grep ai_qc

# Stop the service (replace SERVICE_NAME with actual name)
sudo systemctl stop SERVICE_NAME

# Verify it's stopped
ps aux | grep run_api_server.py
# Should return no results (except the grep command itself)

Step 2: Create Backend Directory Structure

# Create backend directory
sudo mkdir -p /opt/ai_qc

# Copy all files except web_ui.html to backend
cd /var/www/html/ai_qc
sudo rsync -av \
  --exclude='web_ui.html' \
  --exclude='*.pyc' \
  --exclude='__pycache__' \
  --exclude='.git' \
  . /opt/ai_qc/

# Set ownership
sudo chown -R www-data:www-data /opt/ai_qc

# Set permissions
sudo chmod -R 750 /opt/ai_qc
sudo chmod 770 /opt/ai_qc/uploads /opt/ai_qc/output
sudo chmod 770 /opt/ai_qc/uploads-dev /opt/ai_qc/output-dev
sudo chmod 640 /opt/ai_qc/config/*.env

Step 3: Prepare Frontend Directory

# Create clean frontend directory
sudo mkdir -p /var/www/html/ai_qc_new

# Copy web_ui.html and rename to index.html
sudo cp /var/www/html/ai_qc/web_ui.html /var/www/html/ai_qc_new/index.html

# Set ownership
sudo chown -R www-data:www-data /var/www/html/ai_qc_new

Step 4: Update Backend Configuration

# Update production environment config with absolute paths
sudo nano /opt/ai_qc/config/production.env

# Ensure these paths are absolute:
# UPLOAD_FOLDER=/opt/ai_qc/uploads
# OUTPUT_FOLDER=/opt/ai_qc/output
# UPLOAD_FOLDER_DEV=/opt/ai_qc/uploads-dev
# OUTPUT_FOLDER_DEV=/opt/ai_qc/output-dev
# BRAND_GUIDELINES_FOLDER=/opt/ai_qc/brand_guidelines

Step 5: Update Frontend API URLs

# Edit the frontend to use absolute API paths
sudo nano /var/www/html/ai_qc_new/index.html

# Find all fetch() calls and ensure they use /api/ prefix
# Search for: fetch('
# Replace relative URLs with /api/ prefix if needed
# Example: fetch('/start_analysis') → fetch('/api/start_analysis')

Important: Check if your current web_ui.html already uses /api/ prefix. If it does, no changes needed!

Step 6: Update Systemd Service

# Find current service file
sudo find /etc/systemd/system -name "*ai_qc*"

# Create new service file (or update existing)
sudo nano /etc/systemd/system/ai_qc.service

Paste this content:

[Unit]
Description=Visual AI QC Flask Application
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/opt/ai_qc
Environment="ENVIRONMENT=production"
Environment="PATH=/opt/ai_qc/venv/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/opt/ai_qc/venv/bin/python /opt/ai_qc/run_api_server.py --host localhost --port 7183 --workers 2

Restart=always
RestartSec=10

NoNewPrivileges=true
PrivateTmp=true

StandardOutput=journal
StandardError=journal
SyslogIdentifier=ai_qc

[Install]
WantedBy=multi-user.target

Save and exit (Ctrl+X, Y, Enter)

# Reload systemd
sudo systemctl daemon-reload

Step 7: Update Apache Configuration

# Find current Apache config
ls -la /etc/apache2/sites-available/ | grep ai_qc

# Backup current config
sudo cp /etc/apache2/sites-available/ai_qc.conf /etc/apache2/sites-available/ai_qc.conf.backup

# Edit Apache config
sudo nano /etc/apache2/sites-available/ai_qc.conf

Update the configuration to:

<VirtualHost *:80>
    ServerName your-domain.com

    # Frontend - serve from web root
    DocumentRoot /var/www/html/ai_qc_new

    <Directory /var/www/html/ai_qc_new>
        Options -Indexes +FollowSymLinks
        AllowOverride None
        Require all granted
        DirectoryIndex index.html
    </Directory>

    # Backend API - proxy to Flask
    ProxyPreserveHost On
    ProxyPass /api http://localhost:7183/api
    ProxyPassReverse /api http://localhost:7183/api
    ProxyTimeout 300

    # Serve uploaded files from backend
    Alias /uploads /opt/ai_qc/uploads
    <Directory /opt/ai_qc/uploads>
        Options -Indexes
        Require all granted
    </Directory>

    # Serve output files from backend
    Alias /output /opt/ai_qc/output
    <Directory /opt/ai_qc/output>
        Options -Indexes
        Require all granted
    </Directory>

    # Development folders (optional)
    Alias /uploads-dev /opt/ai_qc/uploads-dev
    <Directory /opt/ai_qc/uploads-dev>
        Options -Indexes
        Require all granted
    </Directory>

    Alias /output-dev /opt/ai_qc/output-dev
    <Directory /opt/ai_qc/output-dev>
        Options -Indexes
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/ai_qc_error.log
    CustomLog ${APACHE_LOG_DIR}/ai_qc_access.log combined
</VirtualHost>

Save and exit, then:

# Test Apache configuration
sudo apache2ctl configtest

# Should return "Syntax OK"

Step 8: Install Dependencies (if needed)

# Activate virtual environment
cd /opt/ai_qc
source venv/bin/activate

# Install waitress if not already installed (for run_api_server.py)
pip install waitress

# Verify all dependencies
pip install -r requirements.txt

deactivate

Step 9: Test Backend Standalone

# Test if backend starts correctly
cd /opt/ai_qc
sudo -u www-data /opt/ai_qc/venv/bin/python run_api_server.py --host localhost --port 7183 --workers 2

# In another terminal, test the API
curl http://localhost:7183/api/profiles

# Should return profile data
# Press Ctrl+C to stop the test server

Step 10: Start Services

# Start the backend service
sudo systemctl start ai_qc

# Check status
sudo systemctl status ai_qc

# Check logs
sudo journalctl -u ai_qc -f

# Verify backend is responding
curl http://localhost:7183/api/profiles

Step 11: Reload Apache

# Reload Apache to apply new configuration
sudo systemctl reload apache2

# Check Apache status
sudo systemctl status apache2

# Check Apache error log
sudo tail -f /var/log/apache2/ai_qc_error.log

Step 12: Test the Application

# Test frontend is accessible
curl http://your-domain.com/

# Test API through Apache proxy
curl http://your-domain.com/api/profiles

# Test file serving
curl -I http://your-domain.com/uploads/
curl -I http://your-domain.com/output/

Then test in browser:

  1. Open http://your-domain.com/ in browser
  2. Sign in with Microsoft authentication
  3. Upload a test file
  4. Run analysis
  5. Verify results display correctly
  6. Check saved files list updates

Step 13: Finalize Migration

Once everything is working:

# Rename directories
sudo mv /var/www/html/ai_qc /var/www/html/ai_qc_old
sudo mv /var/www/html/ai_qc_new /var/www/html/ai_qc

# Update Apache config DocumentRoot if needed
sudo nano /etc/apache2/sites-available/ai_qc.conf
# Change: DocumentRoot /var/www/html/ai_qc_new
# To:     DocumentRoot /var/www/html/ai_qc

# Reload Apache
sudo systemctl reload apache2

# Test again to ensure everything still works

Step 14: Enable Service on Boot

# Ensure service starts on boot
sudo systemctl enable ai_qc

# Verify it's enabled
sudo systemctl is-enabled ai_qc
# Should return "enabled"

Verification Checklist

After migration, verify:

  • Backend service is running: sudo systemctl status ai_qc
  • Backend responds: curl http://localhost:7183/api/profiles
  • Apache is running: sudo systemctl status apache2
  • Frontend loads: Visit http://your-domain.com/
  • API calls work: Check browser console for errors
  • Authentication works: Sign in with Microsoft
  • File upload works: Upload test file
  • Analysis works: Run QC analysis on test file
  • Results display: Verify results show correctly
  • Saved files work: Check saved files list updates
  • File downloads work: Download generated PDF reports
  • Logs are clean: sudo journalctl -u ai_qc -n 50 --no-pager

Rollback Plan

If issues occur:

Quick Rollback

# Stop new service
sudo systemctl stop ai_qc

# Restore old Apache config
sudo cp /etc/apache2/sites-available/ai_qc.conf.backup /etc/apache2/sites-available/ai_qc.conf
sudo systemctl reload apache2

# Rename directories back
sudo mv /var/www/html/ai_qc /var/www/html/ai_qc_failed
sudo mv /var/www/html/ai_qc_old /var/www/html/ai_qc

# Restore old service file (if you backed it up)
sudo cp /etc/systemd/system/ai_qc.service.backup /etc/systemd/system/ai_qc.service
sudo systemctl daemon-reload

# Start old service
sudo systemctl start ai_qc

# Verify old version works
curl http://your-domain.com/

Full Restore from Backup

# Stop all services
sudo systemctl stop ai_qc
sudo systemctl stop apache2

# Remove new directories
sudo rm -rf /opt/ai_qc
sudo rm -rf /var/www/html/ai_qc_new

# Restore from backup
cd /var/www/html/ai_qc
sudo tar -xzf ~/ai_qc_backup_YYYYMMDD_HHMMSS.tar.gz

# Restore old config and restart
sudo systemctl start ai_qc
sudo systemctl start apache2

Monitoring After Migration

Check Logs Regularly

# Backend logs
sudo journalctl -u ai_qc -f

# Apache logs
sudo tail -f /var/log/apache2/ai_qc_error.log
sudo tail -f /var/log/apache2/ai_qc_access.log

# Check disk space
df -h /opt/ai_qc

Performance Monitoring

# Check backend process
ps aux | grep run_api_server

# Check memory usage
sudo systemctl status ai_qc

# Check port is listening
sudo ss -tlnp | grep 7183

Benefits of New Structure

Security: Backend code not accessible from web root Separation: Frontend and backend can be updated independently Scalability: Backend can be moved to separate server if needed Standard Practice: Matches other apps on your server (/opt/veo3, /opt/voice2text) Better Permissions: More granular access control Cleaner Structure: Clear separation of concerns


Need Help?

If you encounter issues:

  1. Check logs: sudo journalctl -u ai_qc -n 100 --no-pager
  2. Check Apache logs: sudo tail -100 /var/log/apache2/ai_qc_error.log
  3. Test backend directly: curl http://localhost:7183/api/profiles
  4. Verify permissions: ls -la /opt/ai_qc
  5. Check service status: sudo systemctl status ai_qc

Common issues:

  • Permission denied: Check file ownership (sudo chown -R www-data:www-data /opt/ai_qc)
  • Module not found: Check virtual environment (which python should show venv path)
  • Port already in use: Check if old service is still running (ps aux | grep 7183)
  • API not responding: Check if service is running (sudo systemctl status ai_qc)