DEV Community

Cover image for Deploying Planka – Open-Source Project Management Tool
Sanskriti Harmukh for Vultr

Posted on with Aashish Chaurasiya • Originally published at docs.vultr.com

Deploying Planka – Open-Source Project Management Tool

Planka is an open-source, Kanban-style project management tool including boards, lists, and cards for organizing tasks and tracking team progress. This guide deploys it via Docker Compose with a PostgreSQL backend and Traefik-managed HTTPS, then builds a board and tests collaboration.

Prerequisites: a Linux server (2 vCPU / 4GB RAM minimum), Docker + Docker Compose, a domain A record (e.g. planka.example.com).


Set Up the Project

$ mkdir ~/planka
$ cd ~/planka
$ openssl rand -hex 64
Enter fullscreen mode Exit fullscreen mode

Environment file — replace domain, email, secret key, and DB password:

$ nano .env
Enter fullscreen mode Exit fullscreen mode
DOMAIN=planka.example.com
LETSENCRYPT_EMAIL=admin@example.com

BASE_URL=https://planka.example.com
SECRET_KEY=YOUR_GENERATED_SECRET_KEY

POSTGRES_DB=planka
POSTGRES_USER=planka_admin
POSTGRES_PASSWORD=STRONG_DATABASE_PASSWORD
Enter fullscreen mode Exit fullscreen mode

Deploy with Docker Compose

$ nano docker-compose.yml
Enter fullscreen mode Exit fullscreen mode
services:
  traefik:
    image: traefik:v3.7.0
    restart: unless-stopped
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
      - "--certificatesresolvers.letsencrypt.acme.email=${LETSENCRYPT_EMAIL}"
      - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt

  postgres:
    image: postgres:16-alpine
    container_name: planka-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - ./pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
      interval: 10s
      timeout: 5s
      retries: 5

  planka:
    image: ghcr.io/plankanban/planka:2.1.1
    container_name: planka-app
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      BASE_URL: ${BASE_URL}
      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres/${POSTGRES_DB}
      SECRET_KEY: ${SECRET_KEY}
    volumes:
      - ./data:/app/data
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.planka.rule=Host(`${DOMAIN}`)"
      - "traefik.http.routers.planka.entrypoints=websecure"
      - "traefik.http.routers.planka.tls.certresolver=letsencrypt"
    restart: unless-stopped
Enter fullscreen mode Exit fullscreen mode
$ docker compose up -d
$ docker compose ps -a
Enter fullscreen mode Exit fullscreen mode

Create the admin account:

$ docker compose run --rm planka npm run db:create-admin-user
Enter fullscreen mode Exit fullscreen mode

Enter email, password, name (username optional).

$ docker compose logs
Enter fullscreen mode Exit fullscreen mode

Confirm PostgreSQL accepts connections and Planka starts cleanly.


First-Run Setup

Visit https://planka.example.com, log in with your admin credentials, accept the End User Terms of Service to reach the dashboard.


Build a Kanban Board

1. Create a project: Create project → name (e.g. Team Collaboration Project) → optional description → Create project.

2. Create a board: open the project → Create board → name (e.g. Development Tasks) → Create board.

3. Add lists and cards: Add list for To Do, In Progress, Completed. Under each, Add card, name it, Enter. Drag cards between lists to confirm movement works.

4. Invite a team member: profile avatar → AdministrationAdd user (name, email, password) → Add User. Back on the board, open the members panel, search for the new user, add them.


Next Steps

Planka is running with persistent PostgreSQL storage and automatic HTTPS. From here:

  • Set up OIDC for SSO instead of local accounts
  • Configure SMTP for email notifications on card activity
  • Explore custom labels, due dates, and card attachments for richer workflows

For the full guide, visit the original article on Vultr Docs.

Top comments (0)