Browse Source

Merge branch 'rel-9.3' into feature/version-upgrade-to-v20

# Conflicts:
#	npm/ng-packs/package.json
#	npm/ng-packs/packages/oauth/package.json
#	npm/ng-packs/packages/theme-shared/package.json
#	templates/app-nolayers/angular/package.json
#	templates/app/angular/package.json
#	templates/module/angular/package.json
pull/23220/head
erdemcaygor 7 months ago
parent
commit
c3fddd6229
  1. 20
      .github/workflows/auto-pr.yml
  2. 26
      Directory.Packages.props
  3. 3
      abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json
  4. 4
      common.props
  5. 97
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md
  6. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-check-for-updates.png
  7. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-download.png
  8. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/containers-type.png
  9. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/cover-image.png
  10. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/health-checks.png
  11. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/new-migration-added.gif
  12. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/saas-health-check.png
  13. BIN
      docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/theme-style-selection-leptonx.png
  14. BIN
      docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/mongo-db.jpg
  15. 93
      docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/post.md
  16. 113
      docs/en/Community-Articles/2025-06-13-modular-docker-container-management/modular-docker-container-management.md
  17. BIN
      docs/en/Community-Articles/2025-06-13-modular-docker-container-management/solution-runner-containers.png
  18. 2
      docs/en/cli/differences-between-old-and-new-cli.md
  19. 6
      docs/en/cli/index.md
  20. 4
      docs/en/docs-nav.json
  21. 12
      docs/en/framework/architecture/modularity/basics.md
  22. 3
      docs/en/framework/infrastructure/background-workers/index.md
  23. 4
      docs/en/framework/real-time/signalr.md
  24. 2
      docs/en/framework/ui/mvc-razor-pages/basic-theme.md
  25. 11
      docs/en/framework/ui/mvc-razor-pages/client-side-package-management.md
  26. BIN
      docs/en/get-started/images/abp-studio-new-solution-dialog-modularity.png
  27. BIN
      docs/en/get-started/images/abp-studio-no-layers-new-solution-modularity.png
  28. 10
      docs/en/get-started/layered-web-application.md
  29. 4
      docs/en/get-started/maui.md
  30. 4
      docs/en/get-started/microservice.md
  31. 8
      docs/en/get-started/pre-requirements.md
  32. 14
      docs/en/get-started/single-layer-web-application.md
  33. BIN
      docs/en/images/azure-deploy-create-web-app-2.png
  34. BIN
      docs/en/images/azure-deploy-create-web-app-6.png
  35. 2
      docs/en/modules/audit-logging-pro.md
  36. 46
      docs/en/release-info/migration-guides/abp-9-3.md
  37. 1
      docs/en/release-info/migration-guides/index.md
  38. 13
      docs/en/release-info/release-notes.md
  39. 6
      docs/en/release-info/road-map.md
  40. 2
      docs/en/samples/index.md
  41. BIN
      docs/en/solution-templates/application-module/images/new-solution-v2.png
  42. 34
      docs/en/solution-templates/application-module/index.md
  43. 2
      docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md
  44. 114
      docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md
  45. 216
      docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md
  46. 263
      docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md
  47. 138
      docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md
  48. 33
      docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md
  49. BIN
      docs/en/studio/images/solution-runner/csharp-application-context-menu-build.png
  50. BIN
      docs/en/studio/images/solution-runner/csharp-application-context-menu-monitor.png
  51. BIN
      docs/en/studio/images/solution-runner/csharp-application-context-menu.png
  52. BIN
      docs/en/studio/images/solution-runner/docker-container-example-add-dialog.png
  53. BIN
      docs/en/studio/images/solution-runner/docker-container-example-add.png
  54. BIN
      docs/en/studio/images/solution-runner/docker-container-example-rabbitmq.png
  55. BIN
      docs/en/studio/images/solution-runner/docker-container-properties.png
  56. BIN
      docs/en/studio/images/solution-runner/docker-container-stack.png
  57. BIN
      docs/en/studio/images/solution-runner/docker-container-warning.png
  58. BIN
      docs/en/studio/images/solution-runner/folder-context-menu.png
  59. BIN
      docs/en/studio/images/solution-runner/profile-root-context-menu.png
  60. BIN
      docs/en/studio/images/solution-runner/solution-runner.png
  61. 11
      docs/en/studio/installation.md
  62. 31
      docs/en/studio/release-notes.md
  63. 67
      docs/en/studio/running-applications.md
  64. 3
      docs/en/studio/version-mapping.md
  65. 2
      docs/en/tutorials/book-store/part-01.md
  66. BIN
      docs/en/tutorials/microservice/images/abp-studio-solution-runner-play-all.png
  67. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration.png
  68. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-add-new-folder-command-2.png
  69. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4-v2.png
  70. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png
  71. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-3.png
  72. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-4.png
  73. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-orders-with-product-name.png
  74. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-products.png
  75. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item-v2.png
  76. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item.png
  77. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-build-and-restart-application.png
  78. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-catalog-module-expanded-in-solution-explorer.png
  79. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order-v2.png
  80. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order.png
  81. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-update-database.png
  82. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-graph-build.png
  83. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-import-module-dialog-for-catalog.png
  84. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-import-module-for-ordering-dialog.png
  85. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-import-module-ordering.png
  86. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-imports-and-dependencies-v2.png
  87. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-imports-and-dependencies.png
  88. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering-v2.png
  89. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering.png
  90. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-v2.png
  91. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog.png
  92. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-standard-module.png
  93. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-module-installation-dialog-for-catalog.png
  94. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-catalog.png
  95. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-code-catalog.png
  96. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-ordering-swagger-ui-in-browser-v2.png
  97. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-ordering-swagger-ui-in-browser.png
  98. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-solution-explorer-with-folders-v2.png
  99. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-initial-catalog-page.png
  100. BIN
      docs/en/tutorials/modular-crm/images/abp-studio-swagger-ui-create-order-execute-v2.png

20
.github/workflows/auto-pr.yml

@ -1,13 +1,13 @@
name: Merge branch dev with rel-9.2
name: Merge branch dev with rel-9.3
on:
push:
branches:
- rel-9.2
- rel-9.3
permissions:
contents: read
jobs:
merge-dev-with-rel-9-2:
merge-dev-with-rel-9-3:
permissions:
contents: write # for peter-evans/create-pull-request to create branch
pull-requests: write # for peter-evans/create-pull-request to create a PR
@ -18,14 +18,14 @@ jobs:
ref: dev
- name: Reset promotion branch
run: |
git fetch origin rel-9.2:rel-9.2
git reset --hard rel-9.2
git fetch origin rel-9.3:rel-9.3
git reset --hard rel-9.3
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
branch: auto-merge/rel-9-2/${{github.run_number}}
title: Merge branch dev with rel-9.2
body: This PR generated automatically to merge dev with rel-9.2. Please review the changed files before merging to prevent any errors that may occur.
branch: auto-merge/rel-9-3/${{github.run_number}}
title: Merge branch dev with rel-9.3
body: This PR generated automatically to merge dev with rel-9.3. Please review the changed files before merging to prevent any errors that may occur.
reviewers: maliming
draft: true
token: ${{ github.token }}
@ -34,5 +34,5 @@ jobs:
GH_TOKEN: ${{ secrets.BOT_SECRET }}
run: |
gh pr ready
gh pr review auto-merge/rel-9-2/${{github.run_number}} --approve
gh pr merge auto-merge/rel-9-2/${{github.run_number}} --merge --auto --delete-branch
gh pr review auto-merge/rel-9-3/${{github.run_number}} --approve
gh pr merge auto-merge/rel-9-3/${{github.run_number}} --merge --auto --delete-branch

26
Directory.Packages.props

@ -29,14 +29,14 @@
<PackageVersion Include="Dapper" Version="2.1.66" />
<PackageVersion Include="Dapr.AspNetCore" Version="1.15.4" />
<PackageVersion Include="Dapr.Client" Version="1.15.4" />
<PackageVersion Include="DeviceDetector.NET" Version="6.4.2" />
<PackageVersion Include="MyCSharp.HttpUserAgentParser" Version="3.0.25" />
<PackageVersion Include="Devart.Data.Oracle.EFCore" Version="10.4.235.9" />
<PackageVersion Include="DistributedLock.Core" Version="1.0.8" />
<PackageVersion Include="DistributedLock.Redis" Version="1.0.3" />
<PackageVersion Include="DeepL.net" Version="1.15.0" />
<PackageVersion Include="itext.bouncy-castle-adapter" Version="9.1.0" />
<PackageVersion Include="itext7" Version="9.1.0" />
<PackageVersion Include="itext7.pdfhtml" Version="6.1.0" />
<PackageVersion Include="itext.bouncy-castle-adapter" Version="9.2.0" />
<PackageVersion Include="itext7" Version="9.2.0" />
<PackageVersion Include="itext7.pdfhtml" Version="6.2.0" />
<PackageVersion Include="MongoSandbox.Core" Version="2.0.0" />
<PackageVersion Include="MongoSandbox8.runtime.linux-x64" Version="2.0.0" />
<PackageVersion Include="MongoSandbox8.runtime.osx-arm64" Version="2.0.0" />
@ -113,10 +113,10 @@
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.9.0" />
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.9.0" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.9.0" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.9.0" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.12.0" />
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.12.0" />
<PackageVersion Include="Microsoft.IdentityModel.Tokens" Version="8.12.0" />
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.12.0" />
<PackageVersion Include="Minio" Version="6.0.4" />
<PackageVersion Include="MongoDB.Driver" Version="3.3.0" />
<PackageVersion Include="NEST" Version="7.17.5" />
@ -128,11 +128,11 @@
<PackageVersion Include="NUglify" Version="1.21.15" />
<PackageVersion Include="Nullable" Version="1.3.1" />
<PackageVersion Include="Octokit" Version="14.0.0" />
<PackageVersion Include="OpenIddict.Abstractions" Version="6.2.1" />
<PackageVersion Include="OpenIddict.Core" Version="6.2.1" />
<PackageVersion Include="OpenIddict.Server.AspNetCore" Version="6.2.1" />
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="6.2.1" />
<PackageVersion Include="OpenIddict.Validation.ServerIntegration" Version="6.2.1" />
<PackageVersion Include="OpenIddict.Abstractions" Version="6.4.0" />
<PackageVersion Include="OpenIddict.Core" Version="6.4.0" />
<PackageVersion Include="OpenIddict.Server.AspNetCore" Version="6.4.0" />
<PackageVersion Include="OpenIddict.Validation.AspNetCore" Version="6.4.0" />
<PackageVersion Include="OpenIddict.Validation.ServerIntegration" Version="6.4.0" />
<PackageVersion Include="Oracle.EntityFrameworkCore" Version="9.23.80" />
<PackageVersion Include="Polly" Version="8.5.2" />
<PackageVersion Include="Polly.Extensions.Http" Version="3.0.0" />

3
abp_io/AbpIoLocalization/AbpIoLocalization/Www/Localization/Resources/en.json

@ -1890,6 +1890,7 @@
"BiographyContainsUrlValidationMessage": "Biography cannot contain URL.",
"CreatePostSEOTitleInfo": "SEO URL is a clean, readable, keyword-rich URL that helps both users and search engines understand what this post is about. Keep it short with 60 characters. SEO titles over 60 characters will be truncated. Use hyphens (-) to separate words (not underscores). Include target keywords near the start. Lowercase only. No stop words unless needed (e.g: \"and\", \"or\", \"the\").",
"SEOTitle": "SEO URL",
"InvalidYouTubeUrl": "The URL you entered is not a valid YouTube video link. Please make sure it points to a specific video and try again."
"InvalidYouTubeUrl": "The URL you entered is not a valid YouTube video link. Please make sure it points to a specific video and try again.",
"SelectAnOption": "Select an option"
}
}

