Planka
v1.0.0Collaborative Kanban boards for organizing projects and tasks.
x-arcane:
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/planka.svg"
urls:
- "https://docs.planka.cloud/docs/installation/docker/production-version/"
services:
planka:
image: "ghcr.io/plankanban/planka:latest"
restart: "unless-stopped"
ports:
- "${PORT:-3000}:1337"
environment:
BASE_URL: "${BASE_URL:-http://localhost:3000}"
DATABASE_URL: "postgresql://planka:${DB_PASSWORD:?Set DB_PASSWORD in .env}@db:5432/planka"
SECRET_KEY: "${SECRET_KEY:?Set SECRET_KEY in .env}"
DEFAULT_ADMIN_EMAIL: "${ADMIN_EMAIL:-admin@example.com}"
DEFAULT_ADMIN_PASSWORD: "${ADMIN_PASSWORD:?Set ADMIN_PASSWORD in .env}"
DEFAULT_ADMIN_NAME: "${ADMIN_NAME:-Administrator}"
OUTGOING_BLOCKED_HOSTS: "localhost,db"
DEFAULT_ADMIN_USERNAME: "${ADMIN_USERNAME:-admin}"
volumes:
- "data:/app/data"
depends_on:
db:
condition: "service_healthy"
labels:
com.getarcaneapp.arcane.icon: "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/planka.svg"
db:
image: "postgres:16-alpine"
restart: "unless-stopped"
environment:
POSTGRES_DB: "planka"
POSTGRES_USER: "planka"
POSTGRES_PASSWORD: "${DB_PASSWORD:?Set DB_PASSWORD in .env}"
volumes:
- "db-data:/var/lib/postgresql/data"
healthcheck:
test:
- "CMD-SHELL"
- "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
interval: "10s"
timeout: "5s"
retries: 10
start_period: "30s"
labels:
com.getarcaneapp.arcane.icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/postgresql.svg
volumes:
data: {}
db-data: {}
# Replace every change-me with an independent secret before deployment.
# Generate secrets with: openssl rand -hex 32
PORT=3000
BASE_URL=http://localhost:3000
DB_PASSWORD=change-me
SECRET_KEY=change-me
ADMIN_EMAIL=admin@example.com
ADMIN_USERNAME=admin
ADMIN_NAME=Administrator
ADMIN_PASSWORD=change-me
README
Collaborative Kanban boards for organizing projects and tasks.
Copy .env.example to .env, review the settings, then run docker compose up -d. In Arcane, import the template and supply the same environment variables. Replace every change-me value before starting. Generate independent secrets with openssl rand -hex 32; use hexadecimal database passwords so connection URLs need no escaping. Use docker compose ps and docker compose logs to check startup.
Sign in at BASE_URL with ADMIN_EMAIL and ADMIN_PASSWORD. Admin settings provision the initial account; leaving them configured also prevents editing or deleting that account. Uploaded files live in the data volume and boards in PostgreSQL.
Named volumes preserve server data across container recreation. Back up these volumes before upgrades; docker compose down -v deletes them. Set PORT to an unused host port. For remote browser access, put HTTPS in front of the application and update its public URL setting where provided.
Upstream documentation: Planka deployment.