diff --git a/DIAGNOSIS-2025-12-30.md b/DIAGNOSIS-2025-12-30.md
deleted file mode 100644
index 68978dc..0000000
--- a/DIAGNOSIS-2025-12-30.md
+++ /dev/null
@@ -1,378 +0,0 @@
-# ROA2WEB Production Deployment Issue - Diagnostic Report
-
-**Date**: 2025-12-30
-**Environment**: Windows Production (roa2web.romfast.ro)
-**Issue**: 404 errors on API calls after deployment
-
----
-
-## Summary
-
-Frontend loads successfully but all API calls return **404 Not Found** errors:
-- `POST /roa2web/api/auth/login` → 404
-- `GET /roa2web/api/companies` → 404
-
-Browser console shows:
-```
-POST https://roa2web.romfast.ro/roa2web/api/auth/login 404 (Not Found)
-```
-
----
-
-## Architecture Overview
-
-**2-Tier IIS Deployment**:
-
-```
-Internet → Public IIS (10.0.20.122 - roa2web.romfast.ro)
- ↓ HTTPS reverse proxy
- Internal IIS (10.0.20.36 - application server)
- ↓ API proxy to localhost
- Backend Service (localhost:8000 on 10.0.20.36)
- ↓
- Oracle Database
-```
-
-### Verified Components
-
-✅ **Public IIS** (10.0.20.122 - roa2web.romfast.ro):
-- ✅ web.config correctly proxies all requests to `https://10.0.20.36/{R:1}`
-- ✅ Forwards headers: `X-Forwarded-Proto`, `X-Forwarded-Host`, `X-Real-IP`
-- ✅ Configuration verified - THIS SERVER IS CORRECT
-
-✅ **Frontend** (10.0.20.36):
-- Built with `base: '/roa2web/'` (correct for IIS sub-application)
-- API calls use `baseURL: '/roa2web/api'` (correct)
-- Static files load successfully
-
-❌ **Internal IIS** (10.0.20.36) - **PROBLEMA ESTE AICI**:
-- **CRITICAL**: web.config lipsește SAU nu este configurat corect
-- **MUST**: Trebuie să facă proxy de la `/roa2web/api/*` către `http://localhost:8000/api/*`
-- **Location**: `C:\inetpub\wwwroot\roa2web\web.config` (pe serverul 10.0.20.36)
-
-❓ **Backend Service** (pe 10.0.20.36):
-- **UNKNOWN**: Need to verify service is running
-- Should be accessible at `http://localhost:8000/health` (de pe 10.0.20.36)
-
----
-
-## Root Cause Analysis
-
-Based on Playwright testing, the issue is most likely:
-
-### Primary Suspect: Internal Server web.config
-
-The internal server's web.config **MUST** handle the `/roa2web/` prefix correctly.
-
-**WRONG Configuration** (causes 404):
-```xml
-
- ❌ Missing roa2web prefix!
-
-
-```
-
-**CORRECT Configuration**:
-```xml
-
- ✅ Includes roa2web prefix
-
-
-```
-
-**Why**: Requests arrive at internal server as `/roa2web/api/auth/login` (NOT `/api/auth/login`), because the public server preserves the full path when proxying.
-
-### Secondary Suspects
-
-1. **Backend service not running**
- - Check: `Get-Service ROA2WEB-Backend`
-
-2. **IIS ARR not enabled**
- - Check: `Get-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" -Filter "system.webServer/proxy" -Name "enabled"`
-
-3. **IIS sub-application misconfigured**
- - Frontend should be deployed at IIS path `/roa2web`, not root
-
----
-
-## Diagnostic Steps
-
-### Step 1: Check Backend Service (on 10.0.20.36)
-
-```powershell
-# Check service status
-Get-Service ROA2WEB-Backend
-
-# If stopped, start it
-Start-Service ROA2WEB-Backend
-
-# Test backend directly
-Invoke-WebRequest http://localhost:8000/health
-```
-
-**Expected Output**:
-```json
-{"status": "healthy", "version": "..."}
-```
-
-### Step 2: Check Internal IIS web.config (on 10.0.20.36)
-
-```powershell
-# View current web.config
-Get-Content C:\inetpub\wwwroot\roa2web\web.config
-
-# OR if frontend is in subdirectory:
-Get-Content C:\inetpub\wwwroot\roa2web\frontend\web.config
-```
-
-**Verify these rules**:
-- `` (NOT `^api/(.*)`)
-- `` (NOT `^uploads/(.*)`)
-- `` for SPA fallback
-
-### Step 3: Check IIS ARR (on 10.0.20.36)
-
-```powershell
-# Check if ARR is installed
-Get-WindowsFeature -Name Web-ARR
-
-# Check if proxy is enabled
-Get-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" `
- -Filter "system.webServer/proxy" `
- -Name "enabled"
-```
-
-**Expected**: `enabled` should be `True`
-
-### Step 4: Test Internal IIS Proxy (on 10.0.20.36)
-
-```powershell
-# Test API endpoint through IIS
-Invoke-WebRequest https://localhost/roa2web/api/health
-
-# Should proxy to backend and return response
-```
-
-### Step 5: Check IIS Application Structure (on 10.0.20.36)
-
-```powershell
-# List IIS applications
-Get-WebApplication -Site "Default Web Site" | Format-Table Path, PhysicalPath
-
-# Should show:
-# /roa2web -> C:\inetpub\wwwroot\roa2web\
-```
-
----
-
-## Fix Recommendations
-
-### Fix #1: Update Internal Server web.config
-
-**Server**: 10.0.20.36 (internal application server)
-**Location**: `C:\inetpub\wwwroot\roa2web\web.config`
-
-**IMPORTANT**: Acest web.config este pe serverul 10.0.20.36, NU pe 10.0.20.122!
-
-**Required Configuration**:
-
-```xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-**Deployment**:
-
-```powershell
-# ⚠️ IMPORTANT: Rulează aceste comenzi pe serverul 10.0.20.36, NU pe 10.0.20.122!
-# Conectează-te la 10.0.20.36 (internal application server)
-
-# Backup current config
-Copy-Item C:\inetpub\wwwroot\roa2web\web.config `
- C:\inetpub\wwwroot\roa2web\web.config.backup.$(Get-Date -Format 'yyyyMMdd-HHmmss')
-
-# Update web.config with corrected version
-# (copy from repository: public/web.config after updating it)
-
-# Restart IIS
-iisreset
-
-# Test
-Invoke-WebRequest https://localhost/roa2web/api/health
-```
-
-### Fix #2: Ensure Backend Service is Running
-
-```powershell
-# On internal server (10.0.20.36)
-
-# Check service
-Get-Service ROA2WEB-Backend
-
-# If stopped
-Start-Service ROA2WEB-Backend
-
-# View startup logs
-Get-Content C:\inetpub\wwwroot\roa2web\logs\backend-stdout.log -Tail 50
-
-# Check for errors
-Get-Content C:\inetpub\wwwroot\roa2web\logs\backend-stderr.log -Tail 50
-```
-
-### Fix #3: Enable IIS ARR (if not enabled)
-
-```powershell
-# On internal server (10.0.20.36)
-
-# Enable proxy
-Set-WebConfigurationProperty -PSPath "MACHINE/WEBROOT/APPHOST" `
- -Filter "system.webServer/proxy" `
- -Name "enabled" `
- -Value "True"
-
-# Restart IIS
-iisreset
-```
-
----
-
-## Verification Steps (After Fix)
-
-### 1. Backend Health Check (Direct)
-
-```powershell
-# On 10.0.20.36
-Invoke-WebRequest http://localhost:8000/health
-```
-
-**Expected**: `200 OK` with JSON response
-
-### 2. Internal IIS Proxy Test
-
-```powershell
-# On 10.0.20.36
-Invoke-WebRequest https://localhost/roa2web/api/health
-```
-
-**Expected**: `200 OK` (proxied from backend)
-
-### 3. Public Access Test
-
-```powershell
-# From any client
-Invoke-WebRequest https://roa2web.romfast.ro/roa2web/
-```
-
-**Expected**: Frontend loads (HTML page)
-
-### 4. Login Flow Test (Playwright)
-
-Use Playwright to test complete login flow:
-
-```bash
-# On development machine
-cd /mnt/e/proiecte/roa2web
-npx playwright test --headed --project=chromium tests/login.spec.js
-```
-
-**Expected**: Login succeeds without 404 errors
-
----
-
-## Prevention
-
-To prevent this issue in future deployments:
-
-1. **Use Correct web.config Template**
- - Repository should have separate web.config templates:
- - `public/web.config` - for internal server (with `/roa2web/` prefix)
- - `deployment/windows/config/web.config` - same as above
-
-2. **Automated Deployment Script**
- - PowerShell script should validate web.config before deployment
- - Check for required URL patterns: `^roa2web/api/`, `^roa2web/uploads/`
-
-3. **Deployment Checklist**
- - Add to `deployment/windows/docs/DEPLOYMENT-CHECKLIST.md`:
- - [ ] Verify web.config includes `/roa2web/` prefix in match rules
- - [ ] Test backend: `Invoke-WebRequest http://localhost:8000/health`
- - [ ] Test IIS proxy: `Invoke-WebRequest https://localhost/roa2web/api/health`
- - [ ] Test public access: `Invoke-WebRequest https://roa2web.romfast.ro/roa2web/`
-
-4. **Monitoring**
- - Add health check endpoint monitoring
- - Alert if backend service stops
- - Monitor IIS logs for 404/502 errors
-
----
-
-## Next Steps
-
-1. ✅ **Immediate**: Check internal server web.config (on 10.0.20.36)
-2. ✅ **Immediate**: Verify backend service is running
-3. ✅ **Immediate**: Apply Fix #1 if web.config is incorrect
-4. ⏭️ **After Fix**: Run verification steps
-5. ⏭️ **After Fix**: Update repository web.config template
-6. ⏭️ **Future**: Add automated deployment validation
-
----
-
-## Documentation Created
-
-- ✅ `deployment/windows/docs/TWO-TIER-IIS-DEPLOYMENT.md` - Complete 2-tier architecture guide
-- ✅ Updated `CLAUDE.md` with deployment documentation reference
-- ✅ This diagnostic report: `DIAGNOSIS-2025-12-30.md`
-
----
-
-## Contact Information
-
-**Issue Reported By**: User via Playwright testing
-**Diagnosed By**: Claude Code
-**Date**: 2025-12-30
-**Severity**: HIGH (blocking production login)
-**Priority**: IMMEDIATE
-
----
-
-*For detailed architecture documentation, see: `deployment/windows/docs/TWO-TIER-IIS-DEPLOYMENT.md`*
diff --git a/deployment/windows/DEPLOYMENT-FIXES-2025-12-29.md b/deployment/windows/DEPLOYMENT-FIXES-2025-12-29.md
deleted file mode 100644
index 80a59bc..0000000
--- a/deployment/windows/DEPLOYMENT-FIXES-2025-12-29.md
+++ /dev/null
@@ -1,371 +0,0 @@
-# Deployment Fixes - 2025-12-29
-
-## Summary
-
-Fixed critical Telegram bot deployment issue and updated all deployment scripts and documentation to use `--workers 1` configuration.
-
----
-
-## Problems Fixed
-
-### 1. ❌ Telegram Bot Conflict (CRITICAL)
-
-**Error:**
-```
-telegram.error.Conflict: Conflict: terminated by other getUpdates request;
-make sure that only one bot instance is running
-```
-
-**Root Cause:**
-- NSSM service was configured with `--workers 4`
-- Each uvicorn worker spawned its own Telegram bot instance
-- Telegram API allows only ONE bot instance to poll for updates
-- Multiple instances conflicted → continuous errors
-
-**Solution:**
-- Changed NSSM service configuration to `--workers 1`
-- Single worker = Single bot instance = No conflicts
-
----
-
-### 2. ❌ Cache Stats Endpoint (502 Bad Gateway)
-
-**Error:**
-- `/api/reports/cache/stats` returned 502 Bad Gateway
-
-**Root Cause:**
-- Multiple workers accessing same SQLite cache database
-- SQLite locking conflicts caused worker crashes
-
-**Solution:**
-- **Automatically fixed** by using `--workers 1`
-- Single worker = No SQLite locking conflicts
-
----
-
-### 3. ⚠️ Pydantic v2 Warnings
-
-**Warning:**
-```
-UserWarning: Valid config keys have changed in V2:
-* 'schema_extra' has been renamed to 'json_schema_extra'
-```
-
-**Solution:**
-- Updated `backend/modules/reports/models/trial_balance.py:72`
-- Changed `schema_extra` → `json_schema_extra`
-
----
-
-## Files Modified
-
-### 1. Deployment Scripts
-
-#### `Install-ROA2WEB.ps1` (Line 370-371)
-**Changed:**
-```powershell
-# Before
-& nssm install ... "--workers" "4"
-
-# After
-# NOTE: Using --workers 1 because Telegram bot requires single instance (polling conflict)
-& nssm install ... "--workers" "1"
-```
-
-#### `Fix-TelegramWorkers.ps1` (NEW)
-**Created:** Automatic fix script for existing installations
-- Stops ROA2WEB-Backend service
-- Updates NSSM parameters to `--workers 1`
-- Restarts service
-- Verifies configuration and health
-- Checks logs for Telegram errors
-
-**Usage:**
-```powershell
-cd C:\TEMP\ROA2WEB-Scripts
-.\Fix-TelegramWorkers.ps1
-```
-
----
-
-### 2. Documentation
-
-#### `TELEGRAM-BOT-DEPLOYMENT.md` (NEW)
-**Created:** Complete deployment guide for Telegram bot
-- Explains the worker conflict issue
-- Installation and upgrade procedures
-- Verification steps
-- Troubleshooting guide
-- Architecture notes and performance analysis
-
-**Key Points:**
-- ✅ Always use `--workers 1`
-- ✅ Performance is excellent (async I/O bound, not CPU bound)
-- ✅ Single worker handles 100+ concurrent users
-- ✅ Lower memory usage (~400 MB vs ~1.6 GB)
-
-#### `WINDOWS_DEPLOYMENT.md`
-**Updated sections:**
-
-1. **High CPU/Memory Usage** (Line 716-743)
- - Removed outdated `WORKERS=2` in .env suggestion
- - Clarified workers are configured in NSSM, not .env
- - Added warning about not changing `--workers 1`
-
-2. **Backend Configuration (.env)** (Line 353-360)
- - Removed `WORKERS=4` from example .env
- - Added note that WORKERS is configured in NSSM
- - Added reference to TELEGRAM-BOT-DEPLOYMENT.md
-
----
-
-### 3. Backend Code
-
-#### `backend/modules/reports/models/trial_balance.py` (Line 72)
-**Changed:**
-```python
-# Before
-class Config:
- schema_extra = { ... }
-
-# After
-class Config:
- json_schema_extra = { ... }
-```
-
-**Impact:** Eliminates Pydantic v2 warnings in logs
-
----
-
-## Deployment Instructions
-
-### For New Installations
-
-Use updated `Install-ROA2WEB.ps1`:
-```powershell
-.\Install-ROA2WEB.ps1
-```
-
-The script now automatically uses `--workers 1` - no manual configuration needed.
-
----
-
-### For Existing Installations
-
-**Option 1: Automatic Fix (Recommended)**
-```powershell
-cd C:\TEMP\ROA2WEB-Scripts
-.\Fix-TelegramWorkers.ps1
-```
-
-**Option 2: Manual Fix**
-```powershell
-# Stop service
-Stop-Service ROA2WEB-Backend
-
-# Update NSSM
-nssm set ROA2WEB-Backend AppParameters "-m uvicorn main:app --host 127.0.0.1 --port 8000 --workers 1"
-
-# Verify
-nssm get ROA2WEB-Backend AppParameters
-
-# Start service
-Start-Service ROA2WEB-Backend
-
-# Monitor logs
-Get-Content C:\inetpub\wwwroot\roa2web\logs\backend-stderr.log -Tail 50 -Wait
-```
-
----
-
-## Verification
-
-### 1. Check NSSM Configuration
-```powershell
-nssm get ROA2WEB-Backend AppParameters
-```
-
-**Expected:**
-```
--m uvicorn main:app --host 127.0.0.1 --port 8000 --workers 1
-```
-
-### 2. Check Process Count
-```powershell
-Get-Process -Name python
-```
-
-**Expected:**
-- 1-2 Python processes (1 parent + 1 worker, or just 1 combined)
-- **NOT** 5 processes (1 parent + 4 workers)
-
-### 3. Check Telegram Bot in Logs
-```powershell
-Get-Content C:\inetpub\wwwroot\roa2web\logs\backend-stderr.log -Tail 100 | Select-String "Bot running"
-```
-
-**Expected:**
-- Message appears **EXACTLY ONCE**
-- No "Conflict: terminated by other getUpdates" errors
-
-### 4. Test Cache Stats Endpoint
-```
-https://roa2web.romfast.ro/roa2web/reports/cache-stats
-```
-
-**Expected:**
-- Page loads successfully (200 OK)
-- No 502 Bad Gateway error
-
-### 5. Test Telegram Bot
-Send a message to @ROA2WEBBot in Telegram
-
-**Expected:**
-- Bot responds without errors
-- No conflict errors in backend logs
-
----
-
-## Performance Impact
-
-### Before Fix (--workers 4)
-- ❌ Telegram bot conflicts (unusable)
-- ❌ Cache stats endpoint crashes (502)
-- 📊 5 Python processes
-- 📊 ~1.6 GB memory usage
-- ✅ Same performance (async I/O)
-
-### After Fix (--workers 1)
-- ✅ Telegram bot works perfectly
-- ✅ Cache stats endpoint works
-- ✅ No SQLite locking conflicts
-- 📊 2 Python processes
-- 📊 ~400 MB memory usage
-- ✅ Same performance (async I/O)
-
-**Conclusion:** `--workers 1` is **SUPERIOR** for this application in every way.
-
----
-
-## Architecture Notes
-
-### Why Single Worker is Better
-
-1. **Telegram Bot Requirement**
- - Telegram API allows only ONE bot instance per token
- - Multiple workers = Multiple bot instances = Conflicts
-
-2. **SQLite Cache Database**
- - Shared SQLite database for cache
- - Multiple workers = Locking conflicts = Crashes
-
-3. **Async I/O Performance**
- - Application is I/O bound (Oracle database queries)
- - NOT CPU bound
- - Single worker with async/await handles 100+ concurrent requests
- - Multiple workers provide NO performance benefit
-
-4. **Lower Resource Usage**
- - Less memory (~400 MB vs ~1.6 GB)
- - Fewer processes to manage
- - Simpler debugging
-
-### Performance Characteristics
-
-**With `--workers 1`:**
-- Concurrent requests: 100+ (async/await)
-- Database pooling: 5-10 Oracle connections (shared)
-- Memory usage: ~300-500 MB per worker
-- CPU usage: Low (I/O bound)
-- Response times: 50-200ms (mostly DB query time)
-
-**Adequate for:**
-- 50-100 concurrent users
-- 1000+ requests per minute
-- Multiple modules (Reports, Data Entry, Telegram)
-
----
-
-## Future Considerations
-
-### Alternative: Separate Bot Service
-
-If scalability becomes an issue, consider:
-
-**Option A (Current):** Integrated bot, single worker
-- ✅ Simple deployment
-- ✅ Single service to manage
-- ⚠️ Must use `--workers 1`
-
-**Option B (Alternative):** Separate bot service
-- ✅ Could use `--workers 4` for web backend
-- ❌ Two Windows services to manage
-- ❌ More complex deployment
-- ❌ Two processes to monitor
-
-**Decision:** Keep current architecture. Performance is excellent and deployment is simpler.
-
----
-
-## Checklist for Deployment
-
-### Pre-Deployment
-- [ ] Read this document
-- [ ] Read `TELEGRAM-BOT-DEPLOYMENT.md`
-- [ ] Backup current installation
-- [ ] Note current NSSM parameters
-
-### Deployment
-- [ ] Copy updated scripts to server
-- [ ] Run `Fix-TelegramWorkers.ps1` (existing) OR `Install-ROA2WEB.ps1` (new)
-- [ ] Wait 30 seconds for service startup
-- [ ] Verify NSSM parameters show `--workers 1`
-
-### Post-Deployment Verification
-- [ ] Check process count (should be 1-2, not 5)
-- [ ] Check logs for single bot startup message
-- [ ] Verify NO "Conflict" errors in logs
-- [ ] Test health endpoint: http://localhost:8000/health
-- [ ] Test cache stats: https://roa2web.romfast.ro/roa2web/reports/cache-stats
-- [ ] Test Telegram bot functionality
-- [ ] Monitor logs for 5 minutes
-
-### If Issues Occur
-- [ ] Check `TELEGRAM-BOT-DEPLOYMENT.md` troubleshooting section
-- [ ] Review backend logs for errors
-- [ ] Verify Oracle connection
-- [ ] Check PYTHONPATH in NSSM config
-- [ ] Contact development team with logs
-
----
-
-## Rollback Procedure
-
-If you need to rollback (not recommended):
-
-```powershell
-# Stop service
-Stop-Service ROA2WEB-Backend
-
-# Restore old parameters (WILL BREAK TELEGRAM BOT)
-nssm set ROA2WEB-Backend AppParameters "-m uvicorn main:app --host 127.0.0.1 --port 8000 --workers 4"
-
-# Start service
-Start-Service ROA2WEB-Backend
-```
-
-**Warning:** Rollback will restore the Telegram bot conflict issue.
-
----
-
-## Support
-
-For questions or issues:
-1. Check `TELEGRAM-BOT-DEPLOYMENT.md` troubleshooting
-2. Review `WINDOWS_DEPLOYMENT.md` for general deployment issues
-3. Check backend logs: `C:\inetpub\wwwroot\roa2web\logs\backend-stderr.log`
-4. Contact development team with:
- - Current NSSM parameters
- - Recent log excerpts (last 100 lines)
- - Process count and memory usage
- - Specific error messages
diff --git a/deployment/windows/config/web.config.10.0.20.36-INTERNAL b/deployment/windows/config/web.config.10.0.20.36-INTERNAL
deleted file mode 100644
index 03ff98f..0000000
--- a/deployment/windows/config/web.config.10.0.20.36-INTERNAL
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/deployment/windows/scripts/Build-ROA2WEB.ps1 b/deployment/windows/scripts/Build-ROA2WEB.ps1
index 237eb84..ee99b9b 100644
--- a/deployment/windows/scripts/Build-ROA2WEB.ps1
+++ b/deployment/windows/scripts/Build-ROA2WEB.ps1
@@ -117,6 +117,11 @@ function Write-Warning {
Write-Host " [WARN] $Message" -ForegroundColor Yellow
}
+function Write-Info {
+ param([string]$Message)
+ Write-Host " [INFO] $Message" -ForegroundColor Gray
+}
+
function Resolve-FullPath {
param([string]$Path)
@@ -352,6 +357,26 @@ function Build-Frontend {
}
}
+ # Copy public/ folder (contains web.config and other static assets)
+ $publicSourcePath = Join-Path $projectRoot "public"
+ if (Test-Path $publicSourcePath) {
+ $publicDestPath = Join-Path $tempBuildDir "public"
+ Write-Step "Copying public/ folder..."
+ Write-Info "Source: $publicSourcePath"
+ Write-Info "Dest: $publicDestPath"
+ Copy-Item -Path $publicSourcePath -Destination $publicDestPath -Recurse -Force
+ Write-Success "public/ folder copied (includes web.config)"
+
+ # Verify web.config was copied
+ $copiedWebConfig = Join-Path $publicDestPath "web.config"
+ if (Test-Path $copiedWebConfig) {
+ Write-Success "web.config found in public/"
+ } else {
+ Write-Warning "web.config NOT found in public/ - check source"
+ }
+ } else {
+ Write-Warning "public/ folder not found at: $publicSourcePath"
+ }
# Copy shared folder to maintain relative imports (../shared/)
# For ultrathin monolith: src/ and shared/ are siblings at project root
@@ -463,6 +488,15 @@ function Build-Frontend {
$totalSize = ($distFiles | Measure-Object -Property Length -Sum).Sum / 1MB
Write-Success "Generated $(($distFiles).Count) files ($([math]::Round($totalSize, 2)) MB)"
+ # Verify web.config was built
+ $webConfigPath = Join-Path $distPath "web.config"
+ if (Test-Path $webConfigPath) {
+ Write-Success "web.config found in build output"
+ } else {
+ Write-Warning "web.config NOT found in build output: $webConfigPath"
+ Write-Warning "Check if public/web.config exists in source"
+ }
+
return $distPath
} finally {
Pop-Location
@@ -879,7 +913,18 @@ function New-DeploymentPackage {
$frontendDest = Join-Path $OutputPath "frontend"
New-Item -ItemType Directory -Path $frontendDest -Force | Out-Null
Write-Step "Copying Unified Frontend files (SPA)..."
+ Write-Info "Source: $frontendDistPath"
+ Write-Info "Destination: $frontendDest"
Copy-Item -Path "$frontendDistPath\*" -Destination $frontendDest -Recurse -Force
+
+ # Verify web.config was copied
+ $copiedWebConfig = Join-Path $frontendDest "web.config"
+ if (Test-Path $copiedWebConfig) {
+ Write-Success "web.config copied to package"
+ } else {
+ Write-Warning "web.config NOT copied to package"
+ }
+
Write-Success "Unified Frontend files copied"
# Unified Backend (includes Reports, Data Entry, Telegram modules)
@@ -901,7 +946,18 @@ function New-DeploymentPackage {
$frontendDest = Join-Path $OutputPath "frontend"
New-Item -ItemType Directory -Path $frontendDest -Force | Out-Null
Write-Step "Copying Unified Frontend files (SPA)..."
+ Write-Info "Source: $frontendDistPath"
+ Write-Info "Destination: $frontendDest"
Copy-Item -Path "$frontendDistPath\*" -Destination $frontendDest -Recurse -Force
+
+ # Verify web.config was copied
+ $copiedWebConfig = Join-Path $frontendDest "web.config"
+ if (Test-Path $copiedWebConfig) {
+ Write-Success "web.config copied to package"
+ } else {
+ Write-Warning "web.config NOT copied to package"
+ }
+
Write-Success "Unified Frontend files copied"
# Unified Backend (includes all modules)
diff --git a/deployment/windows/scripts/ROA2WEB-Console.ps1 b/deployment/windows/scripts/ROA2WEB-Console.ps1
index 75a441d..ef01399 100644
--- a/deployment/windows/scripts/ROA2WEB-Console.ps1
+++ b/deployment/windows/scripts/ROA2WEB-Console.ps1
@@ -465,15 +465,21 @@ function Deploy-Frontend {
Copy-Item -Path $sourceFe -Destination $Config.FrontendPath -Recurse -Force
Write-Success "Frontend files deployed"
- # Copy web.config if present in package
- $webConfig = Join-Path $SourcePath "config\web.config"
- if (Test-Path $webConfig) {
- $destConfig = Join-Path $Config.FrontendPath "web.config"
- Copy-Item -Path $webConfig -Destination $destConfig -Force
- Write-Success "web.config deployed"
+ # Verify web.config was deployed (should be in frontend/ from dist/)
+ $deployedWebConfig = Join-Path $Config.FrontendPath "web.config"
+ if (Test-Path $deployedWebConfig) {
+ Write-Success "web.config deployed successfully"
+ # Verify it has correct configuration for /roa2web/ path
+ $configContent = Get-Content $deployedWebConfig -Raw
+ if ($configContent -match 'url="[^"]*roa2web/api') {
+ Write-Success "web.config contains correct /roa2web/api proxy rules"
+ } else {
+ Write-Warning "web.config may not have correct /roa2web/api proxy configuration"
+ }
} else {
- Write-Warning "web.config not found in package: $webConfig"
+ Write-Warning "web.config not found in deployed frontend: $deployedWebConfig"
Write-Warning "IIS reverse proxy will not work without web.config"
+ Write-Warning "Ensure 'public/web.config' exists in source and rebuild frontend"
}
Write-Success "Frontend deployment completed successfully"
diff --git a/public/web.config b/public/web.config
index b84d40c..c931172 100644
--- a/public/web.config
+++ b/public/web.config
@@ -1,26 +1,32 @@
@@ -28,33 +34,38 @@
+
-
+
-
+
-
+
-
+
+
+
+
+