Our blog contains the activity stream of Orchard Dojo: general news, new resources or tutorials are announced here.

Hosting Orchard Core at Exoscale

It's not all about hyperscalers: You can run your Orchard Core app in the cloud even if not using Azure, AWS, or some other giant like these. Let's see how we can do this with Exoscale! Blog post series overview This post is part of our series about hosting Orchard Core at European cloud providers. Orchard Core has built-in support for a lot of Azure services, including Media storage, secret storage, e-mail delivery and sending SMS, AI search, and even observability with Azure Application Insights with the Lombiq module. AWS also has support for Media storage. For cloud-hosted full-text search we can use Elasticsearch, and Redis to aid with horizontal scaling. How does using a smaller cloud provider, without specific support from Orchard Core, compare? We've looked into hosting a vanilla Orchard Core app as a proof of concept, and are sharing our experiences here. The goal was to run Orchard Core with a minimal hosting environment, but with a stateless web server (so, keeping the database and Media storage separate). This could've been simplified to only use a web server (and keep the database in a local SQLite file, as well as use local Media files), but we wanted to go a bit more realistic than that. To be able to play around with the web server from the GUI too, we've chosen Windows as the OS if available. Additionally, we also checked if the platform helps with any of the other common infrastructure requirements, like sending e-mails or observability. Note that while we usually received some credits from the cloud providers for testing, they are not paying for these reviews, and any endorsement or critique is our own. What's Exoscale? Exoscale is a cloud provider from Switzerland, with hosting locations back at home, as well as in Germany, Austria, Bulgaria, and since July also in Croatia. As far as services interesting for Orchard Core hosting go, they offer VMs with load balancing, AWS S3-compatible object storage, and databases as a service. Managed Kubernetes is also available, but for the sake of this post, trying to host a simple app, we won't create a cluster. Instead of Redis, you can create Valkey instances (Valkey is an open-source fork of Redis), which, for now, should just work with Orchard Core's Redis support. While OpenSearch is also available, that's incompatible with Orchard's Elasticsearch integration. DNS management is also available, though that's something I'd keep at Cloudflare for a real-life app. I'd also use Cloudflare as a CDN, despite Exoscale offering a CDN layer (with Akamai) on top of their object storage; but since in Orchard Core we don't serve Media files from storage directly, that wouldn't help anyway. If you want to send e-mails, implement observability, or add search and indexing other than with Lucene on the web server, you're on your own. Creating an Orchard Core hosting environment You surely already guessed, but we'll need three Exoscale services: A Compute Instance, i.e. a VM, for the web server. A DBaaS database; we'll use PostgreSQL. We could also create SQL Server instances, but not only would the minimum 2-core VM be an overkill for our purposes, it's also much more expensive, starting at about EUR 247/month (vs a Postgres DBaaS starting at EUR 42/month). Object Storage for Media. Let's start with the server! I went with the Swiss zone, since there's no place like home, and opted with a 2-CPU plan with 2 GB of RAM. For this site, 1 CPU would also be more than enough (while to cater for Windows, I'm more comfortable with 2 GB of RAM instead of 1), but there's no 1-CPU 2 GB RAM instance type. [image alt="Creating an Exoscale Compute Instance"]BlogPost/other-posts/2025/hosting-orchard-core-at-exoscale/creating-a-compute-instance.webp[/image] You may notice two things here: On the right, there's a warning about having to create Security Groups for ingress rules first. (Somewhat confusingly the ADD button below it actually creates the compute instance, not a Security Group.) To be able to actually connect to the VM, we also need to edit the default Security Group (or perhaps more diligently, create a new one), then open up the ingress port 80 with TCP (for HTTP), as well as add a rule for RDP. As a last step, you'll also need to add 0.0.0.0/0 (i.e. all IPs) under External Sources, allowing anyone to connect to our web server. Those ENABLE buttons for instances Mega and up mean that you need to ask Exoscale support to allow them "after a manual screening process". This I find a bit strange. Until the server started, so in the meantime, I created an Object Storage bucket in the same zone (to minimize latency, these resources should all be in the same zone): [image alt="Creating an Object Storage bucket"]BlogPost/other-posts/2025/hosting-orchard-core-at-exoscale/adding-bucket.webp?2[/image] It seems that unlike with other cloud providers where you create a storage account, then a bucket under it, here everyone shares the same storage account. Thus, bucket names should be globally unique. This doesn't seem appealing at a first glance, but apart from the naming issue, I didn't find any practical problem with it. Somewhat counterintuitively, the storage access and secret keys are API keys. You can create these following the docs; for the sake of simplicity, I created a key for the Owner role, but for a production app, you should follow the docs' recommendations and create a restricted role just to access this bucket. Finally, we also need a single-node Postgres database server: [image alt="Creating a managed database"]BlogPost/other-posts/2025/hosting-orchard-core-at-exoscale/adding-postgresql-dbaas.webp[/image] Note that this runs on its own VM. The IP filter is necessary for the web server to access the DB server; the provided CIDR matches the exact IP of it. This is everything we need, so now we can continue with setting up Orchard Core in this environment. Deploying Orchard Core to the web server You can deploy an ASP.NET Core app, including an Orchard Core-using one, with Web Deploy to IIS, using automated deployment from a GitHub Actions workflow, or just by copying its publish outputs to the server. Here, I opted with the simplest option: I published the web app to a folder from Visual Studio (but running dotnet publish from the CLI would be equally suitable), and copied the resulting files to the server via Remote Desktop. Then I could simply run the web app: [image alt="The Orchard Core app running under Windows Server"]BlogPost/other-posts/2025/hosting-orchard-core-at-exoscale/app-running.webp[/image] The app listens to port 80 because I added an appsettings.Production.json file configuring it: { "Kestrel": { "Endpoints": { "HttpEndpoint": { "Url": "http://*:80" } } } } This allows you to simply open the IP of the server in a browser, or point a DNS A record to it. Our site is now available on the internet! ...after we allowed the exe of our web app through the Windows Firewall, that is. You may notice that this is a really barebones approach: There's no IIS, no HTTPS, no proper deployment. And you're right! This is a focused example of getting Orchard Core running, but we'll return to the missing pieces later. Setting up Orchard Core Running the Orchard Core setup is standard: Just fill out the usual settings on the setup screen, and point the app to the Postgres DB. For the latter, you can copy the Postgres connection string from the Exoscale Console, take the password of the default user from the DB's Users menu, and ask your favorite AI tool to turn them into an Npgsql connection string that .NET uses. Once setup finishes, you can configure Media storage too. I've elaborated above how to set up a bucket; the service URL for it will be in the format https://sos-{zone}.exo.io, with our Switzerland zone being ch-dk-2. Now it's time to configure the connection for the app. Again, you can use the appsettings.Production.json file to add something like below, resulting in the following full file: { "Kestrel": { "Endpoints": { "HttpEndpoint": { "Url": "http://*:80" } } }, "OrchardCore": { "OrchardCore_Media_AmazonS3": { "ServiceURL": "https://sos-ch-dk-2.exo.io", "Credentials": { "SecretKey": "add the secret of the user you created", "AccessKey": "add the access key of the user you created" }, "CreateBucket": true, "RemoveBucket": true, "BucketName": "oc-media" } } } Be sure to change the ServiceURL value to that of your instance, as indicated on its Overview page (under "S3 endpoint"). That's actually an undocumented configuration key that comes very handy when, as we do here, you connect to an S3 account outside of AWS. Now restart the app (so it reads the updated configuration file) and enable the Amazon Media Storage feature from the Orchard Core admin. It'll work, despite it not running in Amazon. Magic! And with this, our app fully works! Why would you (not) use Exoscale? OK, so we've seen that running Orchard Core under Exoscale works. This is not a huge surprise, but it's nice to get it verified and have the basics figured out. Why would we do this, though, instead of choosing the beaten path with Azure or AWS, for example? European Exoscale is not just hosting in Europe, but the company itself is also based in a European country. If that matters for you, either for sentimental reasons or as a matter of company policy (like using a provider that's not under the US CLOUD Act), it can be a big plus. Note though, that while Switzerland is highly aligned with the EU legally, it's not an EU member state, nor part of the European Economic Area. Costs Exoscale can be a lot cheaper. At €17/month, the Exoscale server provides roughly the same as an A1_v2 Azure VM, which costs €45/month. However, the smallest managed Postgres instance at €42/month is way above what we'd use on Azure for an entry-level app, where an S0 Azure SQL DB would be around €13/month. So, in the end, Exoscale costs around EUR 60/month, while the roughly equivalent service in Azure would be basically the same. We do get more with Exoscale (a dedicated VM for the DB, and I think the web server is faster too), a lot more room to grow, but the cost advantage, in itself, disappears, at least in the beginning. For an entry-level app the storage is cents in both cases, but if you increase your usage, Exoscale's storage costs can be dramatically lower (EUR 0,00002750/GB vs Azure's Standard Hot tier at EUR 0,0185/GB). Network costs at Exoscale (EUR 0,02/GB for egress) and per-operation costs at Azure (there's no simple number for this) complicate things, though, so be sure to calculate what's applicable for your app. All this being said, at Azure, we'd rather use App Services: This is a higher-level "websites as a service", offering a bunch of convenience features like automated deployment, staged publishing, and configuration management. The smallest proper App Services-based infrastructure (with a staging slot and separate staging and production DBs) comes at around €90/month, though, but that also contains a lot of features lacking from VMs. Simplicity Without consulting any resource, just by playing with the Console, I could fully understand the Exoscale offering (I think...) within like half an hour. Getting the full Orchard Core environment running wouldn't have been much more, have I not written this post at the same time (plus getting stuck on the mentioned storage configuration). The cons Coming from frequently using the cushy but extremely complex ecosystem of Azure, using a more basic provider like Exoscale is certainly an interesting change. It seems to me that ultimately, there's a lot of work to do if you want to have a full-blown, highly automated hosting environment for Orchard Core, with an option for horizontal scaling. Below are the features that I'd consider necessary, and while these are given with Azure, you need to roll your own solutions with Exoscale: Staged publishing (blue-green deployment): You'd need to set up multiple VMs or multiple sites, and manage swapping staging with production somehow on your own. Automated deployments: I think under a Windows server, the easiest would be to set up Web Deploy and use it from an automation platform like GitHub Actions. Observability: You'd either need to host an observability platform yourself, or use an external service. The lack of a search/indexing service is less of an issue, because you can just use the Elastic Cloud (what's the option in Azure and AWS too), and I'd consider the lack of an e-mail service not a huge issue either (you can just use something like SendGrid). Managed Valkey is good, but starting at €43/month, it's not priced for an easy entry (just as Postgres), although it also provides a lot more resources than the lowest tiers of Azure Cache for Redis do (for a lower price). Yes, you could build an all-in-one infrastructure with Kubernetes, and have containers with services for all the above features (and a DB and storage as well), but that's a large complexity you need to manage. Using Terraform, supported by Exoscale, to ramp up your infrastructure can cut down on manual repetition (and aid portability to other providers to an extent), but is also work that you have to invest. And at the entry level, managed solutions for services like SQL and Redis (instead of hosting your own VMs/containers) can be more cost-efficient too (but that flips if your app's demand increases).There are also three notable things I very much didn't like about Exoscale's pricing: All prices on the pricing page are shown for usage hours only. That's necessary, but a metric frequently a lot more useful is the monthly cost. While I can always multiply by 730 to get an approximation of a month, it would be much clearer to have it indicated in the pricing table already. Also, I'd welcome seeing these hourly and monthly costs indicated in the Exoscale Console, when creating resources, too. The Pricing Calculator helps, and it does show monthly costs too, but it's better to show this information everywhere. The prices in EUR, CHF, and USD are exactly the same. Given that 1 CHF is 1,07 EUR, and 1 EUR is 1,16 USD as of writing this, there's a significant difference in your costs depending on what you pay with (you pay almost 25% more in CHF than USD). According to the website, "Your account can be setup in either CHF, EUR or USD, depending on your initial legal residence." This seems like an arbitrary disadvantage for Swiss users, and an advantage to non-EU ones. The latter is a surprising policy for a company primarily targeting EU customers. I'd welcome the price differences to disappear.You can only pay in advance, at least as a new customer. This requires you to either be ready to top up your balance any time you get a low credit notification, or you need to park an excessive amount at Exoscale. In either case, it's also a manual process. It would be better if they would just charge my card after each month's usage. So, what should I do?Based on the feature set, Exoscale can be a good choice to host your Orchard Core app if you don't need anything beyond what's easily possible with the existing offering, or if you already invested into a portable Kubernetes-based infrastructure. However, I think the particularities of Exoscale's pricing are not for everyone. And if you need help hosting Orchard Core at Exoscale, Azure, or onboard of a satellite (not kidding), drop us a line!

Latest tutorials

Hosting Orchard Core at Exoscale
zoltan.lehoczky
Step away from that Node.js
sara.el-saig

Featured tags

AI
SMS
IIS
MCP
API
SEO
SSL
All tags >

Secrets module, Lombiq GitHub Actions v4.2.0 - This week in Orchard (20/02/2026)

This week, you can see an interesting demo of the Secrets module, which provides a secure, centralized way to store and manage sensitive data such as passwords, API keys, connection strings, and certificates! But before that, let us quickly mention the new Content Manager Delete behavior and the Dynamic Cache Options documentation! And don't forget to check out the latest release of the Lombiq GitHub Actions project!

Simplify using shape morphing in Razor pages, Jean-Thierry Kéchichian Community Award 2025 - This week in Orchard (31/10/2025)

Cast your vote for the Jean-Thierry Kéchichian Community Award! This week's topics include simplifying using StringValues in Liquid templates and shape morphing in Razor pages! Oh, and do you know about the Orchard Harvest's sponsorship opportunity?

AI Data Source Management feature, allow the use of the site's time zone in workflow timer activities - This week in Orchard (13/06/2025)

This time, you can see a fascinating AI Data Source Management feature demo! But first, let's look at our other topics, like allowing the use of the site's time zone in workflow timer activities, and adding a warning when using Redis for data protection. Don't forget to fill out our Orchard Core Admin UI experience renewal survey to help shape the future of Orchard Core!

Orchard Harvest 2024 montage video, Orchard Dojo case study - This week in Orchard (27/09/2024)

Cache top-unread notifications in the navbar for better performance, and add AddSiteDisplayDriver, and AddPermissionProvider extensions are the topics for this week. Check out our post for an Orchard Harvest 2024 montage video and for a case study about how we migrated Orchard Dojo to Orchard Core!

Orchard Harvest 2024, log file path based on orchard_app_data environment variable - This week in Orchard (12/04/2024)

Add cache busting parameter to media thumbnails and links in Media Library, the log file path now based on the orchard_app_data environment variable, and the latest news about this year's Orchard Harvest conference! Check out our post for the details! Orchard Core updates Add cache busting parameter to media thumbnails and links in Media Library It's recommended to send long far-future client cache TTLs in HTTP response headers for static resources like images, documents, and CSS files, and this is what Orchard Core also does. However, in the Media Library admin, this causes an issue if you change files since thumbnails and View links will now load the old files. This is especially a problem with CDNs, since then it's not just your browser caching these files but the CDN too, which for an ordinary user is impossible to purge, and thus they won't see the updated files. The solution here is to make Media Library admin thumbnails and View links use the usual cache-busting parameter mechanism. Log file path based on orchard_app_data environment variable As described in the document here, setting the environment variable orchard_app_data doesn't change the log location, and logs are still placed under the App_Data folder. So, if you created an environment variable orchard_app_data with value C:\\orchard_data, and ran the application with the Default tenant, you noticed that the Sites folder created at C:\\orchard_data but logs are generated under App_Data. But because the orchard_app_data environment variable has a value C:\\orchard_data, logs should also be created under C:\\orchard_data. The goal of this change was to fix this behavior. News from the community Orchard Harvest 2024 We had the first online Orchard Harvest last year, and it was so great to see that we had 188 sign-ups for the conference! It was an excellent opportunity to share knowledge, talk about development plans and ideas, and foremost, meet the rest of the worldwide community. And of course, we recorded every session, which means they are available on YouTube! Click the link to rewatch all the inspiring talks and discussions! So, after last year, the Orchard Harvest Conference will be held again in 2024. Last year it was held online due to economic reasons. This year the organizing team has decided to finally organize the Orchard Harvest 2024 Conference in person. Each year, we try to attract as many people as possible, and a face-to-face event helps to build truly productive relationships. Last year, we started organizing the event in Las Vegas, so that's one of the reasons we're going to do it here again this year! Also, most of the active people in the community are either from the US or can reach the US. According to the questionnaire, most people wanted the event to take place in September. With the organizers, we agreed that a Thursday and Friday would be best, so it wouldn't take so many working days away from people. They could even stay for the weekend on an individual basis. Finally, we chose the 12th and 13th of September. It's not right after the summer holidays, people don't travel as much then. There are fewer things that could come up for potential participants that would prevent them from participating. Also important is that it does not interfere with any national holiday. We are currently working with the organizers on a contract with the venue. We are also thinking about what themes the event should be based on. Furthermore, we are trying to put together a set of goals that we will try to follow through. Do you have any ideas that you would like us to consider? Please tell us under this GitHub Discussion! There is a possibility of sponsoring the Orchard Harvest conference, and we are currently in the planning stage. We would be open to it if you would like to sponsor our event. If you are interested, you can contact us using [email protected] or the [email protected] email addresses, and you can also write under the mentioned GitHub Discussion page. If you would like to be kept informed about the events around the conference sign up here to receive our announcements about Orchard Harvest. As we move forward, we will keep community members informed of the details, and you will also find every detail in this newsletter too! Orchard Dojo Newsletter Lombiq's Orchard Dojo Newsletter has 471 subscribers! We have started this newsletter to inform the community around Orchard of the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post is published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news about Orchard and the details of the topics above, don't forget to check out the recording of this Orchard meeting!

Add PagerOptions, Output Caching for ASP.NET Core 6.0 - This week in Orchard (02/09/2022)

Fix the password generator to meet the password requirements, add PagerOptions, and a demo about Output Caching for ASP.NET Core 6.0! Let's get started! Orchard Core updates Fix the password generator to meet the password requirements A few weeks ago, we mentioned that you have the option to generate passwords on the user creation form. But how can you do that? Head to the admin UI of Orchard Core and navigate to Security -> Users. Here you will find the Add User button. Click on it! This will navigate you to the create user page, where you can find this feature, where you can provide a password for the newly created user, and you have the option to generate a random secure password or copy the password to the clipboard. The password generator had an issue which was password randomness occasionally omits a special character or number. Password should include a number, lower and uppercase letter, and special character. Now, this has been fixed, and the generated password meets the requirements described here. Add PagerOptions When you navigate to Configuration > Settings -> General, you have the option to set up the default page size which is the default page size of lists. But you also have the option to define the maximum number of pages that can be paged (MaxPagedCount) and the maximum page size that can be set by a user (MaxPageSize). And from now on, you can define the pager options using appsettings.json as well. Here you can see that you can easily set up the values for all three properties. Demos Output Caching for ASP.NET Core 6.0 Output caching stores the generated output of pages, controls, and HTTP responses in memory. Output caching enables you to cache different versions of content depending on the query string and on form-post parameters to a page, on browser type, or on the language of the user. And now, .NET 7 has an Output caching middleware with a sample that illustrates the usage of ASP.NET Core Output caching middleware. The application sends a Hello World! message and the current time. A different cache entry is created for each variation of the query string. If you open up the Startup.cs file of this sample, you can see how to set up Output caching. You just need to say app.UseOutputCache(); and by using the AddOutputCache, you can use some options as to what to cache and how to cache it. You can cache a given endpoint as well by just saying app.MapGet("/query", Gravatar.WriteGravatar).CacheOutput(p => p.VaryByQuery("culture"));. But it's only available in .NET 7.0 preview and not in .NET 6.0. Sébastien Ros published a custom package to NuGet that copies the code from the ASP.NET Core repository but targets 6.0. It could be done because there is nothing in this feature that requires things from .NET 7.0. And Orchard Core targets .NET 6.0., so you can have Output caching in Orchard Core! But how can you do that? Let's say you add a new module to Orchard Core and reference the Preview.OutputCaching NuGet. Now you have to modify the Startup.cs file of your module. The code is very simple, in the ConfigureServices, we call AddOutputCache, and in the Configure we say UseOutputCache. But there are lots of options to configure policies and roles. So, by default when you use AddOutputCache, it doesn't cache anything until you tell what to cache (like a route, an action, path, etc.). By calling the options.AddBasePolicy(build => { });, it will just enable the default policy on everything, which is to cache everything. But only if it's a GET request and only if the user is unauthenticated. Now let's try out this feature! Open up the homepage of your site and check the Network tab of the DevTools window when using Chrome. Here you can see a new Response Header called age, with a value of 9. The age header contains the time in seconds the object was in a proxy cache. This means this is a response from the cache, and the cached value is from 9 seconds ago. The default cache, in this case, was 1 minute, after 1 minute it got a fresh entry, and by refreshing this page you can see the increasing value of the age header. After it reaches 60, the counter will start from 0 again. Interested in how to customize Output caching or maybe you would like to help the community build a module for Orchard Core that provides Output caching? Then check out this recording on YouTube for more! News from the community Orchard Dojo Newsletter Lombiq's Orchard Dojo Newsletter has 343 subscribers! We have started this newsletter to inform the community around Orchard of the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post is published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this Orchard meeting!

