Как установить и настроить Wekan на VPS
Если команда устала от бесплатных лимитов Trello и не хочет отдавать доски задач стороннему облаку, логичный шаг — поднять канбан у себя. Wekan — open-source аналог Trello: drag-and-drop карточки, чек-листы, дедлайны, вложения, доски с несколькими списками — и всё это на вашем сервере, без подписок и без чужих серверов между вами и данными. Ниже — рабочий путь установки на чистом VPS: от Docker Compose до HTTPS и первого бэкапа.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Wekan и зачем он на своём сервере
Wekan написан на Meteor.js и хранит данные в MongoDB. Внешне это почти точная копия Trello: доски, списки, карточки, лейблы, чек-листы, комментарии, вложения, свои поля (custom fields), фильтры и поиск. Есть импорт досок из Trello (через экспортированный JSON), так что миграция не требует переписывать всё вручную.
Основной аргумент для self-hosted версии — данные остаются у вас. Для команд, которые ведут в канбане клиентские проекты, финансовые задачи или что-то с NDA, это не мелочь: не нужно доверять список задач чужому облаку и его политике хранения логов. Второй аргумент — никаких лимитов на доски, участников или карточки, которые есть в бесплатных тарифах SaaS-аналогов.
Минусы тоже стоит проговорить честно: Wekan развивается медленнами темпами, интерфейс местами выглядит архаично по сравнению с современными коммерческими продуктами, а мобильного нативного приложения нет — только адаптивный веб. Если команде нужны продвинутые автоматизации (Butler-подобные правила, интеграции с десятками сервисов) — Wekan это не заменит. Но как чистая канбан-доска для задач команды разработки, поддержки или личного проектного менеджмента — справляется полностью.
Требования к серверу и подготовка
Wekan через Docker вместе с MongoDB комфортно работает на скромном VPS. Ориентиры:
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 GB | 2 GB |
| Диск | 15 GB SSD | 25+ GB SSD (с запасом под бэкапы MongoDB) |
| ОС | Ubuntu 24.04 / Debian 12 | Ubuntu 24.04 LTS |
Для команды до 15-20 человек с обычным темпом работы 2 GB RAM хватает с запасом — MongoDB и Meteor-приложение вместе редко выедают больше 500-700 MB в простое. Если планируете держать на том же сервере ещё несколько сервисов, закладывайте память отдельно под каждый.
Перед установкой Wekan сервер должен быть подготовлен: обновлена система, настроен SSH-доступ по ключу, поднят файрвол и привязан домен. Если делаете это с нуля, пригодятся отдельные материалы: настройка домена и DNS и настройка файрвола на Ubuntu 24.04.
Дальше понадобится Docker и Docker Compose — если их ещё нет, разверните по инструкции установка Docker с нуля. Проверить, что всё на месте:
docker --version
docker compose version
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверDocker Compose для Wekan и MongoDB
Официальный образ Wekan — wekanteam/wekan на Docker Hub, поддерживается сообществом проекта. Создаём рабочую директорию и файл окружения:
sudo mkdir -p /opt/wekan
cd /opt/wekan
sudo nano .env
Содержимое .env (замените домен и сгенерируйте свои секреты):
WEKAN_DOMAIN=wekan.example.com
WEKAN_PORT=8123
MONGO_URL=mongodb://wekandb:27017/wekan
ROOT_URL=https://wekan.example.com
MAIL_FROM=Wekan <noreply@example.com>
Секрет для сессий (используется Meteor) сгенерируйте отдельно и сохраните — он должен оставаться постоянным между перезапусками:
openssl rand -hex 32
Теперь docker-compose.yml:
services:
wekandb:
image: mongo:6.0
container_name: wekan-db
restart: unless-stopped
command: mongod --oplogSize 128 --replSet rs0
networks:
- wekan-net
volumes:
- wekan-db-data:/data/db
- wekan-db-dump:/dump
wekan-db-init-rs:
image: mongo:6.0
container_name: wekan-db-init
command: >
mongosh --host wekandb:27017 --eval
"rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'wekandb:27017'}]})"
depends_on:
- wekandb
networks:
- wekan-net
restart: "no"
wekan:
image: wekanteam/wekan:latest
container_name: wekan-app
restart: unless-stopped
environment:
- MONGO_URL=mongodb://wekandb:27017/wekan?replicaSet=rs0
- ROOT_URL=${ROOT_URL}
- MAIL_FROM=${MAIL_FROM}
- WITH_API=true
- PORT=8080
ports:
- "127.0.0.1:${WEKAN_PORT}:8080"
depends_on:
- wekandb
networks:
- wekan-net
networks:
wekan-net:
driver: bridge
volumes:
wekan-db-data:
wekan-db-dump:
Обратите внимание на replica set: начиная с версии MongoDB 4+ Wekan требует replSet, иначе не заведутся некоторые внутренние механизмы (oplog tailing для realtime-обновлений). Контейнер wekan-db-init-rs инициализирует replica set один раз при первом запуске и после этого не нужен — он завершается с кодом 0, это нормально.
Порт Wekan привязан только к 127.0.0.1 — наружу сервис не торчит, доступ будет только через обратный прокси с HTTPS. Это и безопаснее, и правильнее с точки зрения архитектуры.
Запускаем:
cd /opt/wekan
sudo docker compose up -d
sudo docker compose logs -f wekan
Дайте контейнеру 20-30 секунд на инициализацию Meteor-приложения — в логах должна появиться строка про Wekan is running или подобная. Если контейнер уходит в restart-loop, почти всегда причина в недоступности replica set — проверьте, что wekan-db-init-rs действительно отработал (docker compose logs wekan-db-init-rs).
HTTPS через обратный прокси
Открывать Wekan напрямую по HTTP небезопасно — пароли и cookie сессий должны идти по TLS. Проще всего поставить перед ним Caddy — он сам получает и продлевает сертификат Let's Encrypt. Если у вас ещё нет обратного прокси, пошаговая установка есть в статье Caddy с авто-SSL на Ubuntu 24.04.
Конфиг для Wekan в Caddyfile:
wekan.example.com {
reverse_proxy 127.0.0.1:8123
encode gzip
}
Перезапускаем Caddy:
sudo systemctl reload caddy
Если предпочитаете Nginx с Certbot — тоже рабочий вариант, конфиг будет чуть длиннее (нужен явный proxy_set_header для WebSocket, так как Wekan использует realtime-соединения через Meteor DDP):
server {
listen 443 ssl;
server_name wekan.example.com;
ssl_certificate /etc/letsencrypt/live/wekan.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wekan.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8123;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $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;
}
}
Без правильной обработки Upgrade/Connection заголовков доски будут открываться, но realtime-обновления карточек (когда коллега двигает карточку, а у вас она сама переезжает) работать не будут — придётся обновлять страницу вручную.
Первый запуск и создание администратора
Открываем https://wekan.example.com в браузере. Первый зарегистрированный пользователь автоматически получает права администратора — это особенность Wekan, поэтому регистрацию имеет смысл на время закрыть сразу после создания своего аккаунта.
После логина в панели администратора (Admin Panel → Settings) стоит сразу пройтись по базовым настройкам:
- Disable registration — выключить открытую регистрацию, если доски внутренние для команды. Новых пользователей потом добавляет админ вручную через
Admin Panel→People. - Emailing — указать SMTP для писем-приглашений и уведомлений (без него пригласительные ссылки всё равно работают, но письма не уйдут).
- Layout — можно отключить лишние виджеты на публичной странице входа, если она видна извне.
Для приглашения участников: Admin Panel → People → Invite. Указываете email, Wekan либо отправит письмо (если настроен SMTP), либо сгенерирует ссылку, которую можно передать вручную.
Настройка вложений и хранилища файлов
По умолчанию файлы, которые пользователи прикрепляют к карточкам, складываются в файловую систему контейнера — а значит, живут в volume wekan-db-data рядом с базой (на самом деле в отдельном пути внутри контейнера приложения, но факт в том, что они физически на диске сервера). Для небольших команд это нормально, но стоит держать в уме два момента:
- Диск растёт незаметно. Скриншоты и документы в карточках накапливаются, особенно если команда активно ведёт задачи с вложениями. Раз в месяц полезно смотреть
docker system dfи объём volume. - S3-совместимое хранилище. Wekan умеет отдавать вложения в S3 (в том числе совместимые сервисы) через переменные окружения
S3вdocker-compose.yml. Для команд с большим объёмом файлов это снимает нагрузку с диска VPS и упрощает бэкапы — база данных остаётся компактной, а файлы живут отдельно.
Если объём вложений небольшой (до нескольких GB), проще оставить локальное хранение и просто закладывать диск с запасом при выборе тарифа сервера.
Бэкапы MongoDB
Канбан-доска легко становится источником правды по текущим задачам — терять её обидно. Бэкап делается штатными средствами MongoDB, дампом базы wekan:
sudo mkdir -p /opt/wekan/backups
sudo docker exec wekan-db mongodump --db wekan --archive=/dump/wekan-$(date +%Y%m%d).archive
sudo docker cp wekan-db:/dump/wekan-$(date +%Y%m%d).archive /opt/wekan/backups/
Автоматизируем через cron — простой скрипт /opt/wekan/backup.sh:
#!/bin/bash
DATE=$(date +%Y%m%d-%H%M)
docker exec wekan-db mongodump --db wekan --archive=/dump/wekan-$DATE.archive
docker cp wekan-db:/dump/wekan-$DATE.archive /opt/wekan/backups/
find /opt/wekan/backups -name "*.archive" -mtime +14 -delete
sudo chmod +x /opt/wekan/backup.sh
sudo crontab -e
# добавить строку:
0 3 * * * /opt/wekan/backup.sh
Скрипт хранит бэкапы за последние 14 дней и чистит старые сам. Дампы стоит периодически копировать за пределы сервера — на объектное хранилище или хотя бы на другую машину, иначе бэкап на том же диске не спасёт при отказе сервера целиком.
Восстановление из архива:
sudo docker cp /opt/wekan/backups/wekan-20260815-0300.archive wekan-db:/dump/restore.archive
sudo docker exec wekan-db mongorestore --db wekan --archive=/dump/restore.archive --drop
Флаг --drop пересоздаёт коллекции перед восстановлением — используйте с осторожностью, это перезапишет текущие данные.
Обновление Wekan
Обновления Wekan выходят регулярно — команда проекта чинит баги и добавляет мелкие функции. Обновление через Docker простое:
cd /opt/wekan
sudo docker compose pull wekan
sudo docker compose up -d wekan
Перед обновлением на проде рекомендуется сделать свежий дамп базы (см. выше) — на случай, если новая версия образа принесёт миграцию схемы, которая пойдёт не так. За последние релизы серьёзных проблем с миграциями не было, но привычка бэкапиться перед обновлением дешевле, чем восстановление задним числом.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли перенести доски из Trello?
Да, в Wekan есть импорт: Admin Panel → доска → Import → загружаете JSON-экспорт доски из Trello (Trello: меню доски → Print, Export, and Share → Export as JSON). Карточки, списки, лейблы и чек-листы переносятся, история активности — частично.
Нужен ли обязательно replica set MongoDB для одного сервера?
Да, даже single-node replica set (как в конфиге выше) нужен — без него не работают некоторые механизмы realtime-синхронизации Wekan, приложение может падать или зависать на отдельных операциях.
Сколько человек выдержит Wekan на минимальном VPS (1 vCPU / 1 GB)?
Для команды до 5-7 активных пользователей с обычным темпом работы этого достаточно. При росте команды или активном использовании вложений лучше сразу закладывать 2 GB RAM.
Есть ли мобильное приложение?
Официального нативного приложения нет, но интерфейс адаптивный и приемлемо работает в мобильном браузере. Через "Добавить на главный экран" в браузере можно получить что-то похожее на PWA-иконку.
Что делать, если после обновления доски не грузятся?
Проверьте логи docker compose logs wekan — чаще всего проблема в устаревшем формате MONGO_URL без replicaSet=rs0 после смены образа, либо в кэше браузера (жёсткое обновление страницы Ctrl+Shift+R решает половину таких случаев).
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →