{"id":"691679a4adcd0bfee0251fe7","title":"2025 11 02 Issue 69","path":"how-to/committee/release-notes/2025-11-02-issue-69","contentMarkdown":"# 2nd November 2025 — MongoDB Backup/Restore System [#69](https://github.com/nbarrett/ngx-ramblers/issues/69)\n## [build 340](https://github.com/nbarrett/ngx-ramblers/actions/runs/19011520890) — [#69](https://github.com/nbarrett/ngx-ramblers/issues/69) — [commit 4072610](https://github.com/nbarrett/ngx-ramblers/commit/4072610)\n\nComprehensive MongoDB backup/restore system with S3 integration, unified environment selectors, global settings, and admin-only config security.\n\n**Where to Find It**\n\n- **Admin → Backup/Restore**: Complete backup and restore interface\n- **Settings → Global AWS S3 Configuration**: Bucket and region settings\n- **History Tab**: Real-time updates with status colors\n\n**Benefits**\n\n- **Robust Backup/Restore**: Works across local filesystem and S3 with consistent UI\n- **Global S3 Settings**: Centralized bucket/region configuration with per-environment fallback\n- **Security Hardened**: Sensitive config fields redacted for non-admins\n- **Organized S3 Structure**: Clear path layout s3://bucket/environment/database/timestamp-env-db/\n- **Smart Upload Controls**: Upload checkbox disabled unless S3 is properly configured\n- **Real-Time Status**: WebSocket updates with color-coded badges (sunrise/mintcake/sunset)\n- **Better UX**: Select all/none, humanized labels, searchable dropdowns\n\n**Technical Details**\n\nBackend - S3 Strategy:\n- Prefer global bucket/region from BackupConfig.aws with per-environment fallback\n- S3 path layout: s3://global-bucket/environment/database/timestamp-env-db/\n- Applies to upload, list, delete, and restore flows\n- Consistent timestamp extraction/validation and pagination handling\n- Local backups: parity with S3 using consistent shapes and NamedError\n\nBackend - Security:\n- GET /api/database/configs redacts sensitive fields for non-admins:\n  - apiKey, accessKeyId, secretAccessKey, clientSecret\n  - accessToken, refreshToken, password, username, userName\n- Admin detection via JWT (memberAdmin/contentAdmin/fileAdmin/walkAdmin/socialAdmin/treasuryAdmin/financeAdmin)\n- Non-admins receive redacted values\n\nFrontend - Environment Selector:\n- New unified app-environment-select component replaces two separate components\n- Multi-select mode: [(selected)] returns EnvironmentInfo[]\n  - Select all/none header, chips with native \"×\" clear\n  - Humanized labels, dropdown appendTo body, dropdownPosition=bottom\n- Single-select mode: [(selectedName)] returns environment name\n- Replaces app-environment-multi-select and app-environment-single-select (removed)\n\nFrontend - Collections & Display:\n- Collections multi-select with consistent chip styling and header badge\n- Backups sorted by -timestamp, then name (S3 and local)\n- S3 badges show Environment/Database/Date\n- Dates formatted via DateUtilsService\n\nFrontend - Status & UX:\n- Session status badges use app palette (sunrise/mintcake/sunset)\n- \"Select all\" toggles to \"Select none\" when all selected\n- Pluralization via pluraliseWithCount()\n- Replaced yellow \"warning\" text with normal text in non-warning contexts\n- Dropdowns append to body and open bottom (no clipping)\n\nFrontend - Global S3 Settings:\n- New \"Global AWS S3 Configuration\" section (Bucket, Region)\n- Upload to S3 defaults to on\n- Upload checkbox disabled with helper text unless global bucket set or all environments have AWS bucket\n- Start Backup prevents submit if uploads enabled but S3 not configured\n\nCode Structure:\n- Added: environment-select.ts (unified selector)\n- Removed: environment-multi-select.ts, environment-single-select.ts\n- Updated: BackupConfig accepts optional aws: { bucket, region }\n- Consistent use of array/date utils throughout\n\nTesting Notes:\n- Backup tab: select multiple environments, optional collections, Scale Down, Upload to S3\n- Restore tab: single-select environment, choose S3 or Local backup, optional collections\n- History tab: real-time updates with palette-aligned status colors\n- S3 path verification: s3://global-bucket/env/db/timestamp-env-db/\n- Configs API: verify redaction without admin JWT, full values with admin JWT","contentHtml":"<h1>2nd November 2025 — MongoDB Backup/Restore System <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/69\">#69</a></h1>\n<h2><a href=\"https://github.com/nbarrett/ngx-ramblers/actions/runs/19011520890\">build 340</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/69\">#69</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/4072610\">commit 4072610</a></h2>\n<p>Comprehensive MongoDB backup/restore system with S3 integration, unified environment selectors, global settings, and admin-only config security.</p>\n<p><strong>Where to Find It</strong></p>\n<ul>\n<li><strong>Admin → Backup/Restore</strong>: Complete backup and restore interface</li>\n<li><strong>Settings → Global AWS S3 Configuration</strong>: Bucket and region settings</li>\n<li><strong>History Tab</strong>: Real-time updates with status colors</li>\n</ul>\n<p><strong>Benefits</strong></p>\n<ul>\n<li><strong>Robust Backup/Restore</strong>: Works across local filesystem and S3 with consistent UI</li>\n<li><strong>Global S3 Settings</strong>: Centralized bucket/region configuration with per-environment fallback</li>\n<li><strong>Security Hardened</strong>: Sensitive config fields redacted for non-admins</li>\n<li><strong>Organized S3 Structure</strong>: Clear path layout s3://bucket/environment/database/timestamp-env-db/</li>\n<li><strong>Smart Upload Controls</strong>: Upload checkbox disabled unless S3 is properly configured</li>\n<li><strong>Real-Time Status</strong>: WebSocket updates with color-coded badges (sunrise/mintcake/sunset)</li>\n<li><strong>Better UX</strong>: Select all/none, humanized labels, searchable dropdowns</li>\n</ul>\n<p><strong>Technical Details</strong></p>\n<p>Backend - S3 Strategy:</p>\n<ul>\n<li>Prefer global bucket/region from BackupConfig.aws with per-environment fallback</li>\n<li>S3 path layout: s3://global-bucket/environment/database/timestamp-env-db/</li>\n<li>Applies to upload, list, delete, and restore flows</li>\n<li>Consistent timestamp extraction/validation and pagination handling</li>\n<li>Local backups: parity with S3 using consistent shapes and NamedError</li>\n</ul>\n<p>Backend - Security:</p>\n<ul>\n<li>GET /api/database/configs redacts sensitive fields for non-admins:<ul>\n<li>apiKey, accessKeyId, secretAccessKey, clientSecret</li>\n<li>accessToken, refreshToken, password, username, userName</li>\n</ul>\n</li>\n<li>Admin detection via JWT (memberAdmin/contentAdmin/fileAdmin/walkAdmin/socialAdmin/treasuryAdmin/financeAdmin)</li>\n<li>Non-admins receive redacted values</li>\n</ul>\n<p>Frontend - Environment Selector:</p>\n<ul>\n<li>New unified app-environment-select component replaces two separate components</li>\n<li>Multi-select mode: [(selected)] returns EnvironmentInfo[]<ul>\n<li>Select all/none header, chips with native &quot;×&quot; clear</li>\n<li>Humanized labels, dropdown appendTo body, dropdownPosition=bottom</li>\n</ul>\n</li>\n<li>Single-select mode: [(selectedName)] returns environment name</li>\n<li>Replaces app-environment-multi-select and app-environment-single-select (removed)</li>\n</ul>\n<p>Frontend - Collections &amp; Display:</p>\n<ul>\n<li>Collections multi-select with consistent chip styling and header badge</li>\n<li>Backups sorted by -timestamp, then name (S3 and local)</li>\n<li>S3 badges show Environment/Database/Date</li>\n<li>Dates formatted via DateUtilsService</li>\n</ul>\n<p>Frontend - Status &amp; UX:</p>\n<ul>\n<li>Session status badges use app palette (sunrise/mintcake/sunset)</li>\n<li>&quot;Select all&quot; toggles to &quot;Select none&quot; when all selected</li>\n<li>Pluralization via pluraliseWithCount()</li>\n<li>Replaced yellow &quot;warning&quot; text with normal text in non-warning contexts</li>\n<li>Dropdowns append to body and open bottom (no clipping)</li>\n</ul>\n<p>Frontend - Global S3 Settings:</p>\n<ul>\n<li>New &quot;Global AWS S3 Configuration&quot; section (Bucket, Region)</li>\n<li>Upload to S3 defaults to on</li>\n<li>Upload checkbox disabled with helper text unless global bucket set or all environments have AWS bucket</li>\n<li>Start Backup prevents submit if uploads enabled but S3 not configured</li>\n</ul>\n<p>Code Structure:</p>\n<ul>\n<li>Added: environment-select.ts (unified selector)</li>\n<li>Removed: environment-multi-select.ts, environment-single-select.ts</li>\n<li>Updated: BackupConfig accepts optional aws: { bucket, region }</li>\n<li>Consistent use of array/date utils throughout</li>\n</ul>\n<p>Testing Notes:</p>\n<ul>\n<li>Backup tab: select multiple environments, optional collections, Scale Down, Upload to S3</li>\n<li>Restore tab: single-select environment, choose S3 or Local backup, optional collections</li>\n<li>History tab: real-time updates with palette-aligned status colors</li>\n<li>S3 path verification: s3://global-bucket/env/db/timestamp-env-db/</li>\n<li>Configs API: verify redaction without admin JWT, full values with admin JWT</li>\n</ul>\n"}