MAATRIX / Блог / Wekan на Ubuntu 24.04: пошаговая установка

Wekan на Ubuntu 24.04: пошаговая установка

MAATRIX

Команда завела доски в Trello, а потом упёрлась в лимиты бесплатного тарифа, вопросы про то, где физически лежат данные, или банальную блокировку доступа. Wekan решает это по-другому: это open-source канбан-доска с той же логикой карточек и колонок, но она крутится на вашем сервере, и никто, кроме вас, не решает, жить ей завтра или нет. Ниже — пошаговая установка Wekan на Ubuntu 24.04 через Docker Compose: от чистого сервера до рабочей доски с HTTPS и бэкапами.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Что такое Wekan и почему его ставят на свой сервер

Wekan — это self-hosted альтернатива Trello: доски, списки, карточки, чек-листы, метки, дедлайны, свои поля, интеграция по webhook и REST API. Проект живёт на GitHub, активно развивается сообществом и распространяется бесплатно без ограничений на число досок или участников — в отличие от бесплатных тарифов облачных сервисов.

Технически Wekan — приложение на Node.js (построено на фреймворке Meteor), которому обязательно нужна MongoDB как база данных. Это не «однофайловый» сервис вроде статического сайта: под капотом два процесса — сама Wekan и Mongo, — и именно поэтому Docker Compose здесь удобнее, чем ручная установка пакетов: оба сервиса поднимаются одной командой и не конфликтуют с остальным окружением сервера.

Для кого это имеет смысл. Небольшой команде на 3–15 человек, у которой уже есть VPS и нет нужды платить за облачный канбан. Тем, кому важно, чтобы данные о проектах не покидали свою инфраструктуру. Тем, кто хочет встроить канбан во внутренние процессы через API — Wekan отдаёт REST API из коробки. Ресурсы нужны скромные: для команды до 15–20 человек хватает 1–2 vCPU и 2 ГБ RAM с запасом на систему и бэкапы; это ориентир, а не измеренный бенчмарк — при активном использовании вложений стоит смотреть на потребление в реальном времени.

Шаг 1. Подготовка сервера и установка Docker

Возьмите чистый VPS на Ubuntu 24.04 с root-доступом. Обновите систему и поставьте базовые утилиты:

apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg

Docker Engine ставим из официального репозитория, а не из пакетов Ubuntu — так вы получаете актуальные версии и docker compose как встроенный плагин:

install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Проверьте, что всё встало:

docker --version
docker compose version

Если ставите Docker с нуля впервые, подробный разбор с проверками и типовыми граблями есть в статье про Docker Compose для продакшена на Ubuntu 24.04 — она пригодится и здесь, потому что Wekan разворачивается по тем же принципам: политика перезапуска, именованные тома, аккуратные лимиты.

Создайте рабочую директорию проекта:

mkdir -p /opt/wekan && cd /opt/wekan

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Шаг 2. Docker Compose: Wekan и MongoDB

Wekan хранит данные в MongoDB, и для реактивности Meteor использует так называемый oplog — журнал операций базы. В продакшене на реплика-сете это даёт мгновенное обновление интерфейса у всех участников без перезагрузки страницы. Для одиночного (standalone) MongoDB без реплика-сета Wekan тоже работает, но откатывается на периодический опрос базы — доска обновится с небольшой задержкой в несколько секунд, а не мгновенно. Для команды до 15–20 человек эта разница на практике почти не заметна, поэтому ниже — простой standalone-вариант; если для вас критична мгновенная синхронизация между всеми открытыми вкладками, поднимайте Mongo как однонодовый реплика-сет отдельно.

Создайте docker-compose.yml:

services:
  wekan-db:
    image: mongo:7
    container_name: wekan-db
    restart: unless-stopped
    command: mongod --quiet --logpath /dev/null
    networks:
      - wekan-net
    volumes:
      - wekan-db-data:/data/db

  wekan:
    image: wekanteam/wekan
    container_name: wekan-app
    restart: unless-stopped
    depends_on:
      - wekan-db
    environment:
      - MONGO_URL=mongodb://wekan-db:27017/wekan
      - ROOT_URL=https://board.example.com
      - MAIL_URL=
      - MAIL_FROM=
      - WITH_API=true
      - BROWSER_POLICY_ENABLED=true
      - RESULTS_PER_PAGE=20
      - PORT=8080
    ports:
      - "127.0.0.1:8080:8080"
    networks:
      - wekan-net
    volumes:
      - wekan-files:/data

networks:
  wekan-net:
    driver: bridge

volumes:
  wekan-db-data:
  wekan-files:

Что здесь важно:

  • wekan-db не публикует порт наружу — MongoDB доступна только внутри сети wekan-net, это закрывает базу от интернета без единой строчки firewall-правил.
  • wekan слушает на 127.0.0.1:8080, а не на всех интерфейсах — снаружи сервер отдаёт только 80/443 через reverse-прокси (настроим в шаге 4), сам порт 8080 наружу не торчит.
  • ROOT_URL замените на реальный домен — Wekan использует его для формирования ссылок, вебхуков и корректной работы cookie-сессий; без него после логина будут странности с редиректами.
  • Том wekan-files — это каталог для вложений (файлов, прикреплённых к карточкам), если вы не настраиваете внешнее S3-совместимое хранилище. Для несложных досок локального тома достаточно.

Шаг 3. Запуск, первый администратор и доступ по HTTP

Поднимите стек:

docker compose up -d

