Особенности развертки Planka через Portainer в связке с Nginx Proxy Manager
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 адрес именно этой сети.