Squidex CMS
Open-source headless CMS with event sourcing and GraphQL.
Overview
Squidex is an open-source headless CMS built on .NET that implements event sourcing architecture, making it unique among content management systems. Originally created by Sebastian Stehle in 2017, Squidex stores all changes as immutable events, providing complete audit trails and the ability to replay system state at any point in time. This event-driven approach, combined with automatic GraphQL and REST API generation, makes it particularly powerful for modern application architectures requiring content versioning and real-time synchronization. This stack pairs Squidex with MongoDB 7 to provide both event storage and content persistence in a single database solution. MongoDB's document-oriented structure aligns perfectly with Squidex's flexible schema system, while its change streams enable real-time content updates across connected applications. The combination leverages MongoDB's aggregation framework for complex content queries and its horizontal scaling capabilities for growing content volumes. This configuration is ideal for development teams building headless applications, content creators managing multi-channel publishing workflows, and enterprises requiring comprehensive content audit trails. The event sourcing architecture makes this stack particularly valuable for applications needing content versioning, collaborative editing, or compliance with data governance requirements.
Key Features
- Event sourcing architecture with complete audit trail and time-travel debugging capabilities
- Auto-generated GraphQL and REST APIs from custom content schemas
- Real-time content synchronization using MongoDB change streams
- Flexible content modeling with dynamic field types and validation rules
- Built-in content versioning and draft/publish workflows
- Multi-language content support with field-level localization
- Advanced content querying using MongoDB aggregation pipelines
- Webhook system for triggering external integrations on content changes
Common Use Cases
- 1Multi-channel content publishing for websites, mobile apps, and IoT devices
- 2E-commerce platforms requiring product catalog management with price history
- 3News and media sites needing editorial workflows and content scheduling
- 4SaaS applications providing customizable user interfaces and content
- 5Enterprise content hubs managing documentation across multiple departments
- 6Digital agencies building headless websites for multiple clients
- 7Compliance-heavy industries requiring complete content change auditing
Prerequisites
- Minimum 2GB RAM available (MongoDB requires 1GB+, Squidex needs 512MB+)
- Port 5000 available for Squidex web interface access
- Valid email address and strong password for admin account setup
- Basic understanding of headless CMS concepts and API consumption
- Docker and Docker Compose installed with network creation permissions
- Sufficient disk space for MongoDB data growth and event log storage
For development & testing. Review security settings, change default credentials, and test thoroughly before production use. See Terms
docker-compose.yml
docker-compose.yml
1services: 2 squidex: 3 image: squidex/squidex:latest4 container_name: squidex5 restart: unless-stopped6 environment: 7 URLS__BASEURL: http://localhost:50008 EVENTSTORE__TYPE: MongoDb9 EVENTSTORE__MONGODB__CONFIGURATION: mongodb://mongodb10 STORE__TYPE: MongoDb11 STORE__MONGODB__CONFIGURATION: mongodb://mongodb12 IDENTITY__ADMINEMAIL: ${ADMIN_EMAIL}13 IDENTITY__ADMINPASSWORD: ${ADMIN_PASSWORD}14 ports: 15 - "5000:5000"16 depends_on: 17 - mongodb18 networks: 19 - squidex-network2021 mongodb: 22 image: mongo:723 container_name: squidex-mongodb24 volumes: 25 - mongodb_data:/data/db26 networks: 27 - squidex-network2829volumes: 30 mongodb_data: 3132networks: 33 squidex-network: 34 driver: bridge.env Template
.env
1ADMIN_EMAIL=admin@example.com2ADMIN_PASSWORD=changeme123Usage Notes
- 1Docs: https://docs.squidex.io/
- 2Access at http://localhost:5000 - login with ADMIN_EMAIL/ADMIN_PASSWORD
- 3Event sourcing: full audit trail, time travel debugging
- 4GraphQL and REST APIs auto-generated from schemas
- 5Built on .NET 8, MongoDB for storage
- 6Strong password required (min 8 chars, mixed case, numbers)
Individual Services(2 services)
Copy individual services to mix and match with your existing compose files.
squidex
squidex:
image: squidex/squidex:latest
container_name: squidex
restart: unless-stopped
environment:
URLS__BASEURL: http://localhost:5000
EVENTSTORE__TYPE: MongoDb
EVENTSTORE__MONGODB__CONFIGURATION: mongodb://mongodb
STORE__TYPE: MongoDb
STORE__MONGODB__CONFIGURATION: mongodb://mongodb
IDENTITY__ADMINEMAIL: ${ADMIN_EMAIL}
IDENTITY__ADMINPASSWORD: ${ADMIN_PASSWORD}
ports:
- "5000:5000"
depends_on:
- mongodb
networks:
- squidex-network
mongodb
mongodb:
image: mongo:7
container_name: squidex-mongodb
volumes:
- mongodb_data:/data/db
networks:
- squidex-network
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 squidex:5 image: squidex/squidex:latest6 container_name: squidex7 restart: unless-stopped8 environment:9 URLS__BASEURL: http://localhost:500010 EVENTSTORE__TYPE: MongoDb11 EVENTSTORE__MONGODB__CONFIGURATION: mongodb://mongodb12 STORE__TYPE: MongoDb13 STORE__MONGODB__CONFIGURATION: mongodb://mongodb14 IDENTITY__ADMINEMAIL: ${ADMIN_EMAIL}15 IDENTITY__ADMINPASSWORD: ${ADMIN_PASSWORD}16 ports:17 - "5000:5000"18 depends_on:19 - mongodb20 networks:21 - squidex-network2223 mongodb:24 image: mongo:725 container_name: squidex-mongodb26 volumes:27 - mongodb_data:/data/db28 networks:29 - squidex-network3031volumes:32 mongodb_data:3334networks:35 squidex-network:36 driver: bridge37EOF3839# 2. Create the .env file40cat > .env << 'EOF'41ADMIN_EMAIL=admin@example.com42ADMIN_PASSWORD=changeme12343EOF4445# 3. Start the services46docker compose up -d4748# 4. View logs49docker compose logs -fOne-Liner
Run this command to download and set up the recipe in one step:
terminal
1curl -fsSL https://docker.recipes/api/recipes/squidex/run | bashTroubleshooting
- Identity validation failed error: Ensure ADMIN_PASSWORD meets complexity requirements (8+ characters, mixed case, numbers)
- MongoDB connection timeout: Check that mongodb container is fully started before squidex attempts connection
- Port 5000 already in use: Change the host port mapping from 5000:5000 to another port like 5001:5000
- Event store initialization failed: Clear mongodb_data volume and restart containers to reset database state
- GraphQL schema not updating: Clear browser cache and wait for Squidex schema compilation to complete
- High memory usage: Monitor MongoDB memory consumption and consider setting wiredTiger cache limits
Community Notes
Loading...
Loading notes...
Download Recipe Kit
Get all files in a ready-to-deploy package
Includes docker-compose.yml, .env template, README, and license
Ad Space
Shortcuts: C CopyF FavoriteD Download