Containers had no restart policy, so they didn't auto-start after a Docker
daemon restart or host reboot. unless-stopped restarts on boot and crashes
but respects manual stops.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Docker container defaults to Production when no environment is set,
which triggers the new startup secret validation. Default to Development
for docker-compose (local dev) and expose BANKSYNC_ENCRYPTION_KEY env var
so production deployments can override it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix ReconciliationController and BankSync LinkAccount/UpdateLinkedAccount IDOR (verify account ownership)
- Add ASP.NET Core rate limiting: strict on auth endpoints, global on all API routes
- Harden SSRF validation on Ollama URL (IPv6-mapped bypass, link-local, 0.0.0.0 blocking)
- Upgrade encryption from AES-CBC to AES-GCM with HKDF key derivation (backward-compatible decrypt)
- Add startup validation that rejects default JWT/encryption keys in Production
- Add security headers (X-Frame-Options, CSP, HSTS, Cache-Control, nosniff) to API and nginx
- Mask account numbers in API responses (show last 4 digits only)
- Add password strength validation (min 8 chars) and BCrypt work factor 12
- Hash refresh tokens (SHA-256) before database storage
- Set JWT ClockSkew to zero for immediate expiry enforcement
- Add file upload size limit (10 MB) and filename sanitization
- Cap transaction search PageSize to 200
- Fix FileWatcherService cross-user account matching in multi-user deployments
- Sanitize console.error calls to prevent token leakage in browser logs
- Parameterize raw SQL in SimpleFinConnectionMigration
- Make AuthService.GenerateAuthResponse fully async
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a lightweight docker:cli sidecar that prunes dangling images
every 24 hours to prevent untagged image buildup from redeployments.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>