MinCMS is an S3-backed minimal content management system (CMS) with integrated dashboard
2.5K
MinCMS is a minimal, self-hosted content management system backed by S3-compatible storage. Upload, organize, and share files through a clean REST API and a modern React dashboard — no traditional database required.
MinCMS stores everything (files and metadata) in any S3-compatible bucket — AWS S3, Less3, MinIO, Wasabi, Backblaze B2, and more — so you keep full control of your data.
Clone the repository
git clone https://github.com/jchristn/MinCMS.git
cd MinCMS/docker
Configure your S3 credentials (required before starting)
Edit docker/server/mincms.json and fill in your S3 settings. The server will fail to start if these are not configured.
AWS S3:
{
"S3": {
"AccessKey": "your-access-key",
"SecretKey": "your-secret-key",
"Bucket": "your-bucket-name",
"Region": "us-east-1"
}
}
MinIO or other S3-compatible services — also set EndpointUrl and RequestStyle:
{
"S3": {
"AccessKey": "minioadmin",
"SecretKey": "minioadmin",
"Bucket": "my-bucket",
"Region": "us-east-1",
"EndpointUrl": "http://localhost:9000",
"UseSsl": false,
"RequestStyle": "PathStyle"
}
}
Important: You must update
docker/server/mincms.jsonwith valid S3 credentials before runningdocker compose up. The configuration file is mounted into the container at startup — changes made after the container is running require a restart (docker compose restart mincms-server).
Start the stack
docker compose up -d
Access the services
| Service | URL |
|---|---|
| API | http://localhost:8200 |
| Dashboard | http://localhost:8300 |
Log into the dashboard using the default API key: mincmsadmin
Tip: Change the default access key in
mincms.jsonbefore deploying to production.
MinCMS consists of two services:
| Component | Technology | Description |
|---|---|---|
| MinCms.Server | .NET 10 | REST API for managing collections & files |
| MinCms.Dashboard | React 19 | Web UI for browsing and managing content |
All data — both file content and collection metadata — is stored in your S3 bucket. There is no separate database to manage, back up, or migrate.
┌──────────────┐ ┌──────────────┐ ┌──────────────────┐
│ Dashboard │────> │ API Server │────> │ S3-Compatible │
│ (React 19) │ │ (.NET 10) │ │ Storage │
└──────────────┘ └──────────────┘ └──────────────────┘
:8300 :8200 AWS / Less3 / MinIO
All API endpoints (except health checks and public downloads) require authentication via x-api-key header or Authorization: Bearer <key>.
| Method | Endpoint | Description |
|---|---|---|
GET | /v1.0/collections | List all collections |
POST | /v1.0/collections | Create a new collection |
GET | /v1.0/collections/{slug} | Get collection details |
DELETE | /v1.0/collections/{slug} | Delete collection & files |
| Method | Endpoint | Description |
|---|---|---|
GET | /v1.0/collections/{slug}/files | List files |
POST | /v1.0/collections/{slug}/files | Upload a file |
GET | /v1.0/collections/{slug}/files/{fileName} | Get file metadata |
DELETE | /v1.0/collections/{slug}/files/{fileName} | Delete a file |
DELETE | /v1.0/collections/{slug}/files | Delete multiple files |
| Method | Endpoint | Description |
|---|---|---|
GET | /download/{slug} | Browsable file listing |
GET | /download/{slug}/{fileName} | Download a file |
GET | /download/{slug}/sitemap.xml | XML sitemap for SEO |
MinCMS is configured through mincms.json and environment variables. Environment variables take precedence, making it easy to override settings per deployment.
{
"Rest": {
"Hostname": "localhost",
"Port": 8200,
"Ssl": false
},
"S3": {
"AccessKey": "",
"SecretKey": "",
"Bucket": "",
"Region": "",
"EndpointUrl": null,
"UseSsl": true,
"RequestStyle": "VirtualHosted"
},
"AccessKeys": [
{
"Name": "Admin",
"Key": "mincmsadmin"
}
],
"Logging": {
"ConsoleLogging": true,
"MinimumSeverity": 1,
"EnableColors": false,
"FileLogging": true,
"LogDirectory": "./logs/",
"LogFilename": "mincms.log",
"IncludeDateInFilename": true,
"Servers": []
}
}
| Variable | Overrides | Description |
|---|---|---|
WEBSERVER_HOSTNAME | Rest.Hostname | Webserver listen hostname |
WEBSERVER_PORT | Rest.Port | Webserver listen port |
S3_ACCESS_KEY | S3.AccessKey | S3 access key |
S3_SECRET_KEY | S3.SecretKey | S3 secret key |
S3_BUCKET | S3.Bucket | S3 bucket name |
S3_REGION | S3.Region | AWS region |
S3_ENDPOINT | S3.EndpointUrl | Custom S3-compatible endpoint URL |
S3_USE_SSL | S3.UseSsl | Use SSL for S3 (true/false) |
S3_REQUEST_STYLE | S3.RequestStyle | VirtualHosted or PathStyle |
| Variable | Default | Description |
|---|---|---|
MINCMS_SERVER_URL | http://localhost:8200 | Server URL for the login page |
MINCMS_LOGO_FILE | /assets/logo.png | Login page logo |
MINCMS_LOGO_NOTEXT_FILE | /assets/logo-no-text.png | Top bar logo |
MINCMS_FAVICON_FILE | /assets/logo-no-text.ico | Browser favicon |
Environment variable (if set and non-empty)
└─ overrides → mincms.json value
└─ overrides → built-in default
cd src/MinCms.Server
dotnet build
dotnet run
cd dashboard
npm install
npm run dev
Multi-platform images (linux/amd64 and linux/arm64) can be built with the provided scripts:
build-server.bat v0.1.0
build-dashboard.bat v0.1.0
Contributions are welcome! Here's how to get involved:
MinCMS is released under the MIT License. You are free to use, modify, and distribute it.
See CHANGELOG.md for release notes.
Content type
Image
Digest
sha256:cffba5a91…
Size
120.3 MB
Last updated
1 day ago
docker pull jchristn77/mincms-server