Skip to content

Updates to .NET 10 - #292

Open
oahsiao wants to merge 49 commits into
bagetter:mainfrom
oahsiao:personal/v-oahsiao/package-admin-dashboard
Open

oahsiao wants to merge 49 commits into
bagetter:mainfrom
oahsiao:personal/v-oahsiao/package-admin-dashboard

Conversation

@oahsiao

@oahsiao oahsiao commented Sep 21, 2026

Copy link
Copy Markdown

Upgrades the target framework to .NET 10.

Updates several package versions to align with the new framework.
Removes obsolete Razor runtime compilation configuration.
Enforces authentication for Razor Pages.Summary of the changes (in less than 80 chars)

  • Detail 1
  • Detail 2

Addresses #123

vhafdal and others added 30 commits February 11, 2026 10:35
Upgrades the target framework to .NET 10.

Updates several package versions to align with the new framework.
Removes obsolete Razor runtime compilation configuration.
Enforces authentication for Razor Pages.
Implements paged NuGet registration metadata responses to improve performance for packages with large version histories.

This change introduces a configuration option "RegistrationPageSize" to control the number of package versions included in a single registration page.
When a package has more versions than this value, the registration index will return paged entries.

Also updates service index to include versions 3.4.0, 3.5.0 and 3.6.0
Ensures BaGetter can locate its configuration file in a cross-platform manner.

Previously, the application only looked for the config file in a Windows-specific location. This change adds support for Linux by searching for a config file in `/etc/BaGetter` if the application is not running on Windows.
Adds validation to ensure the registration page size is greater than zero, preventing potential errors.
Also, enhances the package content controller to accurately detect image content types, improving the user experience when retrieving package icons.
Adds tests to ensure registration page size validation and correct paging when registration page size is small.
Implements HTTP caching using ETags to improve performance.
The server now returns 304 Not Modified if the client's cache is up to date.
This reduces bandwidth usage and improves response times.

Also adds request telemetry using metrics and logging.
This provides insights into the performance and usage of the service.
Adds "must-revalidate" and "immutable" cache control directives to HTTP responses.

This change enhances caching behavior by specifying whether the cache needs to revalidate its entries with the origin server and defining content as immutable, improving performance.
Adds request rate limiting, HTTP caching/compression, and HTTP request telemetry.

Also loads configuration from OS-level locations and includes documentation updates related to publishing to IIS.

The rate limiting feature can be enabled to prevent abuse of the BaGetter instance.
Allows configuration of CORS policy and security headers via appsettings.json.

Adds a PowerShell script to simplify IIS publishing.

This provides greater control over security aspects of the BaGetter instance.
Updates tests to assert that the service index entry count is greater than or equal to the expected minimum, rather than strictly equal.

This change accommodates potential variations in the number of service index entries without causing test failures, providing more flexibility and resilience.
Implements audit logging for package mutation operations, enhancing traceability through actor and client IP metadata.

Introduces search reindexing functionality, allowing rebuild of the search index from packages stored in the database, either manually via CLI or automatically as a background service with configurable intervals and batch sizes.

Adds stricter validation to the configuration options to ensure proper configuration.
Adds an operations playbook for deployment, validation, and troubleshooting.

Enhances documentation with debugging guidance, configuration validation rules, and script usage examples.

Improves the overall operational experience by providing tools and documentation for maintaining a BaGetter instance.
Enables configuration of multiple upstream NuGet package mirrors for read-through caching.

When multiple mirrors are configured, BaGetter will attempt to retrieve packages from each mirror in order,
falling back to the next if a package is not found.
If no mirrors are configured, BaGetter will use the legacy single mirror setting.

This change introduces a new `Mirrors` configuration option, alongside the existing `Mirror` option,
and updates the dependency injection to handle multiple upstream clients.
Adds theming support to the web UI via CSS custom properties,
allowing for easier customization and dark mode support.

Updates the UI with modern fonts for improved aesthetics and
readability.

Removes unused FallbackUpstreamClient.

Adjusts image styling for package icons on index and package
pages.
Enables BaGetter to run as a native Windows Service, providing an alternative to IIS hosting.
This includes a new command-line interface for installing and uninstalling the service,
as well as documentation on how to use this new feature.

Also updates target framework to .NET 10 to utilize latest features.
Allows storing hashed API keys and passwords in the configuration file, improving security.

A new `hash` command is added to the CLI to generate the PBKDF2 hashes.

The authentication logic is updated to verify secrets against their hashed values.
Allows administrators to delete packages and specific package versions through the web interface.
This functionality is protected by role-based access control, requiring users to have the "Admin" role and valid API key.
Also adds the ability to assign roles to users through the configuration file.

Packages can be re-pushed if they are soft-deleted (unlisted) even when overwrite is disabled.
Implements search functionality that filters packages by tag and author.