4
common.props

@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>9.3.0-preview</Version>
<LeptonXVersion>4.3.0-preview</LeptonXVersion>
<Version>9.3.0-rc.2</Version>
<LeptonXVersion>4.3.0-rc.2</LeptonXVersion>
<NoWarn>$(NoWarn);CS1591;CS0436</NoWarn>
<PackageIconUrl>https://abp.io/assets/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>https://abp.io/</PackageProjectUrl>

97
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/POST.md

@ -0,0 +1,97 @@
# Announcing ABP Studio 1.0 General Availability 🚀
It's the moment you've been waiting for! We are thrilled to announce the stable release of ABP Studio v1.0. This milestone marks a significant step forward in our mission to provide a first-class, integrated development environment for ABP developers. Paired with the recently released [ABP v9.2](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb), ABP Studio v1.0 brings new features and improvements that will make your development work faster and more efficient.
For the past several months, our core ABP team has been hard at work, focusing on the features that matter most to you, our community of developers. This release is the peak of that effort, bringing a host of improvements and new capabilities to the forefront. Let's dive in and explore what's new in ABP Studio v1.0.
## What's New with ABP Studio v1.0?
ABP Studio v1.0 is all about enhancing your development experience, from project creation to deployment. Here, we'll walk you through some of the latest features we've implemented, along with other key enhancements that make this release truly special.
### ❤️ Solution Runner with Ready/Health Checks
ABP Studio's Solution Runner now provides visual health monitoring that makes tracking your applications' status easily. When you start an application, a spinner indicates it's "starting", then in the *Overall* tab, you can see the application's health (✅ for healthy, ⚠️ for unhealthy) that displays real-time health status:
![Health Checks](health-checks.png)
With [pre-configured health checks](https://abp.io/docs/9.2/solution-templates/layered-web-application/health-check-configuration) in ABP solution templates including database connectivity tests, you get instant feedback on your applications' health.
When health check UI is configured, you can access comprehensive health dashboards with a dedicated "Browse Health UI" command or see the last health response from the "Show Latest Health Check Response" command:
![SaaS Health Check](saas-health-check.png)
When you restart applications that are open in your browser, ABP Studio automatically refreshes the pages for you.
### 🎨 Theme Style Selection on Project Creation
When creating a new solution, you can now choose your theme, theme style, and layout right from the project creation wizard instead of having to configure these settings later. ABP Studio lets you pick from [ABP's officially provided themes including Basic, LeptonX Lite, and LeptonX](https://abp.io/docs/latest/ui-themes).
![Theme Style Selection LeptonX](theme-style-selection-leptonx.png)
If you select Basic or LeptonX Lite themes, only the theme will be changed. However, if you select the LeptonX theme, you'll get additional options to fine-tune your setup:
- **Theme Style Configuration** - Pick from **System, Light, Dim, or Dark** styles to match how you like your development environment
- **Layout Options** - **Sidebar menu** / **Top menu**
### 📦 "Container" Application Type for Solution Runner
ABP Studio v1.0 introduces a dedicated "Container" application type that gives you better control over your Docker containers directly from the Solution Runner. Instead of managing all your containers through PowerShell scripts or running them all together, you can now see and control each container individually in the Solution Runner panel.
![Container Application Type](containers-type.png)
This new feature replaces the previous _Infrastructure_ folder approach with a cleaner, more intuitive container section. You can now:
- **Start and stop containers individually** - No more starting all containers at once when you only need specific services
- **Monitor container status** - See which containers are running, stopped, or have issues directly in the UI
- **Manage container dependencies** - Control the order and timing of container startup based on your application needs
Whether you're working with databases, message brokers, or other containerized services, the new Container application type makes it much easier to manage your development environment. This is especially useful for microservice architectures where you might want to run only specific services during development or testing.
### ⚙️ Handle Multiple DbContexts When Adding/Removing/Applying Migrations
When working with ABP solutions that have multiple DbContexts (such as when using the separate tenant database option), ABP Studio now intelligently prompts you to select the appropriate DbContext for migration operations. This enhancement ensures you're always working with the correct database context and helps prevent common mistakes when managing multiple databases.
![EF Core Migration Context Selection](new-migration-added.gif)
The context selection dialog appears automatically when you perform any of these Entity Framework operations:
- **Adding a new migration** - Choose which DbContext the new migration should target
- **Removing an existing migration** - Select the DbContext from which to remove the migration
- **Updating the database** - Specify which database context should be updated
## Get Started with ABP Studio v1.0 Today!
ABP Studio v1.0 is built on the solid foundation of the [latest version of ABP Framework, which is v9.2](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb). This means that when you create a new project with ABP Studio, you're getting all the latest features, performance improvements, and bug fixes that come with v9.2. This includes updates to dependencies, enhancements to the core framework, and improvements to application modules.
We are incredibly excited for you to get your hands on ABP Studio v1.0. We believe these new features will make a real difference in your day-to-day development workflow.
### ⬇️ Download ABP Studio 1.0
Ready to get started? You can download the stable v1.0 release right now from the official ABP Studio website: **[https://abp.io/studio](https://abp.io/studio)**
![ABP Studio 1.0 Download](abp-studio-download.png)
If you are an existing ABP Studio user, it's even easier. You don't need to download the installer again. Simply launch ABP Studio, and it will prompt you to update to the latest version directly from the UI.
> Alternatively, you can click to the *Help -> Check for Updates* context menu item to check for updates and install the latest version:
>
> ![ABP Studio 1.0 Check for Updates](abp-studio-check-for-updates.png)
### 🔮 What's Next?
ABP Studio v1.0 represents just the beginning of our journey. We're committed to continuously evolving the platform, adding features that directly address real-world development challenges and enhance your workflow. Our goal is to make ABP Studio the go-to development environment for .NET and ABP Framework developers.
We will keep releasing new versions with exciting features based on our roadmap and your valuable feedback. To give you a sneak peek into what's planned for future releases, you can expect to see:
- **Environment Variable Management:** A dedicated UI to easily manage environment variables for your solutions.
- **OpenTelemetry Integration:** We'll be integrating OpenTelemetry support directly into the startup templates, making distributed tracing and observability a seamless part of your application from day one.
- **LeptonX Theme Builder**: Allowing users to determine styling, colour palette and easily override their project's theme styles.
- **Monitor dashboards of the tools used in the solution (e.g. Kubernetes, Redis, Grafana, etc...)**
- **Pre-configured .NET Aspire for the Microservice Startup Template**
- **and more...**
We are incredibly excited about the future of ABP Studio and can't wait to share the next set of features with you. Your comments and suggestions are invaluable to us. If you have any feedback, please drop a comment below.
Thank you for being part of our community and happy coding!
**The Volosoft Team**

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-check-for-updates.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/abp-studio-download.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/containers-type.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 KiB

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/health-checks.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/new-migration-added.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 KiB

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/saas-health-check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
docs/en/Blog-Posts/2025-06-10-Announcing-ABP-Studio-1.0-Stable-Release/theme-style-selection-leptonx.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/mongo-db.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

93
docs/en/Community-Articles/2025-06-12-fix-mongodb-guid-abp-v9.2.0-upgrade/post.md

@ -0,0 +1,93 @@
# Solving MongoDB GUID Issues After an ABP Framework Upgrade
So, you've just upgraded your ABP Framework application to a newer version (like v9.2.0+) and suddenly, your application can't read data from its MongoDB database. You're seeing strange deserialization errors, especially related to `Guid` types. What's going on?
You've likely run into a classic compatibility issue with the MongoDB .NET driver.
### The Problem: Legacy vs. Standard GUIDs
Here's the short version:
* **Old MongoDB Drivers** (used in older ABP versions) stored `Guid` values in a format called `CSharpLegacy`.
* **New MongoDB Drivers** (v3.0+), now default to a universal `Standard` format.
When your newly upgraded app tries to read old data, the new driver expects the `Standard` format but finds `CSharpLegacy`. The byte orders don't match, and... boom. Deserialization fails.
The ABP Framework team has an excellent official guide covering this topic in detail. We highly recommend reading their **[MongoDB Driver 2 to 3 Migration Guide](https://abp.io/docs/latest/release-info/migration-guides/MongoDB-Driver-2-to-3)** for a full understanding.
Our tip below serves as a fast, application-level fix if you need to get your system back online quickly without performing a full data migration.
### The Quick Fix: Tell the Driver to Use the Old Format
Instead of changing your data, you can simply tell the new driver to continue using the old `CSharpLegacy` format for all `Guid` and `Guid?` properties. This provides immediate backward compatibility without touching your database.
It’s a simple, two-step process.
#### Step 1: Create a Custom Convention
First, create this class in your `.MongoDb` project. It tells the serializer how to handle `Guid` types.
```csharp
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Conventions;
using MongoDB.Bson.Serialization.Serializers;
using System;
public class LegacyGuidConvention : ConventionBase, IMemberMapConvention
{
public void Apply(BsonMemberMap memberMap)
{
if (memberMap.MemberType == typeof(Guid))
{
memberMap.SetSerializer(new GuidSerializer(GuidRepresentation.CSharpLegacy));
}
else if (memberMap.MemberType == typeof(Guid?))
{
var guidSerializer = new GuidSerializer(GuidRepresentation.CSharpLegacy);
var nullableGuidSerializer = new NullableSerializer<Guid>(guidSerializer);
memberMap.SetSerializer(nullableGuidSerializer);
}
}
}
```
#### Step 2: Register the Convention at Startup
Now, register this convention in your `YourProjectMongoDbModule.cs` file. Add this code to the top of the `ConfigureServices` method. This ensures your rule is applied globally as soon as the application starts.
```csharp
using Volo.Abp.Modularity;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Conventions;
public class YourProjectMongoDbModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// Fix Start
var conventionPack = new ConventionPack { new LegacyGuidConvention() };
ConventionRegistry.Register(
"LegacyGuidConvention",
conventionPack,
t => true); // Apply to all types
// Fix End
// ... Your existing ConfigureServices code
}
}
```
### An Alternative to Full Data Migration
It's important to note that the method described here is an **application-level fix**. It's a fantastic alternative to performing a full data migration, which involves writing scripts to convert every legacy GUID in your database.
If you are interested in the more permanent, data-centric approach, the ABP.IO community has a detailed guide on [**Migrating MongoDB GUIDs from Legacy to Standard Format**](https://abp.io/community/articles/migrating-mongodb-guids-from-legacy-to-standard-format-mongodb-v2-to-v3-dqwybdtw).
Our quick fix is ideal for getting a system back online fast or when a database migration is too complex. The full migration is better for long-term standards compliance. Choose the path that best fits your project's needs!
### That's It!
Restart your application, and the errors should be gone. Your app can now correctly read its old `Guid` data, and it will continue to write new data in the same legacy format, ensuring consistency.
This approach is a lifesaver for existing projects, saving you from a risky and time-consuming data migration. For brand-new projects, you might consider starting with the `Standard` representation, but for everything else, this is a clean and effective fix. Happy coding!

113
docs/en/Community-Articles/2025-06-13-modular-docker-container-management/modular-docker-container-management.md

@ -0,0 +1,113 @@
# 🚀 New in ABP Studio: Modular Docker Container Management
We're excited to announce a new improvement to Docker integration in **ABP Studio**!
With the latest update, you can now manage Docker containers **individually**, add or remove them dynamically, and launch them **either separately or collectively** — all within the Studio.
![solution-runner-containers](solution-runner-containers.png)
------
## 🔄 What Has Changed?
In previous versions, Docker dependencies were handled using a **single `docker-compose.override.yml` file**, which was **automatically generated** when creating a new solution if it is needed.
By default, this file included common development dependencies like PostgreSQL, Redis, RabbitMQ, etc., and was executed through a predefined script named `docker-dependencies` in the Solution Runner.
While this approach worked well for simple setups, it had some limitations:
- All services were bundled into a **single compose file**.
- Adding or removing services required modifying this central file.
- It wasn't possible to **start or stop individual containers independently**.
------
## ✅ What's New?
With the latest ABP Studio update:
- Each Docker container can now be defined in its **own `docker-compose` file**.
- Compose files can be **added or removed** from the Studio UI.
- Containers can be:
- **Started or stopped individually**.
- **Started/stopped in bulk**.
- The **Solution Runner** recognizes Docker containers and can run them alongside application projects.
------
## ⚠️ Important Notes Before You Start
### Required: Use `container_name` for Docker Service Matching
When working with the new modular Docker system in ABP Studio, each service **must define a `container_name`**.
This name is used by ABP Studio to **identify and map** Docker containers to their corresponding service entries in the Studio UI.
#### Why is this mandatory?
- ABP Studio relies on `container_name` to:
- Detect whether the service is stopped or continue running.
- Perform **start**, **stop**, and **status check** operations reliably.
- Match Studio UI entries with actual running Docker containers.
- Without a `container_name`, container discovery may fail and **service management features might not work as expected**.
#### Example:
```
services:
redis:
container_name: redis
image: redis:7
ports:
- "6379:6379"
networks:
- my-network
```
> If you do **not** define `container_name`, ABP Studio will be unable to track or control the service properly.
------
## 📥 Migrating from the Old System
If you're using the old method with a centralized compose file:
Before:
```
docker-compose -f docker-compose.override.yml up -d
```
Now:
1. Create separate `docker-compose` files for each service
(e.g., `docker-compose.postgres.yml`, `docker-compose.redis.yml`).
2. Go to the **Solution Runner tab in ABP Studio**.
3. Use the **“Add Docker Service”** option in Studio to register each file.
4. Optionally remove or archive the old monolithic compose file.
> If your original `docker-compose.override.yml` contains multiple services, you can split it into individual files — Docker Compose and ABP Studio both support modular composition.
------
## ⚙️ Advanced: Shared Network
If your containers need to communicate over a shared network, you can define an external network in each compose file like this:
```
networks:
my-network:
external: true
```
ABP Studio automatically creates the network if they do no exist. But if you like you can create the network once using:
```
docker network create my-network
```
------
## 📚 Additional Resources
- Docker Compose Documentation
- ABP Studio Documentation (link to updated docs when ready)
- [Report Issues on GitHub](https://github.com/abpframework/abp/issues)

BIN
docs/en/Community-Articles/2025-06-13-modular-docker-container-management/solution-runner-containers.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

2
docs/en/cli/differences-between-old-and-new-cli.md

@ -16,8 +16,6 @@ This change allows you to create your application with the new templating system
> If you installed [ABP Studio](../studio/index.md) recently, then you may skip this section because ABP Studio automatically uninstalls the old CLI and replaces it with the new CLI. Therefore, you don't need to manually switch to the new ABP CLI.
> 🛈 The new ABP CLI is in the beta version for now. If you have any issues, you can always use the old ABP CLI by following the instructions in the _Using the old ABP CLI_ section below.
ABP CLI has two variations, which are `Volo.Abp.Studio.Cli` (new) and `Volo.Abp.Cli` (old). If you are using ABP earlier than v8.2+, then you are probably using the old ABP CLI and can easily switch to the new CLI by simply uninstalling the old one and installing the new CLI by executing the commands below:
```bash

6
docs/en/cli/index.md

@ -161,7 +161,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md
* `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers:
* `ef`: Entity Framework Core.
* `mongodb`: MongoDB.
* `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution).
* `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution). **Note:** When specifying the connection string, make sure to enclose it in double quotes, for example: `--connection-string "Server=localhost;Database=MyProjectName;Trusted_Connection=True"`.
* `--skip-migrations` or `-sm`: Skips the creating initial database migration step.
* `--skip-migrator` or `-smr`: Skips the run database migrator step.
* `--public-website`: Public Website is a front-facing website for describing your project, listing your products and doing SEO for marketing purposes. Users can login and register on your website with this website. This option is only included in PRO templates.
@ -183,7 +183,7 @@ For more samples, go to [ABP CLI Create Solution Samples](new-command-samples.md
* `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers:
* `ef`: Entity Framework Core.
* `mongodb`: MongoDB.
* `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution).
* `--connection-string` or `-cs`: Overwrites the default connection strings in all `appsettings.json` files. The default connection string is `Server=localhost;Database=MyProjectName;Trusted_Connection=True` for EF Core and it is configured to use the SQL Server. If you want to use the EF Core, but need to change the DBMS, you can change it as [described here](../framework/data/entity-framework-core/other-dbms.md) (after creating the solution). **Note:** When specifying the connection string, make sure to enclose it in double quotes, for example: `--connection-string "Server=localhost;Database=MyProjectName;Trusted_Connection=True"`.
* `--skip-migrations` or `-sm`: Skips the creating initial database migration step.
* `--skip-migrator` or `-smr`: Skips the run database migrator step.
* `--sample-crud-page` or `-scp`: It adds the [BookStore](./../tutorials/book-store/index.md) sample to your solution.
@ -295,7 +295,7 @@ abp new-package --name Acme.BookStore.Domain --template lib.domain
* `lib.ef`
* `--include-migrations`: Allows migration operations on this package.
* `--connection-string-name`: Default value is the last part of the package's namespace (or package name simply).
* `--connection-string`: Connection string value. Defaut value is null. You can set it alter.
* `--connection-string`: Connection string value. Defaut value is null. You can set it alter. **Note:** When specifying the connection string, make sure to enclose it in double quotes, for example: `--connection-string "Server=localhost;Database=MyProjectName;Trusted_Connection=True"`.
* `lib.mongodb`
* `lib.http-api`
* `lib.http-api-client`

4
docs/en/docs-nav.json

@ -192,11 +192,11 @@
"path": "tutorials/modular-crm/part-01.md"
},
{
"text": "2: Creating the Initial Products Module",
"text": "2: Setting Up the Catalog Module",
"path": "tutorials/modular-crm/part-02.md"
},
{
"text": "3: Building the Products Module",
"text": "3: Building the Catalog Module",
"path": "tutorials/modular-crm/part-03.md"
},
{

12
docs/en/framework/architecture/modularity/basics.md

@ -2,10 +2,11 @@
ABP was designed to support to build fully modular applications and systems where every module may have entities, services, database integration, APIs, UI components and so on;
* This document introduces the basics of the module system.
* [Module development best practice guide](../best-practices) explains some **best practices** to develop **re-usable application modules** based on **DDD** principles and layers. A module designed based on this guide will be **database independent** and can be deployed as a **microservice** if needed.
* [Pre-built application modules](../../../modules) are **ready to use** in any kind of application.
* [Module startup template](../../../solution-templates/application-module) is a jump start way to **create a new module**.
* This document introduces the **basics** of the module system.
* The [modular monolith application development tutorial](../../../tutorials/modular-crm/index.md) explains and demonstrates how to build **modular monolith applications** with ABP.
* [Pre-built application modules](../../../modules/index.md) are **ready to use** in any kind of application.
* [Module startup template](../../../solution-templates/application-module/index.md) is a jump start way to **create a new reusable application module**.
* [Module development best practice guide](../best-practices/index.md) explains some **best practices** to develop **re-usable application modules** based on **DDD** principles and layers. A module designed based on this guide will be **database independent** and can be deployed as a **microservice** if needed.
* [ABP CLI](../../../cli/index.md) has commands to support modular development.
* All other framework features are compatible to the modularity system.
@ -189,4 +190,5 @@ There are **two types of modules.** They don't have any structural difference bu
- **Application modules**: These modules implement **specific application/business functionalities** like blogging, document management, identity management, tenant management... etc. They generally have their own entities, services, APIs and UI components. See [pre-built application modules](../../../modules).
## See Also
* [Video tutorial](https://abp.io/video-courses/essentials/modularity)
* [Modular monolith application development tutorial](../../../tutorials/modular-crm/index.md)
* [Video tutorial for basic modularity](https://abp.io/video-courses/essentials/modularity)

3
docs/en/framework/infrastructure/background-workers/index.md

@ -41,6 +41,8 @@ Start your worker in the `StartAsync` (which is called when the application begi
Assume that we want to make a user passive, if the user has not logged in to the application in last 30 days. `AsyncPeriodicBackgroundWorkerBase` class simplifies to create periodic workers, so we will use it for the example below:
> You can use `CronExpression` property to set the cron expression for the background worker if you will use the [Hangfire Background Worker Manager](./hangfire.md) or [Quartz Background Worker Manager](./quartz.md).
````csharp
public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
{
@ -52,6 +54,7 @@ public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase
serviceScopeFactory)
{
Timer.Period = 600000; //10 minutes
//CronExpression = "0 0/10 * * * ?"; //Run every 10 minutes, Only for Quartz or Hangfire integration.
}
protected async override Task DoWorkAsync(

4
docs/en/framework/real-time/signalr.md

@ -55,11 +55,9 @@ Client side installation depends on your UI framework / client type.
Run the following command in the root folder of your web project:
```bash
yarn add @abp/signalr
abp add-package @abp/signalr
```
> This requires to [install yarn](https://yarnpkg.com/) if you haven't install before.
This will add the `@abp/signalr` to the dependencies in the `package.json` of your project:
```json

2
docs/en/framework/ui/mvc-razor-pages/basic-theme.md

@ -14,7 +14,7 @@ If you need to manually this theme, follow the steps below:
* Install the [Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic](https://www.nuget.org/packages/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic) NuGet package to your web project.
* Add `AbpAspNetCoreMvcUiBasicThemeModule` into the `[DependsOn(...)]` attribute for your [module class](../../architecture/modularity/basics.md) in the web project.
* Install the [@abp/aspnetcore.mvc.ui.theme.basic](https://www.npmjs.com/package/@abp/aspnetcore.mvc.ui.theme.basic) NPM package to your web project (e.g. `npm install @abp/aspnetcore.mvc.ui.theme.basic` or `yarn add @abp/aspnetcore.mvc.ui.theme.basic`).
* Install the [@abp/aspnetcore.mvc.ui.theme.basic](https://www.npmjs.com/package/@abp/aspnetcore.mvc.ui.theme.basic) NPM package to your web project (e.g. `abp add-package @abp/aspnetcore.mvc.ui.theme.basic`).
* Run `abp install-libs` command in a command line terminal in the web project's folder.
## Layouts

11
docs/en/framework/ui/mvc-razor-pages/client-side-package-management.md

@ -3,9 +3,8 @@
ABP can work with any type of client side package management systems. You can even decide to use no package management system and manage your dependencies manually.
However, ABP works best with **NPM/Yarn**. By default, built-in modules are configured to work with NPM/Yarn.
However, ABP works best with **NPM**. By default, built-in modules are configured to work with NPM.
Finally, we suggest the [**Yarn**](https://classic.yarnpkg.com/) over the NPM since it's faster, stable and also compatible with the NPM.
### @ABP NPM Packages
@ -35,14 +34,12 @@ It's suggested to depend on a standard package instead of directly depending on
#### Package Installation
After depending on a NPM package, all you should do is to run the **yarn** command from the command line to install all the packages and their dependencies:
After depending on a NPM package, you should run the **abp install-libs** command from the command line to install all the packages and their dependencies, and copy the required resources to the wwwroot/libs folder:
```bash
yarn
abp install-libs
```
Alternatively, you can use `npm install` but [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) is suggested as mentioned before.
#### Package Contribution
If you need a third-party NPM package that is not in the standard set of packages, you can create a Pull Request on the Github [repository](https://github.com/volosoft/abp). A pull request that follows these rules is accepted:
@ -57,7 +54,7 @@ See current standard packages for examples.
### Mapping The Library Resources
Using NPM packages and NPM/Yarn tool is the de facto standard for client side libraries. NPM/Yarn tool creates a **node_modules** folder in the root folder of your web project.
Using NPM packages and NPM tool is the de facto standard for client side libraries. NPM tool creates a **node_modules** folder in the root folder of your web project.
Next challenge is copying needed resources (js, css, img... files) from the `node_modules` into a folder inside the **wwwroot** folder to make it accessible to the clients/browsers.

BIN
docs/en/get-started/images/abp-studio-new-solution-dialog-modularity.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
docs/en/get-started/images/abp-studio-no-layers-new-solution-modularity.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

10
docs/en/get-started/layered-web-application.md

@ -17,7 +17,7 @@ First things first! Let's setup your development environment before creating the
* [Visual Studio 2022](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development.
* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet){{ if UI != "Blazor" }}
* [Node v22.11+](https://nodejs.org/)
* [Node v22.11+](https://nodejs.org/){{ end }}{{ if UI == "NG" }}
* [Yarn v1.22+ (not v2+)](https://classic.yarnpkg.com/en/docs/install) or npm v10+ (already installed with Node){{ end }}
* [Docker Desktop](https://www.docker.com/products/docker-desktop/)
@ -25,8 +25,6 @@ First things first! Let's setup your development environment before creating the
## Creating a New Solution
> This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. **ABP Studio** is in the beta version now. If you have any issues, you can use the [ABP CLI](../cli/index.md) to create new solutions. You can also use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands for new project creations.
> ABP startup solution templates have many options for your specific needs. If you don't understand an option that probably means you don't need it. We selected common defaults for you, so you can leave these options as they are.
Assuming that you have [installed and logged in](../studio/installation.md) to the application, you should see the following screen when you open ABP Studio:
@ -105,6 +103,12 @@ Here, you can select the database management systems (DBMS){{ if DB == "EF" }} a
If you uncheck the *Kubernetes Configuration* option, the solution will not include the Kubernetes configuration files, such as Helm charts and other Kubernetes-related files. You can also specify *Social Logins*; if you uncheck this option, the solution will not be configured for social login. Lastly, you can specify the *Include Tests* option to include or exclude the test projects from the solution.
On the next screen, you can configure the modularity options for your solution:
> If you select the *Setup as a modular solution* option, the solution is created more ready for [modular monolith development](../tutorials/modular-crm/index.md) and allows you to add sub-modules during the solution creation phase.
![abp-studio-new-solution-modularity](images/abp-studio-new-solution-dialog-modularity.png)
Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you. After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:
![abp-studio-created-new-solution](images/abp-studio-created-new-solution.png)

4
docs/en/get-started/maui.md

@ -13,9 +13,11 @@ dotnet tool install -g Volo.Abp.Studio.Cli
Then use the `abp new` command in an empty folder to create a new solution:
````bash
abp new Acme.MyMauiApp -t maui
abp new Acme.MyMauiApp -t maui --old
````
> **Note**: Since this startup template is not provided by the new ABP Studio Templates yet, you need to pass the `--old` parameter at the end of the command to use the old CLI & templating system for this startup template.
`Acme.MyMauiApp` is the solution name, like *YourCompany.YourProduct*. You can use single level, two-levels or three-levels naming.
## Solution Structure

4
docs/en/get-started/microservice.md

@ -11,7 +11,7 @@ First things first! Let's setup your development environment before creating the
* [Visual Studio 2022](https://visualstudio.microsoft.com/vs/) or another IDE that supports .NET development
* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet)
* [Node v22.11+](https://nodejs.org/)
* [Yarn v1.22+ (not v2+)](https://classic.yarnpkg.com/en/docs/install) or npm v10+ (already installed with Node)
* [Yarn v1.22+ (not v2+)](https://classic.yarnpkg.com/en/docs/install) or npm v10+ (already installed with Node), **This is required for the Angular applications.**
* [Docker Desktop (with Kubernetes enabled)](https://www.docker.com/products/docker-desktop/)
* [Helm](https://helm.sh/docs/intro/install/)
* [NGINX Ingress Controller](https://kubernetes.github.io/ingress-nginx/deploy/)
@ -21,8 +21,6 @@ First things first! Let's setup your development environment before creating the
## Creating a New Solution
> 🛈 This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. **ABP Studio** is in the beta version now. If you have any issues, you can use the [ABP CLI](../cli/index.md) to create new solutions. You can also use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands for new project creations.
> ABP startup solution templates have many options for your specific needs. If you don't understand an option that probably means you don't need it. We selected common defaults for you, so you can leave these options as they are.
Assuming that you have [installed and logged in](../studio/installation.md) to the application, you should see the following screen when you open ABP Studio:

8
docs/en/get-started/pre-requirements.md

@ -47,11 +47,13 @@ If you have already installed the `EF Core CLI`, you can update it by running th
dotnet tool update --global dotnet-ef
```
## Node.js and Yarn
## Node.js
ABP projects include some frontend resource packages, so you need to install Node.js and Yarn to manage these resource packages. You can download Node.js from the [official Node.js website](https://nodejs.org/). We recommend installing version v20.11+.
ABP projects include some frontend resource packages, so you need to install Node.js/NPM manage these resource packages. You can download Node.js from the [official Node.js website](https://nodejs.org/). We recommend installing version v20.11+.
Using Yarn (classic) to manage frontend resource packages is faster and more stable than using npm. You can download `Yarn` from the [Yarn official website](https://classic.yarnpkg.com/en/docs/install). We recommend installing Yarn v1.22+ (make sure to install the Classic version, not v2+).
## Yarn (Required Only for Angular Projects)
ABP Angular projects use Yarn as the package manager to manage frontend dependencies and run build tasks, You can download `Yarn` from the [Yarn official website](https://classic.yarnpkg.com/en/docs/install). We recommend installing Yarn v1.22+ (make sure to install the Classic version, not v2+).
To install Yarn using npm, run the following command:

14
docs/en/get-started/single-layer-web-application.md

@ -16,14 +16,14 @@ First things first! Let's setup your development environment before creating the
* [Visual Studio 2022](https://visualstudio.microsoft.com/) or another IDE that supports [.NET 9.0+](https://dotnet.microsoft.com/download/dotnet) development.
* [.NET 9.0+](https://dotnet.microsoft.com/en-us/download/dotnet){{ if UI != "Blazor" }}
* [Node v22.11+](https://nodejs.org/)
* [Node v22.11+](https://nodejs.org/){{ end }}{{ if UI == "NG" }}
* [Yarn v1.22+ (not v2+)](https://classic.yarnpkg.com/en/docs/install) or npm v10+ (already installed with Node){{ end }}
> Check the [Pre-requirements document](pre-requirements.md) for more detailed information about these tools.
## Creating a New Solution
> 🛈 This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. **ABP Studio** is in the beta version now. If you have any issues, you can use the [ABP CLI](../cli/index.md) to create new solutions. You can also use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands for new project creations.
> 🛈 This document uses [ABP Studio](../studio/index.md) to create new ABP solutions. You can also use the [ABP CLI](../cli/index.md) to create new solutions and use the [getting started page](https://abp.io/get-started) to easily build ABP CLI commands.
> ABP startup solution templates have many options for your specific needs. If you don't understand an option that probably means you don't need it. We selected common defaults for you, so you can leave these options as they are.
@ -31,7 +31,7 @@ Assuming that you have [installed and logged in](../studio/installation.md) to t
![abp-studio-welcome-screen](images/abp-studio-welcome-screen.png)
Select the *File* -> *New Solution* in the main menu, or click the *New solution* button on the Welcome screen to open the *Create new solution* wizard:
Select the *File* -> *New Solution* in the main menu, or click the *New solution* button on the *Welcome* screen to open the *Create new solution* wizard:
![abp-studio-new-solution-dialog](images/abp-studio-no-layers-new-solution-dialog-0.9.13.png)
@ -73,9 +73,15 @@ Here, you can select the database management systems (DBMS){{ if DB == "EF" }} a
![abp-studio-no-layers-new-solution-additional-options](images/abp-studio-no-layers-new-solution-additional-options-0.9.13.png)
Configure any additional options as needed and click the *Next* button to continue. On the next screen, you can configure the modularity options for your solution:
> If you select the *Setup as a modular solution* option, the solution is created more ready for [modular monolith development](../tutorials/modular-crm/index.md) and allows you to add sub-modules during the solution creation phase.
![abp-studio-no-layers-new-solution-modularity](images/abp-studio-no-layers-new-solution-modularity.png)
Now, we are ready to allow ABP Studio to create our solution. Just click the *Create* button and let the ABP Studio do the rest for you.
After clicking the Create button, the dialog is closed and your solution is loaded into ABP Studio:
After clicking the *Create* button, the dialog is closed and your solution is loaded into ABP Studio:
![abp-studio-created-new-solution](images/abp-studio-no-layers-created-new-solution.png)

BIN
docs/en/images/azure-deploy-create-web-app-2.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 141 KiB

BIN
docs/en/images/azure-deploy-create-web-app-6.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 KiB

After

Width:  |  Height:  |  Size: 183 KiB

2
docs/en/modules/audit-logging-pro.md

@ -131,6 +131,7 @@ To see `AbpAuditingOptions` properties, please see its [documentation](../framew
Configure<ExpiredAuditLogDeleterOptions>(options =>
{
options.Period = (int)TimeSpan.FromSeconds(30).TotalMilliseconds;
options.CronExpression = "0 23 * * *"; // This Cron expression only works if Hangfire or Quartz is used for background workers.
});
```
@ -146,6 +147,7 @@ Configure<AuditLogExcelFileOptions>(options =>
options.FileRetentionHours = 24; // How long to keep files before cleanup (default: 24 hours)
options.DownloadBaseUrl = "https://yourdomain.com"; // Base URL for download links in emails
options.ExcelFileCleanupOptions.Period = (int)TimeSpan.FromHours(24).TotalMilliseconds; // Interval of the cleanup worker (default: 24 hours)
options.ExcelFileCleanupOptions.CronExpression = "0 23 * * *"; // This Cron expression only works if Hangfire or Quartz is used for background workers.
});
```

46
docs/en/release-info/migration-guides/abp-9-3.md

@ -0,0 +1,46 @@
# ABP Version 9.3 Migration Guide
This document is a guide for upgrading ABP v9.2 solutions to ABP v9.3. There are some changes in this version that may affect your applications, please read it carefully and apply the necessary changes to your application.
## Updated `RabbitMQ.Client` to `7.x`
In this version, we updated `RabbitMQ.Client` to `7.1.2`. [This is a major version update](https://github.com/rabbitmq/rabbitmq-dotnet-client/blob/main/v7-MIGRATION.md) that brings significant improvements to the library:
1. Full async/await support throughout the entire public API and internals
2. Improved performance and resource utilization
3. Better error handling and connection management
With this update, you should update your method calls to use the new async/await support (in the RabbitMQ related provider packages). There are some method signature changes and new API calls, aligned with the new API. You can see the internal changes we made in [#22510](https://github.com/abpframework/abp/pull/22510) and make the relevant changes in your code.
## Docs Module: Export as PDF
In this version, we have introduced a new feature to the [Docs Module](../../modules/docs.md) that allows you to export the documentation as a PDF file. (Administrators generate PDF files from the back-office side, and then "Download PDF" button appears on the document system, allowing users to download the compiled documentation as a PDF file.)
While implementing this feature, we have made changes in some services of the Docs Module. Typically, you don't need to make any changes in your code unless you have overridden or used internal services of the Docs Module.
For example, the `ProjectAdminAppService` constructor has been changed to accept a new parameter:
```diff
public class ProjectAdminAppService : ApplicationService, IProjectAdminAppService
{
public ProjectAdminAppService(
IProjectRepository projectRepository,
IDocumentRepository documentRepository,
IDocumentFullSearch elasticSearchService,
IGuidGenerator guidGenerator,
+ IProjectPdfFileStore projectPdfFileStore)
}
```
You can see the all internal changes we made in [#22430](https://github.com/abpframework/abp/pull/22430) and [#22922](https://github.com/abpframework/abp/pull/22922) and make the relevant changes in your code if needed.
## Angular UI: Migrating NPM Packages to Standalone Structure
In this version, we've updated our Angular packages to support the new standalone components architecture. This is a non-breaking change - your existing module-based applications will continue to work without any modifications. However, if you wish to migrate to the standalone approach, [we've provided the necessary updates in our packages](https://github.com/abpframework/abp/pull/22829).
The main changes include:
- Updated routing configurations to support both module-based and standalone approaches
- Added support for standalone components in ABP Suite code generation
- Updated schematics to support both module-based and standalone templates
For detailed migration steps and best practices, please refer to our upcoming documentation and/or blog post. The migration is optional, and you can continue using the module-based approach if you prefer.

1
docs/en/release-info/migration-guides/index.md

@ -2,6 +2,7 @@
The following documents explain how to migrate your existing ABP applications. We write migration documents only if you need to take an action while upgrading your solution. Otherwise, you can easily upgrade your solution using the [abp update command](../upgrading.md).
- [9.2 to 9.3](abp-9-3.md)
- [9.x to 9.2](abp-9-2.md)
- [9.0 to 9.1](abp-9-1.md)
- [8.x to 9.0](abp-9-0.md)

13
docs/en/release-info/release-notes.md

@ -7,10 +7,19 @@ Also see the following notes about ABP releases:
* [ABP Studio release notes](../studio/release-notes.md)
* [Change logs for ABP pro packages](https://abp.io/pro-releases)
## 9.3 (2025-06-17)
## 9.2 (2025-03-25)
This is currently a RC (release-candidate) and you can see the detailed **[blog post / announcement](https://abp.io/community/articles/announcing-abp-9-3-release-candidate-4dqgiryf)** for the v9.3 release.
This is currently a RC (release-candidate) and you can see the detailed **[blog post / announcement](https://abp.io/community/articles/abp-platform-9.2-rc-has-been-released-jpq072nh)** for the v9.2 release.
* Cron Expression Support for Background Workers
* Docs Module: PDF Export
* Angular UI: Standalone Package Structure
* Upgraded to `Blazorise` **v1.7.7**
* Audit Logging Module: Excel Export
## 9.2 (2025-06-02)
See the detailed **[blog post / announcement](https://abp.io/community/articles/announcing-abp-9-2-stable-release-061qmtzb)** for the v9.2 release.
* Added `ApplicationName` Property to Isolate Background Jobs & Background Workers
* Docs Module: Added "Alternative Words" to Filter Items

6
docs/en/release-info/road-map.md

@ -4,11 +4,12 @@ This document provides a road map, release schedule, and planned features for th
## Next Versions
### v9.3
### v10.0
The next version will be 9.3 and planned to release the stable 9.3 version in July 2025. We will be mostly working on the following topics:
The next version will be 10.0 and planned to release the stable 10.0 version in December 2025. We will be mostly working on the following topics:
* Framework
* Upgrading to .NET 10
* Upgrading 3rd-party dependencies
* Enhancements in the core points
@ -16,7 +17,6 @@ The next version will be 9.3 and planned to release the stable 9.3 version in Ju
* Define navigation properties without target string property dependency
* Improvements one-to-many scenarios
* File Upload Modal enhancements
* Master/Detail DataGrid Toggle Detail Row Enhancements for Blazor UI
* ABP Studio

2
docs/en/samples/index.md

@ -69,7 +69,7 @@ A modular monolith application that demonstrates how to create, compose, and com
* **ModularCRM: Razor Pages UI & Entity Framework Core**
* [Tutorial](../tutorials/modular-crm/part-01.md?UI=MVC&DB=EF)
* [Source code](https://github.com/abpframework/abp-samples/tree/master/ModularCrm)
* [Source code](https://github.com/abpframework/abp-samples/tree/master/ModularCRM)
## CloudCrm

BIN
docs/en/solution-templates/application-module/images/new-solution-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

34
docs/en/solution-templates/application-module/index.md

@ -1,18 +1,22 @@
# Module Solution Template
# ABP Application Module Template
This template can be used to create a **reusable [application module](../../modules)** based on the [module development best practices & conventions](../../framework/architecture/best-practices). It is also suitable for creating **microservices** (with or without UI).
This document explains how to create a **reusable [application module](../../modules)** based on the [module development best practices & conventions](../../framework/architecture/best-practices).
> Notice that the application module that is created in this tutorial is not an executable application. To see the module in action, you should install it into an executable application.
>
> It is advised to see the *[Modular Monolith Application Development Tutorial](../../tutorials/modular-crm/index.md)* to learn how to create application modules, install them into an executable web application, run and test the application. That tutorial uses the *Standard* module template, while this document explains the *DDD* module template.
## How to Start With?
You can use the [ABP CLI](../../cli) or [ABP Studio](../../studio/overview.md) to create a new project using this startup template. Alternatively, you can generate a CLI command from the [Get Started](https://abp.io/get-started) page. We will use the ABP Studio for this guide.
You can use the [ABP CLI](../../cli) or [ABP Studio](../../studio/overview.md) to create a new project using this startup template. We will use the ABP Studio for this guide.
First, install the ABP Studio if you haven't installed before. You can follow the [installation guide](../../studio/installation.md) for this.
First, install the ABP Studio if you haven't installed before. You can follow the [installation guide](../../studio/installation.md) for this purpose.
### Creating a New Empty Solution
Open the ABP Studio and click the `New solution` button in the welcome page or the `File > New Solution` top menu item. Select the `Empty Solution` template and click the `Next` button.
Open the ABP Studio and click the `New solution` button in the welcome page or the `File > New Solution` top menu item. Click the `empty solution` link to select the empty solution template.
![New Solution](images/new-solution.png)
![New Solution](images/new-solution-v2.png)
Enter the solution name, select the solution folder and click the `Create` button.
@ -130,15 +134,15 @@ You can still create unit tests for your classes which will be harder to write (
> Domain & Application tests are using EF Core. If you remove EF Core integration or you want to use MongoDB for testing these layers, you should manually change project references & module dependencies.
### Host Project
### Host Applications
The solution doesn't have a host application to run your module. However, you can create a [single-layer](../../get-started/single-layer-web-application.md) or [layered](../../get-started/layered-web-application.md) application and [import](../../studio/solution-explorer.md#imports) the created module into the host application.
## UI
You can also see the *[Modular Monolith Application Development Tutorial](../../tutorials/modular-crm/index.md)* to learn how to create application modules, install them into an executable web application, run and test the application
### Angular UI
## Angular UI
The solution will have a folder called `angular` in it. This is where the Angular client-side code is located. When you open that folder in an IDE, the folder structure will look like below:
If you've selected the Angular UI, the solution will have a folder called `angular` inside it. This is where the Angular client-side code is located. When you open that folder in an IDE, the folder structure will look like below:
![Folder structure of ABP Angular module project](../../images/angular-module-folder-structure.png)
@ -147,7 +151,7 @@ The solution will have a folder called `angular` in it. This is where the Angula
The server-side is similar to the solution described above. After you create a *Host* application, the API and the `Angular` demo application consume it.
#### How to Run the Angular Development App
### How to Run the Angular Development App
For module development, you will need the `dev-app` project up and running. So, here is how we can start the development server.
@ -179,7 +183,7 @@ The issue management page is empty in the beginning. You may change the content
Now, let's have a closer look at some key elements of your project.
#### Main Module
### The Main Module
`IssueManagementModule` at the _angular/projects/issue-management/src/lib/issue-management.module.ts_ path is the main module of your module project. There are a few things worth mentioning in it:
@ -189,7 +193,7 @@ Now, let's have a closer look at some key elements of your project.
- It is prepared for configurability. The `forLazy` static method enables [a configuration to be passed to the module when it is loaded by the router](https://volosoft.com/blog/how-to-configure-angular-modules-loaded-by-the-router).
#### Main Routing Module
### The Main Routing Module
`IssueManagementRoutingModule` at the _angular/projects/issue-management/src/lib/issue-management-routing.module.ts_ path is the main routing module of your module project. It currently does two things:
@ -198,7 +202,7 @@ Now, let's have a closer look at some key elements of your project.
You can rearrange this module to load more than one component at different routes, but you need to update the route provider at _angular/projects/issue-management/config/src/providers/route.provider.ts_ to match the new routing structure with the routes in the menu. Please check [Modifying the Menu](../../framework/ui/angular/modifying-the-menu.md) to see how route providers work.
#### Config Module
### The Config Module
There is a config module at the _angular/projects/issue-management/config/src/issue-management-config.module.ts_ path. The static `forRoot` method of this module is supposed to be called at the route level. So, you may assume the following will take place:
@ -219,6 +223,6 @@ You can use this static method to configure an application that uses your module
The difference between the `forRoot` method of the config module and the `forLazy` method of the main module is that, for smallest bundle size, the former should only be used when you have to configure an app before your module is even loaded.
#### Testing Angular UI
### Testing Angular UI
Please see the [testing document](../../framework/ui/angular/testing.md).

2
docs/en/solution-templates/layered-web-application/deployment/azure-deployment/azure-deployment.md

@ -3,7 +3,7 @@
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "BlazorServer", "NG"],
"UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}

114
docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step1-create-azure-resources.md

@ -1,7 +1,7 @@
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "BlazorServer", "NG"],
"UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
@ -15,7 +15,9 @@ To create a new Azure Web App Service, choose one of the following options:
- [Create a new Azure Web App Service using the Terraform Template](terraform-web-app-service.md) (If you have experience with Terraform)
{{ if UI == "MVC" && Tiered == "No" }}
{{ if Tiered == "No" }}
{{ if UI == "BlazorServer" || UI == "MVC" || UI == "BlazorWebApp"}}
### Create a new Azure Web App service using the Azure Portal
@ -39,9 +41,102 @@ To create a new Azure Web App Service, choose one of the following options:
![Create Web App](../../../../images/azure-deploy-create-web-app-3.png)
{{else}}
{{else if UI == 'NG'}}
### Create a new Azure Static Web App for Angular using the Azure Portal
1. Log in to the [Azure Portal](https://portal.azure.com/).
2. Click the **Create a resource** button.
3. Search for **Static Web App** and select **Static Web App** from the results.
![Create a resource angular](../../../../images/azure-deploy-create-a-resource-angular.png)
4. Click the **Create** button.
5. Fill in the required fields and click the **Review + create** button.
6. Click the **Create** button.
![Create Web App](../../../../images/azure-deploy-create-web-app-4.png)
7. Wait for the deployment to complete.
![Create Web App](../../../../images/azure-deploy-create-web-app-5.png)
### Create a new Azure Web App Service for API application
1. You can create a new Azure Web App Service for an API application in the same resource group.
2. Click the **Create** button on the top of the resource group page.
3. Search for **Web App** and select **Web App** from the results.
![Create a resource](../../../../images/azure-deploy-create-a-resource.png)
4. Click the **Create** button.
5. Fill in the required fields and click the **Review + create** button.
6. Click the **Create** button.
![Create Web App](../../../../images/azure-deploy-create-web-app-6.png)
7. Wait for the deployment to complete.
![Create Web App](../../../../images/azure-deploy-create-web-app-3.png)
{{ else }}
### Create a new Azure Static Web App for Blazor using the Azure Portal
1. Log in to the [Azure Portal](https://portal.azure.com/).
2. Click the **Create a resource** button.
3. Search for **Static Web App** and select **Static Web App** from the results.
![Create a resource blazor](../../../../images/azure-deploy-create-a-resource-angular.png)
4. Click the **Create** button.
5. Fill in the required fields and click the **Review + create** button.
6. Click the **Create** button.
![Create Web App](../../../../images/azure-deploy-create-web-app-7.png)
7. Wait for the deployment to complete.
![Create Web App](../../../../images/azure-deploy-create-web-app-8.png)
### Create a new Azure Web App Service for API application
1. You can create a new Azure Web App Service for an API application in the same resource group.
2. Click the **Create** button on the top of the resource group page.
3. Search for **Web App** and select **Web App** from the results.
![Create a resource](../../../../images/azure-deploy-create-a-resource.png)
4. Click the **Create** button.
5. Fill in the required fields and click the **Review + create** button.
6. Click the **Create** button.
![Create Web App](../../../../images/azure-deploy-create-web-app-6.png)
7. Wait for the deployment to complete.
![Create Web App](../../../../images/azure-deploy-create-web-app-3.png)
{{end}}
{{ else }}
{{ if UI == "BlazorServer" || UI == "MVC" }}
{{ if UI == "BlazorServer" || UI == "MVC" || UI == "BlazorWebApp"}}
### Create a new Azure Web App service using the Azure Portal
@ -65,8 +160,7 @@ To create a new Azure Web App Service, choose one of the following options:
![Create Web App](../../../../images/azure-deploy-create-web-app-3.png)
{{ else if UI == 'NG' }}
{{ else if UI == 'NG'}}
### Create a new Azure Static Web App for Angular using the Azure Portal
1. Log in to the [Azure Portal](https://portal.azure.com/).
@ -89,7 +183,7 @@ To create a new Azure Web App Service, choose one of the following options:
![Create Web App](../../../../images/azure-deploy-create-web-app-5.png)
{{else}}
{{ else }}
### Create a new Azure Static Web App for Blazor using the Azure Portal
@ -111,8 +205,6 @@ To create a new Azure Web App Service, choose one of the following options:
7. Wait for the deployment to complete.
![Create Web App](../../../../images/azure-deploy-create-web-app-8.png)
{{end}}
### Create a new Azure Web App Service for API application
@ -137,8 +229,6 @@ To create a new Azure Web App Service, choose one of the following options:
![Create Web App](../../../../images/azure-deploy-create-web-app-3.png)
{{ if Tiered == "Yes" && (UI == "MVC" || UI == "BlazorServer")}}
### Create a new Azure Web App Service for AuthServer application
Similar to the API application, you can create a new Azure Web App Service for an AuthServer application in the same resource group.
@ -167,8 +257,6 @@ Same as above, but you only need to modify the name of the web app service to **
{{ end }}
{{ end }}
## What's next?
- [Customizing the Azure Web App Service](step2-configuration-application.md)

216
docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step2-configuration-application.md

@ -1,7 +1,7 @@
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "BlazorServer", "NG"],
"UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
@ -9,17 +9,26 @@
## Step 2: Customizing the Configuration of the ABP Application
- To customize the configuration of your ABP application, modify the `ConnectionString` values in every location throughout your project. The `ConnectionString` values are stored in the `appsettings.json` files.
#### To customize the configuration of your ABP application
This includes the following files:
{{ if UI == "MVC" && Tiered == "No" }}
**./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.Web/appsettings.json**
{{else}}
**./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
{{end}}
{{if Tiered == "Yes"}}
- Modify the `ConnectionString` values in every location throughout your project. The `ConnectionString` values are stored in the `appsettings.json` files.
* This includes the following files:
**./src/yourapp.DbMigrator/appsettings.json**
{{ if Tiered == "No" }}
{{ if UI == "MVC" }}
**./src/yourapp.Web/appsettings.json**
{{ else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp" }}
and **./src/yourapp.Blazor/appsettings.json**
{{ end }}
{{ if UI == "Blazor"|| UI == "NG" }}
**./src/yourapp.HttpApi.Host/appsettings.json**
{{ end }}
{{ else }}
**./src/yourapp.HttpApi.Host/appsettings.json**
**./src/yourapp.AuthServer/appsettings.json**
{{end}}
{{ end }}
```json
"ConnectionStrings": {
@ -27,35 +36,42 @@
}
```
{{ if UI == "MVC" }}
{{if Tiered == "No"}}
- Modify the **yourapp.Web** URL in every location throughout your project, especially within the **./src/yourapp.Web/appsettings.json** and **./src/yourapp.DbMigrator/appsettings.json** files, to match your Azure Web App Service URL.
* This includes the following files:
**./src/yourapp.DbMigrator/appsettings.json**
{{ if Tiered == "No" }}
{{ if UI == "MVC" }}
**./src/yourapp.Web/appsettings.json**
{{ else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp" }}
and **./src/yourapp.Blazor/appsettings.json**
{{ else }}
Modify the **`localhost:4200`** in every location throughout your project.
**./angular/src/environments/environment.prod.ts**
{{ end }}
{{ if UI == "Blazor"|| UI == "NG" }}
**./src/yourapp.HttpApi.Host/appsettings.json**
{{ end }}
{{ else }}
{{ if UI == "MVC" }}
**./src/yourapp.Web/appsettings.json**
{{ else if UI == "Blazor" || UI == "BlazorServer" || UI == "BlazorWebApp" }}
**./src/yourapp.Blazor/appsettings.json**
{{ else }}
Modify the **`localhost:4200`** in every location throughout your project.
**./angular/src/environments/environment.prod.ts**
{{ end }}
**./src/yourapp.AuthServer/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp.azurewebsites.net"
}
```
{{else}}
- Modify the **yourapp.Web** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.Web/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** , **./src/yourapp.HttpApi.Host/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp.azurewebsites.net"
}
```
- Modify the **yourapp.ApiHost** URL in every location throughout your project.
This includes the following files:
* This includes the following files:
**./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Web/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
@ -67,7 +83,7 @@
- Modify the **yourapp.AuthServer** URL in every location throughout your project.
This includes the following files:
* This includes the following files:
**./src/yourapp.Web/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
@ -79,139 +95,7 @@
- Modify the **Redis__Configuration** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.Web/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
```json
"Redis": {
"Configuration": "redis-abpdemo.redis.cache.windows.net:6380,password={yourpassword},ssl=true,abortConnect=False"
},
```
{{end}}
{{ else if UI == "NG" }}
- Modify the **`localhost:4200`** in every location throughout your project.
This includes the following files:
**./angular/src/environments/environment.prod.ts** , **./aspnet-core/src/yourapp.DbMigrator/appsettings.json** and **./aspnet-core/src/yourapp.HttpApi.Host/appsettings.json**
```typescript
application: {
baseUrl: 'https://yourapp.azurestaticapps.net'
}
```
- Modify the **yourapp.HttpApi.Host** URL in every location throughout your project.
This includes the following files:
**./angular/src/environments/environment.prod.ts** , **./aspnet-core/src/yourapp.DbMigrator/appsettings.json** and **./aspnet-core/src/yourapp.HttpApi.Host/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourApiHost.azurewebsites.net"
}
```
{{ else if UI == "Blazor" }}
- Modify the **yourapp.Blazor** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp.azurewebsites.net"
}
```
- Modify the **yourapp.HttpApi.Host** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourApiHost.azurewebsites.net"
}
```
{{ else }}
{{if Tiered == "No"}}
- Modify the **yourapp.Web** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp.azurewebsites.net"
}
```
- Modify the **yourapp.ApiHost** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Blazor/appsettings.json** and **./src/yourapp.DbMigrator/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp-apihost.azurewebsites.net"
}
```
{{else}}
- Modify the **yourapp.Web** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** , **./src/yourapp.HttpApi.Host/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp.azurewebsites.net"
}
```
- Modify the **yourapp.ApiHost** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.HttpApi.Host/appsettings.json** , **./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.AuthServer/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp-apihost.azurewebsites.net"
}
```
- Modify the **yourapp.AuthServer** URL in every location throughout your project.
This includes the following files:
**./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
```json
"App": {
"SelfUrl": "https://yourapp-authserver.azurewebsites.net"
}
```
- Modify the **Redis__Configuration** URL in every location throughout your project.
This includes the following files:
* This includes the following files:
**./src/yourapp.Blazor/appsettings.json** , **./src/yourapp.AuthServer/appsettings.json** , **./src/yourapp.DbMigrator/appsettings.json** and **./src/yourapp.HttpApi.Host/appsettings.json**
@ -220,11 +104,7 @@
"Configuration": "redis-abpdemo.redis.cache.windows.net:6380,password={yourpassword},ssl=true,abortConnect=False"
},
```
{{end}}
{{end}}
{{ end }}
## What's next?

263
docs/en/solution-templates/layered-web-application/deployment/azure-deployment/step3-deployment-github-action.md

@ -1,7 +1,7 @@
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "BlazorServer", "NG"],
"UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
@ -70,8 +70,8 @@ jobs:
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
working-directory: ./aspnet-core/src/Demo.AzureAppsAngular.HttpApi.Host # Replace with your project name
- name: Generate authserver.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Upload artifact for apihost
uses: actions/upload-artifact@v4
@ -170,8 +170,8 @@ jobs:
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
working-directory: ./src/demo.BlazorNonTierEfCore.HttpApi.Host # Replace with your project name
- name: Generate authserver.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Upload artifact for apihost
uses: actions/upload-artifact@v4
@ -234,6 +234,96 @@ jobs:
name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read #This is required for actions/checkout
steps:
- uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.x'
- name: Install ABP CLI
run: |
dotnet tool install -g Volo.Abp.Cli
abp install-libs
shell: bash
- name: Build with dotnet
run: dotnet build --configuration Release
- name: Run migrations
run: dotnet run
working-directory: ./src/BlazorServer.NonTiered.DbMigrator
- name: dotnet publish
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp
working-directory: './src/BlazorServer.NonTiered.Blazor'
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/openiddict.pfx -p 7015b85e-89fc-4346-bfd0-a67d81de824e # Replace with your password
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: .net-app
path: ${{env.DOTNET_ROOT}}/myapp
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
permissions:
id-token: write #This is required for requesting the JWT
contents: read #This is required for actions/checkout
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: .net-app
- name: Login to Azure
uses: azure/login@v2
with:
client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_E74C791E153A4F38A50107C6B5341809 }}
tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_7EC2684BA1FB43F1B563AD3832D0A5AC }}
subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_81FB702F1C8F43388B145043765CC189 }}
- name: Deploy to Azure Web App
id: deploy-to-webapp
uses: azure/webapps-deploy@v3
with:
app-name: 'abp-blazor-webapp-layered'
slot-name: 'Production'
package: .
```
}%}
{{ else }}
{%{
```yaml
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App
on:
push:
branches:
@ -266,17 +356,27 @@ jobs:
run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings
working-directory: ./src/blazorservertierdemo.DbMigrator # Replace with your project name
- name: dotnet publish authserver
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver
working-directory: ./src/blazorservertierdemo.AuthServer # Replace with your project name
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: dotnet publish apihost
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
working-directory: ./src/blazorservertierdemo.HttpApi.Host # Replace with your project name
- name: Generate authserver.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/apihost/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: dotnet publish webapp
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp
working-directory: ./src/blazorservertierdemo.Blazor # Replace with your project name
- name: Upload artifact for authserver
uses: actions/upload-artifact@v4
with:
name: .net-authserver
path: ${{env.DOTNET_ROOT}}/authserver
- name: Upload artifact for apihost
uses: actions/upload-artifact@v4
with:
@ -295,7 +395,23 @@ jobs:
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp-3.outputs.webapp-url }}
steps:
- name: Download artifact from authserver
uses: actions/download-artifact@v4
with:
name: .net-authserver
path: ./authserver
- name: Deploy authserver
id: deploy-to-webapp
uses: azure/webapps-deploy@v3
with:
app-name: 'authserver-blazorserver' # Replace with your app name
slot-name: 'Production'
publish-profile: ${{ secrets.authserverblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
package: ./authserver
- name: Download artifact from apihost
uses: actions/download-artifact@v4
with:
@ -323,8 +439,101 @@ jobs:
with:
app-name: 'webapp-blazorserver' # Replace with your app name
slot-name: 'Production'
publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
package: ./webapp
publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings
```
}%}
{{end}}
{{ else if UI == "BlazorWebApp" }}
{{ if Tiered == "No" }}
{%{
```yaml
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy ASP.Net Core app to Azure Web App - abp-blazor-webapp-layered
on:
push:
branches:
- main
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read #This is required for actions/checkout
steps:
- uses: actions/checkout@v4
- name: Set up .NET Core
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.x'
- name: Install ABP CLI
run: |
dotnet tool install -g Volo.Abp.Cli
abp install-libs
shell: bash
- name: Build with dotnet
run: dotnet build --configuration Release
- name: Run migrations
run: dotnet run
working-directory: ./src/BlzWapp.NonTiered.DbMigrator
- name: dotnet publish
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp
working-directory: './src/BlzWapp.NonTiered.Blazor'
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/openiddict.pfx -p 7015b85e-89fc-4346-bfd0-a67d81de824e # Replace with your password
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
with:
name: .net-app
path: ${{env.DOTNET_ROOT}}/myapp
deploy:
runs-on: ubuntu-latest
needs: build
environment:
name: 'Production'
url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}
permissions:
id-token: write #This is required for requesting the JWT
contents: read #This is required for actions/checkout
steps:
- name: Download artifact from build job
uses: actions/download-artifact@v4
with:
name: .net-app
- name: Login to Azure
uses: azure/login@v2
with:
client-id: ${{ secrets.AZUREAPPSERVICE_CLIENTID_E74C791E153A4F38A50107C6B5341809 }}
tenant-id: ${{ secrets.AZUREAPPSERVICE_TENANTID_7EC2684BA1FB43F1B563AD3832D0A5AC }}
subscription-id: ${{ secrets.AZUREAPPSERVICE_SUBSCRIPTIONID_81FB702F1C8F43388B145043765CC189 }}
- name: Deploy to Azure Web App
id: deploy-to-webapp
uses: azure/webapps-deploy@v3
with:
app-name: 'abp-blazor-webapp-layered'
slot-name: 'Production'
package: .
```
}%}
@ -337,7 +546,7 @@ jobs:
# Docs for the Azure Web Apps Deploy action: https://github.com/Azure/webapps-deploy
# More GitHub Actions for Azure: https://github.com/Azure/actions
name: Build and deploy ASP.Net Core with BlazorServer to Azure Web App
name: Build and deploy ASP.Net Core with BlazorWebApp to Azure Web App
on:
push:
@ -369,22 +578,22 @@ jobs:
- name: Run migrations
run: dotnet run -- "${{ secrets.CONNECTION_STRING }}" # Set your connection string as a secret in your repository settings
working-directory: ./src/blazorservertierdemo.DbMigrator # Replace with your project name
working-directory: ./src/BlzWapp.DbMigrator # Replace with your project name
- name: dotnet publish authserver
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver
working-directory: ./src/blazorservertierdemo.AuthServer # Replace with your project name
working-directory: ./src/BlzWapp.AuthServer # Replace with your project name
- name: Generate authserver.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: dotnet publish apihost
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost
working-directory: ./src/blazorservertierdemo.HttpApi.Host # Replace with your project name
working-directory: ./src/BlzWapp.HttpApi.Host # Replace with your project name
- name: dotnet publish webapp
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/webapp
working-directory: ./src/blazorservertierdemo.Blazor # Replace with your project name
working-directory: ./src/BlzWapp.Blazor # Replace with your project name
- name: Upload artifact for authserver
uses: actions/upload-artifact@v4
@ -422,9 +631,9 @@ jobs:
id: deploy-to-webapp
uses: azure/webapps-deploy@v3
with:
app-name: 'authserver-blazorserver' # Replace with your app name
app-name: 'authserver-blazorwebapp' # Replace with your app name
slot-name: 'Production'
publish-profile: ${{ secrets.authserverblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
publish-profile: ${{ secrets.authserverblazorwebappPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
package: ./authserver
- name: Download artifact from apihost
@ -437,9 +646,9 @@ jobs:
id: deploy-to-webapp-2
uses: azure/webapps-deploy@v3
with:
app-name: 'apihost-blazorserver' # Replace with your app name
app-name: 'apihost-blazorwebapp' # Replace with your app name
slot-name: 'Production'
publish-profile: ${{ secrets.apihostblazorserverPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
publish-profile: ${{ secrets.apihostblazorwebappPublishSettings }} # Set your Azure Web App to publish your profile as a secret in your repository settings
package: ./apihost
- name: Download artifact from webapp
@ -452,9 +661,9 @@ jobs:
id: deploy-to-webapp-3
uses: azure/webapps-deploy@v3
with:
app-name: 'webapp-blazorserver' # Replace with your app name
app-name: 'webapp-blazorwebapp' # Replace with your app name
slot-name: 'Production'
publish-profile: ${{ secrets.webappblazorserverPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings
publish-profile: ${{ secrets.webappblazorwebappPublishSettings }} # Set your Azure Web App publish your profile as a secret in your repository settings
```
}%}
@ -509,8 +718,8 @@ jobs:
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/myapp
working-directory: ./src/yourapp.Web # Replace with your project name
- name: Generate authserver.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/myapp/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Upload artifact for deployment job
uses: actions/upload-artifact@v4
@ -589,8 +798,8 @@ jobs:
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/authserver
working-directory: ./src/mvctierdemo.AuthServer # Replace with your project name
- name: Generate authserver.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/authserver.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: Generate openiddict.pfx
run: dotnet dev-certs https -v -ep ${{env.DOTNET_ROOT}}/authserver/openiddict.pfx -p 2D7AA457-5D33-48D6-936F-C48E5EF468ED # Replace with your password
- name: dotnet publish apihost
run: dotnet publish -c Release -o ${{env.DOTNET_ROOT}}/apihost

138
docs/en/solution-templates/layered-web-application/deployment/azure-deployment/terraform-web-app-service.md

@ -3,7 +3,7 @@
````json
//[doc-params]
{
"UI": ["MVC", "Blazor", "BlazorServer", "NG"],
"UI": ["MVC", "Blazor", "BlazorServer", "BlazorWebApp", "NG"],
"DB": ["EF", "Mongo"],
"Tiered": ["Yes", "No"]
}
@ -224,6 +224,53 @@ resource "azurerm_service_plan" "appserviceplan" {
sku_name = "B3"
}
resource "azurerm_linux_web_app" "webapp" {
name = "webapp-blazorserver"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
service_plan_id = azurerm_service_plan.appserviceplan.id
https_only = true
site_config {
application_stack {
dotnet_version = "6.0"
}
minimum_tls_version = "1.2"
}
}
```
{{ else }}
```terraform
# Configure the Azure provider
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.0"
}
}
required_version = ">= 0.14.9"
}
provider "azurerm" {
features {}
}
# Create the resource group
resource "azurerm_resource_group" "rg" {
name = "blazorserver-app-tier-rg"
location = "westeurope"
}
# Create the Linux App Service Plan
resource "azurerm_service_plan" "appserviceplan" {
name = "blazorserver-app-tier-plan"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
os_type = "Linux"
sku_name = "B3"
}
# Create the web app, pass in the App Service Plan ID
resource "azurerm_linux_web_app" "authserver" {
name = "authserver-blazorserver"
@ -237,6 +284,9 @@ resource "azurerm_linux_web_app" "authserver" {
}
minimum_tls_version = "1.2"
}
app_settings = {
"Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
}
}
resource "azurerm_linux_web_app" "apihost" {
name = "apihost-blazorserver"
@ -250,6 +300,9 @@ resource "azurerm_linux_web_app" "apihost" {
}
minimum_tls_version = "1.2"
}
app_settings = {
"Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
}
}
resource "azurerm_linux_web_app" "webapp" {
name = "webapp-blazorserver"
@ -263,6 +316,77 @@ resource "azurerm_linux_web_app" "webapp" {
}
minimum_tls_version = "1.2"
}
app_settings = {
"Redis__Configuration" = azurerm_redis_cache.redis.primary_connection_string
}
}
resource "azurerm_redis_cache" "redis" {
name = "redis-blazorserver"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
capacity = 0
family = "C"
sku_name = "Basic"
enable_non_ssl_port = false
minimum_tls_version = "1.2"
redis_configuration {
maxmemory_reserved = 2
maxmemory_delta = 2
maxmemory_policy = "volatile-lru"
}
}
```
{{end}}
{{ else if UI == "BlazorWebApp" }}
{{if Tiered == "No"}}
```terraform
# Configure the Azure provider
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "~> 3.0.0"
}
}
required_version = ">= 0.14.9"
}
provider "azurerm" {
features {}
}
# Create the resource group
resource "azurerm_resource_group" "rg" {
name = "blazorwebapp-app-nontier-rg"
location = "westeurope"
}
# Create the Linux App Service Plan
resource "azurerm_service_plan" "appserviceplan" {
name = "blazorwebapp-app-nontier-plan"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
os_type = "Linux"
sku_name = "B3"
}
resource "azurerm_linux_web_app" "webapp" {
name = "webapp-blazorwebapp"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
service_plan_id = azurerm_service_plan.appserviceplan.id
https_only = true
site_config {
application_stack {
dotnet_version = "6.0"
}
minimum_tls_version = "1.2"
}
}
```
@ -285,13 +409,13 @@ provider "azurerm" {
# Create the resource group
resource "azurerm_resource_group" "rg" {
name = "blazorserver-app-tier-rg"
name = "blazorwebapp-app-tier-rg"
location = "westeurope"
}
# Create the Linux App Service Plan
resource "azurerm_service_plan" "appserviceplan" {
name = "blazorserver-app-tier-plan"
name = "blazorwebapp-app-tier-plan"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
os_type = "Linux"
@ -300,7 +424,7 @@ resource "azurerm_service_plan" "appserviceplan" {
# Create the web app, pass in the App Service Plan ID
resource "azurerm_linux_web_app" "authserver" {
name = "authserver-blazorserver"
name = "authserver-blazorwebapp"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
service_plan_id = azurerm_service_plan.appserviceplan.id
@ -316,7 +440,7 @@ resource "azurerm_linux_web_app" "authserver" {
}
}
resource "azurerm_linux_web_app" "apihost" {
name = "apihost-blazorserver"
name = "apihost-blazorwebapp"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
service_plan_id = azurerm_service_plan.appserviceplan.id
@ -332,7 +456,7 @@ resource "azurerm_linux_web_app" "apihost" {
}
}
resource "azurerm_linux_web_app" "webapp" {
name = "webapp-blazorserver"
name = "webapp-blazorwebapp"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
service_plan_id = azurerm_service_plan.appserviceplan.id
@ -349,7 +473,7 @@ resource "azurerm_linux_web_app" "webapp" {
}
resource "azurerm_redis_cache" "redis" {
name = "redis-blazorserver"
name = "redis-blazorwebapp"
location = azurerm_resource_group.rg.location
resource_group_name = azurerm_resource_group.rg.name
capacity = 0

33
docs/en/solution-templates/layered-web-application/deployment/deployment-iis.md

@ -254,6 +254,39 @@ We can visit the websites from a browser.
![Tiered IIS deployment](../../../images/iis-sample-tiered-deployment.gif)
{{ if UI == "NG" }}
## Rewrite for getEnvConfig
Please add the following rewrite rules to your `web.config` file to redirect requests for `getEnvConfig` to `dynamic-env.json`:
```xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect" stopProcessing="true">
<match url="getEnvConfig" />
<action type="Redirect" url="dynamic-env.json" />
</rule>
<rule name="Angular Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="./index.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
```
> See [Angular RemoteEnvironment](https://abp.io/docs/latest/framework/ui/angular/environment#remoteenvironment) for more details.
{{ end }}
## Fix 405 Method Not Allowed Error
Remove `WebDAV` modules and handlers from the `Web.config` file.

BIN
docs/en/studio/images/solution-runner/csharp-application-context-menu-build.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 30 KiB

BIN
docs/en/studio/images/solution-runner/csharp-application-context-menu-monitor.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

BIN
docs/en/studio/images/solution-runner/csharp-application-context-menu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
docs/en/studio/images/solution-runner/docker-container-example-add-dialog.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

BIN
docs/en/studio/images/solution-runner/docker-container-example-add.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
docs/en/studio/images/solution-runner/docker-container-example-rabbitmq.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
docs/en/studio/images/solution-runner/docker-container-properties.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

BIN
docs/en/studio/images/solution-runner/docker-container-stack.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
docs/en/studio/images/solution-runner/docker-container-warning.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
docs/en/studio/images/solution-runner/folder-context-menu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 13 KiB

BIN
docs/en/studio/images/solution-runner/profile-root-context-menu.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
docs/en/studio/images/solution-runner/solution-runner.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 32 KiB

11
docs/en/studio/installation.md

@ -1,11 +1,10 @@
# Installing ABP Studio
> **Warning: Beta Version Information**\
> Currently, ABP Studio is in its beta phase and available for everyone. To access the beta version, kindly visit [this web page](https://abp.io/studio).
This document explains how to install the ABP Studio tool.
## Pre-requirements
ABP Studio now features automatic installation of most required dependencies. When you first launch the application, it will check for and install the following components:
ABP Studio automatically instals most of the required dependencies. When you first launch the application, it will check for and install the following components if missed:
* .NET SDK
* Node.js
@ -13,12 +12,14 @@ ABP Studio now features automatic installation of most required dependencies. Wh
* mkcert (for HTTPS development)
* WireGuard (for Kubernetes operations)
The only manual installation required is:
However, the followings should be manually installed:
### Docker (Required for Kubernetes Operations)
ABP Studio needs [Docker](https://www.docker.com/) for [Kubernetes](https://kubernetes.io/) operations. Install Docker by following the guidelines on the official [Docker website](https://docs.docker.com/get-docker/).
ABP Studio needs [Docker](https://www.docker.com/) for Docker and [Kubernetes](https://kubernetes.io/) operations. Install Docker by following the guidelines on the official [Docker website](https://docs.docker.com/get-docker/).
### Package Manager Prerequisites
* **Windows:** The automatic installation process uses `winget`. If not already installed, ABP Studio will attempt to install it.
* **macOS:** The automatic installation process uses `brew`. If not already installed, you'll need to install it manually from [brew.sh](https://brew.sh/).

31
docs/en/studio/release-notes.md

@ -2,6 +2,37 @@
This document contains **brief release notes** for each ABP Studio release. Release notes only include **major features** and **visible enhancements**. Therefore, they don't include all the development done in the related version.
## 1.0.2 (2025-06-24)
* Enhanced the ABP NuGet package installation experience.
* Upgraded template dependencies for ABP Framework and LeptonX. (targeting ABP `9.2.1`)
* Replaced the `System.Data` package with `Microsoft.Data`.
* Fixed a dynamic-env file path configuration issue in Angular templates.
* Disabled Pushed Authorization for MAUI applications.
* Improved the IDE experience by displaying the main project in a dedicated 'main' folder and hiding `.abppkg` files.
## 1.0.1 (2025-06-13)
* Fixed an issue with language selection during solution creation.
* Resolved a logo visibility problem in the Angular semi-dark theme.
* Added and corrected the handling of CEF (Chromium Embedded Framework) resources for the Windows version.
## 1.0.0 (2025-06-11)
* **Solution Runner with Health Checks:** ABP Studio's Solution Runner now provides visual health monitoring that makes tracking your applications' status easily.
* **Improved Multi-DbContext Migration Handling:** ABP Studio now prompts you to select the correct DbContext for migration operations when working with multiple DbContexts.
* **Theme Style Selection on Project Creation:** When creating a new solution, you can now choose your theme, theme style, and layout right from the project creation wizard instead of having to configure these settings later.
* **Solution & Module Creation:** Introduced major enhancements, including language selection, database provider choice for microservices, improved folder handling, theme visualization, and better module installation recommendations.
* **MAUI & Blazor:** Configured the new MAUI/Blazor bundling system, added dashboard pages to MAUI projects, and applied various fixes for themes and dependencies.
* **Solution Runner & Docker:** Added Docker container support to the solution runner, enabling users to add and manage containers within run profiles.
* **Authentication & Authorization:** Fixed Swagger authentication, and added dynamic claims support for microservices.
* **ABP Studio Login:** Improved login flows with selecting account and organization support.
* **Language Selection:** Added language selection during solution creation. You can now include only the languages you need in your project.
* **Performance:** Sped up the development cycle by skipping package restores during project runs when no dependencies have changed.
* **Dependency Updates:** Upgraded ABP Framework, LeptonX, and other Microsoft dependencies to the latest versions. (targeting ABP `9.2.0`)
* **User Experience:** Implemented several UI/UX improvements, such as remembering user choices in wizards and sorting items alphabetically.
* **Testing & Internals:** Switched to `MongoSandbox` for integration tests, improved local development against abp.io websites, and made various fixes to CI/CD workflows.
## 0.9.26 (2025-04-30)
* Fixed the issue where C# applications would not stop when requested.

67
docs/en/studio/running-applications.md

@ -19,9 +19,10 @@ Use the *Solution Runner* to easily run your application(s) and set up infrastru
The solution runner contains 4 different types to define tree structure.
- **Profile**: We can create different profiles to manage the tree as our needs. For example we can create 2 different profile for `team-1` and `team-2`. `team-1` want to see the only *Administration* and *Identity* service, `team-2` see the *Saas* and *AuditLogging* services. With that way each team see the only services they need to run. In this example `Default` profile *Acme.BookStore (Default)* comes out of the box when we create the project.
- **Folder**: We can organize the applications with *Folder* type. In this example for docker set up we use `Docker-Dependencies` CLI application and keep it in `infrastructure`, similarly in `services` folder for our microservice projects. We can also use nested folder if we want `apps`, `gateways`, `infrastructure` and `services` is the folders in current(`Default`) profile.
- **Folder**: We can organize the applications with *Folder* type. In this example, we keep services in `services` folder for our microservice projects. We can also use nested folder if we want `apps`, `gateways`` and `services` is the folders in current(`Default`) profile.
- **C# Application**: We can add any C# application from our [Solution Explorer](./solution-explorer.md). If the application is not in our solution, we can add it externally by providing the *.csproj* file path. The .NET icon indicates that the application is a C# project. For example, `Acme.BookStore.AuthServer`, `Acme.BookStore.Web`, `Acme.BookStore.WebGateway`, etc., are C# applications.
- **CLI Application**: We can add [powershell](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core) commands to prepare some environments or run other application types than C# such as angular. In this example `Docker-Dependencies` is the CLI application for docker environment.
- **CLI Application**: We can add [powershell](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core) commands to prepare some environments or run other application types than C# such as angular.
- **Docker Container**: We can add Docker container files to control them on UI, start/stop containers individually.
## Profile
@ -234,6 +235,68 @@ CLI applications uses the [powershell](https://learn.microsoft.com/en-us/powersh
> When CLI applications start chain icon won't be visible, because only C# applications can connect the ABP Studio.
## Docker Containers
Each Docker container represents a `.yml` file. Each file can be run on UI individually. A file may contain one or more services. To start/stop each service individually, we recommend to keep services in separate files.
An example `rabbitmq.yml` container file:
```yml
volumes:
bookstore_rabbitmq:
networks:
bookstore:
external: true
services:
rabbitmq:
container_name: rabbitmq
image: rabbitmq:3.12.7-management-alpine
volumes:
- bookstore_rabbitmq:/var/lib/rabbitmq
networks:
- bookstore
ports:
- "15672:15672"
- "5672:5672"
```
> Note: We suggest to use `container_name` property in your services. Otherwise, tracking the container may not be possible in some cases.
To add this file to `containers`, we can use `Add Docker Container` menu:
![docker-container-example-add](images/solution-runner/docker-container-example-add.png)
It will open a simple dialog with a file picker:
![docker-container-example-add-dialog](images/solution-runner/docker-container-example-add-dialog.png)
Then we have the `rabbitmq` on the Studio UI under containers:
![docker-container-example-rabbitmq](images/solution-runner/docker-container-example-rabbitmq.png)
Name of the `yml` file is used as label in the UI, so we recommend to create the file with the name of service inside.
If the `yml` file contains multiple services, they will be represented as a single container with the file name. In this case, when we start/stop it, all services inside the file will be started/stopped.
> If a service is shut down externally, it will be shown as `Stopped` in the UI. In this case you can start them again. If it is constantly stopping, there may be a problem in the `yml` file.
> It may take stuck in `starting` state a while to download images if they don't exist.
> A warning icon is displayed when a service is stopped externally inside the container. In this case, yo can restart the application on Studio UI:
>
> ![docker-container-warning](images/solution-runner/docker-container-warning.png)
### Properties
![docker-container-properties](images/solution-runner/docker-container-properties.png)
In properties dialog, you can set the name of docker compose stack name of the containers. In the example above, it is set as `BookStore-Containers`. In Docker Desktop UI the containers are stacked under that name. Exmple:
![docker-container-stack](images/solution-runner/docker-container-stack.png)
## Docker Compose
You can manually run applications using [Docker Compose](https://docs.docker.com/compose/). This allows for easy setup and management of multi-container Docker applications. To get started, ensure you have Docker and Docker Compose installed on your machine.

3
docs/en/studio/version-mapping.md

@ -4,6 +4,9 @@ This document provides a general overview of the relationship between various ve
| **ABP Studio Version** | **ABP Version of Startup Template** |
|------------------------|---------------------------|
| 1.0.2 | 9.2.1 |
| 1.0.1 | 9.2.0 |
| 1.0.0 | 9.2.0 |
| 0.9.26 | 9.1.1 |
| 0.9.24 - 0.9.25 | 9.1.0 |
| 0.9.22 - 0.9.23 | 9.0.4 |

2
docs/en/tutorials/book-store/part-01.md

@ -34,8 +34,6 @@ For such cases, run the `abp install-libs` command on the root directory of your
abp install-libs
```
> We suggest you install [Yarn v1.22+ (not v2)](https://classic.yarnpkg.com/en/docs/install) to prevent possible package inconsistencies, if you haven't installed it yet.
## Create the Book Entity
**Domain layer** in the startup template is separated into two projects:

BIN
docs/en/tutorials/microservice/images/abp-studio-solution-runner-play-all.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 33 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-add-entity-framework-core-migration.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 29 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-add-new-folder-command-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-3.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 47 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-add-package-reference-dialog-4.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 53 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-orders-with-product-name.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 56 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-browser-list-of-products.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 50 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-browser-orders-menu-item.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-build-and-restart-application.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-catalog-module-expanded-in-solution-explorer.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-add-migration-order.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-entity-framework-core-update-database.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 29 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-graph-build.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 30 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-import-module-dialog-for-catalog.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-import-module-for-ordering-dialog.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 42 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-import-module-ordering.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 21 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-imports-and-dependencies-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-imports-and-dependencies.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-for-ordering.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-install-module-dialog.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-modular-crm-with-standard-module.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 26 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-module-installation-dialog-for-catalog.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-catalog.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-open-with-visual-studio-code-catalog.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-ordering-swagger-ui-in-browser-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-ordering-swagger-ui-in-browser.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-solution-explorer-with-folders-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-solution-runner-initial-catalog-page.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
docs/en/tutorials/modular-crm/images/abp-studio-swagger-ui-create-order-execute-v2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save