Проверьте, что оба контейнера стартовали и не падают в рестарт-цикл:

docker compose ps
docker compose logs -f wekan

Первый запуск Wekan занимает от нескольких секунд до пары минут — приложению нужно создать индексы в MongoDB. В логе появится строка вида App running at: http://localhost:8080/.

Пока не настроен домен и HTTPS, проверьте доступ через SSH-туннель, не открывая порт наружу:

ssh -L 8080:127.0.0.1:8080 root@ваш_сервер

Откройте http://localhost:8080 в браузере на своей машине. На странице регистрации создайте первого пользователя — в Wekan самый первый зарегистрированный аккаунт автоматически получает права администратора. Сразу после этого имеет смысл зайти в Admin Panel → Settings и при необходимости отключить публичную регистрацию (Allow user to register в интерфейсе, либо через переменную окружения при желании закрыть регистрацию совсем), если доска предназначена только для вашей команды, а не для открытого доступа.

Шаг 4. HTTPS через Caddy и firewall

Для рабочей доски нужен домен и валидный сертификат — без HTTPS браузеры будут ругаться, а часть функций (например, копирование в буфер, некоторые cookie-политики) в современных браузерах на HTTP работает с ограничениями. Caddy — самый быстрый способ получить автоматический Let's Encrypt-сертификат без ручной возни с certbot; подробный разбор установки — в статье Caddy с авто-SSL на Ubuntu 24.04.

Коротко для Wekan: заведите A-запись домена на IP сервера, поставьте Caddy и опишите проксирование на локальный порт 8080 в /etc/caddy/Caddyfile:

board.example.com {
    reverse_proxy 127.0.0.1:8080
}

Перезапустите Caddy:

systemctl reload caddy

Caddy сам выпустит и продлит сертификат. После этого поправьте ROOT_URL в docker-compose.yml на реальный https://board.example.com (если ещё не указали) и пересоздайте контейнер Wekan:

docker compose up -d wekan

Firewall настройте по минимуму: разрешите только SSH, 80 и 443, всё остальное — закрыто. Порт 8080 в правила не добавляйте вовсе — он и так слушает только 127.0.0.1 и наружу не виден. Пошаговая настройка — в статье про firewall UFW на Ubuntu 24.04:

ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

Шаг 5. Бэкап данных и обновление Wekan

Все данные Wekan — доски, карточки, пользователи — лежат в MongoDB внутри тома wekan-db-data, вложения — в томе wekan-files. Потерять их обидно, поэтому бэкап настраивайте сразу, а не после первого инцидента.

Самый простой вариант — регулярный дамп через mongodump прямо из контейнера базы:

docker exec wekan-db mongodump --db wekan --archive=/data/db/wekan-backup.archive
docker cp wekan-db:/data/db/wekan-backup.archive ./backups/wekan-$(date +%F).archive

Оберните это в cron-задачу и обязательно копируйте архивы за пределы сервера — на объектное хранилище или другую машину: локальная копия на том же диске не спасёт при отказе самого сервера. Для регулярных зашифрованных бэкапов с версионированием и ретеншеном удобнее не изобретать велосипед, а взять готовый инструмент — разбор есть в статье установка и настройка BorgBackup на VPS.

Восстановление из архива — обратная операция:

docker cp ./backups/wekan-2026-08-15.archive wekan-db:/data/db/restore.archive
docker exec wekan-db mongorestore --db wekan --archive=/data/db/restore.archive --drop

Обновление самого Wekan сводится к смене тега образа и пересозданию контейнера — данные в отдельном томе Mongo при этом не трогаются:

docker compose pull wekan
docker compose up -d wekan

Перед крупным обновлением (смена мажорной версии) сделайте свежий дамп базы и проверьте changelog проекта на GitHub — Meteor-приложения иногда требуют миграции данных при переходе через несколько версий сразу.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Обязательно ли использовать Docker, или можно поставить Wekan напрямую на систему?

Технически да — есть snap-пакет и ручная сборка из исходников, но обе схемы сложнее в сопровождении: нужно вручную следить за версией Node.js, Meteor-рантаймом и MongoDB. Docker Compose закрывает все эти зависимости внутри образа и остаётся стандартным способом деплоя, который поддерживает сама команда Wekan.

Можно ли перенести доски из Trello в Wekan?

Да, в интерфейсе Wekan есть импорт досок из экспортированного JSON-файла Trello (Board → Import). Перенос карточек, списков и части меток проходит автоматически, но проверьте вложения и права участников вручную после импорта.

Нужен ли email для работы Wekan?

Нет, базовая работа (доски, карточки, вход по логину) не требует почты. MAIL_URL нужен только для уведомлений и восстановления пароля по email — если не настроить SMTP, эти функции просто не будут работать, всё остальное не пострадает.

Сколько ресурсов реально нужно на растущую команду?

Прямой зависимости от числа пользователей почти нет — нагрузку создают активные одновременные сессии и объём вложений. Для 20–40 активных пользователей 2 vCPU и 4 ГБ RAM обычно оставляют запас; это ориентир, точную цифру для вашей нагрузки лучше проверить мониторингом после недели работы.

Можно ли использовать внешний MongoDB вместо контейнера в composе?

Да, просто укажите в MONGO_URL адрес внешней базы (например, управляемого MongoDB) вместо wekan-db и уберите сервис wekan-db из compose-файла — Wekan не требует, чтобы Mongo обязательно жил в том же Docker-хосте.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →