TMS: self-hosted менеджер задач, который я делал для себя

Иногда проект начинается не с идеи «сделать ещё один продукт», а с гораздо более прозаичного желания: мне нужен нормальный инструмент для себя.

С менеджерами задач у меня получилось именно так. Хотелось иметь систему, которая живёт на моей инфраструктуре, хранит мои данные у меня, не требует подписки и не зависит от того, что завтра произойдёт с очередным облачным сервисом. При этом мне не нужен был тяжёлый корпоративный комбайн — нужен был просто удобный ежедневный рабочий инструмент.

Так появился TMS. Некоторое время я делал его именно под свои задачи, а теперь проект уже достаточно оформился, чтобы выложить его в открытый доступ. Поэтому с сегодняшнего дня TMS — open source: опубликованы исходники, готовые Docker-образы и отдельный stack для Portainer.

TMS
SELF-HOSTED TASK MANAGEMENT

Что получилось

TMS — небольшая self-hosted система управления задачами. Основной сценарий простой: открыть её утром и использовать весь день, не превращая само управление задачами в отдельную работу.

Сейчас в TMS есть:

  • три представления задач — список, Kanban-доска и календарь;
  • быстрое создание задач и полноценное редактирование;
  • описания, вложения, сроки и приоритеты;
  • настраиваемые статусы и типы задач;
  • заказчики и типизированные пользовательские поля;
  • расширенные фильтры, сортировка, пагинация и массовые операции;
  • персональные настройки языка, часового пояса и темы;
  • русский и английский интерфейс;
  • многопользовательский режим с изоляцией данных;
  • опциональная самостоятельная регистрация и подтверждение пользователей;
  • уведомления по email и Telegram;
  • восстановление пароля через web-интерфейс и локальную консоль.

Всё это работает как обычное web-приложение с MariaDB и рассчитано на развёртывание в Docker.

Почему self-hosted

Для меня здесь это не просто способ распространения. Я изначально хотел, чтобы задача, заметка к ней, приложенный файл и вся остальная рабочая информация не требовали стороннего аккаунта и не жили на чужой инфраструктуре.

Поэтому TMS не завязан на внешний сервис. Сервер можно поднять дома, на VPS или в своей локальной инфраструктуре, поставить перед ним привычный nginx/Caddy/Traefik и дальше обращаться с ним как с любым другим собственным сервисом.

Что теперь опубликовано

Исходники находятся на GitHub:

github.com/mirivlad/tms

Готовые контейнерные образы публикуются в 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_LOCALEru или 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 →

Оставить комментарий

Email не публикуется. Поля, отмеченные *, обязательны.