- Phase 7: Config Consolidation - CONTEXT.md: Defines scope, decisions, and requirements - PLAN.md: 18-task implementation plan with detailed acceptance criteria - Centralize all configs into config/ folder - Update deploy scripts, backend loading, and documentation - Maintain backward compatibility with inventory.env Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
503 lines
18 KiB
Markdown
503 lines
18 KiB
Markdown
---
|
|
wave: 1
|
|
depends_on: []
|
|
files_modified: [
|
|
"config/backend.env",
|
|
"config/frontend.env",
|
|
"config/network.env",
|
|
"config/docker.env",
|
|
"config/README.md",
|
|
"backend/config_loader.py",
|
|
"backend/config_manager.py",
|
|
"backend/entrypoint.sh",
|
|
"deploy.sh",
|
|
"run_standalone.sh",
|
|
"export_prod.sh",
|
|
"install_service.sh",
|
|
"docker-compose.yml",
|
|
"DEPLOYMENT.md",
|
|
"README.md"
|
|
]
|
|
autonomous: true
|
|
---
|
|
|
|
# Phase 7: Config Consolidation - Implementation Plan
|
|
|
|
**Objective:** Establish a centralized config/ folder structure, migrate all configurations from root level to config/, and update all scripts and code to use the new structure while maintaining backward compatibility.
|
|
|
|
**Success Criteria:**
|
|
- Config folder exists with all required configuration files
|
|
- All scripts reference config folder instead of root-level env files
|
|
- Docker deployment works with new config structure
|
|
- Standalone deployment works with new config structure
|
|
- Backward compatibility: old inventory.env still loads if needed
|
|
- All documentation updated
|
|
- Root directory cleaned of unnecessary files
|
|
|
|
---
|
|
|
|
## Task 1: Create Config Folder Structure
|
|
|
|
**Read First:**
|
|
- Current project root layout (understand what we're migrating from)
|
|
- Current inventory.env and variants
|
|
- PROJECT_ARCHITECTURE.md (reference tech stack and requirements)
|
|
|
|
**Action:**
|
|
1. Create `config/` folder in project root: `mkdir -p config`
|
|
2. Create `config/README.md` with documentation of all config files and their purposes
|
|
3. Ensure config/ is tracked in git (add to .gitignore if needed, or ensure it's not in .gitignore)
|
|
|
|
**Acceptance Criteria:**
|
|
- `config/` directory exists in project root
|
|
- `config/README.md` exists and documents the purpose of each config file
|
|
- `config/` appears in git status (is tracked)
|
|
|
|
---
|
|
|
|
## Task 2: Create backend.env Configuration File
|
|
|
|
**Read First:**
|
|
- Current `inventory.env` content and structure
|
|
- `backend/config_loader.py` to understand what variables are expected
|
|
- `backend/config_manager.py` to understand all used environment variables
|
|
- `backend/main.py` to see what environment variables are loaded
|
|
|
|
**Action:**
|
|
1. Read existing `inventory.env` file
|
|
2. Extract backend-specific environment variables (database, AI keys, auth settings, JWT secrets)
|
|
3. Create `config/backend.env` with all backend-specific variables from inventory.env
|
|
4. Include meaningful comments explaining each variable
|
|
5. Use same values as inventory.env to maintain current functionality
|
|
6. Ensure format matches python-dotenv expectations
|
|
|
|
**Acceptance Criteria:**
|
|
- `config/backend.env` exists and contains all backend-specific variables
|
|
- File format is valid for python-dotenv (KEY=VALUE format with comments)
|
|
- Contains at least: JWT_SECRET_KEY, GEMINI_API_KEY, LDAP settings, database config
|
|
- All values match original inventory.env
|
|
|
|
---
|
|
|
|
## Task 3: Create network.env Configuration File
|
|
|
|
**Read First:**
|
|
- Current `inventory.env` file
|
|
- `run_standalone.sh` to see what network variables it uses
|
|
- `deploy.sh` to see what network variables it references
|
|
- `docker-compose.yml` to understand port and network configuration
|
|
|
|
**Action:**
|
|
1. Extract network/deployment-specific variables from inventory.env (ports, server IPs, SSL config, CORS settings)
|
|
2. Create `config/network.env` with these variables
|
|
3. Include meaningful comments for each variable
|
|
4. Ensure variables match what deploy.sh and run_standalone.sh expect
|
|
5. Include default values for development
|
|
|
|
**Acceptance Criteria:**
|
|
- `config/network.env` exists with network-specific variables
|
|
- Contains at least: BACKEND_PORT, BACKEND_SSL_PORT, FRONTEND_PORT, FRONTEND_SSL_PORT, SERVER_IP, SSL_ENABLED
|
|
- All values match original inventory.env
|
|
- Format is bash-sourceable (KEY=VALUE)
|
|
|
|
---
|
|
|
|
## Task 4: Create docker.env Configuration File
|
|
|
|
**Read First:**
|
|
- Current `docker-compose.yml` file
|
|
- `inventory.env` file for current values
|
|
- Dockerfile files (backend/Dockerfile, frontend/Dockerfile)
|
|
|
|
**Action:**
|
|
1. Create `config/docker.env` with variables specifically for docker-compose
|
|
2. Include variables that docker-compose.yml references in its environment sections
|
|
3. These may overlap with network.env but are docker-compose specific
|
|
4. Add comments explaining docker-specific context
|
|
5. Include any build arguments and docker-specific settings
|
|
|
|
**Acceptance Criteria:**
|
|
- `config/docker.env` exists
|
|
- Contains Docker-specific environment variables
|
|
- Format is valid for docker-compose (KEY=VALUE)
|
|
- All required docker-compose.yml variables are present
|
|
|
|
---
|
|
|
|
## Task 5: Create frontend.env Configuration File
|
|
|
|
**Read First:**
|
|
- `frontend/package.json` to see if environment variables are used
|
|
- `frontend/next.config.mjs` to understand what env vars are needed
|
|
- `frontend/entrypoint.sh` to see how frontend loads configuration
|
|
- Any frontend environment setup in current codebase
|
|
|
|
**Action:**
|
|
1. Create `config/frontend.env` with frontend-specific variables
|
|
2. Include API endpoint configuration, feature flags, service worker settings, etc.
|
|
3. Add comments explaining each variable's purpose
|
|
4. If frontend doesn't currently use env files, create minimal defaults for future use
|
|
5. Ensure Next.js compatible format
|
|
|
|
**Acceptance Criteria:**
|
|
- `config/frontend.env` exists
|
|
- Contains frontend-specific variables (API_BASE_URL, feature flags, etc.)
|
|
- Format is valid for frontend configuration
|
|
- Documented with clear comments
|
|
|
|
---
|
|
|
|
## Task 6: Update backend/config_loader.py
|
|
|
|
**Read First:**
|
|
- Current `backend/config_loader.py` implementation
|
|
- Current `backend/config_manager.py` implementation
|
|
- `backend/main.py` to see how config_loader is used
|
|
- Current load order and fallback logic
|
|
|
|
**Action:**
|
|
1. Update `config_loader.py` to change config loading order:
|
|
- Priority 1: System environment variables (already set by Docker/deployment)
|
|
- Priority 2: `config/backend.env` (new centralized location)
|
|
- Priority 3: `inventory.env` (backward compatibility)
|
|
- Priority 4: `backend/.env` (legacy location)
|
|
- Priority 5: Hardcoded defaults
|
|
2. Update file paths to look in config/ folder first
|
|
3. Update log messages to indicate which config file is being loaded
|
|
4. Ensure backward compatibility: if config/backend.env doesn't exist, fall back to inventory.env
|
|
5. Test that load_dotenv() calls work correctly with new paths
|
|
|
|
**Acceptance Criteria:**
|
|
- `config_loader.py` contains logic to load from `config/backend.env` first
|
|
- Falls back to `inventory.env` if `config/backend.env` not found
|
|
- Load order matches: env vars > config/backend.env > inventory.env > backend/.env
|
|
- Log messages indicate which config file was loaded
|
|
- All environment variables are still accessible to rest of backend
|
|
- File contains comment explaining the new config structure
|
|
|
|
---
|
|
|
|
## Task 7: Update backend/config_manager.py
|
|
|
|
**Read First:**
|
|
- Current `backend/config_manager.py` implementation
|
|
- Look for any file paths that hardcode inventory.env
|
|
- Understand how config updates are written back to disk
|
|
|
|
**Action:**
|
|
1. Update file paths to use `config/backend.env` instead of root `inventory.env`
|
|
2. Ensure write operations go to `config/backend.env`
|
|
3. Update comments to reflect new path
|
|
4. Verify get_config_path() returns path to config/backend.env
|
|
5. Ensure file operations handle non-existent config/ folder gracefully
|
|
|
|
**Acceptance Criteria:**
|
|
- `config_manager.py` references `config/backend.env` instead of `inventory.env`
|
|
- get_config_path() returns correct path to config/backend.env
|
|
- Config updates are written to config/backend.env
|
|
- Error handling works if config/ folder doesn't exist
|
|
|
|
---
|
|
|
|
## Task 8: Update backend/entrypoint.sh
|
|
|
|
**Read First:**
|
|
- Current `backend/entrypoint.sh` content
|
|
- How environment variables are sourced
|
|
- Docker ENTRYPOINT and CMD configuration
|
|
|
|
**Action:**
|
|
1. Update entrypoint.sh to source from `config/backend.env` instead of root location
|
|
2. Update path references to point to /app/config/backend.env (inside Docker container)
|
|
3. Maintain backward compatibility: try config/backend.env first, fall back to inventory.env
|
|
4. Add logging to show which config was loaded
|
|
5. Ensure entrypoint handles missing config gracefully
|
|
|
|
**Acceptance Criteria:**
|
|
- `entrypoint.sh` sources from `config/backend.env`
|
|
- Falls back to `inventory.env` if config/backend.env not found
|
|
- Inside Docker, path is /app/config/backend.env
|
|
- Script logs which config file was loaded
|
|
- Script doesn't fail if config files don't exist
|
|
|
|
---
|
|
|
|
## Task 9: Update deploy.sh Script
|
|
|
|
**Read First:**
|
|
- Current `deploy.sh` implementation
|
|
- How environment variables are currently sourced
|
|
- Lines that reference inventory.env
|
|
|
|
**Action:**
|
|
1. Update script to load from `config/network.env` and `config/docker.env` instead of `inventory.env`
|
|
2. Change: `export $(grep -v '^#' "inventory.env" | xargs)` to `export $(grep -v '^#' "config/network.env" | xargs)`
|
|
3. Add fallback: if config/network.env doesn't exist, use inventory.env
|
|
4. Update docker-compose calls to use config/docker.env via environment variable sourcing
|
|
5. Add validation: check that config/ folder exists before sourcing
|
|
6. Add helpful error message if config files are missing
|
|
|
|
**Acceptance Criteria:**
|
|
- `deploy.sh` sources from `config/network.env` instead of `inventory.env`
|
|
- Includes fallback to `inventory.env` if config/network.env not found
|
|
- Validates config folder exists with helpful error message
|
|
- Docker-compose gets correct environment variables from config files
|
|
- Script still functions with new structure
|
|
|
|
---
|
|
|
|
## Task 10: Update run_standalone.sh Script
|
|
|
|
**Read First:**
|
|
- Current `run_standalone.sh` implementation
|
|
- Lines that reference CONFIG_PATH or inventory.env
|
|
- How network configuration is loaded
|
|
- Backend and frontend startup logic
|
|
|
|
**Action:**
|
|
1. Update CONFIG_PATH to point to `config/network.env`
|
|
2. Change line: `CONFIG_PATH="$(cd "$(dirname "$0")" && pwd)/inventory.env"` to reference config/network.env
|
|
3. Add fallback: if config/network.env not found, try inventory.env
|
|
4. Update comment to reflect new config location
|
|
5. Ensure backend environment loading also uses config/backend.env (via PYTHONPATH or direct sourcing)
|
|
6. Add logging showing which config files are being used
|
|
|
|
**Acceptance Criteria:**
|
|
- `run_standalone.sh` loads from `config/network.env`
|
|
- Falls back to `inventory.env` if config files not found
|
|
- Backend loads from `config/backend.env` via config_loader.py
|
|
- Script logs which config files are loaded
|
|
- Standalone mode works with new config structure
|
|
|
|
---
|
|
|
|
## Task 11: Update export_prod.sh Script
|
|
|
|
**Read First:**
|
|
- Current `export_prod.sh` implementation
|
|
- How it uses environment variables
|
|
- What configuration it needs
|
|
|
|
**Action:**
|
|
1. Identify all environment variables used by export_prod.sh
|
|
2. Update script to source from `config/backend.env` and `config/network.env`
|
|
3. Add fallback to inventory.env for backward compatibility
|
|
4. Update comments to reflect new config loading
|
|
5. Ensure export functionality works with new config structure
|
|
|
|
**Acceptance Criteria:**
|
|
- `export_prod.sh` sources correct config files from config/ folder
|
|
- Falls back to `inventory.env` if needed
|
|
- All required environment variables are available to the script
|
|
- Script functions correctly with new configuration structure
|
|
|
|
---
|
|
|
|
## Task 12: Update install_service.sh Script
|
|
|
|
**Read First:**
|
|
- Current `install_service.sh` implementation
|
|
- How it references configuration
|
|
- What paths it sets in systemd service files
|
|
|
|
**Action:**
|
|
1. Update script to reference config/ folder in environment file paths
|
|
2. Update systemd service file generation to point to config/backend.env
|
|
3. If service uses EnvironmentFile, ensure it points to config/backend.env or both config/backend.env and config/network.env
|
|
4. Add validation that config/ folder exists
|
|
5. Update comments to explain new config structure
|
|
|
|
**Acceptance Criteria:**
|
|
- `install_service.sh` references config/backend.env in service configuration
|
|
- Systemd service file has correct EnvironmentFile paths
|
|
- Service can load all required environment variables
|
|
- Script validates config folder exists
|
|
|
|
---
|
|
|
|
## Task 13: Update docker-compose.yml
|
|
|
|
**Read First:**
|
|
- Current `docker-compose.yml` file
|
|
- All env_file and environment references
|
|
- How inventory.env is currently used
|
|
|
|
**Action:**
|
|
1. Update env_file directives to reference config/docker.env instead of inventory.env
|
|
2. Update any hardcoded environment variable references to use config/ equivalents
|
|
3. For services using env_file: `env_file: config/docker.env`
|
|
4. Ensure Docker build arguments reference correct config location
|
|
5. Add validation or comment explaining config folder requirement
|
|
6. Test that docker-compose can still read all needed variables
|
|
|
|
**Acceptance Criteria:**
|
|
- `docker-compose.yml` references `config/docker.env` in env_file
|
|
- All services get correct environment variables
|
|
- Docker-compose validates successfully
|
|
- Docker services can access all required configuration
|
|
|
|
---
|
|
|
|
## Task 14: Update DEPLOYMENT.md
|
|
|
|
**Read First:**
|
|
- Current `DEPLOYMENT.md` content
|
|
- Current documentation structure
|
|
- Instructions for setting up configuration
|
|
|
|
**Action:**
|
|
1. Add new section explaining config folder structure and purpose
|
|
2. Document each config file (backend.env, frontend.env, network.env, docker.env)
|
|
3. Explain which variables go in each config file
|
|
4. Update deployment instructions to reference config/ instead of inventory.env
|
|
5. Document backward compatibility behavior (still reads inventory.env if config/ not found)
|
|
6. Add troubleshooting section for common config issues
|
|
7. Update any examples to use new config paths
|
|
|
|
**Acceptance Criteria:**
|
|
- DEPLOYMENT.md has section explaining config folder structure
|
|
- All four config files are documented with their purpose
|
|
- Deployment instructions reference config/ folder
|
|
- Backward compatibility is explained
|
|
- Examples use new config paths
|
|
|
|
---
|
|
|
|
## Task 15: Update README.md
|
|
|
|
**Read First:**
|
|
- Current `README.md` content
|
|
- Setup/quickstart section
|
|
|
|
**Action:**
|
|
1. Add or update configuration setup section
|
|
2. Explain that config/ folder is where all configuration lives
|
|
3. For quick start, show example of creating config/backend.env
|
|
4. Link to DEPLOYMENT.md for detailed configuration reference
|
|
5. Keep it concise - detailed docs go in DEPLOYMENT.md
|
|
|
|
**Acceptance Criteria:**
|
|
- README.md mentions config/ folder
|
|
- Setup section references config/ not inventory.env
|
|
- Configuration setup is clear for new users
|
|
|
|
---
|
|
|
|
## Task 16: Verify Backward Compatibility and Test All Deployment Methods
|
|
|
|
**Read First:**
|
|
- Current DEPLOYMENT.md
|
|
- All scripts that were updated
|
|
- Docker Compose setup
|
|
- Standalone setup requirements
|
|
|
|
**Action:**
|
|
1. Ensure all scripts still function if inventory.env exists but config/ doesn't (backward compatibility)
|
|
2. Test Docker deployment: `./deploy.sh production`
|
|
- Verify: services start, environment variables are loaded correctly
|
|
- Check logs: which config file was loaded
|
|
3. Test Standalone deployment: `./run_standalone.sh`
|
|
- Verify: backend and frontend start correctly
|
|
- Verify: all environment variables available
|
|
- Verify: correct ports from config/network.env
|
|
4. Test environment variable override: set env var on command line, verify it takes precedence
|
|
5. Verify config/backend.env is loaded by backend: grep logs for config path message
|
|
|
|
**Acceptance Criteria:**
|
|
- Docker deployment works with config/ structure
|
|
- Standalone deployment works with config/ structure
|
|
- Backward compatibility works: scripts still read inventory.env if config/ doesn't exist
|
|
- Environment variable precedence works: system env > config files
|
|
- All tests pass
|
|
- Logs show correct config file was loaded
|
|
|
|
---
|
|
|
|
## Task 17: Audit and Clean Up Root Directory
|
|
|
|
**Read First:**
|
|
- All files in project root directory
|
|
- Understand what each script does
|
|
- Current .gitignore
|
|
|
|
**Action:**
|
|
1. Review all *.sh scripts in root: deploy.sh, run_standalone.sh, export_prod.sh, install_service.sh, __push_ALL_to_remote.sh
|
|
2. For each script, determine:
|
|
- Is it still used? (check git history, comments, references)
|
|
- Can it be archived/removed?
|
|
- Does it need updating for config folder?
|
|
3. For scripts that are truly obsolete:
|
|
- Move to dev_docs/ARCHIVE_LOGS.md or note in comment
|
|
- Do NOT delete without understanding purpose
|
|
4. Review inventory.env* files:
|
|
- Are inventory.env.example and inventory.env.template still needed?
|
|
- Update .gitignore to exclude inventory.env (old) but track config/ structure
|
|
5. Create summary of what's obsolete and what's actively used
|
|
|
|
**Acceptance Criteria:**
|
|
- Review completed for all root-level scripts
|
|
- Documented which scripts are obsolete (if any)
|
|
- Confirmed which scripts are still actively used
|
|
- .gitignore updated if needed
|
|
- Summary created of root directory cleanup
|
|
|
|
---
|
|
|
|
## Task 18: Final Validation and Documentation
|
|
|
|
**Read First:**
|
|
- Updated DEPLOYMENT.md
|
|
- Updated README.md
|
|
- Updated scripts
|
|
- config/README.md
|
|
|
|
**Action:**
|
|
1. Create comprehensive test checklist:
|
|
- Docker deployment test
|
|
- Standalone deployment test
|
|
- Environment variable override test
|
|
- Backward compatibility test
|
|
- Config file format validation
|
|
2. Run all tests and document results
|
|
3. Verify all config files exist and are properly formatted
|
|
4. Verify all scripts source from correct locations
|
|
5. Verify backend loads from config/backend.env
|
|
6. Create deployment.md section summarizing changes
|
|
7. Add entry to dev_docs/PLAN.md documenting completion
|
|
|
|
**Acceptance Criteria:**
|
|
- All deployment methods tested and working
|
|
- Config files exist and are properly formatted
|
|
- Documentation updated and clear
|
|
- No errors in script execution
|
|
- Environment variables load from config/ as expected
|
|
- Phase marked complete in documentation
|
|
|
|
---
|
|
|
|
## Notes
|
|
|
|
**Backward Compatibility:**
|
|
- All scripts include fallback logic: try config/ first, then fall back to inventory.env
|
|
- This allows gradual migration without breaking existing deployments
|
|
- Eventually, old inventory.env files can be deprecated after migration period
|
|
|
|
**Configuration Priority (from highest to lowest):**
|
|
1. System environment variables (set by Docker, deployment platform)
|
|
2. config/backend.env (new centralized backend config)
|
|
3. inventory.env (legacy, for backward compatibility)
|
|
4. backend/.env (legacy backend-specific)
|
|
5. Hardcoded defaults in code
|
|
|
|
**Docker Deployment Flow:**
|
|
1. docker-compose.yml loads config/docker.env
|
|
2. Services get environment variables from docker-compose.yml
|
|
3. Backend entrypoint sources config/backend.env for additional variables
|
|
4. System env vars override everything
|
|
|
|
**Standalone Deployment Flow:**
|
|
1. run_standalone.sh sources config/network.env
|
|
2. Backend activation sources config/backend.env via config_loader.py
|
|
3. All environment variables available to both backend and frontend
|
|
|