SQLite is often described as a “toy database” — and that description is both unfair and unhelpful.
SQLite is an extremely capable, well-engineered piece of software. It powers mobile apps, desktop software, embedded systems, and countless internal tools. In the right context, it’s fast, reliable, and elegant.
But Strapi is not that context.
While Strapi supports SQLite for development and testing, it is not a suitable choice for production Strapi applications. This isn’t about scale, traffic volume, or whether SQLite is “good enough”. It’s about architectural fit, operational risk, and long-term correctness.
Let’s break down why.
SQLite is an embedded database — Strapi is a server platform
SQLite is designed to be embedded. That means:
- The database lives alongside the application
- A single process controls access
- Operational concerns are deliberately minimal
- The database is not treated as an independent system
This design is a feature, not a flaw. It’s exactly why SQLite works so well for:
- Desktop applications
- Mobile apps
- Local tools
- Automated tests
- Prototypes
Strapi, however, is a long-running server application. Even in its simplest production form, a Strapi instance typically involves:
- Concurrent admin users
- Public API traffic
- Background work (cron jobs, webhooks, releases)
- Regular restarts during deployments
- Content that becomes business-critical over time
These characteristics introduce operational demands that SQLite is intentionally not designed to solve.
File-based databases introduce real operational risk
SQLite stores all data in a single file. In production environments, this becomes a liability.
As write activity increases — even modestly — SQLite relies on file-level locking. Overlapping admin actions, background tasks, and API writes can result in:
- Slow requests
- Timeouts
- Failed writes
- Intermittent, hard-to-reproduce bugs
These issues rarely show up immediately. They tend to surface gradually, once a project is live and actively used.
Restarts and deployments are another pressure point. In modern hosting environments, processes restart. Containers are replaced. Infrastructure is upgraded. When all states live in a single file, unexpected interruptions increase the risk of database corruption or an inconsistent state.
Recovering from these situations is far more fragile than with a server-based database designed for long-running workloads.
“But my site is small” is the wrong question
One of the most common arguments in favour of SQLite is that it works fine for “small” sites.
The problem is that production risk is not driven by traffic volume alone.
For CMS-driven applications like Strapi, risk comes from:
- Editorial workflows
- Content correctness
- Uptime expectations
- Deployment frequency
- The cost of data loss or corruption
A Strapi project with five editors and a modest API footprint can hit SQLite’s limits faster than a read-heavy public website.
Once content becomes the source of truth for a business, “mostly works” is no longer good enough.
Data integrity and foreign key constraints matter more than you think
Another subtle but important issue is data integrity.
SQLite is more permissive by default than databases like PostgreSQL. Historically, foreign key constraints were disabled by default, and even today, SQLite’s type system and constraint enforcement are looser than what most production teams expect.
In practice, this means:
- Invalid or inconsistent data can be written without errors
- Migrations behave differently across environments
- Bugs may remain hidden until a later database switch
- Issues surface late, when fixing them is expensive
PostgreSQL (and similar databases) enforce stricter constraints by default. They fail fast when data is incorrect, which is exactly what you want in a system managing structured content.
For Strapi projects, this difference alone is often enough reason to avoid SQLite in production.
Workarounds exist — but they miss the point
There are tools that attempt to add replication, backups, or higher availability on top of SQLite. They can be impressive pieces of engineering.
But needing to add layers of infrastructure just to make your database safe is a strong signal that you’re using the wrong tool for the job.
Strapi does not test, document, or support these setups. Adding them increases complexity, creates unclear failure modes, and pushes responsibility entirely onto the application team.
Production systems benefit from boring, well-understood foundations.
The recommended approach
For production deployments, Strapi strongly recommends using a server-based relational database, such as PostgreSQL (recommended) or MySQL/MariaDB.
These databases are designed to:
- Handle concurrent workloads safely
- Enforce data integrity consistently
- Support reliable backups and recovery
- Behave predictably during restarts and deployments
SQLite remains an excellent choice for:
- Local development
- Automated testing
- Proof-of-concept or demo environments
But once your Strapi application goes live, switching early to a production-grade database will save time, reduce risk, and avoid painful migrations later.
Want the easiest way to run Strapi with a production-ready database?
If you’re looking for a simple, low-friction way to run Strapi with a production-grade database, Strapi Cloud is the easiest option.
Strapi Cloud provisions and manages a production-ready database for you, with sensible defaults and best practices already in place. You don’t need to worry about database setup, configuration, or ongoing maintenance — everything is designed to work seamlessly with Strapi out of the box.
This allows teams to:
- Start with a production-safe database from day one
- Avoid risky SQLite-based deployments
- Focus on content modelling and application logic rather than infrastructure
- Scale confidently as usage grows
If you’d prefer to self-host, PostgreSQL or MySQL/MariaDB remain the recommended choices. But if you want the fastest path to a stable production setup, Strapi Cloud removes much of the operational overhead.
Learn more about running Strapi on Cloud: https://strapi.io/cloud
Final thought
SQLite is not “bad”. It’s just not the right tool for production Strapi applications.
Choosing infrastructure that aligns with how your system actually behaves — not how you hope it behaves — is one of the simplest ways to avoid long-term pain.
Implementation manager at Strapi.