Adds tag: and author: prefixes to the search query to filter results by the specified tag or author, respectively.
Updates the UI to provide links to search results filtered by tag or author.
Enables localization support for the web user interface, allowing users to view the UI in their preferred language.

This includes:
- Adding a LocalizationOptions to configure localization behavior.
- Adding resource files for multiple languages.
- Adding a language selection dropdown to the layout.
- Localizing text on various pages.
Introduces LDAP-backed authentication for package feeds using System.DirectoryServices.Protocols. This allows users to authenticate with directory credentials (including domain\user and UPN formats) and supports role mapping via LDAP groups.

The change refactors basic authentication into a pluggable validator strategy, supporting both local configuration-based credentials and directory services. Includes updated documentation, configuration validation, and cross-platform compatibility notes for Linux and macOS deployments.
…ation

- Upgrades application and Docker images to .NET 10.
- Adds GitHub Actions workflow for automated image building and publishing to GHCR.
- Conditionally applies IIS server options only on Windows to enhance cross-platform compatibility.
Wire an optional `bagetter-mirror` Secret into the chart via envFrom (the pod
still starts if it's absent, mirroring just stays off), and document the
multi-mirror env layout with a mirror-secret.example.yaml covering DevExpress
(v2/Legacy, key-in-URL) and Hangfire Pro/Ace (v2/Legacy, Basic auth).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01753MpyJDLxuXgmFT25x4br
Bring the devop BaGetter mirror onto the same delivery path as DevOp.Nexus
(previously GitHub Actions -> GHCR + manual kubectl). Adds:
- Jenkinsfile: dind/build/helm pod; build image -> push registry.devop.is/nexus/bagetter
  -> helm upgrade --install bagetter. Params for env/version/push/deploy.
- chart/bagetter/values-prod.yaml: Harbor image + pull secret, nuget.devop.is
  ingress (traefik + bagetter-tls), existing bagetter-data PVC, mirror/secret refs.
- chart/bagetter/README-cd.md: job setup, one-time migration prerequisites, and the
  PostgreSQL migration that removes the build-side restore throttle.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Gq1Nwm9wGsRmHCGBh4N77
FallbackUpstreamClient returned the first non-empty upstream's version/metadata
list, so a package present on several feeds was served by only one — letting
nuget.org's stale Hangfire.Throttling 1.0.0-beta1 shadow the licensed feed's
1.4.3. List endpoints now UNION versions/metadata across all upstreams (deduped;
earlier upstream wins per version). Downloads still use the first upstream that
has the package.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Gq1Nwm9wGsRmHCGBh4N77
vhafdal and others added 19 commits June 24, 2026 17:19
StatefulSet + headless Service for bagetter-postgres in the bagetter namespace,
so BaGetter can move off SQLite (concurrent-write "database is locked" 500s) to
Postgres. Config-only switch (BaGetter.Database.PostgreSql provider already ships);
lets the build-side maxHttpRequestsPerSource=1 throttle be removed afterward.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Gq1Nwm9wGsRmHCGBh4N77
The version/metadata listings now union across all upstreams instead of
returning the first non-empty result, so the old Assert.Same test no longer
applies. Assert union (deduped) for versions and metadata (earlier mirror wins
per version).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Gq1Nwm9wGsRmHCGBh4N77
values-prod.yaml now mirrors the live (formerly hand-rolled) deployment exactly:
PostgreSQL DB via the bagetter-db secret, Storage__Path=/data/packages, the
explicit ApiKey + Authentication__Credentials env from bagetter-secret, and the
bagetter-mirror upstreams via envFrom. Lets Helm take over the live deployment
without config drift.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Gq1Nwm9wGsRmHCGBh4N77
The build passed the bare git sha (e.g. ba1a9e2) as the assembly Version, which
NuGet rejects ("not a valid version string"). The image tag stays sha-based; the
Version build-arg now falls back to 1.0.0 for sha builds (or uses VERSION_OVERRIDE).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Gq1Nwm9wGsRmHCGBh4N77
Merge upstream BaGetter PR bagetter#269 (.NET 10, security, and improvements)
The committed appsettings.json enabled Authentication.Ldap, which makes the test host require authentication and fails integration tests with 401 (Run tests job). Local LDAP settings are moved to appsettings.Development.json, which is not loaded by tests/CI (Production environment).
…s repository

The jobs were gated on github.repository == 'oahsiao/BaGetter', which never matches this fork, so Docker images and the BaGetter.zip release assets were skipped.
System.DirectoryServices.Protocols requires the native libldap on Linux (Interop.Ldap PInvoke). Without it, LDAP authentication fails with a DllInitialization error and every login attempt crashes the connection setup.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants