From e5bb14d94592926c0368632709bcbb4b7eabf265 Mon Sep 17 00:00:00 2001 From: Daniel Bedeleanu Date: Thu, 23 Apr 2026 15:59:17 +0300 Subject: [PATCH] Build [v1.14.21] --- .standalone.pid | 6 +-- Caddyfile.standalone | 1 + backups/ainventory_2026-04-23_15-36-20.tar.gz | Bin 0 -> 28954 bytes config/Caddyfile.standalone | 51 ++++++++++++------ dev_docs/SESSION_STATE.md | 35 ++++-------- frontend/VERSION.json | 6 +-- 6 files changed, 52 insertions(+), 47 deletions(-) create mode 100644 backups/ainventory_2026-04-23_15-36-20.tar.gz diff --git a/.standalone.pid b/.standalone.pid index 9a7d29f1..12e4e9c9 100644 --- a/.standalone.pid +++ b/.standalone.pid @@ -1,3 +1,3 @@ -836417 -836418 -836432 +5397 +5398 +5414 diff --git a/Caddyfile.standalone b/Caddyfile.standalone index bd695940..16927387 100644 --- a/Caddyfile.standalone +++ b/Caddyfile.standalone @@ -5,6 +5,7 @@ admin off local_certs skip_install_trust + auto_https disable_redirects on_demand_tls { ask http://localhost:8916/ diff --git a/backups/ainventory_2026-04-23_15-36-20.tar.gz b/backups/ainventory_2026-04-23_15-36-20.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c590418551375bb8c2247d16f83b5240b87db7cc GIT binary patch literal 28954 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 + header_up Connection {>Connection} + } + } + + reverse_proxy http://localhost:8917 { + header_up X-Forwarded-For {remote_host} + header_up X-Forwarded-Proto https + header_up X-Forwarded-Host {host} + } + header { Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" X-XSS-Protection "1; mode=block" - X-Content-Type-Options "nosniff" X-Frame-Options "SAMEORIGIN" Referrer-Policy "strict-origin-when-cross-origin" } } -# Specific port listener for backend (8918 -> 444) -https://:444 { +# Dynamic HTTPS Backend (port 8918) - Matches ANY IP or hostname +https://:8918 { tls internal { on_demand } - reverse_proxy backend:8000 + + reverse_proxy http://localhost:8916 { + header_up X-Forwarded-For {remote_host} + header_up X-Forwarded-Proto https + header_up X-Forwarded-Host {host} + } + + header { + Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" + } } diff --git a/dev_docs/SESSION_STATE.md b/dev_docs/SESSION_STATE.md index 33004b4d..f95478c4 100644 --- a/dev_docs/SESSION_STATE.md +++ b/dev_docs/SESSION_STATE.md @@ -1,36 +1,23 @@ # CURRENT AI WORKING SESSION — HANDOVER -**Active AI:** Claude Haiku 4.5 (Claude Code) +**Active AI:** Gemini CLI **Last Updated:** 2026-04-23 **Current Version:** v1.14.19 -**Status**: ✅ PHASE 7 COMPLETE | 🟢 READY FOR PHASE 8 +**Status**: ✅ SSL PROXY FIXED | 🟢 READY FOR PHASE 8 --- -## SESSION 41 EXECUTION SUMMARY — Infrastructure & Export Fixes +## SESSION 42 EXECUTION SUMMARY — SSL Infrastructure Fix -### 1. Phase 7: Config Consolidation (COMPLETE) -- **Centralized YAML**: Migrated all configuration to `config/*.yaml`. -- **SSOT Architecture**: Established `network.yaml` as the Master Source of Truth for Server IP and Port management. -- **Dynamic Injection**: Frontend API URLs and Backend CORS are now dynamically calculated from master network settings. -- **Python Tooling**: All legacy `.sh` scripts converted to robust, secure Python scripts in `scripts/`. -- **Enhanced Launcher**: `run_standalone.py` now supports `start`, `stop`, `restart`, `status`, and Caddy SSL proxying. +### 1. SSL Proxy Fix (COMPLETE) +- **Port 80 Conflict**: Identified that Caddy was failing to start because it tried to bind to port 80 for HTTP->HTTPS redirects, while port 80 was already in use by a system-wide Caddy. +- **Caddy Configuration**: Modified `Caddyfile.standalone` (root and `config/`) to include `auto_https disable_redirects` in the global options. This allows Caddy to run on custom ports (8918/8919) without interfering with port 80. +- **Service Restart**: Successfully restarted backend, frontend, and proxy using `scripts/run_standalone.py restart`. -### 2. Admin & Security Improvements -- **AI Key Detection**: Fixed backend logic to correctly report AI key status from YAML/Secrets. -- **Secure Saving**: Implemented `ConfigManager.update_keys()` to route sensitive data correctly to `secrets.yaml`. -- **Recursion Fix**: Resolved a critical infinite recursion loop in the configuration manager. - -### 3. Export System Overhaul -- **Data Integrity**: Fixed a routing collision that caused binary SQLite downloads instead of CSV data. -- **FastAPI Streaming**: Refactored exports to use `StreamingResponse` for memory efficiency. -- **Premium UI**: Integrated the `ExportPanel` into the dark-mode aesthetic with standard premium button styles. -- **WebSocket Fix**: Improved Caddy configuration for Next.js HMR stability. - -### 4. Cleanup & Preparation -- ✅ Deleted all deprecated `.sh` and `.env` files. -- ✅ Rebuilt virtual environment (`venv/`) and verified dependencies (added `openpyxl`). -- ✅ Incremented system version to **v1.14.19**. +### 2. Verification +- **Backend SSL**: Verified reachable at `https://localhost:8918/` (Port 8916 upstream). +- **Frontend SSL**: Verified reachable at `https://localhost:8919/` (Port 8917 upstream). +- **Service Status**: `run_standalone.py status` confirms all components are UP. --- diff --git a/frontend/VERSION.json b/frontend/VERSION.json index 7adb8066..2354718a 100644 --- a/frontend/VERSION.json +++ b/frontend/VERSION.json @@ -1,6 +1,6 @@ { - "version": "1.14.20", - "last_build": "2026-04-23-1536", + "version": "1.14.21", + "last_build": "2026-04-23-1559", "codename": "ConfigCore", - "commit": "b0ac7426" + "commit": "6e88ea91" } \ No newline at end of file