Plone CMS
Python-based enterprise CMS with powerful workflow capabilities.
Overview
Plone is a mature, enterprise-grade content management system built on Python and the Zope application server, first released in 2001. Known for its robust security model, sophisticated workflow engine, and multilingual capabilities, Plone has powered government websites, universities, and large corporations worldwide. Its architecture emphasizes content versioning, granular permissions, and enterprise-scale content governance that many organizations require for mission-critical web applications.
This Docker configuration combines Plone's modern headless backend with Volto, the React-based frontend that represents Plone's evolution into a decoupled CMS architecture. The plone-backend container serves content via REST API while plone-frontend delivers the user interface, enabling developers to leverage Plone's powerful content modeling and workflow capabilities with contemporary JavaScript frameworks. This separation allows for flexible deployment scenarios and better performance scaling.
Organizations with complex content approval processes, multi-departmental websites, or strict security requirements will find this stack particularly valuable. Government agencies, educational institutions, and enterprises that need detailed audit trails, advanced user role management, and compliance-ready content workflows can leverage Plone's battle-tested governance features while maintaining modern user experiences through the React frontend.
Key Features
- Advanced workflow engine with customizable content approval processes and state transitions
- Granular role-based permissions system with object-level security controls
- Built-in content versioning and rollback capabilities for all content types
- Multilingual content support with translation workflows and language-specific publishing
- TTW (Through-The-Web) development capabilities for creating content types without coding
- Zope's ZODB object database providing ACID transactions and automatic conflict resolution
- Plone Registry for centralized configuration management across the entire site
- Add-on ecosystem with hundreds of community-developed extensions and integrations
Common Use Cases
- 1Government and municipal websites requiring strict content approval workflows and accessibility compliance
- 2University and academic institution portals with department-specific content management needs
- 3Corporate intranets with complex organizational hierarchies and document approval processes
- 4Non-profit organizations managing multilingual content across different regions and languages
- 5Publishing houses and media companies requiring editorial workflows and content scheduling
- 6Healthcare and pharmaceutical companies needing audit trails and regulatory compliance features
- 7Legal firms managing case documents with granular access controls and version tracking
Prerequisites
- Docker and Docker Compose installed with at least 4GB RAM allocated to containers
- Port 3000 and 8080 available for frontend and backend services respectively
- Basic understanding of Python web applications and REST API concepts
- Familiarity with React development if planning to customize the Volto frontend
- Knowledge of Zope/ZODB concepts for advanced backend customization and add-on development
- Understanding of content management workflows and user role hierarchies for proper site administration
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 plone: 3 image: plone/plone-backend:latest4 container_name: plone5 restart: unless-stopped6 environment: 7 SITE: mysite8 CORS_ALLOW_ORIGIN: "*"9 volumes: 10 - plone_data:/data11 ports: 12 - "8080:8080"13 networks: 14 - plone-network1516 frontend: 17 image: plone/plone-frontend:latest18 container_name: plone-frontend19 restart: unless-stopped20 environment: 21 RAZZLE_API_PATH: http://plone:8080/mysite22 ports: 23 - "3000:3000"24 depends_on: 25 - plone26 networks: 27 - plone-network2829volumes: 30 plone_data: 3132networks: 33 plone-network: 34 driver: bridge.env Template
.env
1SITE=mysiteUsage Notes
- 1Docs: https://6.docs.plone.org/
- 2Frontend (Volto) at http://localhost:3000
- 3Backend REST API at http://localhost:8080/mysite
- 4Create admin: docker exec -it plone bin/adduser admin admin Manager
- 5Enterprise security: granular permissions, workflows
- 6Python/Zope ecosystem, highly customizable
Individual Services(2 services)
Copy individual services to mix and match with your existing compose files.
plone
plone:
image: plone/plone-backend:latest
container_name: plone
restart: unless-stopped
environment:
SITE: mysite
CORS_ALLOW_ORIGIN: "*"
volumes:
- plone_data:/data
ports:
- "8080:8080"
networks:
- plone-network
frontend
frontend:
image: plone/plone-frontend:latest
container_name: plone-frontend
restart: unless-stopped
environment:
RAZZLE_API_PATH: http://plone:8080/mysite
ports:
- "3000:3000"
depends_on:
- plone
networks:
- plone-network
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 plone:5 image: plone/plone-backend:latest6 container_name: plone7 restart: unless-stopped8 environment:9 SITE: mysite10 CORS_ALLOW_ORIGIN: "*"11 volumes:12 - plone_data:/data13 ports:14 - "8080:8080"15 networks:16 - plone-network1718 frontend:19 image: plone/plone-frontend:latest20 container_name: plone-frontend21 restart: unless-stopped22 environment:23 RAZZLE_API_PATH: http://plone:8080/mysite24 ports:25 - "3000:3000"26 depends_on:27 - plone28 networks:29 - plone-network3031volumes:32 plone_data:3334networks:35 plone-network:36 driver: bridge37EOF3839# 2. Create the .env file40cat > .env << 'EOF'41SITE=mysite42EOF4344# 3. Start the services45docker compose up -d4647# 4. View logs48docker 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/plone/run | bashTroubleshooting
- CORS errors in browser console: Verify CORS_ALLOW_ORIGIN environment variable matches your access URL and restart containers
- Frontend shows 'Network Error' connecting to backend: Check that RAZZLE_API_PATH points to the correct backend container URL including site path
- Database IntegrityError on content creation: Stop containers, remove plone_data volume, and restart to reset ZODB database
- adduser command fails with 'No such file': Ensure you're running the command against the backend container, not the frontend container
- Slow performance on large sites: Increase Docker memory allocation and consider configuring Zope's ZServer thread count via environment variables
- Add-on installation fails: Mount a custom buildout configuration or use the official Plone image build process for persistent add-ons
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