Saltar a contenido

Kanboard (Kan)

Alternativa open source a Trello. Kanban board con PostgreSQL 15. Migraciones vía contenedor kan-migrate (no automáticas al iniciar).

📁 Rutas y configs

Qué Dónde
Compose /opt/docker/kan/compose.yaml
Compose migraciones /opt/docker/kan/compose.migrate.yaml
Script migraciones /opt/docker/kan/migrate.sh
Variables de entorno /opt/docker/kan/.env

Contenedores: kan-web, kan-db (PostgreSQL). Puerto: 8514 (solo 127.0.0.1, detrás de Caddy). Red: kan_net (externa).

Migraciones

La imagen kan:latest NO auto-migra el esquema. Antes de actualizar la imagen, correr:

/opt/docker/kan/migrate.sh   # docker compose -f compose.yaml -f compose.migrate.yaml run --rm migrate

⚠️ compose.migrate.yaml debe usar la red kan_net (externa) — la red original kan_kan-network fue eliminada el 15-ago-2026 (commit eb3069d). Si Kan se ve vacío tras actualizar la imagen, es mismatch de esquema: correr las migraciones (incidente 2026-08-21: faltaba la columna cardPrefix, 4 migraciones pendientes, los datos nunca se perdieron).

Compose (web + db)

services:
  web:
    image: ghcr.io/kanbn/kan:latest
    container_name: kan-web
    ports:
      - 127.0.0.1:8514:3000
    networks:
      - kan_net
    env_file:
      - .env
    environment:
      - NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL}
      - BETTER_AUTH_SECRET=${BETTER_AUTH_SECRET}
      - POSTGRES_URL=${POSTGRES_URL}
      - NEXT_PUBLIC_ALLOW_CREDENTIALS=true
      - BETTER_AUTH_TRUSTED_ORIGINS=${BETTER_AUTH_TRUSTED_ORIGINS}
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped
  postgres:
    image: postgres:15
    container_name: kan-db
    environment:
      - POSTGRES_DB=kan_db
      - POSTGRES_USER=kan
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    volumes:
      - kan_postgres_data:/var/lib/postgresql/data
    healthcheck:
      test:
        - CMD-SHELL
        - pg_isready -U kan -d kan_db
      interval: 5s
      timeout: 5s
      retries: 10
    restart: unless-stopped
    networks:
      - kan_net
networks:
  kan_net:
    external: true
volumes:
  kan_postgres_data: null

Compose migraciones

services:
  migrate:
    image: ghcr.io/kanbn/kan-migrate:latest
    container_name: kan-migrate
    networks:
      - kan_net
    environment:
      - POSTGRES_URL=${POSTGRES_URL}
    depends_on:
      postgres:
        condition: service_healthy
    restart: no

networks:
  kan_net:
    external: true