projects.back_all
CMSFull-StackSecurityFeatured
HelixCMS - Security-First Content Management System
Self-hosted CMS with Next.js 14, FastAPI, PostgreSQL, Redis. JWT RS256 auth, RBAC, MFA, plugin system, MinIO storage, MeiliSearch, comprehensive monitoring with Prometheus/Grafana.
Next.js 14 + TypeScript
Frontend
FastAPI + Python 3.12
Backend
PostgreSQL 16 + Redis 7
Database
JWT RS256 + RBAC + MFA
Security
projects.dataset
Self-hosted CMS with plugin system and enterprise-grade security
projects.approach
Security-first architecture with JWT RS256 auth, RBAC, MFA, plugin system, comprehensive monitoring, and production-ready deployment
projects.tech_stack
Next.js 14FastAPIPostgreSQL 16Redis 7MinIOMeiliSearchCeleryPrometheusGrafanaDockerTypeScriptPython 3.12
projects.keywords
Next.jsFastAPIPostgreSQLRedisJWTRBACMFADockerTypeScriptPython
projects.deep_dive
A security-first, self-hosted Content Management System built with modern technologies.
Technology Stack
- ▸Frontend: Next.js 14 (App Router), TypeScript, Tailwind CSS
- ▸Backend: FastAPI, Python 3.12, Pydantic v2
- ▸Database: PostgreSQL 16 (primary), Redis 7 (cache/sessions)
- ▸Storage: MinIO (S3-compatible object storage)
- ▸Search: MeiliSearch
- ▸Task Queue: Celery + Redis
- ▸Monitoring: Prometheus, Grafana, Loki, Promtail
Security Features
- ▸JWT RS256: Access tokens (15 min), refresh tokens (7 days, opaque, SHA-256 stored)
- ▸Refresh token rotation: Each use issues a new pair; reuse detection revokes the entire family
- ▸RBAC: Role-based permission checks at Nginx (UX) and FastAPI dependency (authoritative)
- ▸MFA: TOTP via pyotp, backup codes (SHA-256 hashed), mfa_pending JWT cookie
- ▸Audit log: Append-only
audit_logtable, every write operation logged - ▸Rate limiting: Nginx zones — 5 req/min auth, 120 req/min API, 60 req/min global
- ▸CSP: Strict policy, no
unsafe-eval, nounsafe-inlinein script-src - ▸Input validation: Pydantic v2 strict mode on all endpoints; MIME via magic bytes not Content-Type
- ▸Database isolation:
helix_apphas DML only (no DDL);helix_migratefor schema changes
Plugin System
- ▸ZIP-based plugins with manifest.json (slug, name, version, hooks) and
main.py - ▸JSON-RPC communication over subprocess stdin/stdout
- ▸Hooks for
content.publish,media.upload, etc. - ▸Sandboxed execution (minimal environment, 5s timeout per hook call)
Architecture
Browser
└── Nginx (port 80/443)
├── /api/auth/ → Next.js (auth route handlers)
├── /api/v1/auth/login → Backend (auth rate limit)
├── /api/v1/ → Backend (FastAPI)
├── /grafana/ → Grafana (monitoring)
├── /uploads/ → MinIO (public media)
└── / → Next.js (frontend)
Key Capabilities
- ▸Content management with rich text editor (TipTap)
- ▸Media library with optimization plugins
- ▸Taxonomy and content types
- ▸User management with roles and permissions
- ▸Webhooks for integrations
- ▸Backup and secret rotation scripts
- ▸Production-ready with TLS support