Особенности развертки Planka через Portainer в связке с Nginx Proxy Manager

October 18, 2023

Planka - отличный минималистичный аналог популярного канбана Trello c несколькими характерными сообенностями - бесплатность, открытый исходный код, и разверткой на собственных серверных мощностях. Идеально для тех, кто не хочет зависеть от чужого облака и делиться своими планами с разработчиками.

Planka отлично разворачивается через dockler-compose и имеет наглядный рабочий пример yml файла от разработчиков, где достаточно в environment указать доменное имя (BASE_URL) и придумать секретный ключ (SECRET_KEY), сгенерировав его, например, через команду openssl rand -hex 64 в bash.

Однако, в связке с Nginx Proxy Manager и использовании HTTPS подключения, есть ряд нюансов, которые нужно учесть, чтобы ваш Planka сервер не уходил в бесконечную загрузку после авторизации:

  • docker-compose.yml в environment, параметр BASE_URL должен ОБЯЗАТЕЛЬНО быть указан адрес с подключением через HTTPS (например https://my.domain.ru)
  • в Nginx Proxy Manager в настройках хоста для вашего сайта должна стоять галочка Websockets Supports.

Описание изображения

В итоге мой docker-compose.yml для Portainer выглядит следующим образом:

 version: '3'

services:
  planka:
    image: ghcr.io/plankanban/planka:latest
    command: >
      bash -c
        "for i in `seq 1 30`; do
          ./start.sh &&
          s=$$? && break || s=$$?;
          echo \"Tried $$i times. Waiting 5 seconds...\";
          sleep 5;
        done; (exit $$s)"
    restart: unless-stopped
    volumes:
      - user-avatars:/app/public/user-avatars
      - project-background-images:/app/public/project-background-images
      - attachments:/app/private/attachments

    environment:
      - BASE_URL=https://my.domain.ru
      - TRUST_PROXY=0
      - DATABASE_URL=postgresql://postgres@postgres/planka
      - SECRET_KEY=randomsevretkey
      - DEFAULT_ADMIN_EMAIL=demo@demo.demo
      - DEFAULT_ADMIN_PASSWORD=demo
      - DEFAULT_ADMIN_NAME=Demo Demo
      - DEFAULT_ADMIN_USERNAME=demo
    depends_on:
      - postgres
    networks:
      - default

  postgres:
    image: postgres:14-alpine
    restart: unless-stopped
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=planka
      - POSTGRES_HOST_AUTH_METHOD=trust
    networks:
      - default

volumes:
  user-avatars:
  project-background-images:
  attachments:
  db-data:

networks:
  default:
    name: user-network
    external: true

ПРИМЕЧАНИЕ: Обратите внимание, что порты не торчат наружу, так как NPM предварительно настроен на сеть user-network и всем контейнерам принудительно присваивается IP адрес именно этой сети.