SQL Server
Microsoft SQL Server 2025 on Linux - Express edition with its free production license, internal-only, one variable to accept the EULA.
One-click deploy, from $13/mo on a Miget plan.
Plenty of stacks are married to SQL Server - .NET shops, legacy line-of-business apps, vendors who only certify against MSSQL. What is less known: Microsoft licenses the Express edition for production at no cost, and SQL Server 2025 raised its ceiling to 50 GB per database. That covers a remarkable number of real workloads.
This template runs the official Linux container (mcr.microsoft.com/mssql/server:2025) internal-only - databases never get a public domain - with data on a persistent volume. Two variables: an explicit ACCEPT_EULA=Y (your acceptance, not baked in) and the sa password.
Need Standard or Enterprise? Set MSSQL_PID to your licensed edition - the container model is bring-your-own-license, and setting the PID is the attestation. Developer editions stay out of production; this template defaults to the edition that is actually free there.
Upstream project: Microsoft SQL Server 2025
#what you get
- Official Microsoft image, SQL Server 2025 on Linux
- Express edition: free production license, 50 GB per database
- Full T-SQL, columnstore, JSON, and the tooling ecosystem (.NET, SSMS, sqlcmd)
- Explicit EULA acceptance via variable - nothing silently agreed
- BYOL path: switch MSSQL_PID to Standard/Enterprise you already own
- Internal-only, persistent /var/opt/mssql volume, non-root container
#topology
| Service | Role | Public |
|---|---|---|
| mssql | SQL Server 2025 (:1433) | no (by design) |
#miget sizing
// this stack needs
2 GiB RAM · 10 GB disk · 1 service
Express caps its buffer pool at ~1.4 GB, so 2 GiB is the natural fit - the edition cannot use more. BYOL Standard wants the next plans up. Note: amd64 only; SQL Server has no arm64 story at all.
Hobby - recommended fit
$13/mo
1 vCPU · 2 GiB · 50 GiB disk
Headroom for your own apps: 2 GiB at $19/mo
Professional - production
$22/mo
1 vCPU · 2 GiB · 10 GiB disk
Dedicated resources, production SLOs - plan details
One Miget plan is a fixed pool of compute - the whole stack (managed databases included) deploys inside it, and anything left over runs your other apps. No per-service or per-seat math.
#vs. the managed service
What the hosted equivalents charge, against the flat Miget plan this stack fits on. Prices as of June 2026, sources linked.
| Service | Plan | Monthly | What you get |
|---|---|---|---|
| SQL Server on Miget ★ | 2 GiB plan | $13 | this whole stack, flat - no usage meters, and room left for your own apps |
| Azure SQL Database | Standard S0 | ~$15 | 10 DTU, 250 GB - the production-recommended floor (Basic at $4.90 exists: 5 DTU / 2 GB, genuinely tiny) |
| AWS RDS for SQL Server | Express, db.t3.small | ~$34 | 2 vCPU / 2 GiB + 20 GiB storage, Single-AZ |
Honest math: tiny Azure tiers undercut self-hosting on sticker price. The case here is locality (same project network as your apps), no per-database billing, and a plan that also runs the apps.
#vs. other PaaS
Estimated monthly cost of running this exact stack (2 GiB RAM, 10 GB disk, 1 container) elsewhere, from published June 2026 rates.
| Platform | Est. monthly | Notes |
|---|---|---|
| Miget ★ | $13 flat | compose stacks first-class: one deploy, dedicated vCPU, managed Postgres/Valkey, volumes and TLS all included in the plan |
| Heroku | ~$100 | no volumes; nothing between 1 GB ($50) and 2.5 GB ($250) dynos - 2 GB containers cost far more than shown |
| DO App Platform | ~$29 | no persistent volumes - stateful containers need managed DBs/Spaces (base $5 Spaces included here) |
| Render | ~$28 | per-service instances (0.5 GB $7, 2 GB $25) - every container is its own paid service |
| Railway | ~$22 | usage-based ($10/GB RAM-mo); vCPU billed separately at $20/vCPU-mo on top |
| Fly.io | ~$13 | cheapest sticker price - but burstable shared CPUs (1/16 core; dedicated vCPUs cost ~2-3×), no compose deploys (one app per container, manual wiring), managed DBs billed extra |
Estimates assume RAM fully allocated at published on-demand rates - and sticker price isn't the whole comparison: the cheaper rows buy burstable shared CPUs, per-service wiring instead of a compose deploy, and managed databases billed separately. Heroku and DO App Platform have no persistent volumes at all - stateful stacks like this one need workarounds there.
#deploy it
On Miget
- Create a Compose Stack in app.miget.com pointing at the templates repository
- Set the stack path to
mssql -
Set the required variables:
ACCEPT_EULA, set Y to accept the Microsoft EULA - deliberate, not baked into the templateMSSQL_SA_PASSWORD, 8+ chars, 3 of 4 character classes
- Deploy. Miget layers
compose.miget.yaml(RAM, privacy, volumes, managed services) automatically
Locally first?
Every template is portable, vanilla Docker Compose - the Miget overrides are ignored locally:
git clone https://github.com/deployable-sh/stacks
cd miget-compose-templates/mssql
docker compose up -d Same files, same behavior. The template README covers connection strings and scaling notes.
#faq
Is it really legal to run SQL Server Express in production for free?
Yes - Microsoft offers a free production license for Express, linked from their own container deployment docs. The limits are technical, not legal: 50 GB per database (2025), ~1.4 GB buffer pool, up to 4 cores, no SQL Agent. The template defaults to Express for exactly this reason.
How does this compare to Azure SQL Database pricing?
Azure SQL meters compute (DTUs or vCores) plus storage per database, around the clock for always-on workloads. This stack is $13/month flat on a 2 GiB plan - and the same plan still hosts the app that talks to it. For Express-sized workloads the difference is roughly an order of magnitude.
Can I bring my own Standard or Enterprise license?
Yes - set MSSQL_PID=Standard (or Enterprise) and you attest to holding that license; the container does not validate keys. Raise the RAM in compose.miget.yaml accordingly - Standard 2025 can use up to 256 GB of buffer pool if you give it a plan that big.
How do my apps connect?
From the same Miget project: Server=mssql,1433 with the sa credentials (or better, an app login you create on first boot via MSSQL_DB/MSSQL_USER/MSSQL_PASSWORD). The instance is private with no ingress route - exactly how a database should live.
Why is there no arm64 image?
Microsoft only builds SQL Server containers for x86-64, and the old arm64 workaround (Azure SQL Edge) was retired in September 2025. If your platform nodes are amd64 - as Miget standard plans are - this is a non-issue.
Ship SQL Server today
One compose stack, 2 GiB of RAM, from $13/month flat, and it runs on your laptop with the same files.