Git Product home page Git Product logo

moonglade's Introduction

Moonglade

Build status

The blog system for https://edi.wang. Written in C# on .NET Core and runs on Microsoft Azure.

image

Features

Basic: Post, Comment, Category, Archive, Tag, Page, Friendlink

Misc: Pingback, RSS/Atom/OPML, Open Search, Reader View

Caveats

This is NOT a general purpose blog system like WordPress or other CMS. Currently it contains content "hard coded" for https://edi.wang. To make it yours, you will need to change a certain amount of code.

Build and Run

The following tools are required for development.

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

1. Create Database

Development

Create an SQL Server 2019 LocalDB database. e.g. moonglade-dev

Production

Create an Azure SQL Database or a SQL Server 2019 database. e.g. moonglade-production

2. Set Connection String

Via configuration file

Update the connection string "MoongladeDatabase" in appsettings.[env].json according to your database configuration.

Example:

"ConnectionStrings": {
  "MoongladeDatabase": "Server=(localdb)\\MSSQLLocalDB;Database=moonglade-dev;Trusted_Connection=True;"
}
Via environment variable (Recommend for production)

Set environment variable: ConnectionStrings__MoongladeDatabase to your connection string. If you are deploying to Azure App Service, you can set the connection string in the Configuration blade.

Build Source

  1. Create an "appsettings.Development.json" under "src\Moonglade.Web", this file defines development time settings such as accounts, db connections, keys, etc. It is by default ignored by git, so you will need to manange it on your own.

  2. Build and run Moonglade.sln

Configuration

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

Authentication

Configure how to sign in to admin portal.

Preferred: Azure Active Directory

Register an App in Azure Active Directory

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

Alternative: Local Account

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

Currently password is not encrypted, use it at your own risk.

"Authentication": {
  "Provider": "Local",
  "Local": {
    "Username": "{YOUR-VALUE}",
    "Password": "{YOUR-VALUE}",
  }
}

Image Storage

AppSettings:ImageStorage controls how blog post images are stored. There are 2 built-in options:

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.

CDN

If GetImageByCDNRedirect is set to true, the blog will get images from client browser using a 302 redirect, not by fetching images in backend and put into memory cache. This is especially useful when you have a CDN for your image resources, like what I did on Azure.

"CDNSettings": {
    "GetImageByCDNRedirect": true,
    "CDNEndpoint": "https://ews.azureedge.net/ediwang-images"
}

Email Notification

If you need email notification for new comments, new replies and pingbacks, you have to setup the Moonglade.Notification API first.

Setup Moonglade.Notification API

See https://github.com/EdiWang/Moonglade.Notification for instructions

Configure Moonglade

Set values in AppSettings:

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

Robots.txt

This blog generates robots.txt based on configuration. However, if there are a physical file named "robots.txt" under "wwwroot" directory, it will override the configuration based robots.txt generation.

To customize robots.txt, modify the configuration under RobotsTxt section.

Others

Key Description
Editor HTML / Markdown
CaptchaSettings:ImageWidth Pixel Width of Captcha Image
CaptchaSettings.ImageHeight Pixel Height of Captcha Image
PostSummaryWords How may words to show in post list summary
ImageCacheSlidingExpirationMinutes Time for cached images to expire
EnforceHttps Force website use HTTPS
AllowScriptsInCustomPage Allow JavaScript in Page content or not
EnableImageHotLinkProtection Prevent images from being hot link from other sites*

Due to platform limitation, image hot link prevention requires manually edit file src\Moonglade.Web\urlrewrite.xml before deployment.

FAQ

Does this blog support upgrade from a lower version?

It depends. If the database schema is same for a higer version, then the system can be deployed and override old files without problem.

Does this blog coupled with Microsoft Azure?

No, 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.

Related Projects

Below open source projects are reusable components (NuGet packages) used in my blog, and they can be used in other websites as well.

Repository Nuget
Edi.Blog.Pingback NuGet
Edi.Blog.OpmlFileWriter NuGet
Edi.Captcha.AspNetCore NuGet
Edi.ImageWatermark NuGet
Edi.Net.AesEncryption NuGet
Edi.Practice.RequestResponseModel NuGet
Edi.SyndicationFeedGenerator NuGet
Edi.TemplateEmail NuGet
Edi.WordFilter NuGet

moonglade's People

Contributors

anduin2017 avatar ediwang avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.