[{"data":1,"prerenderedAt":845},["ShallowReactive",2],{"page-/blog/cloud_notes/deploy_blog_on_azure_storage":3},{"id":4,"title":5,"body":6,"date":837,"description":17,"extension":838,"meta":839,"navigation":840,"path":841,"seo":842,"stem":843,"__hash__":844},"content/cloud_notes/deploy_blog_on_azure_storage.md","Deploy Blog on Azure Storage",{"type":7,"value":8,"toc":828},"minimark",[9,13,18,25,32,37,44,47,50,53,56,75,85,100,107,115,119,126,129,135,140,157,161,168,177,188,197,201,209,249,253,256,260,267,274,278,293,296,310,316,330,350,354,357,361,377,380,388,398,404,410,414,421,433,438,442,448,771,774,778,785,792,798,802,824],[10,11,5],"h1",{"id":12},"deploy-blog-on-azure-storage",[14,15,17],"h5",{"id":16},"using-github-action-to-build-mkdocs-and-deploy-to-azure","Using GitHub Action to build Mkdocs and deploy to Azure",[19,20,21],"p",{},[22,23,24],"strong",{},"Oct 1 2024",[19,26,27],{},[28,29],"img",{"alt":30,"src":31},"An orange cat writing a website","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Gemini_Generated_Image_hz8byghz8byghz8b.jpg",[33,34,36],"h2",{"id":35},"_0-intro","0. Intro",[19,38,39],{},[40,41,43],"a",{"href":42},"#1-setup-github-repo","Skip my complains to real deployment process",[19,45,46],{},"Several days ago, I have this new idea to setup a personal website again after abandoned my website for several years, even forgot to renew my domain. I have few experience with building my own website using Wordpress before, but consider the LAMP stack (Linux, Apache, MySQL, PHP) is a thing from ancient time, learned those back when I was still in middle school (around 10 years ago), and I just don't want to deploy another PHP website in 2024, the world don't need another internet artifact 🦕.",[19,48,49],{},"I realized that there is no need to create a dynamic content website at all, because all I wanted is a website with almost zero user interaction, even if I want to add comment function later, that could be easily done by sending an AJAX request to a serverless function run on Cloudflare Worker or Azure Functions which mean there is no need to any dynamic code on the blog site itself, also that means that I do not need to do any maintenance work on a $5 VPS.",[19,51,52],{},"On the other hand, I like that Wordpress offer a easy way to just write a blog post, the writing tool provided in Wordpress is easy to use with zero HTML gymnastics, which felt like Microsoft Word, as it should be, but I perosnally use Markdown to write a lot of documents, and Markdown can be easily rendered into HTML. So that is the logical choice for me to write blog post in.",[19,54,55],{},"So, summary all that long chat up, I need a blog stack that offer:",[57,58,59,63,66,69,72],"ul",{},[60,61,62],"li",{},"Write everything in Markdown",[60,64,65],{},"Render Markdown content into a static HTML site",[60,67,68],{},"Some form of automation, so I don't need to upload a zip everytime I write something",[60,70,71],{},"A service that serve a static website",[60,73,74],{},"Maybe a CDN service that can cache the static content being served",[19,76,77,78,84],{},"The tool I choose to use to render Markdown into static website files is ",[40,79,83],{"href":80,"rel":81},"https://www.mkdocs.org",[82],"nofollow","MkDocs",", it is quite popular and being used to host a lot of documentations of opensource projects, but there is not a lot of difference between documentation and blog 🤣.",[19,86,87,88,93,94,99],{},"I have been using ",[40,89,92],{"href":90,"rel":91},"https://developers.cloudflare.com/pages/",[82],"Cloudflare Pages"," to serve NextJS projects, and it also provide GitHub integration which provided all the necessary automation function, and there is ",[40,95,98],{"href":96,"rel":97},"https://developers.cloudflare.com/pages/framework-guides/deploy-an-mkdocs-site/",[82],"a step by step guide"," provided by Cloudflare. When this website first came online several days ago, this was my choice, and the guide is very easy to follow, with good GitHub integration, but this method come with downside too.",[19,101,102,103],{},"One of the biggest limitation is the max file size in Cloudflare Pages is 25MB.\n",[28,104],{"alt":105,"src":106},"File Size Limitation","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot1.png",[19,108,109,110,114],{},"The other thing is I do not want to be locked into one cloud provider's ecosystem.\n",[28,111],{"alt":112,"src":113},"Billing Issue","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot2.png","\nMy Cloudflare account seems to have some issue with billing, it's certainly my fault, I didn't pay the bill first, but this left a bad taste in my mouth, so I am planing to move away from the Cloudflare ecosystem and migrate to Microsoft Azure, why Azure? I don't want to use AWS and pay for Jeff Bezos' yacht 🛥️.",[33,116,118],{"id":117},"_1-setup-github-repo","1. Setup GitHub Repo",[19,120,121,122],{},"Enough of complaining, time to deploy the website. Following the Guide provided by Cloudflare, we already have a GitHub with these files.\n",[28,123],{"alt":124,"src":125},"Pre-Setup Files","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot3.png",[19,127,128],{},"If you did not setup a Cloudflare Pages site first you could follow these steps.",[19,130,131],{},[132,133,134],"em",{},"(Copied From Cloudflare Documents)",[136,137,139],"h4",{"id":138},"_1-install-mkdocs","1. Install MkDocs:",[141,142,147],"pre",{"className":143,"code":144,"language":145,"meta":146,"style":146},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pip install mkdocs\n","shell","",[148,149,150],"code",{"__ignoreMap":146},[151,152,155],"span",{"class":153,"line":154},"line",1,[151,156,144],{},[136,158,160],{"id":159},"_2-create-an-mkdocs-project","2. Create an MkDocs project:",[19,162,163,164,167],{},"Use the ",[148,165,166],{},"mkdocs new"," command to create a new application:",[141,169,171],{"className":143,"code":170,"language":145,"meta":146,"style":146},"mkdocs new \u003CPROJECT_NAME>\n",[148,172,173],{"__ignoreMap":146},[151,174,175],{"class":153,"line":154},[151,176,170],{},[19,178,179,180,183,184,187],{},"Then ",[148,181,182],{},"cd"," into your project, take MkDocs and its dependencies and put them into a ",[148,185,186],{},"requirements.txt"," file:",[141,189,191],{"className":143,"code":190,"language":145,"meta":146,"style":146},"pip freeze > requirements.txt\n",[148,192,193],{"__ignoreMap":146},[151,194,195],{"class":153,"line":154},[151,196,190],{},[136,198,200],{"id":199},"_3-create-a-github-repository","3. Create a GitHub repository:",[19,202,203,208],{},[40,204,207],{"href":205,"rel":206},"https://github.com/new/",[82],"Create a new GitHub repository",". After creating a new repository, go to your newly created project directory to prepare and push your local application to GitHub by running the following commands in your terminal:",[141,210,212],{"className":143,"code":211,"language":145,"meta":146,"style":146},"git init\ngit remote add origin https://github.com/\u003Cyour-gh-username>/\u003Crepository-name>\ngit add .\ngit commit -m \"Initial commit\"\ngit branch -M main\ngit push -u origin main\n",[148,213,214,219,225,231,237,243],{"__ignoreMap":146},[151,215,216],{"class":153,"line":154},[151,217,218],{},"git init\n",[151,220,222],{"class":153,"line":221},2,[151,223,224],{},"git remote add origin https://github.com/\u003Cyour-gh-username>/\u003Crepository-name>\n",[151,226,228],{"class":153,"line":227},3,[151,229,230],{},"git add .\n",[151,232,234],{"class":153,"line":233},4,[151,235,236],{},"git commit -m \"Initial commit\"\n",[151,238,240],{"class":153,"line":239},5,[151,241,242],{},"git branch -M main\n",[151,244,246],{"class":153,"line":245},6,[151,247,248],{},"git push -u origin main\n",[33,250,252],{"id":251},"_2-setup-azure-storage-account","2. Setup Azure Storage Account",[19,254,255],{},"Next step is to set up the Azure Storage Account which is going to host the static site. Here I assume you already have a Azure account available for use.",[136,257,259],{"id":258},"_1-create-a-storage-account-in-azure-portal","1. Create a Storage Account in Azure Portal",[19,261,262,263],{},"Click here to set up a Storage Account. The name of the account could be anything.\n",[28,264],{"alt":265,"src":266},"Create Resource","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot4.png",[19,268,269,270],{},"After the resource have been deployed you should be able to view the informations about this Storage Account.\n",[28,271],{"alt":272,"src":273},"Storage Account","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot5.png",[136,275,277],{"id":276},"_2-enable-static-website-capability","2. Enable Static Website Capability",[19,279,280,281,284,285,288,289],{},"Click on the ",[22,282,283],{},"Capabilities"," tab and select ",[22,286,287],{},"static website",".\n",[28,290],{"alt":291,"src":292},"Enable Static Website","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot6.png",[19,294,295],{},"Enable the Static Website Toggle and fill in the document path:",[57,297,298,304],{},[60,299,300,301],{},"Index document name ",[148,302,303],{},"index.html",[60,305,306,307],{},"Error document path ",[148,308,309],{},"404.html",[19,311,312],{},[28,313],{"alt":314,"src":315},"Fill info","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot7.png",[19,317,318,319,322,323,326,327],{},"After that click ",[22,320,321],{},"save",", and you should be able to see the ",[22,324,325],{},"Endpoint"," created for your static website.\n",[28,328],{"alt":325,"src":329},"https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot8.png",[19,331,332,333,336,337,340,341,345,346,349],{},"And copy the ",[22,334,335],{},"Primary endpoint"," into a browser, you should be greeted by a ",[148,338,339],{},"The requested content does not exist."," error.\n",[28,342],{"alt":343,"src":344},"The requested content does not exist","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot9.png","\nThis is because we have just configured Storage account send 404.html to user when the request page cannot be found, however we haven't upload any files into the ",[148,347,348],{},"$web"," Azure Storage container, naturally there is no 404.html in the container, so we get a Azure Error page. All good, we can keep going.",[33,351,353],{"id":352},"_3-setup-azure-deployment-credentials","3. Setup Azure deployment credentials",[19,355,356],{},"Next step we want is let GitHub Action to upload Generated static files to Azure automatically whenever there is a push in the main branch in our GitHub Repo. But we need to authorize GitHub Action to access our Azure Storage Account, so we need to setup a Azure Credential for GitHub Action.",[136,358,360],{"id":359},"_1-generate-azure-credentials-in-azure-cloud-shell","1. Generate Azure credentials in Azure Cloud Shell",[19,362,363,364,368,369,372,373],{},"We can open Azure Cloud Shell in Azure Portal by click the console button on the top right.\n",[28,365],{"alt":366,"src":367},"Open Azure Cloud Shell","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot10.png","\nThere should be a shell windows pop up at the bottom half of the screen.",[370,371],"br",{},"\nSelect PowerShell for shell program. This time we don't need to attach a storage account, because we are not going to save any data in the Cloud Shell.  After apply the setting we should be able to run Azure Cli commands in the Cloud Shell.\n",[28,374],{"alt":375,"src":376},"Azure Cloud Shell","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot11.png",[19,378,379],{},"We can generate Credential by typing in the PowerShell command.",[141,381,386],{"className":382,"code":384,"language":385},[383],"language-text","az ad sp create-for-rbac --name \"GithubAction\" --role contributor --scopes /subscriptions/\u003Csubscription-id>/resourceGroups/\u003Cgroup-name> --json-auth\n","text",[148,387,384],{"__ignoreMap":146},[19,389,390,393,394],{},[22,391,392],{},"Replace the Subscription-ID and ResourceGroup-Name with your own",", which can be retrieved from the Storage account Overview tab.\n",[28,395],{"alt":396,"src":397},"Subscription-ID and ResourceGroup-Name","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot12.png",[19,399,400,401],{},"This command should give you back a JSON credential, ",[22,402,403],{},"keep it safe!",[141,405,408],{"className":406,"code":407,"language":385},[383],"{\n    \"clientId\": \"\u003CGUID>\",\n    \"clientSecret\": \"\u003CGUID>\",\n    \"subscriptionId\": \"\u003CGUID>\",\n    \"tenantId\": \"\u003CGUID>\",\n    (...)\n}\n",[148,409,407],{"__ignoreMap":146},[136,411,413],{"id":412},"_2-save-azure-credentials-in-github-action-secrets","2. Save Azure credentials in GitHub Action secrets",[19,415,416,417],{},"Go to the GitHub Repo, in settings tab, select secrets and variables on the left side, create a new Repository secrets.\n",[28,418],{"alt":419,"src":420},"create a new Repository secrets","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot13.png",[19,422,423,424,426,427,430,432],{},"Save the JSON credential create before into GitHub Repo.",[370,425],{},"\nName: ",[148,428,429],{},"AZURE_CREDENTIALS",[370,431],{},"\nSecert:",[141,434,436],{"className":435,"code":407,"language":385},[383],[148,437,407],{"__ignoreMap":146},[33,439,441],{"id":440},"_4-create-a-github-action-file-in-your-project","4. Create a GitHub Action File in your Project",[19,443,444,445,447],{},"Create a file in the your Project Folder.",[370,446],{},"\n.github/workflows/azure-publish.yml",[141,449,453],{"className":450,"code":451,"language":452,"meta":146,"style":146},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","name: Azure Preview Prod\non:\n  push:\n    # This Action will run when there is a push to main branch\n    branches: [ \"main\" ]\n  workflow_dispatch:\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      # checkout the project repo\n      - uses: actions/checkout@v4\n      # use python 3.12\n      - uses: actions/setup-python@v5\n        with:\n          python-version: '3.12'\n          cache: 'pip' # caching pip dependencies\n      # Install Pip Requirements\n      - run: pip install -r requirements.txt\n      # MkDocs Build markdown into static files\n      - run: mkdocs build --site-dir ./site -v\n      # Login using Azure Credentials\n      - uses: Azure/login@v2.2.0\n        with:\n          creds: ${{ secrets.AZURE_CREDENTIALS }}\n      # Upload Builded file to Azure Storage Account\n      - name: Upload to blob storage\n        uses: Azure/cli@v2.1.0\n        with:\n          inlineScript: |\n            az storage blob delete-batch --account-name \u003Cstorage-account-name> -s '$web' --pattern \"*\"\n            az storage blob upload-batch --account-name \u003Cstorage-account-name> -d '$web' -s ./site\n","yaml",[148,454,455,469,478,485,491,513,520,528,536,547,555,561,575,581,593,601,618,637,643,656,662,674,680,692,699,710,716,729,740,747,759,765],{"__ignoreMap":146},[151,456,457,461,465],{"class":153,"line":154},[151,458,460],{"class":459},"swJcz","name",[151,462,464],{"class":463},"sMK4o",":",[151,466,468],{"class":467},"sfazB"," Azure Preview Prod\n",[151,470,471,475],{"class":153,"line":221},[151,472,474],{"class":473},"sfNiH","on",[151,476,477],{"class":463},":\n",[151,479,480,483],{"class":153,"line":227},[151,481,482],{"class":459},"  push",[151,484,477],{"class":463},[151,486,487],{"class":153,"line":233},[151,488,490],{"class":489},"sHwdD","    # This Action will run when there is a push to main branch\n",[151,492,493,496,498,501,504,507,510],{"class":153,"line":239},[151,494,495],{"class":459},"    branches",[151,497,464],{"class":463},[151,499,500],{"class":463}," [",[151,502,503],{"class":463}," \"",[151,505,506],{"class":467},"main",[151,508,509],{"class":463},"\"",[151,511,512],{"class":463}," ]\n",[151,514,515,518],{"class":153,"line":245},[151,516,517],{"class":459},"  workflow_dispatch",[151,519,477],{"class":463},[151,521,523,526],{"class":153,"line":522},7,[151,524,525],{"class":459},"jobs",[151,527,477],{"class":463},[151,529,531,534],{"class":153,"line":530},8,[151,532,533],{"class":459},"  build",[151,535,477],{"class":463},[151,537,539,542,544],{"class":153,"line":538},9,[151,540,541],{"class":459},"    runs-on",[151,543,464],{"class":463},[151,545,546],{"class":467}," ubuntu-latest\n",[151,548,550,553],{"class":153,"line":549},10,[151,551,552],{"class":459},"    steps",[151,554,477],{"class":463},[151,556,558],{"class":153,"line":557},11,[151,559,560],{"class":489},"      # checkout the project repo\n",[151,562,564,567,570,572],{"class":153,"line":563},12,[151,565,566],{"class":463},"      -",[151,568,569],{"class":459}," uses",[151,571,464],{"class":463},[151,573,574],{"class":467}," actions/checkout@v4\n",[151,576,578],{"class":153,"line":577},13,[151,579,580],{"class":489},"      # use python 3.12\n",[151,582,584,586,588,590],{"class":153,"line":583},14,[151,585,566],{"class":463},[151,587,569],{"class":459},[151,589,464],{"class":463},[151,591,592],{"class":467}," actions/setup-python@v5\n",[151,594,596,599],{"class":153,"line":595},15,[151,597,598],{"class":459},"        with",[151,600,477],{"class":463},[151,602,604,607,609,612,615],{"class":153,"line":603},16,[151,605,606],{"class":459},"          python-version",[151,608,464],{"class":463},[151,610,611],{"class":463}," '",[151,613,614],{"class":467},"3.12",[151,616,617],{"class":463},"'\n",[151,619,621,624,626,628,631,634],{"class":153,"line":620},17,[151,622,623],{"class":459},"          cache",[151,625,464],{"class":463},[151,627,611],{"class":463},[151,629,630],{"class":467},"pip",[151,632,633],{"class":463},"'",[151,635,636],{"class":489}," # caching pip dependencies\n",[151,638,640],{"class":153,"line":639},18,[151,641,642],{"class":489},"      # Install Pip Requirements\n",[151,644,646,648,651,653],{"class":153,"line":645},19,[151,647,566],{"class":463},[151,649,650],{"class":459}," run",[151,652,464],{"class":463},[151,654,655],{"class":467}," pip install -r requirements.txt\n",[151,657,659],{"class":153,"line":658},20,[151,660,661],{"class":489},"      # MkDocs Build markdown into static files\n",[151,663,665,667,669,671],{"class":153,"line":664},21,[151,666,566],{"class":463},[151,668,650],{"class":459},[151,670,464],{"class":463},[151,672,673],{"class":467}," mkdocs build --site-dir ./site -v\n",[151,675,677],{"class":153,"line":676},22,[151,678,679],{"class":489},"      # Login using Azure Credentials\n",[151,681,683,685,687,689],{"class":153,"line":682},23,[151,684,566],{"class":463},[151,686,569],{"class":459},[151,688,464],{"class":463},[151,690,691],{"class":467}," Azure/login@v2.2.0\n",[151,693,695,697],{"class":153,"line":694},24,[151,696,598],{"class":459},[151,698,477],{"class":463},[151,700,702,705,707],{"class":153,"line":701},25,[151,703,704],{"class":459},"          creds",[151,706,464],{"class":463},[151,708,709],{"class":467}," ${{ secrets.AZURE_CREDENTIALS }}\n",[151,711,713],{"class":153,"line":712},26,[151,714,715],{"class":489},"      # Upload Builded file to Azure Storage Account\n",[151,717,719,721,724,726],{"class":153,"line":718},27,[151,720,566],{"class":463},[151,722,723],{"class":459}," name",[151,725,464],{"class":463},[151,727,728],{"class":467}," Upload to blob storage\n",[151,730,732,735,737],{"class":153,"line":731},28,[151,733,734],{"class":459},"        uses",[151,736,464],{"class":463},[151,738,739],{"class":467}," Azure/cli@v2.1.0\n",[151,741,743,745],{"class":153,"line":742},29,[151,744,598],{"class":459},[151,746,477],{"class":463},[151,748,750,753,755],{"class":153,"line":749},30,[151,751,752],{"class":459},"          inlineScript",[151,754,464],{"class":463},[151,756,758],{"class":757},"s7zQu"," |\n",[151,760,762],{"class":153,"line":761},31,[151,763,764],{"class":467},"            az storage blob delete-batch --account-name \u003Cstorage-account-name> -s '$web' --pattern \"*\"\n",[151,766,768],{"class":153,"line":767},32,[151,769,770],{"class":467},"            az storage blob upload-batch --account-name \u003Cstorage-account-name> -d '$web' -s ./site\n",[19,772,773],{},"This file defined a GitHub Action workflow which will trigger automatically whenever there is update pushed to the main branch.",[33,775,777],{"id":776},"_5-final-step-push-your-changes-to-github","5. Final Step: Push your changes to GitHub",[19,779,780,781],{},"Once your push the changes to GitHub Repo, the action we defined in the file above should be automatically be triggered and start the workflow.\n",[28,782],{"alt":783,"src":784},"Triggered Workflow","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot14.png",[19,786,787,788],{},"Wait around 1 mins. Open the Endpoint Url we got in Step 2, now we should be able to see the website we just deployed on Azure using GitHub Action! 🤩🥳\n",[28,789],{"alt":790,"src":791},"Working Website","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Screenshot15.png",[19,793,794],{},[28,795],{"alt":796,"src":797},"Cat with Cola","https://static-blog.tingouw.com/cloud_notes/deploy_blog_on_azure_storage/Gemini_Generated_Image_rue7g9rue7g9rue7.jpg",[33,799,801],{"id":800},"references","References",[57,803,804,810,817],{},[60,805,806],{},[40,807,809],{"href":96,"rel":808},[82],"MkDocs | Cloudflare Pages docs",[60,811,812],{},[40,813,816],{"href":814,"rel":815},"https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blob-static-website",[82],"Static website hosting in Azure Storage",[60,818,819],{},[40,820,823],{"href":821,"rel":822},"https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-static-site-github-actions?tabs=userlevel",[82],"Use GitHub Actions workflow to deploy your static website in Azure Storage",[825,826,827],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}",{"title":146,"searchDepth":221,"depth":221,"links":829},[830,831,832,833,834,835,836],{"id":35,"depth":221,"text":36},{"id":117,"depth":221,"text":118},{"id":251,"depth":221,"text":252},{"id":352,"depth":221,"text":353},{"id":440,"depth":221,"text":441},{"id":776,"depth":221,"text":777},{"id":800,"depth":221,"text":801},"2024-10-1","md",{},true,"/cloud_notes/deploy_blog_on_azure_storage",{"title":5,"description":17},"cloud_notes/deploy_blog_on_azure_storage","toiESUOVNYG9S42bK8X5HZwL6nMlCVAL7joEbaNG83c",1776777282626]