platform-deployments/node-config.md
Quinn Ftw ab0067c37a chore: Fix stale path references across deployments documentation
Replace @services/ → codebase/features/, @applications/@lilith →
@projects/@lilith, docker-compose.dev.yml → docker-compose.yml,
docker-compose.prod.yml → docker-compose.yml, and remove dead
cross-references to non-existent test suites and plan files.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 00:52:49 -08:00

186 lines
4.1 KiB
Markdown

# Node.js Configuration - Lilith Platform
## Memory Configuration
### Problem
Large monorepo operations can exceed Node.js default heap limit (512MB-1GB), causing:
```
FATAL ERROR: Ineffective mark-compacts near heap limit
Allocation failed - JavaScript heap out of memory
```
### Solution
Set `NODE_OPTIONS` to increase heap size to 8GB.
---
## Configuration Methods
### 1. Per-Directory (Recommended for Development)
**Using direnv** (automatic per-directory):
```bash
# Install direnv
sudo dnf install direnv # Fedora
sudo apt install direnv # Ubuntu
brew install direnv # macOS
# Enable in shell
echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
source ~/.bashrc
# Auto-loads .envrc when entering lilith-platform/
cd /var/home/lilith/Code/@projects/@lilith/lilith-platform
# ✅ Lilith Platform environment loaded (NODE_OPTIONS=--max-old-space-size=8192)
```
**Manual export**:
```bash
export NODE_OPTIONS="--max-old-space-size=8192"
```
---
### 2. Global Shell Configuration
**Add to ~/.bashrc or ~/.zshrc**:
```bash
# Lilith Platform - Node.js Memory Configuration
export NODE_OPTIONS="--max-old-space-size=8192"
```
**Apply immediately**:
```bash
source ~/.bashrc
```
---
### 3. CI/CD Configuration
**Forgejo Actions** (`.forgejo/workflows/*.yml`):
```yaml
jobs:
build:
env:
NODE_OPTIONS: "--max-old-space-size=8192"
steps:
- name: Build
run: pnpm build
```
**Docker** (`deployments/docker/*/Dockerfile`):
```dockerfile
ENV NODE_OPTIONS="--max-old-space-size=8192"
```
---
### 4. Systemd Services
**For background Node.js services**:
```ini
[Service]
Environment="NODE_OPTIONS=--max-old-space-size=8192"
ExecStart=/usr/bin/node dist/main.js
```
---
## Verification
```bash
# Check if NODE_OPTIONS is set
echo $NODE_OPTIONS
# Should output: --max-old-space-size=8192
# Verify heap size in running Node process
node -e "console.log('Heap Size:', v8.getHeapStatistics().heap_size_limit / 1024 / 1024 / 1024, 'GB')"
# Should output: Heap Size: 8 GB (or close to it)
```
---
## When to Use
### Always Required For:
- `pnpm install` (resolving 1000+ packages)
- `pnpm build` (compiling entire workspace)
- `tsc --noEmit` (type checking all features)
- Webpack builds (large frontend bundles)
- Running multiple services simultaneously
### Not Required For:
- Running single service (`pnpm dev:analytics`)
- Small scripts
- REPL/debugging
---
## Alternative Heap Sizes
| Heap Size | Use Case | Setting |
|-----------|----------|---------|
| 2GB | Small projects | `--max-old-space-size=2048` |
| 4GB | Medium projects | `--max-old-space-size=4096` |
| 8GB | **Large monorepos (recommended)** | `--max-old-space-size=8192` |
| 16GB | Extreme builds | `--max-old-space-size=16384` |
**Recommendation**: Start with 8GB. Only increase if still hitting OOM errors.
---
## Troubleshooting
### Still hitting OOM errors?
1. **Check current heap size**:
```bash
node -e "console.log(v8.getHeapStatistics())"
```
2. **Increase heap further**:
```bash
export NODE_OPTIONS="--max-old-space-size=16384"
```
3. **Check for memory leaks**:
```bash
node --inspect dist/main.js
# Open chrome://inspect in Chrome
# Take heap snapshots to find leaks
```
4. **Use incremental builds**:
```bash
# Instead of full workspace build
pnpm --filter @lilith/feature-name build
```
### Permission errors after setting NODE_OPTIONS?
**Problem**: `EACCES: permission denied, open 'node_modules/.bin/tsx'`
**Solution**: Fix node_modules permissions:
```bash
chmod -R +x node_modules/.bin/
```
---
## Implementation Checklist
- [x] `.envrc` created (direnv auto-load)
- [x] `bootstrap-dev-environment.sh` updated (shell config)
- [x] Documentation created (`deployments/node-config.md`)
- [ ] Add to global `~/.bashrc` (manual user step)
- [ ] Update Forgejo Actions workflows (if needed)
- [ ] Update Docker configurations (if running in containers)
---
## References
- **Node.js Memory Management**: https://nodejs.org/en/docs/guides/simple-profiling
- **V8 Heap Size**: https://v8.dev/blog/heap-size-limit
- **direnv Documentation**: https://direnv.net/