Dec 6, 2021- 3 min read
Search for customizable and scalable low-code Headless CMS
Beginning of the year saw a big adoption of blockchain technologies and there was much incentives to build a Dashboard that can track cryptocurrency prices and portfolio of digital currencies. In order to get up and running fast and cost effective I started researching for suitable Backend stack (CMS, Database, API).
Project scope was simply to provide fast user experience with Public data (currency prices) and Personalized data (collection of transactions). While I was satisfied with Frontend stack built on Vue/Nuxt, the goal was to find low-code, scalable, database driven, cloud agnostic, modular Backend stack with REST/GraphQL API access.
Public portion of site should be accessible to all while Private parts should be accessible and personalized for given user. MFA authorization, overall stack security and data privacy is a priority.
First option was to leverage existing experience and off-the-shelf solutions within WordPress ecosystem. While there were working cost-effective options, most notable limitations were only one private page/view per user, relatively slow response times, no convenient way for horizontal scaling and lack of modern client side features.
After spending fair amount of time researching various services, ended up testing two solutions: AWS Amplify and Strapi CMS.
1. AWS Amplify its a great set of high-level tools that automate deployment and configuration of many services hosted on AWS cloud. Amplify UI provides data modeling tools, database management, CMS, API deployment, user authentication, front-end development guidelines and much more.
2. Strapi is open-source, self-hosted headless CMS built on Node and React. It provides UI to create custom data models, manage API endpoints, manage content and user administration without writing any code. Can run with PostgreSQL or other databases and allows customization by modules/plugin system.
– – Unfortunately at the time of research (May 2021) Amplify’s was still in development and UI that manages data models in DynamoDB instance was not working properly (once DB services were deployed, Amplify UI could not access/modify them). Ended up running Strapi.
*Late 2021 update:
AWS Amplify just released stable version and introduced outstanding features, most notable ability to convert (Figma) UI designs to (React) components.
Strapi released version 4 with lot of improvements, most excitements are around new Plugin system.
One of the major advantages of Strapi is to use your own infrastructure to host and store data independent of hosting provider. Unlike Amplify this also means that you have to take care of each step of stack implementation. Luckily Strapi has partnered with Digital Ocean and together provided server image that could be deployed in seconds.
Server image consists of Nginx reverse proxy server, Strapi CMS, PostgreSQL database and PM2 process manager. You have to manually implement and generate SSL certificates for Nginx server but overall installation is straight-forward.
Strapi CMS codebase sits in dedicated folder and you can enable Git versioning to track customization and dependency upgrades.
Security is hardened within server stack image, I also added external security and monitoring services for Node runtime.
With built in data models for user management it was straight forward to enable user authentication and authorization. Strapi features external email provider integrations for user registration/verification and also has plugin support for AWS Cognito with SMS phone verification for 2FA.
Main advantage of Strapi is UI for designing data models and relationships between them. All of it can be easily exposed via REST or GraphQL API endpoints. For extra customization it is possible to extend each segment within Strapi’s MVC architecture with NodeJS snippets. Upgrade of Strapi’s core dependencies can be done independently of custom code, just be sure to upgrade your code to be aligned with Strapi’s core API’s changes.
Another advantage of this stack is scaling, since Database and Strapi Node core could be deployed as independent instances, it is possible to achieve horizontal scaling of both PostgreSQL and NodeJS with introduction of load-balancing.
After all we end up with low-latency statically generated PWA Frontend, easily extendible Backend, custom REST API, solid security and very low maintenance costs. We retained full control over Data storage, infrastructure hosting and UX/UI.