Major structural improvements: - Created organized directory structure with logical separation - bin/ directory for legacy scripts (poc.sh, prod.sh) - config/ directory for configuration templates - tests/ directory for test framework - docs/ directory for documentation (ADRs) Enhanced build system: - Comprehensive Makefile with 20+ commands for development workflow - Full CI/CD pipeline support (test, lint, security-check) - Vendor integration testing for git vendor inclusion scenarios - Development environment setup and configuration management Updated test framework: - Smart path resolution for both organized and vendored structures - Improved vendor compatibility testing - Enhanced error handling and timeout protection Documentation updates: - Updated README with new directory structure - Comprehensive command reference and usage examples - Clear vendor integration guidelines - Architecture Decision Record for Node.js version management Files moved: - poc.sh, prod.sh → bin/ (legacy scripts) - bitwarden-config.conf.sample → config/ - test-secrets-manager.sh → tests/ - ADR-Node.md → docs/ All path references updated to maintain full functionality. This reorganization improves maintainability while preserving compatibility for git vendor inclusion scenarios. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
7.6 KiB
ADR-001: Node.js Version Management Strategy
Status
Proposed
Context
The TSYS Secrets Manager project needs to make an architectural decision regarding Node.js version management across development, staging, and production environments. This decision impacts:
- Development workflow and environment consistency
- Production stability and security posture
- Operational complexity and maintenance overhead
- Compliance with enterprise security policies
- Integration with existing shell scripting frameworks
As this project will be git vendor included into shell scripting frameworks, the Node.js management approach must be portable and not introduce complex dependencies on the consuming systems.
Decision Drivers
- Security and Compliance: Enterprise security requirements mandate automated security updates and clear audit trails
- Operational Simplicity: Minimize operational overhead and complexity in production environments
- Development Efficiency: Enable developers to work with appropriate Node.js versions for different projects
- Vendor Integration: Support clean integration when vendored into other shell scripting frameworks
- Stability: Ensure production deployments are stable and predictable
- Version Flexibility: Ability to test and deploy with specific Node.js versions when needed
Options Considered
Option 1: MISE (Modern Infrastructure Software Engineering)
Description: Use MISE for polyglot runtime version management across all environments.
Pros:
- Zero-overhead performance (no shims, direct binary execution)
- Multi-version support with automatic project-based switching
- Modern Rust-based implementation with enhanced security
- Excellent developer experience with unified tooling
- Support for
.nvmrc
and other standard version files - Task runner capabilities
Cons:
- Additional operational complexity in production
- Custom security update processes required
- Not managed by distribution security teams
- Requires team training and adoption
- May complicate vendor integration scenarios
Option 2: System Package Manager (Debian apt)
Description: Use distribution-provided Node.js packages for all environments.
Pros:
- Managed by Debian security team with automatic updates
- Battle-tested in enterprise environments
- Integration with existing configuration management
- Clear audit trails and compliance support
- Minimal operational overhead
- Standard enterprise security practices
Cons:
- Often outdated versions (significant lag behind releases)
- Limited to single system-wide version
- Cannot easily test multiple Node.js versions
- May not support latest language features
- Difficulty matching exact versions across environments
Option 3: Containerized Deployment with Official Images
Description: Use official Node.js Docker images with pinned versions.
Pros:
- Reproducible deployments with exact version control
- Security scanning and automated vulnerability management
- Isolation from host system dependencies
- Industry standard approach for modern deployments
- Easy version management through Dockerfile
Cons:
- Requires container orchestration infrastructure
- Additional complexity for simple script deployments
- May be overkill for shell script frameworks
- Learning curve for container-naive environments
Option 4: Hybrid Approach
Description: Use different tools for different environments and use cases.
Pros:
- Optimized approach for each environment's specific needs
- Flexibility to choose best tool for each scenario
- Can evolve strategy as requirements change
Cons:
- Increased complexity managing multiple approaches
- Potential for environment drift and inconsistencies
- More documentation and training required
Decision
Selected: Option 4 - Hybrid Approach with System Packages as Primary
Primary Strategy:
- Production Environments: Use Debian system packages (apt) for Node.js installation
- Development Environments: Use MISE for flexibility and multi-version testing
- Vendor Integration: Document both approaches, default to system packages
Rationale:
-
Security-First Production: System packages provide the security posture required for enterprise production environments with automated security updates and established audit trails.
-
Development Flexibility: MISE enables developers to test across multiple Node.js versions and maintain development-production parity when needed.
-
Vendor-Friendly: When this project is vendored into shell scripting frameworks, defaulting to system packages minimizes external dependencies and complexity for consuming systems.
-
Gradual Adoption: Teams can start with system packages and adopt MISE for development as needed, without disrupting production systems.
Implementation Guidelines
For Production Deployments:
# Install Node.js via system package manager
sudo apt update
sudo apt install nodejs npm
# Verify installation
node --version
npm --version
For Development Environments:
# Install MISE
curl https://mise.run | sh
# Configure for project
mise use node@18.17.0
mise use node@20.9.0 # For testing newer versions
# Project-specific configuration
echo "node 18.17.0" > .tool-versions
For Vendor Integration:
- Default installation scripts should use system packages
- Provide optional MISE support for advanced users
- Document both approaches clearly
- Include version compatibility matrix
Consequences
Positive:
- Production systems maintain enterprise security standards
- Development teams gain version management flexibility
- Reduced vendor integration complexity
- Clear separation of concerns between environments
- Future migration paths remain open
Negative:
- Increased documentation requirements
- Potential for environment drift if not managed properly
- Team training required for both approaches
- Slightly more complex CI/CD pipelines
Neutral:
- Need to maintain compatibility with both package management approaches
- Version testing required across both installation methods
Compliance and Security Considerations
System Package Approach:
- Automatic security updates via
unattended-upgrades
- Integration with enterprise vulnerability scanners
- Standard audit procedures apply
- Compliance with distribution security policies
MISE Approach (Development Only):
- Manual security update processes
- Custom vulnerability monitoring required
- Developer responsibility for version management
- Clear policies needed for version selection
Monitoring and Metrics
Track:
- Node.js version distribution across environments
- Security update lag time between environments
- Developer adoption of MISE in development
- Issues related to version mismatches
Success Criteria:
- Zero production security incidents related to Node.js versions
- <1 week lag time for critical security updates in production
-
90% developer satisfaction with version management workflow
- Successful vendor integrations with minimal friction
Review Schedule
This ADR should be reviewed:
- Quarterly for the first year
- Annually thereafter
- When major Node.js LTS versions are released
- After significant security incidents
- When vendor integration patterns change
References
- MISE Documentation
- Node.js Release Schedule
- Debian Node.js Packages
- Enterprise Node.js Security Best Practices
Decision Date: 2025-07-16
Decision Makers: Architecture Team, Security Team, DevOps Team
Next Review: 2025-10-16