My first ASP.NET Core app on Cloud Foundry
Today I tried to deploy a .NET Core web app to a Pivotal Cloud Foundry platform that my ITQ buddy Ruurd set up for us to tinker with. The app itself is a very basic ASP.NET MVC app built with the new ASP.NET Core framework to make it cross-platform. It being cross platform makes it very easy to deploy on something like Cloud Foundry since there is no dependency on Windows or the full .NET Framework anymore.
There were some bumps along the way though and here is what I learned.
The post assumes some basic Cloud Foundry knowledge so YMMV as far as this post goes.
Before Cloud Foundry can run an app it must be able to understand how to compile and run said app. There are some default buildpacks for Java and such but there is no default buildpack for ASP.NET 5/Core. Luckily there is one available over at the Cloud Foundry community github.
This takes care of building and running the app. One thing still puzzles me. I added the buildpack to my
manifest.yml but CF did not pick up on it during the
cf push. Setting the buildpack on the push command had the desired effect:
cf push -b https://github.com/cloudfoundry-community/asp.net5-buildpack.git and CF downloaded the required components to handle my .NET Core app.
There must still be something I'm forgetting or doing different from what is expected, but it won't work if I stick the buildpack in the manifest. If anyone knows why, please enlighten me :-)
Pushing the wrong things
When I first pushed I noticed it was uploading ~8200 files. That can't be right. I forgot to add a
.cfignore file to exclude things like my
node_modules folder. It works just like a .gitignore file and so I copy-pasted my .gitignore file to a new
.cfignore file and tried again. I was down to 24 files now.
.cfignore file is an important one because uploading the installed packages resulted in all sorts of failures. My new rule of thumb is to only upload files that I would commit, nothing else, the platform will handle it.
Setting up the host
This last step took me the longest because the platform only told me that health checks were failing when the app was starting up. Documentation pointed me in the direction of the port being set dynamically.
I already had a command in my manifest which was the basic command to start the web app:
dnx web. This however uses the settings you specify in your
project.json file for the command (
server.url ... in this case).
Cloud Foundry will expose a port for you and the number can be found in the
PORT environment variable. You also need to set the IP to 0.0.0.0 since no actual binding is required (CF will take care of it for you). So the url that app is running on becomes:
The final piece is setting up the command to start the app. Since you can no longer use the
web command name from the
project.json file, we need to call the Kestrel server directly (which is what the command in your
project.json is doing) so the command we give to the platform becomes
dnx Microsoft.AspNet.Server.Kestrel server.urls=http://0.0.0.0:$PORT.
Having done all that should get you up and running with your ASP.NET 5/Core on Cloud Foundry.
- Use the correct buildpack.
- Would not stick when using the manifest file.
- Did work on the command line using
cf push -b <buildpack>.
- I don't know why.
- Add a
.cfignorefile to your project.
- Copy-Pasta of my
- Copy-Pasta of my
- Add a command to the manifest that dynamically sets the IP and port number the app is running on.
- Incorrect port results in health-check failure.
- Make use of the
$PORTenvironment variable provided by CF.
- IP address set to 0.0.0.0.