Cache Failover and Shared options, YesSql updates - This week in Orchard (26/11/2021)

Huge YesSql updates, new cache failover and shared options, Media Library improvements, and a new site running on Orchard Core! Do you want to know more? Then don't forget to check out our current post! Orchard Core updates YesSql updates YesSql has updates for the following drivers: MySqlConnector 2.0, Npgsql 6.0, Microsoft.Data.Sqlite 6.0. The Npgsql 6.0 has breaking changes in terms of date and time serialization. The breaking change is in the way it handles time stamps and date-time storage and the type of column that it stores them into. The Microsoft.Data.Sqlite is on 6.0, which contains the SQLite Connection Pooling, so it's pooling SQLite connections now. If we check out the benchmarks for MVC, where Orchard is one of them, and it's running the About page on SQLite, and you can see that on both Windows and Linux it goes up from around 5000 requests per second to 16000 requests per second and also the latency went down. Removed beforeFolderAdded to stop multiple calls to fetch folders When you click OK on the new Media Folder name dialog, the first thing it does after creating the new folder emits beforeFolderAdded which loads the folder we are currently on. Then it emits the folderAdded, which selects the new folder (triggering a load of the new folder through the watcher). It appears that both requests are in flight at the same time, and we are seeing that occasionally the beforeFolderAdded request comes in last and then makes it appear as if the new folder has all the contents of the previously selected folder. bus.$on('addFolder', function (target, folder) { if (self.model == target) {bus.$emit('beforeFolderAdded', self.model); if (self.children !== null) { self.children.push(folder); } folder.parent = self.model; bus.$emit('folderAdded', folder); }}); So, when we create a folder, we fire the beforeFolderAdded then folderAdded both of which load contents of a folder, but there is no guarantee on the order these calls will resolve in. Occasionally, we are seeing the first call to the original folder come in second, and the new folder appears to be populated with images already. Cache Failover and Shared options Sometimes the Redis server is not available because there could be timeouts for example. What do you serve when Redis is down, and it's part of your system. Do you serve something or just wait and try again? You could say that if the cache fails then go to the database and return something from there. But at the same time, it can also be dangerous because you could expose yourself to put your site down. If you expect not to do a lot of database stuff because you have a caching layer, you can put your site down. The DefaultDynamicCacheService uses the IMemoryCache to at least prevent something if Redis is down. For example, cache the id of a requested document locally so that the memory cache is used during the FailoverRetryLatency, which is a configuration value that has a 30 seconds value by default. News from the community Dixin's Blog is running on Orchard Core If you navigate to https://weblogs.asp.net/dixin, you will find a blog that contains several interesting posts about .NET, Windows, and many more. The site is using Orchard Core, and as you may notice, it's very fast, no matter how much content it has on it. Lombiq Gulp Extensions with Stylelint Our Gulp Extensions project now also provides Sass SCSS linting with Stylelint! To use it in your Gulp JS SCSS build pipeline, just configure the corresponding SCSS targets Gulp task. Read more about how you can do that here! Orchard Dojo Newsletter Lombiq's Orchard Dojo Newsletter has 232 subscribers! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post is published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

