{"id":16358607,"url":"https://github.com/rcarmo/azure-durable-functions-node-blog-engine","last_synced_at":"2025-03-23T01:32:01.541Z","repository":{"id":38328309,"uuid":"201427050","full_name":"rcarmo/azure-durable-functions-node-blog-engine","owner":"rcarmo","description":"A simple blog engine and static site generator written as an Azure Durable Functions code sample","archived":false,"fork":false,"pushed_at":"2023-09-27T08:03:29.000Z","size":404,"stargazers_count":12,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-18T16:22:36.661Z","etag":null,"topics":["azure","azure-functions","azure-functions-v2","durable-functions","nodejs","sample","serverless","static-site-generator"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rcarmo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-08-09T08:35:56.000Z","updated_at":"2024-01-20T22:50:51.000Z","dependencies_parsed_at":"2023-02-13T04:30:44.262Z","dependency_job_id":"5caf8037-afdf-4951-bc70-f46097c3cc57","html_url":"https://github.com/rcarmo/azure-durable-functions-node-blog-engine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-durable-functions-node-blog-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-durable-functions-node-blog-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-durable-functions-node-blog-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rcarmo%2Fazure-durable-functions-node-blog-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rcarmo","download_url":"https://codeload.github.com/rcarmo/azure-durable-functions-node-blog-engine/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245044042,"owners_count":20551876,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["azure","azure-functions","azure-functions-v2","durable-functions","nodejs","sample","serverless","static-site-generator"],"created_at":"2024-10-11T02:06:14.133Z","updated_at":"2025-03-23T01:32:01.214Z","avatar_url":"https://github.com/rcarmo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# azure-durable-functions-node-blog-engine\n\nThis is an [Azure Functions][azf] sample that demonstrates how to build a static site generator with [durable functions][azdf] to take raw markup files and render them to a [static Azure website][saw]:\n\n![diagram](sampleContent/docs/internals/diagram.png)\n\nAll you need to do is upload your Markdown/Textile files to Azure storage, and they'll be rendered into a nicely formatted web site. You can even [use OneDrive to do that automatically for you][flow].\n\nThe current demo site is [here](http://acmeblogenginebfa7.z6.web.core.windows.net) (may be temporarily broken as I build this out).\n\n## Why\n\nThis was originally part of an \"ETL\" blob storage processing pipeline and intended to demonstrate how to process thousands of XML/CSV files in a scalable way and insert them into a database as they were uploaded.\n\nBut the general principle behind that kind of transformation pipeline is exactly the same as a static site generator, and handling text and image content also provides opportunity to incorporate Azure Cognitive Services and other fun things, so I turned the original pipeline into something of more general interest - i.e., a fully serverless static file generator.\n\n\u003e Incidentally, you can run this completely inside the [Azure Free Tier][azfree]!\n\n## Setup\n\nThis sample currently assumes you've performed the following provisioning actions via the Azure Portal:\n\n- Set up a NodeJS Function App (on Windows or Linux - a free tier Function App will do just fine)\n- Upgraded the associated storage account to `StorageV2 (general purpose v2)`\n- Enabled the `Static website` feature and made sure the `$web` container has public access enabled\n- Gone into Function App `Configuration` -\u003e `All Settings` -\u003e `Deployment Center` and activated `Local Git` deployment via Kudu (re-visit that pane after configuration to get the Git URL and credentials)\n\n## Contributing/Roadmap/To Do\n\nIf you feel like contributing, this is a rough roadmap/To Do list that matches what I usually need from a static file generator and some Azure-specific features that I intend to implement given time:\n\n- [ ] Integration with Cognitive Services\n- [ ] Higher-level integration with Application Insights\n- [ ] Update diagram\n- [ ] Add `renderTableActivity` to render YAML data into nice tables\n- [ ] Azure Template for automated deployment\n- [ ] List of blog posts (ordered list of everything under `/blog`)\n- [ ] Add auxiliary Azure storage table for metadata lookup and building page listings using page front matter\n- [ ] Handle blob deletion [using EventGrid](https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-event-quickstart) - **Good first contribution!**\n- [ ] Set generated blob metadata (modification time, caching, etc.) from page front matter\n- [ ] Add screenshots on how to [integrate with OneDrive using Flow/Logic Apps][flow] - **Good first contribution!**\n- [x] Flesh out example content/documentation and formatting tests\n- [x] Reformat asset links (images, stylesheets, etc.)\n- [x] Split blob storage access from rendering (`renderTemplateActivity`)\n- [x] Templating\n- [x] Image processing\n- [x] Simple rendering\n- [x] Sample content tree\n- [x] Basic engine\n\n## Monitoring\n\nSince Azure Functions is usually deployed with Application Insights enabled, you can do real-time monitoring and tracing, as well as per-activity metrics:\n\n![appinsights](sampleContent/docs/internals/appinsights.png)\n\n\n[n]: http://nodejs.org\n[azf]: https://docs.microsoft.com/en-us/azure/azure-functions/\n[azdf]: https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-overview\n[azfree]: https://azure.microsoft.com/free/\n[saw]: https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-static-website\n[flow]: https://flow.microsoft.com/en-us/galleries/public/templates/2f90b5d3-029b-4e2e-ad37-1c0fe6d187fe/when-a-file-is-uploaded-to-onedrive-copy-it-to-azure-storage-container/\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frcarmo%2Fazure-durable-functions-node-blog-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frcarmo%2Fazure-durable-functions-node-blog-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frcarmo%2Fazure-durable-functions-node-blog-engine/lists"}