Deploy FrankBoard with Docker and PostgreSQL
FrankBoard deploys as a Docker container with a PostgreSQL backend using a standard Compose file and a small set of environment variables for database connection and initial admin setup.
Deploy FrankBoard with Docker and PostgreSQL
What You Need Before Starting
A Linux VPS with Docker Engine and Docker Compose installed. FrankBoard requires two persistent services: the application container and a PostgreSQL 15+ database. Reserve at least 1 GB RAM and 10 GB storage for comfortable operation with small teams.
The Complete Docker Compose Configuration
Create a docker-compose.yml file in your deployment directory. This configuration pins stable versions, enables automatic restart, and separates application data from database storage:
version: "3.8"
services:
frankboard:
image: frankboard/frankboard:latest
container_name: frankboard
restart: unless-stopped
ports:
- "8080:80"
environment:
- DATABASE_URL=postgres://frankboard:${DB_PASSWORD}@postgres:5432/frankboard
- FRANKBOARD_ADMIN_USERNAME=admin
- FRANKBOARD_ADMIN_PASSWORD=${ADMIN_PASSWORD}
- FRANKBOARD_SECRET_KEY=${SECRET_KEY}
- FRANKBOARD_URL=https://your-domain.com
depends_on:
postgres:
condition: service_healthy
volumes:
- frankboard_data:/var/www/frankboard/data
postgres:
image: postgres:15-alpine
container_name: frankboard_db
restart: unless-stopped
environment:
- POSTGRES_USER=frankboard
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=frankboard
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U frankboard -d frankboard"]
interval: 5s
timeout: 5s
retries: 5
volumes:
frankboard_data:
postgres_data:
Required Environment Variables
Create a .env file in the same directory. Never commit this file to version control:
DB_PASSWORD=your-strong-random-password-32-chars
ADMIN_PASSWORD=your-secure-admin-password
SECRET_KEY=another-random-string-for-session-signing
The DATABASE_URL follows the standard Postgres connection format. FrankBoard parses this at startup to establish its connection pool. The FRANKBOARD_SECRET_KEY secures session cookies and must remain constant across container restarts or users will be logged out.
Step-by-Step Deployment
1. Prepare your server
mkdir ~/frankboard && cd ~/frankboard
nano .env # paste and fill the three variables
nano docker-compose.yml # paste the configuration above
2. Start the services
docker compose up -d
The depends_on condition with service_healthy ensures FrankBoard waits until PostgreSQL accepts connections before attempting schema initialization.
3. Verify and complete setup
docker compose logs -f frankboard
Watch for the line indicating admin user creation. Once healthy, access http://your-vps-ip:8080 and log in with the credentials from your .env file. Change the default admin password immediately through the web interface.
Database Persistence and Backups
FrankBoard stores uploaded files in /var/www/frankboard/data and all relational data in PostgreSQL. Both mount named Docker volumes for survival across container replacements.
For production reliability, add a backup service to your Compose file or run this daily via cron:
docker exec frankboard_db pg_dump -U frankboard frankboard > frankboard_$(date +%Y%m%d).sql
Reverse Proxy and HTTPS
Expose FrankBoard to the internet through Nginx or Traefik rather than raw port 8080. Set FRANKBOARD_URL to your final HTTPS domain so generated links and webhook callbacks resolve correctly. FrankBoard itself does not terminate TLS; handle that at your reverse proxy layer.
Migration from Existing Kanboard Installations
FrankBoard maintains compatibility with Kanboard's database schema. Teams migrating from a standard Kanboard container can point FrankBoard at an existing PostgreSQL database by adjusting DATABASE_URL accordingly. FrankBoard detects the legacy schema and applies its own migrations automatically. File attachments require manual copying from the previous container's data volume to the new FrankBoard volume path.
Plugin Compatibility
FrankBoard ships with a curated set of Kanboard plugins pre-installed and disables external plugin loading by default for security stability. The architecture remains compatible with Kanboard's plugin API, though individual plugins may require visual adjustments to match FrankBoard's refreshed interface. Enable third-party plugins by setting FRANKBOARD_PLUGINS_ENABLED=true if your team requires specific extensions.
Troubleshooting Common Issues
Container fails to start with database connection errors: Verify PostgreSQL finished its initial bootstrap. First startup creates system catalogs and can take 30-60 seconds on modest VPS plans.
Login redirects to HTTP instead of HTTPS: The FRANKBOARD_URL variable must include the https:// scheme. FrankBoard uses this absolute URL for all redirects and email links.
Permission denied on data volume: Ensure Docker manages volume permissions automatically. On rootless Docker setups, adjust UID/GID mapping in your .env or daemon configuration.
Key Takeaways
- FrankBoard deploys with a single
docker-compose.ymland three environment variables - PostgreSQL 15+ is required; SQLite is not supported for production use
- Persistent data lives in two named Docker volumes that survive container recreation
- The
FRANKBOARD_SECRET_KEYmust remain stable to preserve user sessions - HTTPS termination belongs at your reverse proxy, not in the FrankBoard container
- Existing Kanboard databases migrate automatically by updating the connection string