solventum-image-metadata/docs/apache/APACHE-MIGRATION.md
SamoilenkoVadym 9fd8581dd4 fix(config): use port 5001 for Azure AD compatibility
- Change BACKEND_PORT from 8001 to 5001 (same as Flask)
- Keeps existing Azure AD redirect URI working
- No need to update Azure AD app registration
- Apache proxy can use same port configuration

Co-Authored-By: Claude Sonnet 4.5 (1M context) <noreply@anthropic.com>
2026-02-09 13:29:45 +00:00

4.4 KiB

Apache Configuration Migration Guide

⚠️ Important Changes for FastAPI

Your current Apache config uses Flask on port 5001. For FastAPI, you need to change:

Note: Using port 5001 (same as Flask) for Azure AD compatibility

Current (Flask):

ProxyPass /solventum-image-metadata/ http://localhost:5001/
ProxyPassReverse /solventum-image-metadata/ http://localhost:5001/

New (FastAPI):

# Frontend - static files (React build)
Alias /solventum-image-metadata /var/www/html/solventum-image-metadata

<Directory /var/www/html/solventum-image-metadata>
    Options -Indexes +FollowSymLinks
    AllowOverride All
    Require all granted

    # React Router (SPA) - rewrite to index.html
    RewriteEngine On
    RewriteBase /solventum-image-metadata
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/solventum-image-metadata/api/
    RewriteRule ^ /solventum-image-metadata/index.html [L]
</Directory>

# Backend API - proxy to FastAPI
ProxyPreserveHost On
ProxyTimeout 600

<Location /solventum-image-metadata/api>
    ProxyPass http://localhost:5001
    ProxyPassReverse http://localhost:5001

    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
</Location>

Key Changes:

  1. Port unchanged: 5001 (same port as Flask for Azure AD compatibility)
  2. Frontend: Separate static files (not proxied)
  3. API prefix: /solventum-image-metadata/api/ → Backend
  4. SPA routing: RewriteRule for React Router

Update on Server:

# 1. Edit Apache config
sudo nano /etc/apache2/sites-available/solventum-image-metadata.conf

# 2. Replace the ProxyPass lines with the new config above

# 3. Enable required modules
sudo a2enmod rewrite headers alias

# 4. Test config
sudo apache2ctl configtest

# 5. Reload Apache
sudo systemctl reload apache2

Update .env on Server:

# Edit /opt/solventum-image-metadata/.env
sudo nano /opt/solventum-image-metadata/.env

# Change REDIRECT_URI:
REDIRECT_URI=https://ai-sandbox.oliver.solutions/solventum-image-metadata/api/auth/microsoft/callback
#                                                                         ^^^^ ADD /api/

Verify:

# Backend health (direct)
curl http://localhost:5001/health

# Frontend (through Apache)
curl https://ai-sandbox.oliver.solutions/solventum-image-metadata/

# API (through Apache)
curl https://ai-sandbox.oliver.solutions/solventum-image-metadata/api/health

Complete Apache VirtualHost Example:

<VirtualHost *:443>
    ServerName ai-sandbox.oliver.solutions

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/ai-sandbox.oliver.solutions/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ai-sandbox.oliver.solutions/privkey.pem

    # Security headers
    Header always set X-Frame-Options "SAMEORIGIN"
    Header always set X-Content-Type-Options "nosniff"

    # Frontend - React SPA static files
    Alias /solventum-image-metadata /var/www/html/solventum-image-metadata

    <Directory /var/www/html/solventum-image-metadata>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted

        # React Router support
        RewriteEngine On
        RewriteBase /solventum-image-metadata
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !^/solventum-image-metadata/api/
        RewriteRule ^ /solventum-image-metadata/index.html [L]
    </Directory>

    # Cache static assets
    <FilesMatch "\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$">
        Header set Cache-Control "public, max-age=31536000"
    </FilesMatch>

    # Don't cache HTML
    <FilesMatch "\.(html)$">
        Header set Cache-Control "no-cache, no-store, must-revalidate"
    </FilesMatch>

    # Backend API - FastAPI reverse proxy
    ProxyPreserveHost On
    ProxyTimeout 600

    <Location /solventum-image-metadata/api>
        ProxyPass http://localhost:5001
        ProxyPassReverse http://localhost:5001

        RequestHeader set X-Forwarded-Proto "https"
        RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
    </Location>

    # Allow large file uploads (500MB)
    LimitRequestBody 524288000

    ErrorLog ${APACHE_LOG_DIR}/solventum-image-metadata-error.log
    CustomLog ${APACHE_LOG_DIR}/solventum-image-metadata-access.log combined
</VirtualHost>