GitHub Actions, Media Slugify - This week in Orchard (18/12/2020)

This time you could see two great demos in our post! One is about the GitHub Actions integration for Orchard Core and the other one is about a new addition for YesSql. But first, let's check out the latest improvements of Orchard Core, like the new Media Slugify feature or the Synchronization Latency Option! Orchard Core updates How to enable Razor templates in my theme? It's just a few additional lines to the Orchard Core documentation, but we thought we should mention this change because it's a very common mistake that developers would like to use Razor in their custom themes instead of Liquid but the Razor code in the cshtml files doesn't do anything. New feature to slugify media folders and files to make them SEO-friendly Let's set up your site using the Blog recipe then navigate to the admin UI of Orchard Core. Head to Configuration -> Features to find the new one, called Media Slugify, and enable it. The media slugify module slugifies new folders and files to make them SEO-friendly. Now navigate to Content -> Media Library and try to upload something to the Media Library. And let's say that the name of the file that you would like to upload is something like this is a Szép kép.jpg. You can see that the filename contains several spaces and some special chars too. If you upload this image, the feature will slugify the name of the image and the result will be this-is-a-szep-kep.jpg. And the same applies to the folder names too. Check out the following gif to see what will happen if you upload files and create a folder with special characters when the module is disabled or enabled. If you would like to read more about this new feature, this will be your page on the Orchard Core documentation. Using Docker with Orchard Core Orchard Core's source code repository includes a Dockerfile which will allow you to create your own Docker images and containers. It can be quite useful for Orchard Core developers when needing to test PR's. It allows them to deploy locally quickly in some testing environments. There is a new page in the Orchard Core documentation with examples that will be shown for that context. Docker can also be used for more complex usage (ex: production deployment) but this documentation doesn't aim to explain that in detail. For more advanced examples we strongly suggest reading docker and docker-compose documentation. Synchronization Latency Option This is about being able to set how long you are OK to wait before refreshing your document cache. Let's say you have multi-node and the document updates on one node. It will be in the Redis cache, but you don't check for the new values every request, we can just say this is the grace period for which I don't want to check the cache. Like I would only check it every second even if I have one million requests per second, one million times we will get the value from the cache, but the next one will say: OK, I need to get something to be refreshed from the Redis cache. It was set to one second by default. Check the GetInternalAsync method of the DocumentManager, where we get the SynchronizationLatency property of the DocumentOptions. You can set the values of the DocumentOption using app settings. Demos GitHub Actions GitHub Actions allows you to use service containers, so basically just loading a Docker image and exposing it as a service to your main container that runs your tests. This is basically the same as Docker Compose when you have multiple containers running concurrently. What's need is that by using the Orchard environment variables, be able to run the functional tests for each database type to make sure the CMS works on all of those. If you open up the GitHub repository of Orchard Core, you will find several yml files in the .github/workflows folder. The one you can see here is called functional_all_db.yml that runs the functional tests on all databases. The first job here will run the Cypress script called mvc:test on the latest version of Ubuntu. If you aren't familiar with Cypress and Cypress test, you could see a demo about that in this This week in Orchard post. And there are a lot more tests in the workflows folder, check them out if you are interested in running tests! To run the actions manually, we can go to the Actions tab of the GitHub repository of Orchard Core where you can see all the workflows defined in these yml files, like Release - CI, Functional Tests - all Databases, etc. Select the Functional Tests - all Databases one and then click one of the results to see the actual jobs. And you can see all the steps in the job with the time it needed to complete with detailed execution results. And there are a lot more to see and speak about here. If you would like to know more, you should definitely check out this recording on YouTube! YesSql: Fixing subclass support Let's navigate to the GitHub repository of YesSql and open the CoreTests.cs file in the test/YesSql.Test folder and find the ShouldQuerySubClasses unit test. Here you can see a Circle and a Square class, these are both inherit from Shape. After we are creating some new instances of the Circle and Shape we do some queries and say give me the Squares and Circles. The new thing is in this line: Assert.Equal(3, await session.Query<Shape, ShapeIndex>(filterType: false).CountAsync()); Here we say list all the Shape types. And there will be three of them: two Squares and one Circle. So, now you can query by the base type to get inheritance inside that and it was not working before. And in this case, the index is just to store the name of the type that you are storing, just to be sure that it's the correct type. If you would like to see the recording of this new feature, head to YouTube now! News from the community Our full Orchard Core tutorial series, the Dojo Course 3 is here! After a long wait, the new Orchard Core version of our legendary Dojo Course tutorial series is here, the Dojo Course 3! Are you a newcomer and want to learn Orchard Core from the ground up, both from a user's and a developer's perspective? Are you somewhat familiar with Orchard Core but would like to get up to speed and become an Orchard pro? Look no further, check out Dojo Course 3! Dojo Course 3 guides you from the very basics of Orchard Core all up to be able to write your own themes and modules, utilizing various APIs of Orchard. We're publishing a tutorial video every day for 40 days starting on 1 December. So, this is your 40 days of Orchard :). And now we have published every video that is about the admin UI features of Orchard Core. From video 19., we will check the structural overview of the Orchard Core source, and then we will start coding! If you are really interested in the coding part, the upcoming 20 videos are specially for you. If you're looking for our previous Orchard 1.x tutorial series check out Dojo Course 2. A new website using Orchard Core: Cornish Mining World Heritage Explore what World Heritage Site status is and why the Cornwall and west Devon mining landscapes have this globally important designation. Check out this site to see the loads of capabilities that you can achieve using the CMS. If you are interested in more websites using Orchard and Orchard Core, don't forget to visit Show Orchard. Show Orchard is a website for showing representative Orchard CMS (and now Orchard Core) websites all around the internet. It was started by Ryan Drew Burnett, but since he doesn't work with Orchard anymore, as announced earlier it is now maintained by our team at Lombiq Technologies. Orchard Dojo Newsletter Lombiq's Orchard Dojo Newsletter has 176 subscribers! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!

