Иногда проект начинается не с идеи «сделать ещё один продукт», а с гораздо более прозаичного желания: мне нужен нормальный инструмент для себя.
С менеджерами задач у меня получилось именно так. Хотелось иметь систему, которая живёт на моей инфраструктуре, хранит мои данные у меня, не требует подписки и не зависит от того, что завтра произойдёт с очередным облачным сервисом. При этом мне не нужен был тяжёлый корпоративный комбайн — нужен был просто удобный ежедневный рабочий инструмент.
Так появился TMS. Некоторое время я делал его именно под свои задачи, а теперь проект уже достаточно оформился, чтобы выложить его в открытый доступ. Поэтому с сегодняшнего дня TMS — open source: опубликованы исходники, готовые Docker-образы и отдельный stack для Portainer.
Что получилось
TMS — небольшая self-hosted система управления задачами. Основной сценарий простой: открыть её утром и использовать весь день, не превращая само управление задачами в отдельную работу.
Сейчас в TMS есть:
- три представления задач — список, Kanban-доска и календарь;
- быстрое создание задач и полноценное редактирование;
- описания, вложения, сроки и приоритеты;
- настраиваемые статусы и типы задач;
- заказчики и типизированные пользовательские поля;
- расширенные фильтры, сортировка, пагинация и массовые операции;
- персональные настройки языка, часового пояса и темы;
- русский и английский интерфейс;
- многопользовательский режим с изоляцией данных;
- опциональная самостоятельная регистрация и подтверждение пользователей;
- уведомления по email и Telegram;
- восстановление пароля через web-интерфейс и локальную консоль.
Всё это работает как обычное web-приложение с MariaDB и рассчитано на развёртывание в Docker.
Почему self-hosted
Для меня здесь это не просто способ распространения. Я изначально хотел, чтобы задача, заметка к ней, приложенный файл и вся остальная рабочая информация не требовали стороннего аккаунта и не жили на чужой инфраструктуре.
Поэтому TMS не завязан на внешний сервис. Сервер можно поднять дома, на VPS или в своей локальной инфраструктуре, поставить перед ним привычный nginx/Caddy/Traefik и дальше обращаться с ним как с любым другим собственным сервисом.
Что теперь опубликовано
Исходники находятся на GitHub:
Готовые контейнерные образы публикуются в GHCR для linux/amd64 и linux/arm64:
ghcr.io/mirivlad/tms:latest
Для production я всё же советую использовать конкретный стабильный тег, чтобы обновление не произошло неожиданно. На момент публикации текущий стабильный релиз — v0.1.3.
Лицензия проекта — AGPL-3.0-or-later.
Развёртывание через Portainer
Это как раз тот способ, которым удобно пользоваться, если Portainer уже есть в инфраструктуре. В репозитории лежит отдельный файл:
compose.portainer.yaml
Можно создать новый Stack из Git-репозитория https://github.com/mirivlad/tms.git и указать этот compose-файл. В Environment достаточно задать основные параметры:
APP_URL— публичный адрес TMS, напримерhttps://tasks.example.com;APP_TIMEZONE— часовой пояс IANA;APP_LOCALE—ruилиen;DB_PASS— пароль MariaDB;SESSION_SECURE=true, если сайт работает через HTTPS;- при необходимости
TMS_PORT— по умолчанию приложение публикуется на порту8080.
После первого запуска нужно открыть Console контейнера app и создать администратора:
php bin/create-admin.php admin admin@example.com
Пароль утилита запросит интерактивно.
MariaDB наружу не публикуется. На reverse proxy достаточно направить HTTP-порт TMS, например для nginx:
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Про данные и backup
В стандартном stack используются три именованных volume:
tms-db— база MariaDB;tms-attachments— вложения;tms-secrets— ключ шифрования данных уведомлений.
Резервировать нужно все три. Один только dump базы — неполный backup: без volume с вложениями потеряются файлы, а без ключа из tms-secrets восстановленная база не сможет расшифровать сохранённые SMTP/Telegram-реквизиты.
Обычный Docker Compose
Если Portainer не нужен, всё ещё проще. Для готового образа:
cp .env.example .env
# заполнить .env
docker compose -f compose.portainer.yaml up -d
А для сборки прямо из текущих исходников:
docker compose up -d --build
Миграции базы выполняются автоматически при запуске приложения.
Что дальше
TMS остаётся проектом, который я в первую очередь использую сам, поэтому развиваться он будет от реальных повседневных задач, а не ради количества функций в списке.
Но теперь он открыт. Если кому-то нужен именно такой небольшой self-hosted менеджер задач — можно поставить готовый stack, посмотреть код, открыть issue с найденной ошибкой или предложением.
Отдельную страницу проекта я добавил и сюда: TMS на mirv.top →
А исходники и документация находятся здесь: github.com/mirivlad/tms →