Focalboard Project Management
Focalboard Notion alternative with PostgreSQL.
Overview
Focalboard is an open-source project management and collaboration tool developed by Mattermost as an alternative to Notion, Trello, and Asana. It provides kanban boards, table views, gallery views, and calendar functionality for organizing tasks, projects, and knowledge bases. Originally created to fill the gap for teams seeking a privacy-focused, self-hosted alternative to proprietary project management tools, Focalboard combines the flexibility of Notion with the visual project management capabilities of kanban-style boards.
This deployment creates a production-ready Focalboard environment using three specialized containers: the main Focalboard application server, a dedicated PostgreSQL database (focalboard-db) for robust data storage, and an NGINX reverse proxy for optimized web serving. The PostgreSQL backend provides ACID compliance and advanced querying capabilities, making it suitable for teams with complex project hierarchies and reporting needs, while NGINX handles static asset delivery and can be configured for SSL termination and caching.
This stack is ideal for teams and organizations that need a self-hosted project management solution with enterprise-grade database reliability. Unlike simpler SQLite-based deployments, the PostgreSQL backend supports multiple concurrent users, complex queries for project analytics, and provides a solid foundation for scaling from small teams to larger organizations requiring advanced data integrity and backup capabilities.
Key Features
- Multiple project views including kanban boards, table view, gallery view, and calendar for versatile project visualization
- PostgreSQL backend with ACID compliance for data integrity and support for complex project queries and analytics
- Real-time collaboration with live updates across team members viewing the same boards
- Customizable card properties and templates for standardizing project workflows across teams
- NGINX reverse proxy setup enabling optimized static asset delivery and SSL termination configuration
- Built-in user management and permissions system for controlling board access and editing rights
- Import/export functionality supporting migration from Trello, Notion, and other project management tools
- Advanced filtering and sorting capabilities leveraging PostgreSQL's query performance for large datasets
Common Use Cases
- 1Software development teams managing sprints and feature development with kanban workflows and custom card properties
- 2Marketing agencies tracking campaign progress, asset creation, and client deliverables across multiple projects
- 3Educational institutions organizing curriculum planning, student projects, and administrative tasks with privacy compliance
- 4Consulting firms managing client projects with time tracking, milestone tracking, and deliverable management
- 5Non-profit organizations coordinating volunteer activities, fundraising campaigns, and event planning
- 6Manufacturing teams tracking production schedules, quality control processes, and inventory management
- 7Research teams organizing studies, publication pipelines, and collaboration with external partners requiring data sovereignty
Prerequisites
- Docker Engine and Docker Compose installed with at least 2GB available RAM for PostgreSQL and Focalboard containers
- Ports 8000 and 80 available on the host system, or alternative ports configured via FB_PORT and NGINX_PORT variables
- Basic understanding of project management concepts like kanban boards, card properties, and team collaboration workflows
- Environment file (.env) with DB_USER and DB_PASSWORD variables configured for PostgreSQL authentication
- Storage space of at least 10GB recommended for PostgreSQL data volume and container images
- Network connectivity for initial Docker image downloads and ongoing Focalboard updates from Mattermost registry
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 focalboard: 3 image: mattermost/focalboard:latest4 container_name: focalboard5 restart: unless-stopped6 ports: 7 - "${FB_PORT:-8000}:8000"8 environment: 9 - FOCALBOARD_PORT=800010 - FOCALBOARD_DBTYPE=postgres11 - FOCALBOARD_DBCONFIG=postgres://${DB_USER}:${DB_PASSWORD}@focalboard-db/focalboard?sslmode=disable12 depends_on: 13 - focalboard-db1415 focalboard-db: 16 image: postgres:15-alpine17 container_name: focalboard-db18 restart: unless-stopped19 environment: 20 - POSTGRES_USER=${DB_USER}21 - POSTGRES_PASSWORD=${DB_PASSWORD}22 - POSTGRES_DB=focalboard23 volumes: 24 - focalboard_db_data:/var/lib/postgresql/data2526 nginx: 27 image: nginx:alpine28 container_name: focalboard-nginx29 restart: unless-stopped30 ports: 31 - "${NGINX_PORT:-80}:80"32 volumes: 33 - ./nginx.conf:/etc/nginx/nginx.conf:ro3435volumes: 36 focalboard_db_data: .env Template
.env
1# Focalboard2FB_PORT=80003DB_USER=focalboard4DB_PASSWORD=focalboard_password5NGINX_PORT=80Usage Notes
- 1Focalboard at http://localhost:8000
- 2Create account to start
- 3Multiple view types available
- 4Personal or team boards
Individual Services(3 services)
Copy individual services to mix and match with your existing compose files.
focalboard
focalboard:
image: mattermost/focalboard:latest
container_name: focalboard
restart: unless-stopped
ports:
- ${FB_PORT:-8000}:8000
environment:
- FOCALBOARD_PORT=8000
- FOCALBOARD_DBTYPE=postgres
- FOCALBOARD_DBCONFIG=postgres://${DB_USER}:${DB_PASSWORD}@focalboard-db/focalboard?sslmode=disable
depends_on:
- focalboard-db
focalboard-db
focalboard-db:
image: postgres:15-alpine
container_name: focalboard-db
restart: unless-stopped
environment:
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=focalboard
volumes:
- focalboard_db_data:/var/lib/postgresql/data
nginx
nginx:
image: nginx:alpine
container_name: focalboard-nginx
restart: unless-stopped
ports:
- ${NGINX_PORT:-80}:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
Quick Start
terminal
1# 1. Create the compose file2cat > docker-compose.yml << 'EOF'3services:4 focalboard:5 image: mattermost/focalboard:latest6 container_name: focalboard7 restart: unless-stopped8 ports:9 - "${FB_PORT:-8000}:8000"10 environment:11 - FOCALBOARD_PORT=800012 - FOCALBOARD_DBTYPE=postgres13 - FOCALBOARD_DBCONFIG=postgres://${DB_USER}:${DB_PASSWORD}@focalboard-db/focalboard?sslmode=disable14 depends_on:15 - focalboard-db1617 focalboard-db:18 image: postgres:15-alpine19 container_name: focalboard-db20 restart: unless-stopped21 environment:22 - POSTGRES_USER=${DB_USER}23 - POSTGRES_PASSWORD=${DB_PASSWORD}24 - POSTGRES_DB=focalboard25 volumes:26 - focalboard_db_data:/var/lib/postgresql/data2728 nginx:29 image: nginx:alpine30 container_name: focalboard-nginx31 restart: unless-stopped32 ports:33 - "${NGINX_PORT:-80}:80"34 volumes:35 - ./nginx.conf:/etc/nginx/nginx.conf:ro3637volumes:38 focalboard_db_data:39EOF4041# 2. Create the .env file42cat > .env << 'EOF'43# Focalboard44FB_PORT=800045DB_USER=focalboard46DB_PASSWORD=focalboard_password47NGINX_PORT=8048EOF4950# 3. Start the services51docker compose up -d5253# 4. View logs54docker 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/focalboard-stack/run | bashTroubleshooting
- Focalboard fails to start with database connection errors: Verify DB_USER and DB_PASSWORD in environment file match PostgreSQL container configuration and ensure focalboard-db container is running
- NGINX returns 502 Bad Gateway errors: Check that focalboard container is healthy and accessible on port 8000, and verify nginx.conf file exists and has correct upstream configuration
- PostgreSQL container crashes with permission errors: Ensure focalboard_db_data volume has proper ownership and the host system has sufficient disk space for database operations
- Focalboard loads slowly or times out: Increase PostgreSQL shared_buffers and effective_cache_size through environment variables or custom postgresql.conf mounted as volume
- Unable to create new boards or cards: Check PostgreSQL database connectivity and verify focalboard database exists with proper schema initialization
- Lost data after container restart: Ensure focalboard_db_data volume is properly configured and not using tmpfs or other temporary storage backends
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
Components
focalboardpostgresqlnginx
Tags
#focalboard#notion#project-management#kanban
Category
Productivity & CollaborationAd Space
Shortcuts: C CopyF FavoriteD Download