Distributed cache, Media crop picker - This week in Orchard (08/11/2020)

This week we will see the new IDocumentStore, which is a cacheable, committable, and cancellable document store allowing to get documents from a shared cache. And don't forget to watch a demo about how you can add an alt text and crop the images of your Media Field! Orchard Core updates Make features actions sticky while scrolling If you navigate to the admin UI of Orchard Core and head to Configuration -> Features, you will see all of the currently available features of Orchard Core. This list is now getting longer and longer, so the idea here is to use a sticky bar on scrolling for very long pages instead of the scroll to top button. The first page that gets this sticky bar is the Features page, which looks like the following now. Edit button for lists in DetailAdmin view This is a feature that was already there in Orchard 1. When you want to edit something in the admin, you can return a route to the controller that will edit an entity. Or that will display it as a list or display it as a detailed object in the admin. And when you have a list, you have two options. Either you want to show all the content of this list or you want to actually edit the list itself. And to do that, when you see a blog and you click the link of the blog in the content items, it will go to the list of blog posts. This is the DetailAdmin view. And if you actually want to edit the blog you need to click on the edit button. This feature is about adding a new button for the list and you are now not confused about clicking the link or click in the properties button. Move feeds to feature There is a new feature now in Orchard Core called Feeds. Don't forget to enable that module if you would like to have feeds capabilities on your site! Generate xml documentation (comments) for nuget packages Whatever documentation we put on the files, they were not available, because if you don't put the GenerateDocumentationFile tag then it's not generated in the XML file that contains all the documentation, it's not embedded into NuGet, and Visual Studio won't load it. You need that to export your API docs. Not even to generate documentation, just to be able to have it in the NuGet package for the IntelliSense. If you don't do the NoWarn, every public member that doesn't have an API doc would fail the build. The <NoWarn>$(NoWarn);CS1591</NoWarn> removes the warning that some public members do not have comments. Now you will have more documentation when they use the NuGet packages to build sites! Distributed cache Whenever you want some cacheable document that is stored in the storage using YesSq for instance you need to inject the IDocumentStore interface. This will use YesSql to load the document and it will be able to cache it. So, for instance, if you would like to get the site settings you can use the IDocumentStore to do that because it's stored as a document and you want to cache it. And then when you load the site settings using IDocumentStore by passing the type, you can say GetOrCreateImmutableAsync or GetOrCreateMutableAsync. Mutable meaning that when you load the site settings just to read it, you want to say I want an immutable object. And when you want to load the site settings to update it, then use the GetOrCreateMutableAsync method. The difference is in the way that it will either cache it or not and also would it take it from the cache or not, or put it back in the cache or not. Or invalidate the entry in the cache. And there is the IFileDocumentStore which has the same methods as the IDocumentStore, but it's a totally different service. This one can be used to store a document on the file system that can be also cached. But it's a different store. We use the IFileDocumentStore to store the content type definitions. Demos Media crop picker and Alt text editor Set up your site using the Blog recipe. That recipe comes with the Blog Post content type that has the Banner Image Media Field by default. Let's check out the predefined blog post content item to see the new features of the Media Field. If you select the post-bg.jpg image and click on the button with the speech bubble icon, you can set the alt text for the image. Another new button is doing a more interesting thing. If you click on the button with the target cross icon, another new modal window will open where you can select the anchor for the selected image. Using the target cross, you can easily specify the crop point of the image. If you open the preview in another window you can easily see the changes of the image in real-time. But how you can enable/disable these options? Navigate to Content -> Content Definition -> Content Types and hit Edit near the Blog Post and edit the Banner Image settings. Here you will find two new options. One is about allowing alt text and one is to allow the center cropping. These are on by default, that's why you could see the mentioned buttons when you edit the media field. And that's not all! If you would like to know more about this feature don't forget to check out this recording on YouTube! News from the community Orchard Dojo Newsletter Lombiq's Orchard Dojo Newsletter has 172 subscribers! We have started this newsletter to inform the community around Orchard with the latest news about the platform. By subscribing to this newsletter, you will get an e-mail whenever a new post published to Orchard Dojo, including This week in Orchard of course. Do you know of other Orchard enthusiasts who you think would like to read our weekly articles? Tell them to subscribe here! If you are interested in more news around Orchard and the details of the topics above, don't forget to check out the recording of this week's Orchard meeting!