Managing Task Assignment in Agentic Workflows · FrankBoard

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

Original resource: Visit the source site