Skip to main content

Deliver SaaS According Twelve-Factor App

If you haven't heard of the twelve-factor app, it gives us a recommendation or a methodology for developing SaaS or web apps structured into twelve items. The recommendation has some connections with microservice architecture and cloud-native environments which become more popular today. We can learn the details on its website. In this post, we will do a quick review of the twelve points.


One Codebase Multiple Deployment

We should maintain only one codebase for our application even though the application may be deployed into multiple environments like development, staging, and production. Having multiple codebases will lead to any kinds of complicated issues.


Explicitly State Dependencies

All the dependencies for running our application should be stated in the project itself. Many programming languages have a kind of file that maintains a list of the dependencies like package.json in Node.js. We should also be aware of the dependencies related to the platform that runs our application like tools that are installed globally in the operating system.

The recommendation is to avoid the use of global scope dependencies at all. We can run our application in an isolated or virtual environment. This also prevents other processes in the system from affecting our application in some ways.


Maintain Configuration in The Environment

Maintaining configuration in the environment where our application running helps us to easily maintain the structure of the configuration of our application in multiple deployments. Keeping all configurations for all environments in a variable is discouraged because that just adds complexity. We can just populate a configuration for an environment into a variable in our code in which the value can be retrieved from a variable or secret manager in our CI/CD platform.


Attachable Backing Services

Any backing services for our application like databases or queue servers should be easily attached or detached so that we can swiftly switch or replace the service, for example, from a local database to cloud-based services. It is also related to the principle of multiple deployments where backing service can vary.


Separate Code, Build, and Run

This part means we shouldn't modify the released version of our application on the fly like for quick patching of an issue. Every release is read-only, we should modify the code in the development phase and release a new version.


Stateless Processes

This is the solution for an easy scaling out of our application. If our application is stateful which means certain values like sessions are tied to the runner engine or the machine, that will hinder us from scaling out with ease.


Binding Service to Port

We should allow our application to be accessed through a certain URL with a specific port. This dispels the need for a web server to expose the services of our application.


Concurrent Processes

We can categorize jobs in our application into several types. Then, the jobs can be implemented as modules that can run concurently to each other. This will help us to scale up only certain modules that are necessary.


Fast Startup and Graceful Termination

Our application should be able to be started within seconds and maintain termination well so that there is no job or data lost, especially in a microservice environment with several concurrent workers. Applying a mechanism like create before destroy in the deployment life-cycle can be helpful.


Similarity of Environments in Development Phases

Even though there are various adapters for anything, maintaining the similarity of technology or backing services in all environments is preferable. With an adapter, we can make MySQL and PostgreSQL interchangeable but there must be trade-offs and the absence of some features. Besides the technological aspects, gaps in people/teams or development processes should be managed too. We may leverage more container-based services to let the development environment have similar technology to the production environment.


Logs as Stream of Events

We don't need to make our application to manage its logs itself. Let our application expose a stream of events unbuffered into stdout or using third-party tools that are specified to manage and analyze logs.


Administration Tasks as One-Off Processes

Administration tasks like validating data or migrating databases should be implemented as one-off processes. This can be run using the same platform that we use for developing our main application. Most platforms today support REPL implementation where we can create a script and run it directly in a terminal session.


Comments

  1. The Twelve-Factor App methodology provides essential guidelines for building scalable and maintainable SaaS applications, emphasizing the importance of environment consistency and isolated dependencies. By following these principles, developers can ensure that their apps are cloud-native, easily deployable, and resilient. If you're wondering how to create a SaaS, incorporating these practices into your development process will set a strong foundation for your application.

    ReplyDelete

Post a Comment

Popular posts from this blog

Configuring Swap Memory on Ubuntu Using Ansible

If we maintain a Linux machine with a low memory capacity while we are required to run an application with high memory consumption, enabling swap memory is an option. Ansible can be utilized as a helper tool to automate the creation of swap memory. A swap file can be allocated in the available storage of the machine. The swap file then can be assigned as a swap memory. Firstly, we should prepare the inventory file. The following snippet is an example, you must provide your own configuration. [server] 192.168.1.2 [server:vars] ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa Secondly, we need to prepare the task file that contains not only the tasks but also some variables and connection information. For instance, we set /swapfile  as the name of our swap file. We also set the swap memory size to 2GB and the swappiness level to 60. - hosts: server become: true vars: swap_vars: size: 2G swappiness: 60 For simplicity, we only check the...

Increase of Malicious Activities and Implementation of reCaptcha

In recent time, I've seen the increase of malicious activities such as login attempts or phishing emails to some accounts I manage. Let me list some of them and the actions taken. SSH Access Attempts This happened on a server that host a Gitlab server. Because of this case, I started to limit the incoming traffic to the server using internal and cloud firewall provided by the cloud provider. I limit the exposed ports, connected network interfaces, and allowed protocols. Phishing Attempts This typically happened through email and messaging platform such as Whatsapp and Facebook Page messaging. The malicious actors tried to share a suspicious link lured as invoice, support ticket, or something else. Malicious links shared Spammy Bot The actors leverage one of public endpoint on my website to send emails. Actually, the emails won't be forwarded anywhere except to my own email so this just full my inbox. This bot is quite active, but I'm still not sure what...

What's Good About Strapi, a Headless CMS

Recently, I've been revisiting Strapi as a solution for building backend systems. I still think this headless CMS can be quite useful in certain cases, especially for faster prototyping or creating common websites like company profiles or e-commerce platforms. It might even have the potential to handle more complex systems. With the release of version 5, I'm curious to know what updates it brings. Strapi has launched a new documentation page, and it already feels like an improvement in navigation and content structure compared to the previous version. That said, there's still room for improvement, particularly when it comes to use cases and best practices for working with Strapi. In my opinion, Strapi stands out with some compelling features that could catch developers' attention. I believe three key aspects of Strapi offer notable advantages. First, the content-type builder feature lets us design the data structure of an entity or database model, including field ...

Free Cloud Services from UpCloud

Although I typically deploy my development environment or experimental services on UpCloud , I do not always stay updated on its announcements. Recently, I discovered that UpCloud has introduced a new plan called the Essentials plan, which enables certain cloud services to be deployed at no cost. The complimentary services are generally associated with network components or serve as the foundation for other cloud services. This feature is particularly useful when retaining foundational services, such as a load balancer, is necessary, while tearing down all services and reconfiguring the DNS and other application settings each time we temporarily clean up infrastructure to reduce costs is undesirable.  When reviewing the service specifications of the cloud services in the Essentials plan, they appear to be very similar to those in the Development plan. The difference in service levels is unclear, but it could be related to hardware or resource allocation. For instance, the loa...

Kenshin VS The Assassin

It is an assassin versus assassin.