🌕 Moonglade

Build Status

The .NET Core blog system of edi.wang that runs on Microsoft Azure. Enable most common blogging features including Posts, Comments, Categories, Archive, Tags, Pages and Friendlink.


🛠 Build and Run

The system design does not couple with Azure, but the blog works best on Azure. Every part of the system, like Authentication and Image Storage, can be configured to use non-Azure options.

Tools Alternative
.NET Core 3.1 SDK N/A
Visual Studio 2019 Visual Studio Code
Azure SQL Database SQL Server 2019 / LocalDB (Dev Only)

Setup Database

Development Production
Create an SQL Server 2019 LocalDB database. e.g. moonglade Create an Azure SQL Database or a SQL Server 2019 database. e.g. moonglade-production
Update the MoongladeDatabase as your database connection string in appsettings.Development.json Set environment variable: ConnectionStrings__MoongladeDatabase as your connection string.
Connection String Example

If you are deploying to Azure App Service, you can set the connection string in the Configuration blade.

"MoongladeDatabase": "Server=(localdb)\\MSSQLLocalDB;Database=moonglade;Trusted_Connection=True;"

🔨 Build Source

Build and run ./src/Moonglade.sln

⚙ Configuration

Below section discuss system settings in appsettings.[env].json. For blog settings, please use “/admin/settings” UI.

For production, it is strongly recommended to use Environment Variables over appsetting.json file.

🛡 Authentication

Azure Active Directory (Preferred)

"Authentication": {
  "Provider": "AzureAD",
  "AzureAd": {
    "Domain": "{YOUR-VALUE}",
    "TenantId": "{YOUR-VALUE}",
    "ClientId": "{YOUR-VALUE}",

Local Account (Alternative)

Set Authentication:Provider to "Local" and assign a pair of username and password.

Password is not encrypted, use it at your own risk.

"Authentication": {
  "Provider": "Local",
  "Local": {
    "Username": "admin",
    "Password": "admin123",

🖼 Image Storage

AppSettings:ImageStorage controls how blog post images are stored.

Azure Blob Storage (Preferred)

You need to create an Azure Blob Storage with container level permission.

"Provider": "azurestorage"
"AzureStorageSettings": {
  "ConnectionString": "YOUR CONNECTION STRING",
  "ContainerName": "YOUR CONTAINER NAME"

📂 File System (Alternative)

"Provider": "filesystem",
"FileSystemSettings": {
  "Path": "${basedir}\\UploadedImages"

The Path can be relative or absolute. "$\{basedir\}" represents the website’s current directory. Storing images files under website directory is NOT recommended.


If GetImageByCDNRedirect is set to true, the blog will get images from client browser using a 302 redirect. This is especially useful when you have a CDN for your image resources.

"CDNSettings": {
    "GetImageByCDNRedirect": true,
    "CDNEndpoint": "https://yourendpoint.azureedge.net/moonglade-images"

📧 Email Notification

If you need email notification for new comments, new replies and pingbacks, you have to setup the Moonglade.Notification API first. See https://github.com/EdiWang/Moonglade.Notification for instructions.

"Notification": {
  "Enabled": true,
  "ApiEndpoint": "{PROD-ENV-VARIABLE}",

🖥 System Setttings

Key Data Type Description
Editor string HTML / Markdown
CaptchaSettings:ImageWidth int Pixel Width of Captcha Image
CaptchaSettings:ImageHeight int Pixel Height of Captcha Image
PostAbstractWords int How may words to show in post list abstract
ImageCacheSlidingExpirationMinutes int Time for cached images to expire
EnforceHttps bool Force website use HTTPS
AllowExternalScripts bool If CSP should enable external JavaScript links
AllowScriptsInCustomPage bool Allow JavaScript in Page content or not
EnableAudit bool Enable Audit Log or not
EnablePostRawEndpoint bool Enable /meta and /content endpoint for post URL

🎉 Blog Protocols or Standards

Name Support Remark
RSS Yes  
Atom Yes  
OPML Yes  
APML No Not planned
FOAF No Under triage
BlogML No Under triage
Open Search Yes  
Pingback Yes  
Trackback No Not planned
RSD No Not planned
MetaWeblog No Not planned
Reader View Yes  

🐵 Customers

There are a few individuals already setup thier blogs using Moonglade on Azure (Global or China), Alibaba Cloud, Tencent Cloud, etc.

Just Submit PR or issue if you want your blog to be listed here