.NET Hosting
Push an ASP.NET Core project to GitHub and it deploys as dotnet new made it, with no Dockerfile or port code. Chajio Cloud builds it with the SDK your project targets and runs two copies on Linux, with free SSL.
$ git push origin main
▸ Detected .NET project: MyApp.csproj
▸ Detected version requirement: ^10.0
▸ Resolved .NET SDK version 10.0.402
▸ dotnet publish MyApp.csproj --runtime linux-x64
▸ Found web: ./MyApp --urls http://*:$PORT
✓ Live on 2 replicas: https://my-app.live.chajio.cloud
How it works
How we build and run your .NET app
Detect
A
.csprojfile marks a .NET app. There is no Dockerfile or start command to write.Pick the SDK
The
TargetFrameworkin your project picks the SDK:net10.0builds with the newest .NET 10 SDK. Aglobal.jsonchooses the SDK version instead, following itsrollForwardsetting.Publish
Your project is published in Release mode for Linux, restoring its NuGet packages on the way: the same output
dotnet publishgives you locally.Run
Your app starts with
--urls http://*:$PORT, so it listens on the right port with no code, and takes visitors once its health check passes.
Get ready
Getting your .NET app ready
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddHealthChecks();
var app = builder.Build();
app.MapRazorPages();
app.MapHealthChecks("/health");
app.Run();No port code needed. A Razor Pages or MVC app answers the default health check at / as it is. A Web API has nothing at /, so map /health as above and set Health check path to /health.
ASPNETCORE_FORWARDEDHEADERS_ENABLED=trueHTTPS ends before your app, so without this it sees plain http and the proxy’s address. With it, sign-in redirects, absolute links and secure cookies use https, and you see each visitor’s real IP.
static string ToNpgsql(string url)
{
var uri = new Uri(url);
var user = uri.UserInfo.Split(':', 2);
return new NpgsqlConnectionStringBuilder
{
Host = uri.Host,
Port = uri.Port > 0 ? uri.Port : 5432,
Database = uri.AbsolutePath.TrimStart('/'),
Username = Uri.UnescapeDataString(user[0]),
Password = user.Length > 1 ? Uri.UnescapeDataString(user[1]) : null,
}.ConnectionString;
}
builder.Services.AddDbContext<AppDbContext>(o =>
o.UseNpgsql(ToNpgsql(Environment.GetEnvironmentVariable("DATABASE_URL")!)));A managed database reaches your app as a postgresql:// address, which Npgsql doesn’t accept as it is. Convert it once, as here.
Going further
Works with
What you can run
Razor Pages
Deploys exactly as dotnet new webapp makes it.
ASP.NET Core MVC
Controllers and views, served the same way.
Web APIs
Minimal APIs or controllers, with a /health route.
.NET 8 and .NET 10
Both long-term-support releases, picked from your project.
EF Core + Npgsql
PostgreSQL through Entity Framework Core.
NuGet packages
Restored during the build, with no setup.
In production
Running your .NET app in production
Share data protection keys
Two copies run at once, and each makes its own keys unless told otherwise, so a form rendered by one copy and posted to the other fails with 400 Bad Request. Store the keys in your database with PersistKeysToDbContext.
Web APIs need a health route
The webapi template only maps /weatherforecast, so the default health check at / gets a 404 and the deploy never becomes ready. Add app.MapHealthChecks("/health") and point the health check at it.
Migrations, not EnsureCreated
Both copies start together on the first deploy, and two Database.EnsureCreated() calls on an empty database can crash one of them with “relation already exists”. Create your tables with EF Core migrations instead.
Two warnings you can ignore
“Failed to determine the https port for redirect” only means UseHttpsRedirection has nothing to do, because HTTPS is already handled. The warning about keys that “may not be persisted” goes once keys are shared.
Every plan
Included on every plan
2 replicas of every app
Two copies behind a load balancer, so a restart or a failed machine never takes you offline.
A managed database
PostgreSQL, MariaDB or MongoDB, with its own standby replica on another machine.
Deploy on every push
Connect GitHub once; every push to your branch builds and goes live.
One-click rollbacks
Go back to any earlier successful deployment from the Deployments tab.
Free SSL, your domain
Certificates issued and renewed for you, plus a free .live.chajio.cloud address.
Build and runtime logs
Watch builds as they run, and see what your app prints as it serves visitors.
CPU, memory and network
Metrics for every app, from the last 15 minutes to the last 30 days.
Zero-downtime deploys
A new version takes visitors only once its health check passes.
Pricing
.NET hosting plans
Free Plan
5GB DB Storage · 2GB RAM
Then $3.50/mo
- 2 vCPU
- 2 Apps
- 1 Database
- 2 App Replicas (HA)
- 2 Database Replicas (HA)
- PostgreSQL, MariaDB or MongoDB
- Deploy from GitHub
- Auto-deploy on push
- One-click rollbacks
- Deployment history
- Build & runtime logs
- CPU, RAM, disk & network metrics
- Disk usage tracking
- Environment variables
- Custom domain
- Free SSL
Growth Plan
10GB DB Storage · 2GB RAM
- 3 vCPU
- 4 Apps
- 2 Databases
- 2 App Replicas (HA)
- 2 Database Replicas (HA)
- PostgreSQL, MariaDB or MongoDB
- Deploy from GitHub
- Auto-deploy on push
- One-click rollbacks
- Deployment history
- Build & runtime logs
- CPU, RAM, disk & network metrics
- Disk usage tracking
- Environment variables
- Custom domain
- Free SSL
Business Plan
20GB DB Storage · 4GB RAM
- 4 vCPU
- 6 Apps
- 3 Databases
- 2 App Replicas (HA)
- 2 Database Replicas (HA)
- PostgreSQL, MariaDB or MongoDB
- Deploy from GitHub
- Auto-deploy on push
- One-click rollbacks
- Deployment history
- Build & runtime logs
- CPU, RAM, disk & network metrics
- Disk usage tracking
- Environment variables
- Custom domain
- Free SSL
Pro Plan
30GB DB Storage · 8GB RAM
- 8 vCPU
- 10 Apps
- 5 Databases
- 2 App Replicas (HA)
- 2 Database Replicas (HA)
- PostgreSQL, MariaDB or MongoDB
- Deploy from GitHub
- Auto-deploy on push
- One-click rollbacks
- Deployment history
- Build & runtime logs
- CPU, RAM, disk & network metrics
- Disk usage tracking
- Environment variables
- Custom domain
- Free SSL
FAQ
.NET hosting questions
The one your project targets in TargetFramework. net10.0 builds with the newest .NET 10 SDK and net8.0 with .NET 8; both have been deployed end to end. A global.json at the root of your repository chooses the SDK instead, following its rollForward setting.
No. Your app is started with --urls set to the port in PORT, so a project made with dotnet new deploys unchanged. Code that calls UseUrls with PORT still works, but isn’t needed.
The webapi template has nothing at /, so the default health check gets a 404. Add app.MapHealthChecks("/health") and set Health check path to /health.
A managed PostgreSQL database reaches your app as DATABASE_URL, a postgresql:// address. Npgsql needs Host=…;Database=… pairs instead, so convert the address once in Program.cs, as the .NET guide shows, or set ConnectionStrings__Default yourself.
No. Apps run on Linux, so they need ASP.NET Core on modern .NET. Web Forms and other .NET Framework apps have to be ported first.
Not as a managed database. Every plan includes PostgreSQL, MariaDB or MongoDB; PostgreSQL with Npgsql is the closest fit for Entity Framework Core apps.
You can start on the Free plan: free for your first month, then $3.50 a month, with 2 vCPU, 2GB RAM, 2 apps and a managed database. The Growth, Business and Pro plans add more CPU, memory, apps and databases as you grow.
Plans are priced and billed in US dollars, and you pay by card at checkout.
More App Hosting
Deploying something else?
Deploy your .NET app today
Your first month is on us, with a managed database and two replicas from day one.