I was playing around with F# and Suave to build a service and the first thing I usually do whenever I dive into a new language and web framework is figure out how to deploy it to a public cloud. This helps me create a pipeline so I can test things pretty quickly.
Azure has a good support for .Net languages given you are also developing on a Windows machine. I use Mac primarily for my pet projects and I didn't want to move.
You can deploy to Azure App Service using Mac but it uses IIS and Windows when deployed. I would rather prefer to run my service on Linux in Azure as that makes it easy for me to test things out on Mac and be confident that when I deploy, it works.
One way would be deploying myself to Linux VMs but it's too much of a hassle and I don't want to deal with infrastructure. Recently I saw a post about Flynn on Hacker News and thought of giving it a try. It is an Opensource PAAS that works similar to Heroku and uses the same build packs.
In this post we are going to see how to create a F# Suave Web App and deploy to Azure using Flynn.
1. Setup Flynn cluster in Azure
Flynn is pretty easy to setup on Azure (or any other public cloud it supports). They have a simple UI to guide you through and then it takes care of the rest. Follow the guide here to setup Flynn.
2.Build the F# Suave Web App
We will use Ionide to create our project. Go ahead and create a directory e.g.
~/Projects/SuaveBootstrapFlynn and open it in VSCode. Open the Command Palette using ⌘⇧P and search for
F#: New Project and create the project with the name
Suave dependency. Open the
paket.dependencies and make sure it looks like as follow
source https://www.nuget.org/api/v2 nuget FAKE nuget FSharp.Core nuget Suave
Let's also add
SuaveBootstrapFlynn/paket.references which will take care of adding the dependencies references in your
Let's build a simple web app using Suave that outputs some HTML. Edit
SuaveBootsrapFlynn/SuaveBootstrapFlynn.fs as follows
This is pretty simple if you are already familiar with Suave. We just get the
PORT from the environment variables and start the server at that port else we start with port
8080. There is only one route for main page which prints the current time.
3. Setting up for deployment
Make sure have have initialized the project with Git. In terminal run the following command to create a Flynn app, which also adds remote git repository for deployment.
flynn create suavebootstrapflynn
.buildpacks file in the root folder of project, it includes the repository from which to pull the Heroku build pack.
Lastly create a file named
Procfile and add the following to it
web: mono build/SuaveBootstrapFlynn.exe
The Procfile is used to declare the commands that will be run by our application. Here
mono build/SuaveBootstrapFlynn.exe will run our application once it gets deployed.
To deploy just commit your changes and then push to
git push flynn master
Wait for your application to deploy and then run
flynn info which should show the URL to your app. Go visit that and behold you have a web app running in Azure using Flynn.
You can also use Flynn to scale your app and it will take care of deploying the servers and load balancing the requests across them. You can find the complete code here.