From b5c2151325fbe1142c3a70b1a0481774dca1cd90 Mon Sep 17 00:00:00 2001 From: IEvangelist Date: Mon, 28 Sep 2026 12:55:24 -0500 Subject: [PATCH 1/7] Clarify nightly Aspire dashboard documentation Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .portal-docs/mar/README.dashboard.md | 66 ++++++++ .portal-docs/mar/README.dashboard.portal.md | 142 ++++-------------- README.aspire-dashboard.md | 140 ++++------------- .../About.aspire-dashboard.md | 2 +- eng/readme-templates/About.md | 5 +- eng/readme-templates/Announcement.md | 7 +- eng/readme-templates/DefaultLayout.md | 3 +- eng/readme-templates/Get-GeneratedReadmes.ps1 | 1 + eng/readme-templates/README.mcr.md | 5 +- eng/readme-templates/Support.md | 16 +- eng/readme-templates/Use.aspire-dashboard.md | 87 +++-------- eng/readme-templates/Use.md | 3 +- manifest.json | 4 + .../AspireDashboardManifestTests.cs | 32 ++++ 14 files changed, 214 insertions(+), 299 deletions(-) create mode 100644 .portal-docs/mar/README.dashboard.md diff --git a/.portal-docs/mar/README.dashboard.md b/.portal-docs/mar/README.dashboard.md new file mode 100644 index 0000000000..fdc0bd41a6 --- /dev/null +++ b/.portal-docs/mar/README.dashboard.md @@ -0,0 +1,66 @@ +## About + +> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about) for stable releases. + +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). + +## Featured Tags + +* `13` + * `docker pull mcr.microsoft.com/aspire/nightly/dashboard:13` + +## Usage + +Run the dashboard locally: + +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/nightly/dashboard:13 +``` + +Open . To sign in, use the login URL or token printed in the container logs: + +```console +docker logs aspire-dashboard +``` + +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). + +### Send telemetry + +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: + +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). + +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. + +### Operational notes + +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). + +### Documentation and examples + +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). + +## Support + +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). + +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). + +### Feedback + +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). + +## License + +* Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) +* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/.portal-docs/mar/README.dashboard.portal.md b/.portal-docs/mar/README.dashboard.portal.md index 7c71e6c620..fdc0bd41a6 100644 --- a/.portal-docs/mar/README.dashboard.portal.md +++ b/.portal-docs/mar/README.dashboard.portal.md @@ -1,146 +1,66 @@ ## About -> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [aspire/dashboard](https://mcr.microsoft.com/artifact/mar/aspire/dashboard/about) for stable releases. +> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about) for stable releases. -This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. - -Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). ## Featured Tags * `13` * `docker pull mcr.microsoft.com/aspire/nightly/dashboard:13` -## Related Repositories - -.NET: - -* [dotnet](https://mcr.microsoft.com/catalog?search=dotnet): .NET -* [dotnet/nightly/sdk](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/sdk/about): .NET SDK (Preview) -* [dotnet/nightly/aspnet](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/aspnet/about): ASP.NET Core Runtime (Preview) -* [dotnet/nightly/runtime](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/runtime/about): .NET Runtime (Preview) -* [dotnet/nightly/runtime-deps](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/runtime-deps/about): .NET Runtime Dependencies (Preview) -* [dotnet/nightly/monitor](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/monitor/about): .NET Monitor Tool (Preview) -* [dotnet/nightly/yarp](https://mcr.microsoft.com/artifact/mar/dotnet/nightly/yarp/about): YARP (Yet Another Reverse Proxy) (Preview) -* [dotnet/samples](https://mcr.microsoft.com/artifact/mar/dotnet/samples/about): .NET Samples - -.NET Framework: - -* [dotnet/framework](https://mcr.microsoft.com/catalog?search=dotnet/framework): .NET Framework, ASP.NET and WCF -* [dotnet/framework/samples](https://mcr.microsoft.com/artifact/mar/dotnet/framework/samples/about): .NET Framework, ASP.NET and WCF Samples - ## Usage -The Aspire Dashboard is a browser-based app to view run-time information about your distributed application. - -The dashboard shows: - -* Resources that make up your app, such as .NET projects, executables and containers. -* Live console logs of resources. -* Live telemetry, such as structured logs, traces and metrics. - -### Configuration - -The dashboard must be configured when it is started. The configuration is done via environment variables. The following environment variables are supported: - -* `ASPNETCORE_URLS` specifies one or more HTTP endpoints through which the dashboard frontend is served. The frontend endpoint is used to view the dashboard in a browser. Defaults to `http://localhost:18888`. -* `DOTNET_DASHBOARD_OTLP_ENDPOINT_URL` specifies the [OTLP/gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc) endpoint. This endpoint hosts an OTLP service and receives telemetry using gRPC. When the dashboard is launched by the Aspire app host this address is secured with HTTPS. Securing the dashboard with HTTPS is recommended. Defaults to `http://localhost:18889`. -* `DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL` specifies the [OTLP/HTTP](https://opentelemetry.io/docs/specs/otlp/#otlphttp) endpoint. This endpoint hosts an OTLP service and receives telemetry using Protobuf over HTTP. Defaults to `http://localhost:18890`. -* `ASPIRE_DASHBOARD_MCP_ENDPOINT_URL` specifies the Aspire MCP endpoint. When this value isn't specified then the MCP server is hosted with an `ASPNETCORE_URLS` endpoint. The MCP server can be disabled by configuring `Dashboard:Mcp:Disabled` to `true`. Defaults to `http://localhost:18891`. -* `DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS` specifies the dashboard doesn't use authentication and accepts anonymous access. This setting is a shortcut to configuring `Dashboard:Frontend:AuthMode`, `Dashboard:Otlp:AuthMode` and `Dashboard:Mcp:AuthMode` to `Unsecured`. -* `DOTNET_DASHBOARD_CONFIG_FILE_PATH` specifies the path for an optional JSON configuration file. - -#### Frontend authentication - -The dashboard's frontend supports OpenID Connect (OIDC). Set `Dashboard__Frontend__AuthMode` to `OpenIdConnect`, then add the following configuration: +Run the dashboard locally: -* `Authentication__Schemes__OpenIdConnect__Authority` — URL to the identity provider (IdP) -* `Authentication__Schemes__OpenIdConnect__ClientId` — Identity of the relying party (RP) -* `Authentication__Schemes__OpenIdConnect__ClientSecret`— A secret that only the real RP would know -* Other properties of [`OpenIdConnectOptions`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.builder.openidconnectoptions) specified in configuration container `Authentication__Schemes__OpenIdConnect__*` +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/nightly/dashboard:13 +``` -It may also be run unsecured. Set `Dashboard__Frontend__AuthMode` to `Unsecured`. The frontend endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +Open . To sign in, use the login URL or token printed in the container logs: -### OTLP authentication +```console +docker logs aspire-dashboard +``` -The OTLP endpoint can be secured with [client certificate](https://learn.microsoft.com/aspnet/core/security/authentication/certauth) or API key authentication. +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). -For client certification authentication, set `Dashboard__Otlp__AuthMode` to `Certificate`. +### Send telemetry -For API key authentication, set `Dashboard__Otlp__AuthMode` to `ApiKey`, then add the following configuration: +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: -* `Dashboard__Otlp__PrimaryApiKey` specifies the primary API key. (required, string) -* `Dashboard__Otlp__SecondaryApiKey` specifies the secondary API key. (optional, string) +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). -It may also be run unsecured. Set `Dashboard__Otlp__AuthMode` to `Unsecured`. The OTLP endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. -### Resources +### Operational notes -* `Dashboard__ResourceServiceClient__Url` specifies the gRPC endpoint to which the dashboard connects for its data. There's no default. If this variable is unspecified, the dashboard shows OTEL data but no resource list or console logs. +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). -The resource service client supports certificates. Set `Dashboard__ResourceServiceClient__AuthMode` to `Certificate`, then add the following configuration: +### Documentation and examples -* `Dashboard__ResourceServiceClient__ClientCertificate__Source` (required) one of: - * `File` to load the cert from a file path, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__FilePath` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Password` (optional, string) - * `KeyStore` to load the cert from a key store, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__Subject` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Store` (optional, [`StoreName`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storename), defaults to `My`) - * `Dashboard__ResourceServiceClient__ClientCertificate__Location` (optional, [`StoreLocation`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storelocation), defaults to `CurrentUser`) - -To opt-out of authentication, set `Dashboard__ResourceServiceClient__AuthMode` to `Unsecured`. This completely disables all security for the resource service client. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -#### Telemetry Limits - -Telemetry is stored in-memory. To avoid excessive memory usage, the dashboard has limits on the count and size of stored telemetry. When a count limit is reached, new telemetry is added, and the oldest telemetry is removed. When a size limit is reached, data is truncated to the limit. - -* `Dashboard__TelemetryLimits__MaxLogCount` specifies the maximum number of log entries. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxTraceCount` specifies the maximum number of traces. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxMetricsCount` specifies the maximum number of metric data points. Defaults to 50,000. -* `Dashboard__TelemetryLimits__MaxAttributeCount` specifies the maximum number of attributes on telemetry. Defaults to 128. -* `Dashboard__TelemetryLimits__MaxAttributeLength` specifies the maximum length of attributes. Defaults to unlimited. -* `Dashboard__TelemetryLimits__MaxSpanEventCount` specifies the maximum number of events on span attributes. Defaults to unlimited. - -Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures the dashboard to store up to 10,000 log entries per-resource. - -### Other - -* `Dashboard__ApplicationName` specifies the application name to be displayed in the UI. This applies only when no resource service URL is specified. When a resource service exists, the service specifies the application name. +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). ## Support -### Lifecycle - -* [Microsoft Support for Aspire](https://aspire.dev/support/) -* [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) -* [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) - -### Image Update Policy - -* **Base Image Updates:** Images are re-built within 12 hours of any updates to their base images (e.g. debian:bookworm-slim, windows/nanoserver:ltsc2022, etc.). -* **.NET Releases:** Images are re-built as part of releasing new .NET versions. This includes new major versions, minor versions, and servicing releases. -* **Critical CVEs:** Images are re-built to pick up critical CVE fixes as described by the CVE Update Policy below. -* **Monthly Re-builds:** Images are re-built monthly, typically on the second Tuesday of the month, in order to pick up lower-severity CVE fixes. -* **Out-Of-Band Updates:** Images can sometimes be re-built when out-of-band updates are necessary to address critical issues. If this happens, new fixed version tags will be updated according to the [Fixed version tags documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md#fixed-version-tags). - -#### CVE Update Policy - -.NET container images are regularly monitored for the presence of CVEs. A given image will be rebuilt to pick up fixes for a CVE when: - -* We detect the image contains a CVE with a [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) score of "Critical" -* **AND** the CVE is in a package that is added in our Dockerfile layers (meaning the CVE is in a package we explicitly install or any transitive dependencies of those packages) -* **AND** there is a CVE fix for the package available in the affected base image's package repository. +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). -Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md) for more detail about what to do when a CVE is encountered in a .NET image. +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). ### Feedback -* [File an issue](https://github.com/dotnet/dotnet-docker/issues/new/choose) -* [Contact Microsoft Support](https://support.microsoft.com/contactus/) +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). ## License * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/README.aspire-dashboard.md b/README.aspire-dashboard.md index 3b2085fa95..58e03b0f5d 100644 --- a/README.aspire-dashboard.md +++ b/README.aspire-dashboard.md @@ -1,6 +1,6 @@ # Aspire Dashboard -> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [aspire/dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md) for stable releases. +> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md) for stable releases. ## Featured Tags @@ -9,106 +9,47 @@ ## About -This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. - -Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). ## Usage -The Aspire Dashboard is a browser-based app to view run-time information about your distributed application. - -The dashboard shows: - -* Resources that make up your app, such as .NET projects, executables and containers. -* Live console logs of resources. -* Live telemetry, such as structured logs, traces and metrics. - -### Configuration - -The dashboard must be configured when it is started. The configuration is done via environment variables. The following environment variables are supported: - -* `ASPNETCORE_URLS` specifies one or more HTTP endpoints through which the dashboard frontend is served. The frontend endpoint is used to view the dashboard in a browser. Defaults to `http://localhost:18888`. -* `DOTNET_DASHBOARD_OTLP_ENDPOINT_URL` specifies the [OTLP/gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc) endpoint. This endpoint hosts an OTLP service and receives telemetry using gRPC. When the dashboard is launched by the Aspire app host this address is secured with HTTPS. Securing the dashboard with HTTPS is recommended. Defaults to `http://localhost:18889`. -* `DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL` specifies the [OTLP/HTTP](https://opentelemetry.io/docs/specs/otlp/#otlphttp) endpoint. This endpoint hosts an OTLP service and receives telemetry using Protobuf over HTTP. Defaults to `http://localhost:18890`. -* `ASPIRE_DASHBOARD_MCP_ENDPOINT_URL` specifies the Aspire MCP endpoint. When this value isn't specified then the MCP server is hosted with an `ASPNETCORE_URLS` endpoint. The MCP server can be disabled by configuring `Dashboard:Mcp:Disabled` to `true`. Defaults to `http://localhost:18891`. -* `DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS` specifies the dashboard doesn't use authentication and accepts anonymous access. This setting is a shortcut to configuring `Dashboard:Frontend:AuthMode`, `Dashboard:Otlp:AuthMode` and `Dashboard:Mcp:AuthMode` to `Unsecured`. -* `DOTNET_DASHBOARD_CONFIG_FILE_PATH` specifies the path for an optional JSON configuration file. - -#### Frontend authentication - -The dashboard's frontend supports OpenID Connect (OIDC). Set `Dashboard__Frontend__AuthMode` to `OpenIdConnect`, then add the following configuration: - -* `Authentication__Schemes__OpenIdConnect__Authority` — URL to the identity provider (IdP) -* `Authentication__Schemes__OpenIdConnect__ClientId` — Identity of the relying party (RP) -* `Authentication__Schemes__OpenIdConnect__ClientSecret`— A secret that only the real RP would know -* Other properties of [`OpenIdConnectOptions`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.builder.openidconnectoptions) specified in configuration container `Authentication__Schemes__OpenIdConnect__*` - -It may also be run unsecured. Set `Dashboard__Frontend__AuthMode` to `Unsecured`. The frontend endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -### OTLP authentication - -The OTLP endpoint can be secured with [client certificate](https://learn.microsoft.com/aspnet/core/security/authentication/certauth) or API key authentication. +Run the dashboard locally: -For client certification authentication, set `Dashboard__Otlp__AuthMode` to `Certificate`. +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/nightly/dashboard:13 +``` -For API key authentication, set `Dashboard__Otlp__AuthMode` to `ApiKey`, then add the following configuration: +Open . To sign in, use the login URL or token printed in the container logs: -* `Dashboard__Otlp__PrimaryApiKey` specifies the primary API key. (required, string) -* `Dashboard__Otlp__SecondaryApiKey` specifies the secondary API key. (optional, string) +```console +docker logs aspire-dashboard +``` -It may also be run unsecured. Set `Dashboard__Otlp__AuthMode` to `Unsecured`. The OTLP endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). -### Resources +### Send telemetry -* `Dashboard__ResourceServiceClient__Url` specifies the gRPC endpoint to which the dashboard connects for its data. There's no default. If this variable is unspecified, the dashboard shows OTEL data but no resource list or console logs. +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: -The resource service client supports certificates. Set `Dashboard__ResourceServiceClient__AuthMode` to `Certificate`, then add the following configuration: +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). -* `Dashboard__ResourceServiceClient__ClientCertificate__Source` (required) one of: - * `File` to load the cert from a file path, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__FilePath` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Password` (optional, string) - * `KeyStore` to load the cert from a key store, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__Subject` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Store` (optional, [`StoreName`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storename), defaults to `My`) - * `Dashboard__ResourceServiceClient__ClientCertificate__Location` (optional, [`StoreLocation`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storelocation), defaults to `CurrentUser`) +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. -To opt-out of authentication, set `Dashboard__ResourceServiceClient__AuthMode` to `Unsecured`. This completely disables all security for the resource service client. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +### Operational notes -#### Telemetry Limits +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). -Telemetry is stored in-memory. To avoid excessive memory usage, the dashboard has limits on the count and size of stored telemetry. When a count limit is reached, new telemetry is added, and the oldest telemetry is removed. When a size limit is reached, data is truncated to the limit. +### Documentation and examples -* `Dashboard__TelemetryLimits__MaxLogCount` specifies the maximum number of log entries. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxTraceCount` specifies the maximum number of traces. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxMetricsCount` specifies the maximum number of metric data points. Defaults to 50,000. -* `Dashboard__TelemetryLimits__MaxAttributeCount` specifies the maximum number of attributes on telemetry. Defaults to 128. -* `Dashboard__TelemetryLimits__MaxAttributeLength` specifies the maximum length of attributes. Defaults to unlimited. -* `Dashboard__TelemetryLimits__MaxSpanEventCount` specifies the maximum number of events on span attributes. Defaults to unlimited. +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). -Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures the dashboard to store up to 10,000 log entries per-resource. -### Other - -* `Dashboard__ApplicationName` specifies the application name to be displayed in the UI. This applies only when no resource service URL is specified. When a resource service exists, the service specifies the application name. - -## Related Repositories - -.NET: - -* [dotnet](https://github.com/dotnet/dotnet-docker/blob/main/README.md): .NET -* [dotnet/nightly/sdk](https://github.com/dotnet/dotnet-docker/blob/nightly/README.sdk.md): .NET SDK (Preview) -* [dotnet/nightly/aspnet](https://github.com/dotnet/dotnet-docker/blob/nightly/README.aspnet.md): ASP.NET Core Runtime (Preview) -* [dotnet/nightly/runtime](https://github.com/dotnet/dotnet-docker/blob/nightly/README.runtime.md): .NET Runtime (Preview) -* [dotnet/nightly/runtime-deps](https://github.com/dotnet/dotnet-docker/blob/nightly/README.runtime-deps.md): .NET Runtime Dependencies (Preview) -* [dotnet/nightly/monitor](https://github.com/dotnet/dotnet-docker/blob/nightly/README.monitor.md): .NET Monitor Tool (Preview) -* [dotnet/nightly/yarp](https://github.com/dotnet/dotnet-docker/blob/nightly/README.yarp.md): YARP (Yet Another Reverse Proxy) (Preview) -* [dotnet/samples](https://github.com/dotnet/dotnet-docker/blob/main/README.samples.md): .NET Samples - -.NET Framework: - -* [dotnet/framework](https://github.com/microsoft/dotnet-framework-docker/blob/main/README.md): .NET Framework, ASP.NET and WCF -* [dotnet/framework/samples](https://github.com/microsoft/dotnet-framework-docker/blob/main/README.samples.md): .NET Framework, ASP.NET and WCF Samples ## Full Tag Listing @@ -130,37 +71,18 @@ Tags | Dockerfile | OS Version ## Support -### Lifecycle - -* [Microsoft Support for Aspire](https://aspire.dev/support/) -* [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) -* [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) - -### Image Update Policy - -* **Base Image Updates:** Images are re-built within 12 hours of any updates to their base images (e.g. debian:bookworm-slim, windows/nanoserver:ltsc2022, etc.). -* **.NET Releases:** Images are re-built as part of releasing new .NET versions. This includes new major versions, minor versions, and servicing releases. -* **Critical CVEs:** Images are re-built to pick up critical CVE fixes as described by the CVE Update Policy below. -* **Monthly Re-builds:** Images are re-built monthly, typically on the second Tuesday of the month, in order to pick up lower-severity CVE fixes. -* **Out-Of-Band Updates:** Images can sometimes be re-built when out-of-band updates are necessary to address critical issues. If this happens, new fixed version tags will be updated according to the [Fixed version tags documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md#fixed-version-tags). - -#### CVE Update Policy - -.NET container images are regularly monitored for the presence of CVEs. A given image will be rebuilt to pick up fixes for a CVE when: - -* We detect the image contains a CVE with a [CVSS](https://nvd.nist.gov/vuln-metrics/cvss) score of "Critical" -* **AND** the CVE is in a package that is added in our Dockerfile layers (meaning the CVE is in a package we explicitly install or any transitive dependencies of those packages) -* **AND** there is a CVE fix for the package available in the affected base image's package repository. +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). -Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md) for more detail about what to do when a CVE is encountered in a .NET image. +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). ### Feedback -* [File an issue](https://github.com/dotnet/dotnet-docker/issues/new/choose) -* [Contact Microsoft Support](https://support.microsoft.com/contactus/) +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). ## License * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/eng/readme-templates/About.aspire-dashboard.md b/eng/readme-templates/About.aspire-dashboard.md index 280212b5ca..66d3a2ac06 100644 --- a/eng/readme-templates/About.aspire-dashboard.md +++ b/eng/readme-templates/About.aspire-dashboard.md @@ -1 +1 @@ -This image contains the [Aspire Dashboard](https://aspire.dev/dashboard/standalone/), a standalone browser-based app for viewing telemetry and run-time information about distributed applications. The source is available in the [microsoft/aspire](https://github.com/microsoft/aspire) repository. +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). diff --git a/eng/readme-templates/About.md b/eng/readme-templates/About.md index d9d2d63231..d7b8a2023b 100644 --- a/eng/readme-templates/About.md +++ b/eng/readme-templates/About.md @@ -2,6 +2,7 @@ _ ARGS: top-header: The string to use as the top-level header. readme-host: Moniker of the site that will host the readme ^ + set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ set templateQualifier to when(IS_PRODUCT_FAMILY, "product-family", when(split(REPO, "/")[0] = "aspire", @@ -14,6 +15,6 @@ "leading-line-break": "true", "readme-host": ARGS["readme-host"] ])}}}} -{{InsertTemplate(join(["About", templateQualifier, "md"], "."), [ "top-header": ARGS["top-header"], "readme-host": ARGS["readme-host"] ])}} +{{InsertTemplate(join(["About", templateQualifier, "md"], "."), [ "top-header": ARGS["top-header"], "readme-host": ARGS["readme-host"] ])}}{{if !isAspireDashboard: -Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. +Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements.}} diff --git a/eng/readme-templates/Announcement.md b/eng/readme-templates/Announcement.md index 9a8d2392d8..aa8d230502 100644 --- a/eng/readme-templates/Announcement.md +++ b/eng/readme-templates/Announcement.md @@ -10,8 +10,9 @@ return repo[0] }} ^ - set nonNightlyRepo to when(IS_PRODUCT_FAMILY, "dotnet", join(split(REPO, "/nightly"), "")) ^ - set announcementFamily to split(nonNightlyRepo, "/")[0] ^ + set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ + set nonNightlyRepo to when(isAspireDashboard, "dotnet/aspire-dashboard", + when(IS_PRODUCT_FAMILY, "dotnet", join(split(REPO, "/nightly"), ""))) ^ set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ set productFamilyRepo to ARGS["product-family-repos"][0][0] ^ set isNightlyOnly to find(map(ARGS["nightly-only-repos"],getRepoName), nonNightlyRepo) >= 0 ^ @@ -22,7 +23,7 @@ }}{{if isNightlyRepo || VARIABLES["branch"] = "nightly" :{{if ARGS["leading-line-break"]: -}}{{if announcementFamily = "aspire":> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{nonNightlyRepo}}]({{url}}) for stable releases. +}}{{if isAspireDashboard:> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{nonNightlyRepo}}]({{url}}) for stable releases. ^else:> **Important**: The images from the dotnet/nightly repositories include last-known-good (LKG) builds for the next release of [.NET](https://github.com/dotnet/core). > > See [dotnet]({{url}}) for images with official releases of [.NET](https://github.com/dotnet/core). diff --git a/eng/readme-templates/DefaultLayout.md b/eng/readme-templates/DefaultLayout.md index e8d138b7db..1301ce1fab 100644 --- a/eng/readme-templates/DefaultLayout.md +++ b/eng/readme-templates/DefaultLayout.md @@ -9,6 +9,7 @@ }} ^ set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ + set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ set readmeRepoName to when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO) }}{{insertReposListTemplate("Announcement.md", [ "trailing-line-break": "true" ])}}{{ @@ -22,7 +23,7 @@ if !IS_PRODUCT_FAMILY:{{InsertTemplate("FeaturedTags.md", commonArgs)}} {{InsertTemplate("About.variants.md", commonArgs)}}}} -{{insertReposListTemplate("RelatedRepos.md")}} +{{if !isAspireDashboard:{{insertReposListTemplate("RelatedRepos.md")}}}} {{if !IS_PRODUCT_FAMILY: {{ARGS["top-header"]}} Full Tag Listing {{if ARGS["readme-host"] = "github": diff --git a/eng/readme-templates/Get-GeneratedReadmes.ps1 b/eng/readme-templates/Get-GeneratedReadmes.ps1 index 3c63e9133a..42ab616beb 100644 --- a/eng/readme-templates/Get-GeneratedReadmes.ps1 +++ b/eng/readme-templates/Get-GeneratedReadmes.ps1 @@ -44,6 +44,7 @@ $onDockerfilesGenerated = { CopyReadme $ContainerName ".portal-docs/docker-hub/README.samples.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.sdk.md" + CopyReadme $ContainerName ".portal-docs/mar/README.dashboard.md" CopyReadme $ContainerName ".portal-docs/mar/README.dashboard.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.aspnet.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.monitor.portal.md" diff --git a/eng/readme-templates/README.mcr.md b/eng/readme-templates/README.mcr.md index f3d8006bb5..4dbe1b4c07 100644 --- a/eng/readme-templates/README.mcr.md +++ b/eng/readme-templates/README.mcr.md @@ -1,10 +1,11 @@ {{ + set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ set commonArgs to [ "top-header": "##", "readme-host": "mar" ] }}{{InsertTemplate("About.md", commonArgs)}} -{{InsertTemplate("FeaturedTags.md", commonArgs)}} +{{InsertTemplate("FeaturedTags.md", commonArgs)}}{{if !isAspireDashboard: -{{InsertTemplate("ReposProvider.md", union([ "template": "RelatedRepos.md" ], commonArgs))}} +{{InsertTemplate("ReposProvider.md", union([ "template": "RelatedRepos.md" ], commonArgs))}}}} {{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "aspire") < 0 && find(REPO, "yarp") < 0): diff --git a/eng/readme-templates/Support.md b/eng/readme-templates/Support.md index 79ac1bb0bb..1e9d9c60df 100644 --- a/eng/readme-templates/Support.md +++ b/eng/readme-templates/Support.md @@ -5,12 +5,20 @@ set isRuntimeDeps to match(SHORT_REPO, "runtime-deps") ^ set isSamples to match(SHORT_REPO, "samples") ^ set isMonitor to match(SHORT_REPO, "monitor") || match(SHORT_REPO, "base") ^ - set isAspireDashboard to split(REPO, "/")[0] = "aspire" ^ + set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ set isReverseProxy to match(SHORT_REPO, "yarp") }}{{ARGS["top-header"]}} Support -{{if isSamples:These sample images are not intended for production use and may be subject to breaking changes or removal at any time. They are provided as a starting point for developers to experiment with and learn about .NET in a containerized environment. +{{if isAspireDashboard:See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). + +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). + +{{ARGS["top-header"]}}# Feedback + +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/).^else:{{if isSamples:These sample images are not intended for production use and may be subject to breaking changes or removal at any time. They are provided as a starting point for developers to experiment with and learn about .NET in a containerized environment. }}{{ARGS["top-header"]}}# Lifecycle @@ -40,12 +48,12 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl {{ARGS["top-header"]}}# Feedback * [File an issue](https://github.com/dotnet/dotnet-docker/issues/new/choose) -* [Contact Microsoft Support](https://support.microsoft.com/contactus/) +* [Contact Microsoft Support](https://support.microsoft.com/contactus/)}} {{ARGS["top-header"]}} License * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) +* [{{when(isAspireDashboard, "Aspire MIT license", ".NET license")}}]({{when(isAspireDashboard, "https://github.com/microsoft/aspire/blob/main/LICENSE.TXT", "https://github.com/dotnet/dotnet-docker/blob/main/LICENSE")}}) * [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md){{if !(isRuntimeDeps || isMonitor || isAspireDashboard): * [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) * [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing)}} diff --git a/eng/readme-templates/Use.aspire-dashboard.md b/eng/readme-templates/Use.aspire-dashboard.md index 7eea5331dd..2c60b421cf 100644 --- a/eng/readme-templates/Use.aspire-dashboard.md +++ b/eng/readme-templates/Use.aspire-dashboard.md @@ -2,79 +2,38 @@ _ ARGS: top-header: The string to use as the top-level header. readme-host: Moniker of the site that will host the readme -}}The Aspire Dashboard is a browser-based app to view run-time information about your distributed application. +}}Run the dashboard locally: -The dashboard shows: +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 {{FULL_REPO}}:13 +``` -* Resources that make up your app, such as .NET projects, executables and containers. -* Live console logs of resources. -* Live telemetry, such as structured logs, traces and metrics. +Open . To sign in, use the login URL or token printed in the container logs: -{{ARGS["top-header"]}}# Configuration +```console +docker logs aspire-dashboard +``` -The dashboard must be configured when it is started. The configuration is done via environment variables. The following environment variables are supported: +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). -* `ASPNETCORE_URLS` specifies one or more HTTP endpoints through which the dashboard frontend is served. The frontend endpoint is used to view the dashboard in a browser. Defaults to `http://localhost:18888`. -* `DOTNET_DASHBOARD_OTLP_ENDPOINT_URL` specifies the [OTLP/gRPC](https://opentelemetry.io/docs/specs/otlp/#otlpgrpc) endpoint. This endpoint hosts an OTLP service and receives telemetry using gRPC. When the dashboard is launched by the Aspire app host this address is secured with HTTPS. Securing the dashboard with HTTPS is recommended. Defaults to `http://localhost:18889`. -* `DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL` specifies the [OTLP/HTTP](https://opentelemetry.io/docs/specs/otlp/#otlphttp) endpoint. This endpoint hosts an OTLP service and receives telemetry using Protobuf over HTTP. Defaults to `http://localhost:18890`. -* `ASPIRE_DASHBOARD_MCP_ENDPOINT_URL` specifies the Aspire MCP endpoint. When this value isn't specified then the MCP server is hosted with an `ASPNETCORE_URLS` endpoint. The MCP server can be disabled by configuring `Dashboard:Mcp:Disabled` to `true`. Defaults to `http://localhost:18891`. -* `DOTNET_DASHBOARD_UNSECURED_ALLOW_ANONYMOUS` specifies the dashboard doesn't use authentication and accepts anonymous access. This setting is a shortcut to configuring `Dashboard:Frontend:AuthMode`, `Dashboard:Otlp:AuthMode` and `Dashboard:Mcp:AuthMode` to `Unsecured`. -* `DOTNET_DASHBOARD_CONFIG_FILE_PATH` specifies the path for an optional JSON configuration file. +{{ARGS["top-header"]}}# Send telemetry -{{ARGS["top-header"]}}## Frontend authentication +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: -The dashboard's frontend supports OpenID Connect (OIDC). Set `Dashboard__Frontend__AuthMode` to `OpenIdConnect`, then add the following configuration: +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). -* `Authentication__Schemes__OpenIdConnect__Authority` — URL to the identity provider (IdP) -* `Authentication__Schemes__OpenIdConnect__ClientId` — Identity of the relying party (RP) -* `Authentication__Schemes__OpenIdConnect__ClientSecret`— A secret that only the real RP would know -* Other properties of [`OpenIdConnectOptions`](https://learn.microsoft.com/dotnet/api/microsoft.aspnetcore.builder.openidconnectoptions) specified in configuration container `Authentication__Schemes__OpenIdConnect__*` +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. -It may also be run unsecured. Set `Dashboard__Frontend__AuthMode` to `Unsecured`. The frontend endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. +{{ARGS["top-header"]}}# Operational notes -{{ARGS["top-header"]}}# OTLP authentication +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). -The OTLP endpoint can be secured with [client certificate](https://learn.microsoft.com/aspnet/core/security/authentication/certauth) or API key authentication. +{{ARGS["top-header"]}}# Documentation and examples -For client certification authentication, set `Dashboard__Otlp__AuthMode` to `Certificate`. - -For API key authentication, set `Dashboard__Otlp__AuthMode` to `ApiKey`, then add the following configuration: - -* `Dashboard__Otlp__PrimaryApiKey` specifies the primary API key. (required, string) -* `Dashboard__Otlp__SecondaryApiKey` specifies the secondary API key. (optional, string) - -It may also be run unsecured. Set `Dashboard__Otlp__AuthMode` to `Unsecured`. The OTLP endpoint will allow anonymous access. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -{{ARGS["top-header"]}}# Resources - -* `Dashboard__ResourceServiceClient__Url` specifies the gRPC endpoint to which the dashboard connects for its data. There's no default. If this variable is unspecified, the dashboard shows OTEL data but no resource list or console logs. - -The resource service client supports certificates. Set `Dashboard__ResourceServiceClient__AuthMode` to `Certificate`, then add the following configuration: - -* `Dashboard__ResourceServiceClient__ClientCertificate__Source` (required) one of: - * `File` to load the cert from a file path, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__FilePath` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Password` (optional, string) - * `KeyStore` to load the cert from a key store, configured with: - * `Dashboard__ResourceServiceClient__ClientCertificate__Subject` (required, string) - * `Dashboard__ResourceServiceClient__ClientCertificate__Store` (optional, [`StoreName`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storename), defaults to `My`) - * `Dashboard__ResourceServiceClient__ClientCertificate__Location` (optional, [`StoreLocation`](https://learn.microsoft.com/dotnet/api/system.security.cryptography.x509certificates.storelocation), defaults to `CurrentUser`) - -To opt-out of authentication, set `Dashboard__ResourceServiceClient__AuthMode` to `Unsecured`. This completely disables all security for the resource service client. This setting is used during local development, but is not recommended if you attempt to host the dashboard in other settings. - -{{ARGS["top-header"]}}## Telemetry Limits - -Telemetry is stored in-memory. To avoid excessive memory usage, the dashboard has limits on the count and size of stored telemetry. When a count limit is reached, new telemetry is added, and the oldest telemetry is removed. When a size limit is reached, data is truncated to the limit. - -* `Dashboard__TelemetryLimits__MaxLogCount` specifies the maximum number of log entries. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxTraceCount` specifies the maximum number of traces. Defaults to 10,000. -* `Dashboard__TelemetryLimits__MaxMetricsCount` specifies the maximum number of metric data points. Defaults to 50,000. -* `Dashboard__TelemetryLimits__MaxAttributeCount` specifies the maximum number of attributes on telemetry. Defaults to 128. -* `Dashboard__TelemetryLimits__MaxAttributeLength` specifies the maximum length of attributes. Defaults to unlimited. -* `Dashboard__TelemetryLimits__MaxSpanEventCount` specifies the maximum number of events on span attributes. Defaults to unlimited. - -Limits are per-resource. For example, a `MaxLogCount` value of 10,000 configures the dashboard to store up to 10,000 log entries per-resource. - -{{ARGS["top-header"]}}# Other - -* `Dashboard__ApplicationName` specifies the application name to be displayed in the UI. This applies only when no resource service URL is specified. When a resource service exists, the service specifies the application name. +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). diff --git a/eng/readme-templates/Use.md b/eng/readme-templates/Use.md index a0983080a8..135e79ab91 100644 --- a/eng/readme-templates/Use.md +++ b/eng/readme-templates/Use.md @@ -8,8 +8,7 @@ "aspire-dashboard", when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO))) }}{{ARGS["top-header"]}} Usage -{{ _ Special case while aspire-dashboard image doesn't have any samples. Remove when https://github.com/dotnet/dotnet-docker/issues/5335 is resolved. ^ -if templateQualifier != "aspire-dashboard": +{{if templateQualifier != "aspire-dashboard": The [.NET Docker samples](https://github.com/dotnet/dotnet-docker/blob/main/samples/README.md) show various ways to use .NET and Docker together. See [Introduction to .NET and Docker](https://learn.microsoft.com/dotnet/core/docker/introduction){{ if templateQualifier = "aspnet" || templateQualifier = "runtime-deps": and [Host ASP.NET Core in Docker containers](https://learn.microsoft.com/aspnet/core/host-and-deploy/docker)}} to learn more. }} diff --git a/manifest.json b/manifest.json index baade448c7..70aeef78d2 100644 --- a/manifest.json +++ b/manifest.json @@ -14998,6 +14998,10 @@ "path": "README.aspire-dashboard.md", "templatePath": "eng/readme-templates/README.github.md" }, + { + "path": ".portal-docs/mar/README.dashboard.md", + "templatePath": "eng/readme-templates/README.mcr.md" + }, { "path": ".portal-docs/mar/README.dashboard.portal.md", "templatePath": "eng/readme-templates/README.mcr.md" diff --git a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs index a7b571bfd2..d1129f54d2 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text.RegularExpressions; using Newtonsoft.Json.Linq; @@ -37,6 +38,37 @@ public void Manifest_UsesCanonicalRepoName() GetAspireDashboardRepo().Value("name")); } + [Fact] + public void Manifest_DeclaresBothMarReadmesWithoutDockerHub() + { + JObject[] readmes = GetAspireDashboardRepo()["readmes"]!.Children().ToArray(); + + Assert.Equal( + [ + "README.aspire-dashboard.md", + ".portal-docs/mar/README.dashboard.md", + ".portal-docs/mar/README.dashboard.portal.md" + ], + readmes.Select(readme => readme.Value("path"))); + Assert.Equal( + [ + "eng/readme-templates/README.github.md", + "eng/readme-templates/README.mcr.md", + "eng/readme-templates/README.mcr.md" + ], + readmes.Select(readme => readme.Value("templatePath"))); + } + + [Fact] + public void MarReadmes_HaveIdenticalContent() + { + string readmeDirectory = Path.Combine(Config.SourceRepoRoot, ".portal-docs", "mar"); + + Assert.Equal( + File.ReadAllBytes(Path.Combine(readmeDirectory, "README.dashboard.md")), + File.ReadAllBytes(Path.Combine(readmeDirectory, "README.dashboard.portal.md"))); + } + [Fact] public void LegacySyndication_IsLimitedToAspire13() { From 4ae1f5ea2fe47d27c96652f9e88155127d639a10 Mon Sep 17 00:00:00 2001 From: IEvangelist Date: Mon, 28 Sep 2026 13:36:19 -0500 Subject: [PATCH 2/7] Keep sole dashboard portal README and fix Markdown formatting Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: e6169d07-d76f-4cde-8f8a-e6ece5f5fbec --- .portal-docs/mar/README.dashboard.md | 66 ------------------- .portal-docs/mar/README.dashboard.portal.md | 2 +- README.aspire-dashboard.md | 4 +- eng/readme-templates/DefaultLayout.md | 4 +- eng/readme-templates/Get-GeneratedReadmes.ps1 | 1 - eng/readme-templates/Use.aspire-dashboard.md | 2 +- manifest.json | 4 -- .../AspireDashboardManifestTests.cs | 15 +---- 8 files changed, 6 insertions(+), 92 deletions(-) delete mode 100644 .portal-docs/mar/README.dashboard.md diff --git a/.portal-docs/mar/README.dashboard.md b/.portal-docs/mar/README.dashboard.md deleted file mode 100644 index fdc0bd41a6..0000000000 --- a/.portal-docs/mar/README.dashboard.md +++ /dev/null @@ -1,66 +0,0 @@ -## About - -> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about) for stable releases. - -The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). - -## Featured Tags - -* `13` - * `docker pull mcr.microsoft.com/aspire/nightly/dashboard:13` - -## Usage - -Run the dashboard locally: - -```console -docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/nightly/dashboard:13 -``` - -Open . To sign in, use the login URL or token printed in the container logs: - -```console -docker logs aspire-dashboard -``` - -This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). - -### Send telemetry - -Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: - -* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). -* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). - -For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. - -### Operational notes - -* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. -* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). - -### Documentation and examples - -* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). -* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). -* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). -* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). -* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). - -## Support - -See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). - -For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). - -### Feedback - -* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). -* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). -* [Contact Microsoft Support](https://support.microsoft.com/contactus/). - -## License - -* Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) -* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/.portal-docs/mar/README.dashboard.portal.md b/.portal-docs/mar/README.dashboard.portal.md index fdc0bd41a6..2c8fba1672 100644 --- a/.portal-docs/mar/README.dashboard.portal.md +++ b/.portal-docs/mar/README.dashboard.portal.md @@ -17,7 +17,7 @@ Run the dashboard locally: docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/nightly/dashboard:13 ``` -Open . To sign in, use the login URL or token printed in the container logs: +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: ```console docker logs aspire-dashboard diff --git a/README.aspire-dashboard.md b/README.aspire-dashboard.md index 58e03b0f5d..f56ca612f4 100644 --- a/README.aspire-dashboard.md +++ b/README.aspire-dashboard.md @@ -19,7 +19,7 @@ Run the dashboard locally: docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 mcr.microsoft.com/aspire/nightly/dashboard:13 ``` -Open . To sign in, use the login URL or token printed in the container logs: +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: ```console docker logs aspire-dashboard @@ -49,8 +49,6 @@ For applications in other containers, use the dashboard container's name and por * [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). * [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). - - ## Full Tag Listing ### Linux amd64 Tags diff --git a/eng/readme-templates/DefaultLayout.md b/eng/readme-templates/DefaultLayout.md index 1301ce1fab..b5bbb42692 100644 --- a/eng/readme-templates/DefaultLayout.md +++ b/eng/readme-templates/DefaultLayout.md @@ -21,9 +21,9 @@ if !IS_PRODUCT_FAMILY:{{InsertTemplate("FeaturedTags.md", commonArgs)}} {{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "aspire") < 0 && find(REPO, "yarp") < 0): -{{InsertTemplate("About.variants.md", commonArgs)}}}} +{{InsertTemplate("About.variants.md", commonArgs)}}}}{{if !isAspireDashboard: -{{if !isAspireDashboard:{{insertReposListTemplate("RelatedRepos.md")}}}} +{{insertReposListTemplate("RelatedRepos.md")}}}} {{if !IS_PRODUCT_FAMILY: {{ARGS["top-header"]}} Full Tag Listing {{if ARGS["readme-host"] = "github": diff --git a/eng/readme-templates/Get-GeneratedReadmes.ps1 b/eng/readme-templates/Get-GeneratedReadmes.ps1 index 42ab616beb..3c63e9133a 100644 --- a/eng/readme-templates/Get-GeneratedReadmes.ps1 +++ b/eng/readme-templates/Get-GeneratedReadmes.ps1 @@ -44,7 +44,6 @@ $onDockerfilesGenerated = { CopyReadme $ContainerName ".portal-docs/docker-hub/README.samples.md" CopyReadme $ContainerName ".portal-docs/docker-hub/README.sdk.md" - CopyReadme $ContainerName ".portal-docs/mar/README.dashboard.md" CopyReadme $ContainerName ".portal-docs/mar/README.dashboard.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.aspnet.portal.md" CopyReadme $ContainerName ".portal-docs/mar/README.monitor.portal.md" diff --git a/eng/readme-templates/Use.aspire-dashboard.md b/eng/readme-templates/Use.aspire-dashboard.md index 2c60b421cf..fd8fa8707e 100644 --- a/eng/readme-templates/Use.aspire-dashboard.md +++ b/eng/readme-templates/Use.aspire-dashboard.md @@ -8,7 +8,7 @@ docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 {{FULL_REPO}}:13 ``` -Open . To sign in, use the login URL or token printed in the container logs: +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: ```console docker logs aspire-dashboard diff --git a/manifest.json b/manifest.json index 70aeef78d2..baade448c7 100644 --- a/manifest.json +++ b/manifest.json @@ -14998,10 +14998,6 @@ "path": "README.aspire-dashboard.md", "templatePath": "eng/readme-templates/README.github.md" }, - { - "path": ".portal-docs/mar/README.dashboard.md", - "templatePath": "eng/readme-templates/README.mcr.md" - }, { "path": ".portal-docs/mar/README.dashboard.portal.md", "templatePath": "eng/readme-templates/README.mcr.md" diff --git a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs index d1129f54d2..b89eaf7058 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text.RegularExpressions; using Newtonsoft.Json.Linq; @@ -39,36 +38,24 @@ public void Manifest_UsesCanonicalRepoName() } [Fact] - public void Manifest_DeclaresBothMarReadmesWithoutDockerHub() + public void Manifest_DeclaresGitHubAndPortalReadmesWithoutDockerHub() { JObject[] readmes = GetAspireDashboardRepo()["readmes"]!.Children().ToArray(); Assert.Equal( [ "README.aspire-dashboard.md", - ".portal-docs/mar/README.dashboard.md", ".portal-docs/mar/README.dashboard.portal.md" ], readmes.Select(readme => readme.Value("path"))); Assert.Equal( [ "eng/readme-templates/README.github.md", - "eng/readme-templates/README.mcr.md", "eng/readme-templates/README.mcr.md" ], readmes.Select(readme => readme.Value("templatePath"))); } - [Fact] - public void MarReadmes_HaveIdenticalContent() - { - string readmeDirectory = Path.Combine(Config.SourceRepoRoot, ".portal-docs", "mar"); - - Assert.Equal( - File.ReadAllBytes(Path.Combine(readmeDirectory, "README.dashboard.md")), - File.ReadAllBytes(Path.Combine(readmeDirectory, "README.dashboard.portal.md"))); - } - [Fact] public void LegacySyndication_IsLimitedToAspire13() { From 62a315e9eefea35328f2dc98827e3f96daf67e6e Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Thu, 1 Oct 2026 10:00:24 -0700 Subject: [PATCH 3/7] Eject Aspire Dashboard README template Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4a5e1075-75e2-4664-9367-27ad01499735 --- .portal-docs/mar/README.dashboard.portal.md | 8 +- .../About.aspire-dashboard.md | 1 - eng/readme-templates/About.md | 9 +- eng/readme-templates/About.variants.md | 2 +- eng/readme-templates/Announcement.md | 9 +- eng/readme-templates/DefaultLayout.md | 9 +- eng/readme-templates/FeaturedTags.md | 2 - eng/readme-templates/GitHub.header.md | 4 +- .../README.aspire-dashboard.github.md | 1 + .../README.aspire-dashboard.mcr.md | 1 + .../README.aspire-dashboard.md | 83 +++++++++++++++++++ eng/readme-templates/README.mcr.md | 7 +- eng/readme-templates/Support.md | 19 ++--- eng/readme-templates/Url.md | 4 +- eng/readme-templates/Use.aspire-dashboard.md | 39 --------- eng/readme-templates/Use.md | 8 +- manifest.json | 4 +- .../AspireDashboardManifestTests.cs | 4 +- 18 files changed, 117 insertions(+), 97 deletions(-) delete mode 100644 eng/readme-templates/About.aspire-dashboard.md create mode 100644 eng/readme-templates/README.aspire-dashboard.github.md create mode 100644 eng/readme-templates/README.aspire-dashboard.mcr.md create mode 100644 eng/readme-templates/README.aspire-dashboard.md delete mode 100644 eng/readme-templates/Use.aspire-dashboard.md diff --git a/.portal-docs/mar/README.dashboard.portal.md b/.portal-docs/mar/README.dashboard.portal.md index 2c8fba1672..5f01a0f246 100644 --- a/.portal-docs/mar/README.dashboard.portal.md +++ b/.portal-docs/mar/README.dashboard.portal.md @@ -1,14 +1,14 @@ -## About - > **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about) for stable releases. -The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). - ## Featured Tags * `13` * `docker pull mcr.microsoft.com/aspire/nightly/dashboard:13` +## About + +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). + ## Usage Run the dashboard locally: diff --git a/eng/readme-templates/About.aspire-dashboard.md b/eng/readme-templates/About.aspire-dashboard.md deleted file mode 100644 index 66d3a2ac06..0000000000 --- a/eng/readme-templates/About.aspire-dashboard.md +++ /dev/null @@ -1 +0,0 @@ -The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). diff --git a/eng/readme-templates/About.md b/eng/readme-templates/About.md index d7b8a2023b..d2e20f9007 100644 --- a/eng/readme-templates/About.md +++ b/eng/readme-templates/About.md @@ -2,12 +2,9 @@ _ ARGS: top-header: The string to use as the top-level header. readme-host: Moniker of the site that will host the readme ^ - set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ set templateQualifier to when(IS_PRODUCT_FAMILY, "product-family", - when(split(REPO, "/")[0] = "aspire", - "aspire-dashboard", - when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO))) + when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO)) }}{{ARGS["top-header"]}} About {{if ARGS["readme-host"] = "mar":{{InsertTemplate("ReposProvider.md", [ @@ -15,6 +12,6 @@ "leading-line-break": "true", "readme-host": ARGS["readme-host"] ])}}}} -{{InsertTemplate(join(["About", templateQualifier, "md"], "."), [ "top-header": ARGS["top-header"], "readme-host": ARGS["readme-host"] ])}}{{if !isAspireDashboard: +{{InsertTemplate(join(["About", templateQualifier, "md"], "."), [ "top-header": ARGS["top-header"], "readme-host": ARGS["readme-host"] ])}} -Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements.}} +Watch [discussions](https://github.com/dotnet/dotnet-docker/discussions/categories/announcements) for Docker-related .NET announcements. diff --git a/eng/readme-templates/About.variants.md b/eng/readme-templates/About.variants.md index 100b41fd19..7f230313d6 100644 --- a/eng/readme-templates/About.variants.md +++ b/eng/readme-templates/About.variants.md @@ -8,7 +8,7 @@ }}{{ARGS["top-header"]}} Image Variants .NET container images have several variants that offer different combinations of flexibility and deployment size. -The [Image Variants documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-variants.md) contains a summary of the image variants and their use-cases.{{if repo != "sdk" && repo != "aspire-dashboard": +The [Image Variants documentation](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-variants.md) contains a summary of the image variants and their use-cases.{{if repo != "sdk": {{InsertTemplate("About.distroless.md", [ "top-header": ARGS["top-header"] ])}}}}{{if repo = "aspnet": diff --git a/eng/readme-templates/Announcement.md b/eng/readme-templates/Announcement.md index aa8d230502..bc0d750f82 100644 --- a/eng/readme-templates/Announcement.md +++ b/eng/readme-templates/Announcement.md @@ -10,9 +10,7 @@ return repo[0] }} ^ - set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ - set nonNightlyRepo to when(isAspireDashboard, "dotnet/aspire-dashboard", - when(IS_PRODUCT_FAMILY, "dotnet", join(split(REPO, "/nightly"), ""))) ^ + set nonNightlyRepo to when(IS_PRODUCT_FAMILY, "dotnet", join(split(REPO, "/nightly"), "")) ^ set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ set productFamilyRepo to ARGS["product-family-repos"][0][0] ^ set isNightlyOnly to find(map(ARGS["nightly-only-repos"],getRepoName), nonNightlyRepo) >= 0 ^ @@ -23,9 +21,8 @@ }}{{if isNightlyRepo || VARIABLES["branch"] = "nightly" :{{if ARGS["leading-line-break"]: -}}{{if isAspireDashboard:> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{nonNightlyRepo}}]({{url}}) for stable releases. -^else:> **Important**: The images from the dotnet/nightly repositories include last-known-good (LKG) builds for the next release of [.NET](https://github.com/dotnet/core). +}}> **Important**: The images from the dotnet/nightly repositories include last-known-good (LKG) builds for the next release of [.NET](https://github.com/dotnet/core). > > See [dotnet]({{url}}) for images with official releases of [.NET](https://github.com/dotnet/core). -}}{{if ARGS["trailing-line-break"]: +{{if ARGS["trailing-line-break"]: }}}} diff --git a/eng/readme-templates/DefaultLayout.md b/eng/readme-templates/DefaultLayout.md index b5bbb42692..d1e1323da7 100644 --- a/eng/readme-templates/DefaultLayout.md +++ b/eng/readme-templates/DefaultLayout.md @@ -7,9 +7,8 @@ set insertReposListTemplate(template, args) to:{{ return InsertTemplate("ReposProvider.md", union([ "template": template ], commonArgs, args)) }} ^ - set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ - set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ + set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ set readmeRepoName to when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO) }}{{insertReposListTemplate("Announcement.md", [ "trailing-line-break": "true" ])}}{{ @@ -19,11 +18,11 @@ if !IS_PRODUCT_FAMILY:{{InsertTemplate("FeaturedTags.md", commonArgs)}} }} {{InsertTemplate("About.md", commonArgs)}} -{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "aspire") < 0 && find(REPO, "yarp") < 0): +{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "yarp") < 0): -{{InsertTemplate("About.variants.md", commonArgs)}}}}{{if !isAspireDashboard: +{{InsertTemplate("About.variants.md", commonArgs)}}}} -{{insertReposListTemplate("RelatedRepos.md")}}}} +{{insertReposListTemplate("RelatedRepos.md")}} {{if !IS_PRODUCT_FAMILY: {{ARGS["top-header"]}} Full Tag Listing {{if ARGS["readme-host"] = "github": diff --git a/eng/readme-templates/FeaturedTags.md b/eng/readme-templates/FeaturedTags.md index e4c210d7dd..b0a5431943 100644 --- a/eng/readme-templates/FeaturedTags.md +++ b/eng/readme-templates/FeaturedTags.md @@ -20,8 +20,6 @@ elif match(REPO, "monitor/base"):* `9` (Standard Support) * `docker pull {{FULL_REPO}}:9` * `8` (Long-Term Support) * `docker pull {{FULL_REPO}}:8`^ -elif split(REPO, "/")[0] = "aspire":* `13` - * `docker pull {{FULL_REPO}}:13`^ elif match(REPO, "yarp"):* `2.3-preview` * `docker pull {{FULL_REPO}}:2.3-preview`^ else:{{if VARIABLES["branch"] = "nightly":* `11.0` (Release Candidate) diff --git a/eng/readme-templates/GitHub.header.md b/eng/readme-templates/GitHub.header.md index 9ab7e4661c..9cbe8900fa 100644 --- a/eng/readme-templates/GitHub.header.md +++ b/eng/readme-templates/GitHub.header.md @@ -15,8 +15,6 @@ set currentRepo to when(IS_PRODUCT_FAMILY, ARGS["product-family-repos"], - when(split(REPO, "/")[0] = "aspire", - [["aspire/dashboard", "Aspire Dashboard"]], - cat(filter(repos, isCurrentRepo)))) + cat(filter(repos, isCurrentRepo))) }}# {{currentRepo[0][1]}} diff --git a/eng/readme-templates/README.aspire-dashboard.github.md b/eng/readme-templates/README.aspire-dashboard.github.md new file mode 100644 index 0000000000..d0b6536ed8 --- /dev/null +++ b/eng/readme-templates/README.aspire-dashboard.github.md @@ -0,0 +1 @@ +{{InsertTemplate("README.aspire-dashboard.md", [ "readme-host": "github" ])}} diff --git a/eng/readme-templates/README.aspire-dashboard.mcr.md b/eng/readme-templates/README.aspire-dashboard.mcr.md new file mode 100644 index 0000000000..4a365835b8 --- /dev/null +++ b/eng/readme-templates/README.aspire-dashboard.mcr.md @@ -0,0 +1 @@ +{{InsertTemplate("README.aspire-dashboard.md", [ "readme-host": "mar" ])}} diff --git a/eng/readme-templates/README.aspire-dashboard.md b/eng/readme-templates/README.aspire-dashboard.md new file mode 100644 index 0000000000..7e66893f46 --- /dev/null +++ b/eng/readme-templates/README.aspire-dashboard.md @@ -0,0 +1,83 @@ +{{ + _ ARGS: + readme-host: Moniker of the site that will host the readme ^ + + set isGitHub to ARGS["readme-host"] = "github" ^ + set isNightlyRepo to match(split(REPO, "/")[1], "nightly") || VARIABLES["branch"] = "nightly" ^ + set stableUrl to when( + isGitHub, + "https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md", + "https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about") + +}}{{if isGitHub:# Aspire Dashboard + +}}{{if isNightlyRepo:> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard]({{stableUrl}}) for stable releases. + +}}## Featured Tags + +* `13` + * `docker pull {{FULL_REPO}}:13` + +## About + +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). + +## Usage + +Run the dashboard locally: + +```console +docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 {{FULL_REPO}}:13 +``` + +Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: + +```console +docker logs aspire-dashboard +``` + +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). + +### Send telemetry + +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: + +* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). +* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). + +For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. + +### Operational notes + +* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. +* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). + +### Documentation and examples + +* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). +* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). +* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). +* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). +* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). + +{{if isGitHub:## Full Tag Listing + +*Tags not listed in the table above are not supported. See the [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md). See the [full list of tags](https://mcr.microsoft.com/v2/{{REPO}}/tags/list) for all supported and unsupported tags.* + +}}## Support + +See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). + +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). + +### Feedback + +* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). +* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). +* [Contact Microsoft Support](https://support.microsoft.com/contactus/). + +## License + +* Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) +* [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT) +* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md) diff --git a/eng/readme-templates/README.mcr.md b/eng/readme-templates/README.mcr.md index 4dbe1b4c07..6cd3e88435 100644 --- a/eng/readme-templates/README.mcr.md +++ b/eng/readme-templates/README.mcr.md @@ -1,13 +1,12 @@ {{ - set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ set commonArgs to [ "top-header": "##", "readme-host": "mar" ] }}{{InsertTemplate("About.md", commonArgs)}} -{{InsertTemplate("FeaturedTags.md", commonArgs)}}{{if !isAspireDashboard: +{{InsertTemplate("FeaturedTags.md", commonArgs)}} -{{InsertTemplate("ReposProvider.md", union([ "template": "RelatedRepos.md" ], commonArgs))}}}} +{{InsertTemplate("ReposProvider.md", union([ "template": "RelatedRepos.md" ], commonArgs))}} -{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "aspire") < 0 && find(REPO, "yarp") < 0): +{{InsertTemplate("Use.md", commonArgs)}}{{if (find(REPO, "monitor") < 0 && find(REPO, "yarp") < 0): {{InsertTemplate("About.variants.md", commonArgs)}}}} diff --git a/eng/readme-templates/Support.md b/eng/readme-templates/Support.md index 1e9d9c60df..5bca50f8a5 100644 --- a/eng/readme-templates/Support.md +++ b/eng/readme-templates/Support.md @@ -5,25 +5,16 @@ set isRuntimeDeps to match(SHORT_REPO, "runtime-deps") ^ set isSamples to match(SHORT_REPO, "samples") ^ set isMonitor to match(SHORT_REPO, "monitor") || match(SHORT_REPO, "base") ^ - set isAspireDashboard to SHORT_REPO = "aspire-dashboard" || (split(REPO, "/")[0] = "aspire" && SHORT_REPO = "dashboard") ^ set isReverseProxy to match(SHORT_REPO, "yarp") }}{{ARGS["top-header"]}} Support -{{if isAspireDashboard:See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). - -For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). - -{{ARGS["top-header"]}}# Feedback - -* [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). -* [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). -* [Contact Microsoft Support](https://support.microsoft.com/contactus/).^else:{{if isSamples:These sample images are not intended for production use and may be subject to breaking changes or removal at any time. They are provided as a starting point for developers to experiment with and learn about .NET in a containerized environment. +{{if isSamples:These sample images are not intended for production use and may be subject to breaking changes or removal at any time. They are provided as a starting point for developers to experiment with and learn about .NET in a containerized environment. }}{{ARGS["top-header"]}}# Lifecycle {{if isReverseProxy:* [Microsoft Support for YARP](https://github.com/dotnet/yarp/blob/main/docs/roadmap.md) -}}* [Microsoft Support for {{when(isAspireDashboard, "Aspire", ".NET")}}]({{when(isAspireDashboard, "https://aspire.dev/support/", "https://github.com/dotnet/core/blob/main/support.md")}}) +}}* [Microsoft Support for .NET](https://github.com/dotnet/core/blob/main/support.md) * [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md) * [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md) @@ -48,12 +39,12 @@ Please refer to the [Security Policy](https://github.com/dotnet/dotnet-docker/bl {{ARGS["top-header"]}}# Feedback * [File an issue](https://github.com/dotnet/dotnet-docker/issues/new/choose) -* [Contact Microsoft Support](https://support.microsoft.com/contactus/)}} +* [Contact Microsoft Support](https://support.microsoft.com/contactus/) {{ARGS["top-header"]}} License * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) -* [{{when(isAspireDashboard, "Aspire MIT license", ".NET license")}}]({{when(isAspireDashboard, "https://github.com/microsoft/aspire/blob/main/LICENSE.TXT", "https://github.com/dotnet/dotnet-docker/blob/main/LICENSE")}}) -* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md){{if !(isRuntimeDeps || isMonitor || isAspireDashboard): +* [.NET license](https://github.com/dotnet/dotnet-docker/blob/main/LICENSE) +* [Discover licensing for Linux image contents](https://github.com/dotnet/dotnet-docker/blob/main/documentation/image-artifact-details.md){{if !(isRuntimeDeps || isMonitor): * [Windows base image license](https://learn.microsoft.com/virtualization/windowscontainers/images-eula) (only applies to Windows containers) * [Pricing and licensing for Windows Server](https://www.microsoft.com/windows-server/pricing)}} diff --git a/eng/readme-templates/Url.md b/eng/readme-templates/Url.md index b8174853c3..cdd8c69ada 100644 --- a/eng/readme-templates/Url.md +++ b/eng/readme-templates/Url.md @@ -18,9 +18,7 @@ when(isProductFamily, "", cat( - when(repoParts[0] = "aspire", - "aspire-dashboard", - join(slice(repoParts, when(isNightlyRepo || isFrameworkRepo, 2, 1)), "-")), + join(slice(repoParts, when(isNightlyRepo || isFrameworkRepo, 2, 1)), "-"), ".")), "md") diff --git a/eng/readme-templates/Use.aspire-dashboard.md b/eng/readme-templates/Use.aspire-dashboard.md deleted file mode 100644 index fd8fa8707e..0000000000 --- a/eng/readme-templates/Use.aspire-dashboard.md +++ /dev/null @@ -1,39 +0,0 @@ -{{ - _ ARGS: - top-header: The string to use as the top-level header. - readme-host: Moniker of the site that will host the readme -}}Run the dashboard locally: - -```console -docker run --rm -d --name aspire-dashboard -p 127.0.0.1:18888:18888 -p 127.0.0.1:4317:18889 -p 127.0.0.1:4318:18890 {{FULL_REPO}}:13 -``` - -Open `http://localhost:18888`. To sign in, use the login URL or token printed in the container logs: - -```console -docker logs aspire-dashboard -``` - -This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). - -{{ARGS["top-header"]}}# Send telemetry - -Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: - -* OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). -* OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). - -For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. - -{{ARGS["top-header"]}}# Operational notes - -* Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. -* Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). - -{{ARGS["top-header"]}}# Documentation and examples - -* [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). -* [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). -* [JavaScript and Node.js telemetry tutorial](https://aspire.dev/dashboard/standalone-for-nodejs/). -* [Standalone dashboard sample (C#)](https://github.com/microsoft/aspire-samples/tree/main/samples/standalone-dashboard). -* [Dashboard configuration reference](https://aspire.dev/dashboard/configuration/). diff --git a/eng/readme-templates/Use.md b/eng/readme-templates/Use.md index 135e79ab91..b12215edc1 100644 --- a/eng/readme-templates/Use.md +++ b/eng/readme-templates/Use.md @@ -4,13 +4,11 @@ readme-host: Moniker of the site that will host the readme ^ set templateQualifier to when(IS_PRODUCT_FAMILY, "samples", - when(split(REPO, "/")[0] = "aspire", - "aspire-dashboard", - when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO))) + when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO)) }}{{ARGS["top-header"]}} Usage -{{if templateQualifier != "aspire-dashboard": + The [.NET Docker samples](https://github.com/dotnet/dotnet-docker/blob/main/samples/README.md) show various ways to use .NET and Docker together. See [Introduction to .NET and Docker](https://learn.microsoft.com/dotnet/core/docker/introduction){{ if templateQualifier = "aspnet" || templateQualifier = "runtime-deps": and [Host ASP.NET Core in Docker containers](https://learn.microsoft.com/aspnet/core/host-and-deploy/docker)}} to learn more. -}} + {{InsertTemplate(join(["Use", templateQualifier, "md"], "."), [ "top-header": ARGS["top-header"], "readme-host": ARGS["readme-host"]])}} diff --git a/manifest.json b/manifest.json index baade448c7..3cbfa7c7fe 100644 --- a/manifest.json +++ b/manifest.json @@ -14996,11 +14996,11 @@ "readmes": [ { "path": "README.aspire-dashboard.md", - "templatePath": "eng/readme-templates/README.github.md" + "templatePath": "eng/readme-templates/README.aspire-dashboard.github.md" }, { "path": ".portal-docs/mar/README.dashboard.portal.md", - "templatePath": "eng/readme-templates/README.mcr.md" + "templatePath": "eng/readme-templates/README.aspire-dashboard.mcr.md" } ], "mcrTagsMetadataTemplate": "eng/mcr-tags-metadata-templates/dashboard-tags.yml", diff --git a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs index b89eaf7058..c1eb4e5cee 100644 --- a/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs +++ b/tests/Microsoft.DotNet.Docker.Tests/AspireDashboardManifestTests.cs @@ -50,8 +50,8 @@ public void Manifest_DeclaresGitHubAndPortalReadmesWithoutDockerHub() readmes.Select(readme => readme.Value("path"))); Assert.Equal( [ - "eng/readme-templates/README.github.md", - "eng/readme-templates/README.mcr.md" + "eng/readme-templates/README.aspire-dashboard.github.md", + "eng/readme-templates/README.aspire-dashboard.mcr.md" ], readmes.Select(readme => readme.Value("templatePath"))); } From c71f4efb3257f68632ea13440e12954e3ea297f9 Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Wed, 7 Oct 2026 15:55:11 -0700 Subject: [PATCH 4/7] Remove duplicate nightly README variable Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- eng/readme-templates/DefaultLayout.md | 1 - 1 file changed, 1 deletion(-) diff --git a/eng/readme-templates/DefaultLayout.md b/eng/readme-templates/DefaultLayout.md index d1e1323da7..f859e02ae8 100644 --- a/eng/readme-templates/DefaultLayout.md +++ b/eng/readme-templates/DefaultLayout.md @@ -8,7 +8,6 @@ return InsertTemplate("ReposProvider.md", union([ "template": template ], commonArgs, args)) }} ^ set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ - set isNightlyRepo to match(split(REPO, "/")[1], "nightly") ^ set readmeRepoName to when(PARENT_REPO = "monitor", cat("monitor-", SHORT_REPO), SHORT_REPO) }}{{insertReposListTemplate("Announcement.md", [ "trailing-line-break": "true" ])}}{{ From efa7acbe2289d3e61a8b2918757bf19493054da4 Mon Sep 17 00:00:00 2001 From: Logan Bussell Date: Wed, 7 Oct 2026 16:06:31 -0700 Subject: [PATCH 5/7] Ignore flaky Ubuntu CVE index link Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/workflows/check-markdown-links.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check-markdown-links.yml b/.github/workflows/check-markdown-links.yml index 4d939065c3..b68339ec18 100644 --- a/.github/workflows/check-markdown-links.yml +++ b/.github/workflows/check-markdown-links.yml @@ -32,6 +32,8 @@ jobs: MLC_IGNORE_MSRC: https://www.microsoft.com/msrc/faqs-report-an-issue,https://www.microsoft.com/msrc/bounty-dot-net-core # Kubernetes documentation links are unstable MLC_IGNORE_KUBERNETES: https://kubernetes.io/*,https://k3s.io/*,https://minikube.sigs.k8s.io/* + # Ubuntu's CVE index intermittently returns 504 responses to automated requests + MLC_IGNORE_UBUNTU_CVES: https://ubuntu.com/security/cves # Some GitHub links redirect to the login page MLC_REDIRECT_GITHUB: https://github.com/login* # Sites that redirect locale-neutral URLs to locale-specific URLs @@ -43,6 +45,6 @@ jobs: --gitignore --root-dir . --ignore-path eng/announcement-templates,eng/readme-templates - --ignore-links ${{ env.MLC_IGNORE_GITHUB }},${{ env.MLC_IGNORE_SHORT_LINKS }},${{ env.MLC_IGNORE_MSRC }},${{ env.MLC_IGNORE_KUBERNETES }} + --ignore-links ${{ env.MLC_IGNORE_GITHUB }},${{ env.MLC_IGNORE_SHORT_LINKS }},${{ env.MLC_IGNORE_MSRC }},${{ env.MLC_IGNORE_KUBERNETES }},${{ env.MLC_IGNORE_UBUNTU_CVES }} --do-not-warn-for-redirect-to ${{ env.MLC_REDIRECT_GITHUB }},${{ env.MLC_REDIRECT_LOCALES }} --throttle 250 From 4e82b9a3bad5db465c3b27fa654ff86610b3d768 Mon Sep 17 00:00:00 2001 From: David Pine <7679720+IEvangelist@users.noreply.github.com> Date: Thu, 8 Oct 2026 08:10:10 -0500 Subject: [PATCH 6/7] Apply Aspire dashboard README review feedback Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c8655a27-1c77-4c4b-ad38-7ce0b4f15e77 --- .portal-docs/mar/README.dashboard.portal.md | 6 +++--- README.aspire-dashboard.md | 4 ++-- eng/readme-templates/README.aspire-dashboard.md | 9 +++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/.portal-docs/mar/README.dashboard.portal.md b/.portal-docs/mar/README.dashboard.portal.md index 5f01a0f246..ed0b935ea9 100644 --- a/.portal-docs/mar/README.dashboard.portal.md +++ b/.portal-docs/mar/README.dashboard.portal.md @@ -1,4 +1,4 @@ -> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard](https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about) for stable releases. +> **Important**: The aspire/nightly/dashboard image is a preview build of the Aspire Dashboard and is not signed. See [aspire/dashboard](https://mcr.microsoft.com/artifact/mar/aspire/dashboard/about) for stable releases. ## Featured Tags @@ -7,7 +7,7 @@ ## About -The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). ## Usage @@ -51,7 +51,7 @@ For applications in other containers, use the dashboard container's name and por See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). -For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). ### Feedback diff --git a/README.aspire-dashboard.md b/README.aspire-dashboard.md index f56ca612f4..04ca2af172 100644 --- a/README.aspire-dashboard.md +++ b/README.aspire-dashboard.md @@ -9,7 +9,7 @@ ## About -The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). ## Usage @@ -71,7 +71,7 @@ Tags | Dockerfile | OS Version See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). -For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). ### Feedback diff --git a/eng/readme-templates/README.aspire-dashboard.md b/eng/readme-templates/README.aspire-dashboard.md index 7e66893f46..07c60b652f 100644 --- a/eng/readme-templates/README.aspire-dashboard.md +++ b/eng/readme-templates/README.aspire-dashboard.md @@ -7,11 +7,12 @@ set stableUrl to when( isGitHub, "https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md", - "https://mcr.microsoft.com/artifact/mar/dotnet/aspire-dashboard/about") + "https://mcr.microsoft.com/artifact/mar/aspire/dashboard/about") ^ + set stableName to when(isGitHub, "dotnet/aspire-dashboard", "aspire/dashboard") }}{{if isGitHub:# Aspire Dashboard -}}{{if isNightlyRepo:> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [dotnet/aspire-dashboard]({{stableUrl}}) for stable releases. +}}{{if isNightlyRepo:> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{stableName}}]({{stableUrl}}) for stable releases. }}## Featured Tags @@ -20,7 +21,7 @@ ## About -The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. No Aspire AppHost or .NET application is required. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). +The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). ## Usage @@ -68,7 +69,7 @@ For applications in other containers, use the dashboard container's name and por See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). -For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). +For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). ### Feedback From 66c1564b9400f149a353e6fcae67b8d1389158af Mon Sep 17 00:00:00 2001 From: David Pine <7679720+IEvangelist@users.noreply.github.com> Date: Thu, 8 Oct 2026 09:55:00 -0500 Subject: [PATCH 7/7] Align Aspire dashboard README template Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c8655a27-1c77-4c4b-ad38-7ce0b4f15e77 --- .portal-docs/mar/README.dashboard.portal.md | 4 +-- README.aspire-dashboard.md | 4 +-- .../README.aspire-dashboard.md | 32 ++++++++++++------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/.portal-docs/mar/README.dashboard.portal.md b/.portal-docs/mar/README.dashboard.portal.md index ed0b935ea9..f02b72f73d 100644 --- a/.portal-docs/mar/README.dashboard.portal.md +++ b/.portal-docs/mar/README.dashboard.portal.md @@ -23,11 +23,11 @@ Open `http://localhost:18888`. To sign in, use the login URL or token printed in docker logs aspire-dashboard ``` -This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure HTTPS, authentication, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). ### Send telemetry -Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter with the matching protocol and endpoint. Starting the dashboard does not instrument your application automatically. For applications running on the host, use: * OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). * OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). diff --git a/README.aspire-dashboard.md b/README.aspire-dashboard.md index 04ca2af172..fbd630eb9b 100644 --- a/README.aspire-dashboard.md +++ b/README.aspire-dashboard.md @@ -25,11 +25,11 @@ Open `http://localhost:18888`. To sign in, use the login URL or token printed in docker logs aspire-dashboard ``` -This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure HTTPS, authentication, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). ### Send telemetry -Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter with the matching protocol and endpoint. Starting the dashboard does not instrument your application automatically. For applications running on the host, use: * OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). * OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). diff --git a/eng/readme-templates/README.aspire-dashboard.md b/eng/readme-templates/README.aspire-dashboard.md index 07c60b652f..61a396e24c 100644 --- a/eng/readme-templates/README.aspire-dashboard.md +++ b/eng/readme-templates/README.aspire-dashboard.md @@ -3,6 +3,8 @@ readme-host: Moniker of the site that will host the readme ^ set isGitHub to ARGS["readme-host"] = "github" ^ + set isDockerHub to ARGS["readme-host"] = "dockerhub" ^ + set h to when(isDockerHub, "#", "##") ^ set isNightlyRepo to match(split(REPO, "/")[1], "nightly") || VARIABLES["branch"] = "nightly" ^ set stableUrl to when( isGitHub, @@ -14,16 +16,18 @@ }}{{if isNightlyRepo:> **Important**: The {{REPO}} image is a preview build of the Aspire Dashboard and is not signed. See [{{stableName}}]({{stableUrl}}) for stable releases. -}}## Featured Tags +}}{{h}} Featured Tags * `13` * `docker pull {{FULL_REPO}}:13` -## About +{{h}} About The [Aspire Dashboard](https://aspire.dev/dashboard/standalone/) is a standalone viewer for logs, traces, and metrics from OpenTelemetry-enabled applications in any language. Source code is available in [microsoft/aspire](https://github.com/microsoft/aspire). - -## Usage +{{if !isNightlyRepo: +For preview builds, see the [nightly Aspire Dashboard image](https://mcr.microsoft.com/artifact/mar/aspire/nightly/dashboard/about). +}} +{{h}} Usage Run the dashboard locally: @@ -37,23 +41,23 @@ Open `http://localhost:18888`. To sign in, use the login URL or token printed in docker logs aspire-dashboard ``` -This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure authentication, HTTPS, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). +This example keeps browser-token authentication enabled and binds the published ports to the host's loopback interface. Incoming OTLP telemetry is unauthenticated by default in standalone mode; the browser token does not secure telemetry ingestion. Only accept telemetry from trusted applications; configure HTTPS, authentication, and network controls before exposing the dashboard beyond your machine. See [dashboard security guidance](https://aspire.dev/dashboard/security-considerations/). -### Send telemetry +{{h}}# Send telemetry -Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter. Starting the dashboard does not instrument your application automatically. For applications running on the host, use the endpoint and matching exporter protocol: +Instrument your application with its language's OpenTelemetry SDK and configure an OTLP exporter with the matching protocol and endpoint. Starting the dashboard does not instrument your application automatically. For applications running on the host, use: * OTLP/gRPC: `http://localhost:4317` (mapped to container port `18889`). * OTLP/HTTP: `http://localhost:4318` (mapped to container port `18890`). For applications in other containers, use the dashboard container's name and port (`18889` or `18890`) on a shared Docker network, not their own `localhost`. -### Operational notes +{{h}}# Operational notes * Telemetry is stored in memory with configurable limits and is lost when the dashboard restarts. The dashboard is intended for development and short-term diagnostics, not durable telemetry storage. * Standalone mode displays telemetry without an AppHost. Resource listings and captured console logs require a configured [resource service](https://aspire.dev/dashboard/configuration/#resources). -### Documentation and examples +{{h}}# Documentation and examples * [Run the standalone dashboard](https://aspire.dev/dashboard/standalone/). * [Python telemetry tutorial](https://aspire.dev/dashboard/standalone-for-python/). @@ -65,19 +69,23 @@ For applications in other containers, use the dashboard container's name and por *Tags not listed in the table above are not supported. See the [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md). See the [full list of tags](https://mcr.microsoft.com/v2/{{REPO}}/tags/list) for all supported and unsupported tags.* -}}## Support +^elif isDockerHub:# Full Tag Listing + +View the current tags at the [Microsoft Artifact Registry portal](https://mcr.microsoft.com/artifact/mar/{{REPO}}/tags) or on [GitHub](https://github.com/dotnet/dotnet-docker/blob/main/README.aspire-dashboard.md#full-tag-listing). + +}}{{h}} Support See the [Aspire support policy](https://aspire.dev/support/) for supported versions and lifecycle information. Container images are also covered by the [Supported Container Platforms Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-platforms.md), [Supported Tags Policy](https://github.com/dotnet/dotnet-docker/blob/main/documentation/supported-tags.md), and [Image Update Policy](https://github.com/dotnet/dotnet-docker/blob/main/README.md#image-update-policy). For container security and vulnerability reporting, see the [Security Policy](https://github.com/dotnet/dotnet-docker/blob/main/SECURITY.md) and [Container Vulnerability Workflow](https://github.com/dotnet/dotnet-docker/blob/main/documentation/vulnerability-reporting.md). Additional security information can be found on [aspire.dev/dashboard/security-considerations](https://aspire.dev/dashboard/security-considerations/#standalone-mode). -### Feedback +{{h}}# Feedback * [Dashboard issues and feature requests](https://github.com/microsoft/aspire/issues). * [Container image issues](https://github.com/dotnet/dotnet-docker/issues/new/choose). * [Contact Microsoft Support](https://support.microsoft.com/contactus/). -## License +{{h}} License * Legal Notice: [Container License Information](https://aka.ms/mcr/osslegalnotice) * [Aspire MIT license](https://github.com/microsoft/aspire/blob/main/LICENSE.TXT)