В этой публикации, речь пойдет о примере варианта установки сервиса Planka на свой сервер, используя встроенные возможности панели aaPanel и Docker Compose с дальнейшей привязкой к своему домену, а так же немного о том как настроить резервное копирование и восстановление сервиса в случае сбоя
Planka — Доска Kanban работающая в реальном времени для организации работы рабочих групп, отслеживания проектов, созданная с помощью React и Redux и пр.
Возможности Planka:
- Создание проектов, досок, списков, карточек, меток и задач
- Добавление участников карточки, отслеживание времени, установка сроков
- Добавление вложений, комментирование карточек
- Поддержка Markdown в описании карточки и комментариях
- Фильтрация по участникам и меткам
- Настройка персонального фона для каждого проекта
- Обновления в реальном времени
- Уведомления пользователей
- Мультиязычность
Установка с использованием Docker Compose
Можно выполнять все действия как в terminal самой aaPanel, так и через ssh клиент.
Создадим папку для сохранения compose файла (конфигурации)
mkdir /opt/planka
Скачиваем docker-compose.yml
curl -L https://raw.githubusercontent.com/plankanban/planka/master/docker-compose.yml -o /opt/planka/docker-compose.yml
В ходе успешного выполнения команды, в директории /opt/planka появится файл docker-compose.yml
Генерируем секретный ключ
openssl rand -hex 64
На выходе мы получим примерно такую строку:
0f8bc693f8fa2a0c8ddb050523d6148792d62c1d7552a998859d75aad95b675a0a6c11ff5e7d067d5461a53a45217fbb7ddacdb42e4cf7773406084a4d9ed068
Сохраните куда нибудь эту строку (в заметки или скопируйте в память)
Теперь нам нужно перейти в директорию где мы сохранили docker-compose.yml и открыть его для редактирования, заполнив значение некоторых строк:
cd /opt/planka
nano docker-compose.yml
В данном файле необходимо заполнить следующие строки:
SECRET_KEY
BASE_URL
Так же раскомментируем все строки начинающиеся с DEFAULT_ADMIN_ и заполним их
— SECRET_KEY мы вставляем ранее полученное значение 0f8bc693f8fa2a0c8ddb050523d6148792d62d9ed068 и т.д.
— BASE_URL=https://[domain].ru домен, на котором планируется работа planka
— DEFAULT_ADMIN_EMAIL= почта администратора
— DEFAULT_ADMIN_PASSWORD= пароль администратора
— DEFAULT_ADMIN_NAME= имя администратора
— DEFAULT_ADMIN_USERNAME= логин администратора
Авторизация в сервисе осуществляется по связке почта + пароль администратора
Запускаем образ и стартуем сервис
docker compose up -d
При успешном выполнении команды, через некоторое время во вкладке Docker -> Container у вас появятся два работающих контейнера.
Теперь нам необходимо чтобы planka открывалась на нужном нам домене.
К этому моменту, выбранный домен уже должен быть добавлен в aaPanel и как NS запись и как сайт и открываться в браузере. Наша задача настроить конфигурацию Nginx так, чтобы при открытии домена в браузере у нас открывалась не директория сайта, а непосредственно сам сервис planka работающий в Docker контейнере.
Переходим во вкладку Website, находим в списке добавленных сайтов тот, который должен открывать сервис planka и заходим в его настройки.
Нам нужна вкладка Config открыв которую мы увидим конфигурационный файл созданный по умолчанию. Необходимо привести его к похожему виду:
Если у вас добавлены SSL сертификаты, не забудьте перенести блок с ними.
Пример конфигурационного файла Nginx
Спойлер [раскрыть]
upstream planka {
server localhost:1337;
keepalive 32;
}
server {
listen 80;
listen [::]:80;
server_name [domain];
access_log /var/log/nginx/planka-access.log;
error_log /var/log/nginx/planka-error.log error;
# Make sure to allow socket.io connections
location ~* \.io {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 50M;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
client_body_timeout 60;
send_timeout 300;
lingering_timeout 5;
proxy_connect_timeout 1d;
proxy_send_timeout 1d;
proxy_read_timeout 1d;
proxy_pass http://planka;
}
location / {
client_max_body_size 50M;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
proxy_read_timeout 600s;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale timeout;
proxy_cache_lock on;
proxy_http_version 1.1;
proxy_pass http://planka;
}
}
Пример конфигурационного файла с работающего сервера Nginx
Спойлер [раскрыть]
upstream planka {
server localhost:1337;
keepalive 32;
}
server
{
listen 80;
listen 443 ssl;
server_name .ru;
index index.php index.html index.htm;
root /www/home/[domain].ru;
#CERT-APPLY-CHECK--START
# Configuration related to file verification for SSL certificate application - Do not delete
include /www/server/panel/vhost/nginx/well-known/[domain].ru.conf;
#CERT-APPLY-CHECK--END
#SSL-START SSL related configuration, do NOT delete or modify the next line of commented-out 404 rules
#error_page 404/404.html;
#HTTP_TO_HTTPS_START
if ($server_port !~ 443){
rewrite ^(/.*)$ https://$host$1 permanent;
}
#HTTP_TO_HTTPS_END
ssl_certificate /www/server/panel/vhost/cert/[domain].ru/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/[domain].ru/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers *****************************************+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
access_log off; # Disable with aapanel
error_log /www/wwwlogs/[domain].ru.error.log;
# Make sure to allow socket.io connections
location ~* \.io {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
client_max_body_size 50M;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
client_body_timeout 60;
send_timeout 300;
lingering_timeout 5;
proxy_connect_timeout 1d;
proxy_send_timeout 1d;
proxy_read_timeout 1d;
proxy_pass http://planka;
}
location / {
client_max_body_size 50M;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
proxy_read_timeout 600s;
proxy_cache_revalidate on;
proxy_cache_min_uses 2;
proxy_cache_use_stale timeout;
proxy_cache_lock on;
proxy_http_version 1.1;
proxy_pass http://planka;
}
}
После применения настроек, при отсутствии ошибок в конфиге, по выбранному вами домену начнет открываться форма авторизации сервиса planka
Дальше вам останется только войти в сервис, настроить при свой профиль, создать доску, метки и начать заполнять по мере необходимости нужные вам разделы и поля.
По возникшим вопросам связанным с работой Planka можно обращаться сюда.
Посла запуска сервиса Planka полезно сразу настроить резервное копирование данных. Что позволит в случае чего, быстро восстановить если не все то большую часть данных. Ниже Bash скрипты для создания резервной копии и скрипт для ее восстановления. В целом, готовые варианты есть в официальных инструкциях к Planka и иногда они меняются, однако я привожу варианты, которые используются непосредственно на работающем сервере. И к сожалению один раз уже применялись для восстановления, после того как сервер пришлось полностью переустанавливать и после чистой установки Planka восстанавливать данные из резервной копии.
Создадим директорию для резервных копий, например
mkdir /opt/planka/backup
перейдем в директорию
cd /opt/planka/backup
В этой папке разместим оба скрипта
touch backup.sh
touch restore.sh
В каждый из них вставим соответствующее названию содержимое
nano touch backup.sh
nano touch restore.sh
Резервное копирование (скрипт bash — backup.sh)
Спойлер [раскрыть]
#!/bin/bash
# Stop on Error
set -e
# Configure those to match your Planka Docker container names
PLANKA_DOCKER_CONTAINER_POSTGRES="planka-postgres-1"
PLANKA_DOCKER_CONTAINER_PLANKA="planka-planka-1"
# Create Backup Directory
BACKUP_DIR="/opt/planka/backup"
mkdir -p "$BACKUP_DIR"
# Create Temporary folder
BACKUP_DATETIME=$(date --utc +%FT%H-%M-%SZ)
TEMP_BACKUP_DIR="$BACKUP_DIR/$BACKUP_DATETIME-backup"
mkdir -p "$TEMP_BACKUP_DIR"
# Dump DB into SQL File
echo -n "Exporting postgres database ... "
docker exec -t "$PLANKA_DOCKER_CONTAINER_POSTGRES" pg_dumpall -c -U postgres > "$TEMP_BACKUP_DIR/postgres.sql"
echo "Success!"
# Export Docker Volumes
echo -n "Exporting user-avatars ... "
docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$TEMP_BACKUP_DIR:/backup" ubuntu cp -r /app/public/user-avatars /backup/user-avatars
echo "Success!"
echo -n "Exporting project-background-images ... "
docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$TEMP_BACKUP_DIR:/backup" ubuntu cp -r /app/public/project-background-images /backup/project-background-images
echo "Success!"
echo -n "Exporting attachments ... "
docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$TEMP_BACKUP_DIR:/backup" ubuntu cp -r /app/private/attachments /backup/attachments
echo "Success!"
# Create tgz
BACKUP_TAR="$BACKUP_DIR/$BACKUP_DATETIME-backup.tgz"
echo -n "Creating final tarball $BACKUP_TAR ... "
tar -czf "$BACKUP_TAR" \
"$TEMP_BACKUP_DIR/postgres.sql" \
"$TEMP_BACKUP_DIR/user-avatars" \
"$TEMP_BACKUP_DIR/project-background-images" \
"$TEMP_BACKUP_DIR/attachments"
echo "Success!"
# Remove source files
echo -n "Cleaning up temporary files and folders ... "
rm -rf "$TEMP_BACKUP_DIR"
echo "Success!"
# Keep only the last 3 backups
echo -n "Removing old backups, keeping only the last 3 ... "
ls -tp "$BACKUP_DIR"/*.tgz | tail -n +4 | xargs -I {} rm -- {}
echo "Success!"
echo "Backup Complete!"
Восстановление резервной копии (скрипт bash — restore.sh)
Спойлер [раскрыть]
#!/bin/bash
# Stop on Error
set -e
# Configure those to match your Planka Docker container names
PLANKA_DOCKER_CONTAINER_POSTGRES="planka-postgres-1"
PLANKA_DOCKER_CONTAINER_PLANKA="planka-planka-1"
# Extract tgz archive
PLANKA_BACKUP_ARCHIVE_TGZ=$1
PLANKA_BACKUP_ARCHIVE=$(basename "$PLANKA_BACKUP_ARCHIVE_TGZ" .tgz)
echo -n "Extracting tarball $PLANKA_BACKUP_ARCHIVE_TGZ ... "
tar -xzf "$PLANKA_BACKUP_ARCHIVE_TGZ"
echo "Success!"
# Import Database
echo -n "Importing postgres database ... "
cat "$PLANKA_BACKUP_ARCHIVE/postgres.sql" | docker exec -i "$PLANKA_DOCKER_CONTAINER_POSTGRES" psql -U postgres
echo "Success!"
# Restore Docker Volumes
echo -n "Importing user-avatars ... "
docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$(pwd)/$PLANKA_BACKUP_ARCHIVE:/backup" ubuntu cp -rf /backup/user-avatars /app/public/
echo "Success!"
echo -n "Importing project-background-images ... "
docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$(pwd)/$PLANKA_BACKUP_ARCHIVE:/backup" ubuntu cp -rf /backup/project-background-images /app/public/
echo "Success!"
echo -n "Importing attachments ... "
docker run --rm --volumes-from "$PLANKA_DOCKER_CONTAINER_PLANKA" -v "$(pwd)/$PLANKA_BACKUP_ARCHIVE:/backup" ubuntu cp -rf /backup/attachments /app/private/
echo "Success!"
echo -n "Cleaning up temporary files and folders ... "
rm -r "$PLANKA_BACKUP_ARCHIVE"
echo "Success!"
echo "Restore complete!"
Обратите внимание, конкретные значения строк в обоих скриптах
PLANKA_DOCKER_CONTAINER_POSTGRES=»planka-postgres-1″
PLANKA_DOCKER_CONTAINER_PLANKA=»planka-planka-1″
нужно брать конкретно те, которые у вас во вкладке Docker -> Container
После подготовки файлов скриптов, нам необходимо добавить запуск backup.sh в CRON, например выполнение раз в сутки или каждые несколько часов, как вам удобнее.
/opt/planka/backup/backup.sh
Резервные копии будут сохраняться в директории /opt/planka/backup/ с названиями включающее в себя дату и время создания 2025-01-18T22-30-01Z-backup.tgz
При необходимости восстановления из резервной копии, переходим в директорию:
cd /opt/planka/backup
Смотрим какие архивы у нас есть
ls *.tgz
Выбираем свежий по дате или тот который вам необходим и выполняем команду
bash /opt/planka/backup/restore.sh имя_вашего_архива.tgz
Полезные ссылки:
К этой записи нет комментарий. Ваш будет первым!