{"id":100007,"date":"2024-09-01T08:05:26","date_gmt":"2024-09-01T08:05:26","guid":{"rendered":"https:\/\/martinphysics.club\/?p=100007"},"modified":"2024-09-01T08:05:26","modified_gmt":"2024-09-01T08:05:26","slug":"deploy-moonglade-blog-system-manually-on-linux-server","status":"publish","type":"post","link":"https:\/\/martinphysics.club\/?p=100007","title":{"rendered":"Deploy Moonglade Blog System Manually on Linux Server"},"content":{"rendered":"<h2><strong>Beginning&nbsp;<\/strong><\/h2>\n<p>Hello there! Recently, I&#8217;ve been thinking about moving my blog system from WordPress\/GitHub Pages to a more reliable environment. My friend&nbsp;<a title=\"Edi Wang's Blog\" href=\"https:\/\/edi.wang\" target=\"_blank\" rel=\"noopener\">Edi Wang<\/a> mentioned that his <a href=\"https:\/\/github.com\/EdiWang\/Moonglade\" target=\"_blank\" rel=\"noopener\">Moonglade Blog System<\/a> can be deployed without Azure, and I&#8217;ve been interested in his blog system for a long time. So, I decided to start my 996 deployment.<\/p>\n<h3><strong>Environment Setup:<\/strong><\/h3>\n<ul>\n<li>A server (Windows\/Linux; I chose a Vultr VPS with Ubuntu 24.04 LTS x64 for this guide)<\/li>\n<li>A domain with properly configured DNS pointing to your server<\/li>\n<li>\n<p>An already set-up database(Means ctreat database,tables can be automatically creat by Moonglade)<\/p>\n<\/li>\n<\/ul>\n<h3><strong>Some Tips:<\/strong><\/h3>\n<ul>\n<li><strong>Sever chosening<\/strong> :You can opt for an Oracle &#8216;Always Free&#8217; cloud instance for the Linux server, but the firewall settings can be quite complex.If u r looking for a cheap but reliable vps,try <a title=\"vultr aff\" href=\"https:\/\/www.vultr.com\/?ref=8538231\" target=\"_blank\" rel=\"noopener\">vultr with my aff<\/a>.I recommend a 1 CPU, 1 GB RAM server for $5\/month, which I&#8217;ve tested and found adequate for this system.<\/li>\n<li><strong>Database &amp; Domain<\/strong> : Moonglade supports multiple database systems (Microsoft SQL Server, MySQL, PostgreSQL. Please <a href=\"https:\/\/github.com\/EdiWang\/Moonglade?tab=readme-ov-file#setup-database\" target=\"_blank\" rel=\"noopener\">Check this link FYI<\/a>). Database setup is not covered in this guide. The same applies to domain registration and DNS configuration.<\/li>\n<li><strong>Why not Dockers <\/strong>\uff1aas my saids in title,<strong>an reliable environment<\/strong>.<\/li>\n<li><strong>Building Soucre Code<\/strong> : Using the&nbsp;<a href=\"https:\/\/github.com\/EdiWang\/Moonglade\/releases\" target=\"_blank\" rel=\"noopener\">Release Version<\/a> is highly recommended; &nbsp;avoid using the master branch.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2>Setp to setp deployment<\/h2>\n<hr>\n<h3>Get code and Build project<\/h3>\n<p>download the latest &#8220;<span class=\"Truncate-text text-bold\" data-view-component=\"true\">Source code<\/span><span class=\"Truncate-text\" data-view-component=\"true\">(zip)&#8221;<\/span>&nbsp;in <a href=\"https:\/\/github.com\/EdiWang\/Moonglade\/releases\">https:\/\/github.com\/EdiWang\/Moonglade\/releases<\/a> in a Linux\/Windows environment.<strong>I<\/strong> <strong>strongly recommend<\/strong> that you start <strong>compiling from the source code<\/strong>. Because every time I use the version compiled by github, strange problems will occur.<\/p>\n<p>&nbsp;If your Linux server performance is good enough, it&rsquo;s okay to build by following these steps<\/p>\n<p>Install .NET on Linux:<\/p>\n<pre class=\"language-bash\"><code>sudo apt-get update &amp;&amp; \\\n  sudo apt-get install -y dotnet-sdk-8.0<\/code><\/pre>\n<p>Move to the project source file:<\/p>\n<pre class=\"language-bash\"><code>cd Moonglade-14.8.0\\src\\Moonglade.Web<\/code><\/pre>\n<p>then build<\/p>\n<pre class=\"language-bash\"><code>dotnet publish --configuration Release -o \/path\/to\/output<\/code><\/pre>\n<p>You will find the directory in <code>\/path\/to\/output<\/code> as you set.<\/p>\n<p>or<\/p>\n<p>use Viusal Studio in Windows Build source code by urself,then install asp.net runtime on ur server<\/p>\n<pre class=\"language-bash\"><code>sudo apt-get update &amp;&amp; \\\n  sudo apt-get install -y aspnetcore-runtime-8.0<\/code><\/pre>\n<h3>Set server eniverment<\/h3>\n<p>Log in to your server,upload Moongalde (I choose <code>\/var\/www\/Moonglade<\/code> for example) and install Nginx<\/p>\n<pre class=\"language-bash\"><code>sudo apt-get update\nsudo apt-get upgrade\nsudo apt-get install nginx<\/code><\/pre>\n<p>If your server&#8217;s performance is weak and you build on another environment, you should install the .NET runtime to run Moonglade:<\/p>\n<pre class=\"language-bash\"><code>sudo apt-get update &amp;&amp; \\\n  sudo apt-get install -y aspnetcore-runtime-8.0<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h3>Test Nginx and get a SSL Cert<\/h3>\n<div class=\"group\/conversation-turn relative flex w-full min-w-0 flex-col agent-turn\">\n<div class=\"flex-col gap-1 md:gap-3\">\n<div class=\"flex max-w-full flex-col flex-grow\">\n<div class=\"min-h-[20px] text-message flex w-full flex-col items-end gap-2 break-words [.text-message+&amp;]:mt-5 overflow-x-auto whitespace-normal\" dir=\"auto\" data-message-author-role=\"assistant\" data-message-id=\"5460f113-4de2-4545-a857-bb494c169a70\">\n<div class=\"flex w-full flex-col gap-1 empty:hidden first:pt-[3px]\">\n<div class=\"markdown prose w-full break-words dark:prose-invert dark\">\n<p>Enter this command:<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre class=\"language-bash\"><code>curl http:\/\/localhost<\/code><\/pre>\n<p>If Nginx is working, you should see the Nginx welcome page, which looks like this:<\/p>\n<pre class=\"language-bash\"><code>root@vultr:~# curl http:\/\/localhost\n&lt;!DOCTYPE html&gt;\n&lt;html&gt;\n&lt;head&gt;\n&lt;title&gt;Welcome to nginx!&lt;\/title&gt;\n&lt;style&gt;\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n&lt;\/style&gt;\n&lt;\/head&gt;\n&lt;body&gt;\n&lt;h1&gt;Welcome to nginx!&lt;\/h1&gt;\n&lt;p&gt;If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.&lt;\/p&gt;\n\n&lt;p&gt;For online documentation and support please refer to\n&lt;a href=\"http:\/\/nginx.org\/\"&gt;nginx.org&lt;\/a&gt;.&lt;br\/&gt;\nCommercial support is available at\n&lt;a href=\"http:\/\/nginx.com\/\"&gt;nginx.com&lt;\/a&gt;.&lt;\/p&gt;\n\n&lt;p&gt;&lt;em&gt;Thank you for using nginx.&lt;\/em&gt;&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;\/html&gt;\nroot@vultr:~# \n<\/code><\/pre>\n<p>Try entering <code>http:\/\/{your_server_ip}<\/code> to double-check the Nginx welcome page. If you encounter a 404 or 521 error, check the firewall settings.<\/p>\n<p>now use certbot to get free SSL cert:<\/p>\n<pre class=\"language-bash\"><code>sudo apt-get install certbot python3-certbot-nginx\nsudo certbot --nginx<\/code><\/pre>\n<p>Register your email address and domain name. If your DNS is correct, this should be an easy task, and the certificate will automatically be stored on your server and configured in Nginx. Once everything is set up, configure automatic certificate updates:<\/p>\n<pre class=\"language-bash\"><code>sudo certbot renew --dry-run<\/code><\/pre>\n<p>You can use <code>curl<\/code> or a web browser to check the HTTPS status.<\/p>\n<p>&nbsp;<\/p>\n<h3>Deploy Moonglade<\/h3>\n<p>First, move to the location of the Moonglade files (or upload them to your server if you haven&#8217;t already; let&#8217;s assume the document name is &#8220;Moonglade&#8221;). Then, set up Moonglade using <code>nano<\/code>:<\/p>\n<pre class=\"language-bash\"><code>nano Moonglade\/appsettings.json<\/code><\/pre>\n<p>The configuration JSON will look like this :<\/p>\n<pre class=\"language-json\"><code>{\n  \"ConnectionStrings\": {\n    \"MoongladeDatabase\": \"Server=(localdb)\\\\MSSQLLocalDB;Database=moonglade;Trusted_Connection=True;\",\n    \"DatabaseType\": \"SqlServer\"\n  },\n  \"Authentication\": {\n    \"Provider\": \"Local\",\n    \"EntraID\": {\n      \"Instance\": \"https:\/\/login.microsoftonline.com\/\",\n      \"Domain\": \"\",\n      \"TenantId\": \"\",\n      \"ClientId\": \"\",\n      \"CallbackPath\": \"\/signin-oidc\"\n    }\n  },\n  \"ContentModerator\": {\n    \"Provider\": \"Local\",\n    \"ApiEndpoint\": \"\",\n    \"ApiKey\": \"\"\n  },\n  \"Email\": {\n    \"ApiEndpoint\": \"\",\n    \"ApiKey\": \"\",\n    \"ApiKeyHeader\": \"x-functions-key\"\n  },\n  \"ForwardedHeaders\": {\n    \"Enabled\": false,\n    \"HeaderName\": \"\",\n    \"KnownProxies\": []\n  },\n  \"ImageStorage\": {\n    \"AllowedExtensions\": [ \".png\", \".jpg\", \".jpeg\", \".gif\" ],\n    \"Provider\": \"filesystem\",\n    \"FileSystemPath\": \"C:\\\\UploadedImages\",\n    \"AzureStorageSettings\": {\n      \"ConnectionString\": \"\",\n      \"ContainerName\": \"\"\n    },\n    \"MinioStorageSettings\": {\n      \"EndPoint\": \"\",\n      \"AccessKey\": \"\",\n      \"SecretKey\": \"\",\n      \"BucketName\": \"\",\n      \"WithSSL\": false\n    }\n  },\n  \"Editor\": \"HTML\",\n  \"AllowPingbackToLocalhost\": false,\n  \"AllowPingbackFromLocalhost\": false,\n  \"AllowWebmentionToLocalhost\": false,\n  \"AllowWebmentionFromLocalhost\": false,\n  \"CacheSlidingExpirationMinutes\": {\n    \"Post\": 20,\n    \"Page\": 20,\n    \"Image\": 60,\n    \"Widget\": 30\n  },\n  \"Setup\": {\n    \"AutoDatabaseMigration\": true,\n    \"SQLScriptDownloadTimeout\": 30,\n    \"DatabaseMigrationScript\": {\n      \"SqlServer\": \"https:\/\/raw.githubusercontent.com\/EdiWang\/Moonglade\/master\/Deployment\/mssql-migration.sql\",\n      \"MySql\": \"\",\n      \"PostgreSql\": \"\"\n    }\n  },\n  \"Experimental\": {\n    \"SetLastModifiedHeaderForPages\": true,\n    \"ChinaFriendly\": true\n  },\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\",\n      \"Microsoft\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n<\/code><\/pre>\n<p>Remember to paste your database connection string into <code>\"MoongladeDatabase\"<\/code> (and manually set <code>\"DatabaseType\"<\/code> as well). Then, carefully set <code>\"ImageStoragePath\"<\/code>&mdash;I set mine to <code>\/var\/www\/MoongladeUploadedImages<\/code>. The JSON will look like this:<\/p>\n<pre class=\"language-bash\"><code>\"ImageStorage\": {\n    \"AllowedExtensions\": [ \".png\", \".jpg\", \".jpeg\", \".gif\" ],\n    \"Provider\": \"filesystem\",\n    \"FileSystemPath\": \"\/var\/www\/MoongladeUploadedImages\",\n    \"AzureStorageSettings\": {\n      \"ConnectionString\": \"\",\n      \"ContainerName\": \"\"\n    },\n    \"MinioStorageSettings\": {\n      \"EndPoint\": \"\",\n      \"AccessKey\": \"\",\n      \"SecretKey\": \"\",\n      \"BucketName\": \"\",\n      \"WithSSL\": false\n    }<\/code><\/pre>\n<p>Then, copy the files to <code>\/var\/www\/<\/code> and create the <code>UploadedImages<\/code> directory as shown in my command:<\/p>\n<pre class=\"language-bash\"><code>sudo cp -r Moonglade \/var\/www\/\nsudo mkdir \/var\/www\/MoongladeUploadedImages<\/code><\/pre>\n<p>Try to run Moonglade for the first time<\/p>\n<pre class=\"language-bash\"><code>cd \/var\/www\/Moonglade\ndotnet Moonglade.Web.dll<\/code><\/pre>\n<p>If everything goes well, you should see this in the console:<img decoding=\"async\" src=\"\/image\/img-14a0f956-0356-42fe-8044-cd4713d5b498.png\" border=\"0\" alt=\"\" width=\"1095\" height=\"392\" loading=\"lazy\"><\/p>\n<p>&nbsp;<\/p>\n<h3>Configure Nginx to Route to Moonglade<\/h3>\n<p>We need to set a port for the Moonglade service, using port 4560 as follows. Afterward, we need to set up Nginx :<\/p>\n<pre class=\"language-bash\"><code>cd \/etc\/nginx\/sites-enabld<\/code><\/pre>\n<p>Using the `ls` command, you should see only a default file in this path. You can create a new configuration file.<\/p>\n<pre class=\"language-bash\"><code>sudo nano Moonglade<\/code><\/pre>\n<p>And paste this: :<\/p>\n<pre class=\"language-bash\"><code>server {\n    listen 443 ssl;\n    server_name {your domain};\n\n    ssl_certificate \/etc\/letsencrypt\/live\/{your domain}\/fullchain.pem; # managed by Certbot\n    ssl_certificate_key \/etc\/letsencrypt\/live\/{your domain}\/privkey.pem; # managed by Certbot\n    include \/etc\/letsencrypt\/options-ssl-nginx.conf; # managed by Certbot\n    ssl_dhparam \/etc\/letsencrypt\/ssl-dhparams.pem; # managed by Certbot\n\n    location \/ {\n        proxy_pass http:\/\/localhost:4560; # .NET application port\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection keep-alive;\n        proxy_set_header Host $host;\n        proxy_cache_bypass $http_upgrade;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n\n}\nserver {\n    if ($host = {your domain}) {\n        return 301 https:\/\/$host$request_uri;\n    } # managed by Certbot\n\n    listen 80;\n    server_name {your domain};\n    return 404; # managed by Certbot\n\n}\n<\/code><\/pre>\n<p>This configuration is for HTTPS and redirects HTTP to HTTPS. Save the file, remove the default configuration, and test it.<\/p>\n<pre class=\"language-bash\"><code>sudo mv \/etc\/nginx\/sites-enabled\/default \/etc\/nginx\/sites-available\/default.backup\nsudo nginx -t\nsudo systemctl restart nginx<\/code><\/pre>\n<p>If everything goes well, you can start Moonglade in the background.<\/p>\n<pre class=\"language-bash\"><code>cd \/var\/www\/Moonglade\nsudo nohup dotnet Moonglade.Web.dll --urls \"http:\/\/localhost:4560\" &amp;<\/code><\/pre>\n<p>`nohup` will handle Moonglade well..<\/p>\n<p>&nbsp;<\/p>\n<h2>Things to note<\/h2>\n<hr>\n<h3>Shutdown Moonglade<\/h3>\n<p>Just kill it<\/p>\n<pre class=\"language-bash\"><code>pgrep -f Moonglade\nkill &lt;PID&gt;<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h3>Can&#8217;t show Captcha Code<\/h3>\n<p>So, on a Linux system, you need to install the &#8216;OpenSans-Bold&#8217; font. Download it from [this link](https:\/\/github.com\/EdiWang\/Moonglade\/tree\/master\/build) and upload it to your server. Then:<\/p>\n<pre class=\"language-bash\"><code>sudo mkdir -p \/usr\/share\/fonts\/opentype\/OpenSans\nsudo cp OpenSans-Bold.ttf \/usr\/share\/fonts\/opentype\/OpenSans\/<\/code><\/pre>\n<p>check it<\/p>\n<pre class=\"language-bash\"><code>fc-cache -fv\nfc-list | grep \"OpenSans-Bold\"\n<\/code><\/pre>\n<p>everythins go well just kill Monglade and start again.<\/p>\n<h3>Can&#8217;t upload pictures on writring post(HTTP 500)<\/h3>\n<p>Because the image storage path is set to `\/var\/www\/`, which requires root authentication to access, restart Moonglade with `sudo`.<\/p>\n<p>&nbsp;<\/p>\n<p>Wise you enjoy!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hello there! Recently, I&#8217;ve been thinking about moving my blog system from WordPress\/GitHub Pages to a more reliable environment. My friend Edi Wang mentioned that his Moonglade blog system can be deployed without Azure, and I&#8217;ve been interested in his blog system for a long time. So, I decided to start my 996 deployment.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"wpai_generated_summary":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-100007","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Deploy Moonglade Blog System Manually on Linux Server - martinphysics.club<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/martinphysics.club\/?p=100007\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Deploy Moonglade Blog System Manually on Linux Server - martinphysics.club\" \/>\n<meta property=\"og:description\" content=\"Hello there! Recently, I&#039;ve been thinking about moving my blog system from WordPress\/GitHub Pages to a more reliable environment. My friend Edi Wang mentioned that his Moonglade blog system can be deployed without Azure, and I&#039;ve been interested in his blog system for a long time. So, I decided to start my 996 deployment.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/martinphysics.club\/?p=100007\" \/>\n<meta property=\"og:site_name\" content=\"martinphysics.club\" \/>\n<meta property=\"article:published_time\" content=\"2024-09-01T08:05:26+00:00\" \/>\n<meta name=\"author\" content=\"Martin Hung\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Hung\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/martinphysics.club\\\/?p=100007#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/martinphysics.club\\\/?p=100007\"},\"author\":{\"name\":\"Martin Hung\",\"@id\":\"https:\\\/\\\/martinphysics.club\\\/#\\\/schema\\\/person\\\/85413244415fa803d502f5febc10f3c5\"},\"headline\":\"Deploy Moonglade Blog System Manually on Linux Server\",\"datePublished\":\"2024-09-01T08:05:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/martinphysics.club\\\/?p=100007\"},\"wordCount\":770,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/martinphysics.club\\\/#\\\/schema\\\/person\\\/85413244415fa803d502f5febc10f3c5\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/martinphysics.club\\\/?p=100007#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/martinphysics.club\\\/?p=100007\",\"url\":\"https:\\\/\\\/martinphysics.club\\\/?p=100007\",\"name\":\"Deploy Moonglade Blog System Manually on Linux Server - martinphysics.club\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/martinphysics.club\\\/#website\"},\"datePublished\":\"2024-09-01T08:05:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/martinphysics.club\\\/?p=100007#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/martinphysics.club\\\/?p=100007\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/martinphysics.club\\\/?p=100007#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\\\/\\\/martinphysics.club\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Deploy Moonglade Blog System Manually on Linux Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/martinphysics.club\\\/#website\",\"url\":\"https:\\\/\\\/martinphysics.club\\\/\",\"name\":\"martinphysics.club\",\"description\":\"\u7ad9\u70b9\u590d\u539f\u4e2d..\",\"publisher\":{\"@id\":\"https:\\\/\\\/martinphysics.club\\\/#\\\/schema\\\/person\\\/85413244415fa803d502f5febc10f3c5\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/martinphysics.club\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/martinphysics.club\\\/#\\\/schema\\\/person\\\/85413244415fa803d502f5febc10f3c5\",\"name\":\"Martin Hung\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\\\/\\\/martinphysics.club\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/cropped-u16851548201322649963fm26gp0.jpg\",\"url\":\"https:\\\/\\\/martinphysics.club\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/cropped-u16851548201322649963fm26gp0.jpg\",\"contentUrl\":\"https:\\\/\\\/martinphysics.club\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/cropped-u16851548201322649963fm26gp0.jpg\",\"width\":512,\"height\":512,\"caption\":\"Martin Hung\"},\"logo\":{\"@id\":\"https:\\\/\\\/martinphysics.club\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/cropped-u16851548201322649963fm26gp0.jpg\"},\"sameAs\":[\"http:\\\/\\\/martinphysics.club\"],\"url\":\"https:\\\/\\\/martinphysics.club\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Deploy Moonglade Blog System Manually on Linux Server - martinphysics.club","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/martinphysics.club\/?p=100007","og_locale":"zh_CN","og_type":"article","og_title":"Deploy Moonglade Blog System Manually on Linux Server - martinphysics.club","og_description":"Hello there! Recently, I've been thinking about moving my blog system from WordPress\/GitHub Pages to a more reliable environment. My friend Edi Wang mentioned that his Moonglade blog system can be deployed without Azure, and I've been interested in his blog system for a long time. So, I decided to start my 996 deployment.","og_url":"https:\/\/martinphysics.club\/?p=100007","og_site_name":"martinphysics.club","article_published_time":"2024-09-01T08:05:26+00:00","author":"Martin Hung","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"Martin Hung","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"7 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/martinphysics.club\/?p=100007#article","isPartOf":{"@id":"https:\/\/martinphysics.club\/?p=100007"},"author":{"name":"Martin Hung","@id":"https:\/\/martinphysics.club\/#\/schema\/person\/85413244415fa803d502f5febc10f3c5"},"headline":"Deploy Moonglade Blog System Manually on Linux Server","datePublished":"2024-09-01T08:05:26+00:00","mainEntityOfPage":{"@id":"https:\/\/martinphysics.club\/?p=100007"},"wordCount":770,"commentCount":0,"publisher":{"@id":"https:\/\/martinphysics.club\/#\/schema\/person\/85413244415fa803d502f5febc10f3c5"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/martinphysics.club\/?p=100007#respond"]}]},{"@type":"WebPage","@id":"https:\/\/martinphysics.club\/?p=100007","url":"https:\/\/martinphysics.club\/?p=100007","name":"Deploy Moonglade Blog System Manually on Linux Server - martinphysics.club","isPartOf":{"@id":"https:\/\/martinphysics.club\/#website"},"datePublished":"2024-09-01T08:05:26+00:00","breadcrumb":{"@id":"https:\/\/martinphysics.club\/?p=100007#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/martinphysics.club\/?p=100007"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/martinphysics.club\/?p=100007#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/martinphysics.club\/"},{"@type":"ListItem","position":2,"name":"Deploy Moonglade Blog System Manually on Linux Server"}]},{"@type":"WebSite","@id":"https:\/\/martinphysics.club\/#website","url":"https:\/\/martinphysics.club\/","name":"martinphysics.club","description":"\u7ad9\u70b9\u590d\u539f\u4e2d..","publisher":{"@id":"https:\/\/martinphysics.club\/#\/schema\/person\/85413244415fa803d502f5febc10f3c5"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/martinphysics.club\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":["Person","Organization"],"@id":"https:\/\/martinphysics.club\/#\/schema\/person\/85413244415fa803d502f5febc10f3c5","name":"Martin Hung","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/martinphysics.club\/wp-content\/uploads\/2026\/08\/cropped-u16851548201322649963fm26gp0.jpg","url":"https:\/\/martinphysics.club\/wp-content\/uploads\/2026\/08\/cropped-u16851548201322649963fm26gp0.jpg","contentUrl":"https:\/\/martinphysics.club\/wp-content\/uploads\/2026\/08\/cropped-u16851548201322649963fm26gp0.jpg","width":512,"height":512,"caption":"Martin Hung"},"logo":{"@id":"https:\/\/martinphysics.club\/wp-content\/uploads\/2026\/08\/cropped-u16851548201322649963fm26gp0.jpg"},"sameAs":["http:\/\/martinphysics.club"],"url":"https:\/\/martinphysics.club\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/martinphysics.club\/index.php?rest_route=\/wp\/v2\/posts\/100007","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/martinphysics.club\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/martinphysics.club\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/martinphysics.club\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/martinphysics.club\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=100007"}],"version-history":[{"count":0,"href":"https:\/\/martinphysics.club\/index.php?rest_route=\/wp\/v2\/posts\/100007\/revisions"}],"wp:attachment":[{"href":"https:\/\/martinphysics.club\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=100007"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/martinphysics.club\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=100007"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/martinphysics.club\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=100007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}