Команда инженеров · свой ЦОД в РФ · своё железо · своя панель · CloudStack + Linstor · MCP · база знаний по self-hosted
Продуктивность и планирование

Kimai

Учет оплачиваемых часов по клиентам и проектам на своем сервере. Проверили путь от записи времени и ставки до сохраненного счета, а также ресурсы стека и ошибки установки.

Проверено на версии 2.67.0, 4 октября 2026~10 мин чтенияFatmetal Team
Учет времениAGPL-3.0Проверен на стенде

Вердикт

Подходит
  • Подрядчику, который выставляет клиентам часы по проектам.
  • Команде, которой нужны свои записи времени и ставки.
Не подходит
  • Для контроля присутствия через СКУД.
  • Для команды без человека, который поддерживает сервер и базу данных.
Тариф стенда: CPU2-RAM4-DISK50Память в простое: 569.42 МиБУстановка: Docker ComposeРиск: резервные копии и обновления на владельце
Задача

Что Kimai дает команде

Kimai связывает запись времени с клиентом, проектом и видом работы. Исполнитель запускает таймер или вносит часы вручную, а руководитель видит, на что ушло время. Ставку можно назначить для оплачиваемой работы и собрать счет из выбранных записей.

На стенде мы создали клиента и проект, внесли 1:30 работы и указали ставку 1500 ₽ в час. В разделе счетов Kimai рассчитал 2250 ₽ и сохранил счет с номером 2026/001. Это проверенный путь в веб-интерфейсе, а не описание возможностей по README.

После сохранения счета запись остается в истории с номером и статусом. Это помогает отделить подготовку документов от ведения времени, но не превращает Kimai в бухгалтерскую систему. Проверять реквизиты и правила учета придется вне этого теста.

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

PHP / SymfonyMySQL 8.4Docker ComposeCaddy / HTTPS
Kimai: сохраненная запись времени на полтора часа по клиенту и проекту
Запись времени на живом стенде: клиент, проект, работа и длительность.
Сравнение

Чем отличается от облачных трекеров

У самостоятельной установки нет платы за каждое место в самом открытом коде. Вместо подписки команда оплачивает сервер и берет на себя обновления, мониторинг, резервные копии и восстановление. Отдельные плагины Kimai продаются платно.

ВариантЦена на 04.10.2026Что важно
Kimai на своем сервереAGPL-код без оплаты за место; сервер отдельноДанные, доступность и копии в вашем контуре
Kimai Cloud Standard€2,99 за пользователя в месяц при годовой оплатеХостинг и обслуживание у вендора
Toggl Track Starterот $9 за пользователя в месяц при годовой оплатеОплачиваемые ставки и отчеты в подписке
Clockify Standardот $5,49 за место в месяц при годовой оплатеВ тарифе есть выставление счетов

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

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

Архитектура

Как устроен стек

Наш Compose-проект содержит официальный образ kimai/kimai2:2.67.0, MySQL 8.4.11 и Caddy 2.10.2. Приложение и база общаются во внутренней сети Docker. Наружу через HTTPS смотрит только обратный прокси; порт Kimai привязан к localhost.

MySQL хранит клиентов, проекты, пользователей, ставки, записи времени и историю счетов. Отдельные тома Compose отведены под данные Kimai и плагины. Сертификаты Caddy лежат в своих томах. При переносе важны база и прикладные тома, а не только контейнеры.

Валюта в проверенном примере задана клиенту, а ставка введена в запись времени. Kimai объединил их при расчете счета. У проекта могут быть и другие ставки и правила округления; на стенде мы их не сравнивали.

Для почты образ поддерживает MAILER_URL и MAILER_FROM. Без рабочего SMTP ссылка «Я забыл пароль» не завершит восстановление доступа. На стенде тестовое письмо через STARTTLS дошло до ящика; полный сброс пароля мы не проводили. Настройка почты описана апстримом.

Ресурсы

Какую машину выбрать

Апстрим не дает численного минимума памяти для нашего трехконтейнерного состава. Поэтому отправной точкой служит замер на VM с 2 vCPU, 4 ГБ RAM и диском 50 ГБ. Для проверенного сценария выбираем фиксированный CPU2-RAM4-DISK50.

Стендfatmetal-dev, stand-1; Ubuntu 24.04.4
Память контейнеров в простоеKimai 92.15 + MySQL 464.6 + Caddy 12.67 = 569.42 МиБ
Доступная память VM2816 МиБ после установки
Образы2.367 ГБ по docker system df
Корневая файловая система4.8 из 48 ГБ занято

Показатель free -m включает память всей VM, а docker stats измеряет отдельные контейнеры. Складывать эти числа как независимые расходы нельзя: часть памяти относится к системным процессам и файловому кешу.

i

Граница рекомендации. Это простой и один тестовый пользователь. Параллельные команды, большие отчеты и тяжелые плагины под нагрузкой не измерялись. При таком сценарии тариф следует перепроверить.

Установка

Как мы развернули Kimai

На чистую Ubuntu 24.04 поставили Docker Engine и Compose из официального apt-репозитория Docker. Скрипт создал случайные пароли базы и администратора, секрет приложения и файл доступов с закрытыми правами. Затем поднял MySQL, Kimai и Caddy.

  1. Выбрать постоянные данные

    Сохранить Compose-файл и секреты в закрытом каталоге. База, данные приложения и плагины должны жить в томах, переживающих пересоздание контейнеров.

  2. Закрепить версии

    В стенде использованы конкретные теги трех образов, а не latest. Для обновления сначала проверьте совместимость Kimai и базы, затем сделайте копию.

  3. Поднять сервисы

    Compose ждет здоровую базу, затем запускает приложение. Caddy выпускает сертификат для публичного домена; приложение остается на 127.0.0.1:8001.

  4. Проверить пользовательский путь

    Недостаточно ответа главной страницы: мы вошли в браузере, сохранили время, ставку и счет. После пересоздания контейнера Kimai данные остались в интерфейсе.

sudo docker compose -f /opt/kimai/compose.yml pull
sudo docker compose -f /opt/kimai/compose.yml up -d
sudo docker compose -f /opt/kimai/compose.yml ps

Повторный запуск скрипта не перезаписывает уже созданные пароли. После изменения Caddyfile он явно перечитывает конфигурацию прокси; один docker compose up -d не применил бы изменение смонтированного файла к уже работающему Caddy.

Текущая документация Compose и README расходятся по примеру версии MySQL: в образце встречается 8.3, тогда как релиз требует 8.4+. Стенд с MySQL 8.4.11 прошел миграции и сохранил счет.

Kimai: список проектов с созданным демо-проектом
Проект в рабочем пространстве после сохранения.
Проверка

Что показал живой стенд

У MySQL и Kimai статус healthy, Caddy работает. Пять последовательных запросов с машины конвейера к публичной странице входа дали HTTP 200 и проверенный TLS. Медиана полного ответа с редиректами составила 0.114 с.

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

Снимки сделаны браузером с машины конвейера через тот же публичный адрес, которым пользуется клиент. Поэтому проверка включала авторизацию, cookie, прокси и сертификат. Локальный ответ контейнера сам по себе не дал бы такой проверки.

При создании счета шаблон оказался обязательным. Мы выбрали клиента, создали шаблон, назначили записи времени ставку 1500 ₽/час и получили счет на 2250 ₽. История сохранила номер 2026/001 и статус «Новый». Содержимое скачиваемого документа не проверяли.

Kimai: история счетов со счетом на 2250 рублей
История счетов после сохранения тестового документа.

Проверено 4 октября 2026 на Kimai 2.67.0 в dev-контуре stand-1. Клиентский заказ в prod-контуре проверяется отдельно.

Ошибки

Где установка споткнулась

При первом запуске Kimai выполнил миграции, но его проверка здоровья и локальный запрос отвечали HTTP 400. В TRUSTED_HOSTS был только внешний домен: запрос к localhost сервер счел недоверенным. Это ошибка конфигурации, которую легко принять за недоступность приложения.

Untrusted Host "127.0.0.1"

Причина. Локальное имя не попадало в допустимые хосты приложения.

Решение. Указать localhost|127.0.0.1|ваш-домен в TRUSTED_HOSTS и пересоздать контейнер. Docker-документация Kimai допускает такую форму.

В форме времени выбор проекта обновляет список видов работ. Если активность выбрана раньше проекта, она сбрасывается; первый тест вернулся с «Необходимо выбрать активность». Правильный порядок - проект, обновленный список активности, затем сохранение.

!

Счета требуют подготовки. Без шаблона раздел счетов переводит на форму его создания. Для настоящего документа нужен собственный профиль компании-отправителя, реквизиты и налоговые параметры; тестовый шаблон этого не заменяет.

Эксплуатация

Доступ, копии и обновления

Создайте отдельные учетные записи для сотрудников и ограничьте права ролями. Административный пароль и APP_SECRET должны быть уникальными. Файл /opt/kimai/.env на стенде доступен только root; туда же попадают реквизиты SMTP, если включена почта.

Снаружи нужны только 80 и 443 для Caddy и выпуска сертификата. Порт Kimai слушает localhost, MySQL в публичную сеть не выставлен. Внешний доступ к базе лучше открывать отдельно и только под конкретный сценарий, а не как часть типовой установки.

Перед обновлением делайте согласованную копию MySQL и томов Kimai. Команда docker compose down -v удаляет тома и здесь опасна. Восстановление из копии на отдельной машине мы не проверяли, поэтому наличие файлов не следует путать с доказанной процедурой восстановления.

Для полного восстановления понадобятся не только файлы приложения. Проверьте экспорт базы, сохранение томов и секретов, срок хранения копий и пробное восстановление на отдельной VM. Наш тест пересоздания одного контейнера не заменяет такую проверку.

Обновление - это новая пара совместимых версий приложения и БД, а не слепой переход на latest. После смены тегов повторите вход и путь от записи времени до счета. Релизы Kimai и инструкция по Compose служат точками сверки.

Соседи

С чем соединить Kimai

Redmine подойдет, если команде нужен подробный жизненный цикл задач, а Kimai отвечает за оплачиваемые часы и выставление счета. Связь между ними не настраивалась на стенде; здесь речь о разделении ролей продуктов, не о готовой интеграции.

Caddy закрывает публичный HTTPS и остается в составе рецепта. Для почты понадобится ваш SMTP-сервис. Отчеты Kimai открываются в интерфейсе, а регулярные выгрузки и бухгалтерскую интеграцию следует оценивать на собственных данных и требуемых форматах.

Kimai: список доступных отчетов по пользователям и проектам
Доступные виды отчетов; конкретную выгрузку на стенде не тестировали.
Ограничения

Когда это НЕ ваш выбор

Нужен учет явки, а не работы по проектам

Kimai хранит оплачиваемые записи времени. Контроль проходов, смен и требования к табелю сотрудников лучше проверять в кадровой системе или СКУД.

Нужен сервис без администрирования

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

Нужны бухгалтерские документы под конкретную юрисдикцию

Мы проверили расчет и сохранение счета, но не юридические реквизиты, экспорт и соответствие местным правилам. Сверьте шаблон с бухгалтером до отправки клиенту.

AGPL-3.0 позволяет самостоятельную установку открытого ядра, но условия лицензии для модифицированного сервиса и состав платных плагинов нужно разбирать отдельно. Особенно если вы планируете дорабатывать Kimai и давать доступ сторонним клиентам.

FAQ

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

Можно ли вести время по нескольким клиентам?

Да. В проверенном сценарии запись привязана к клиенту, проекту и виду работ. Клиент и проект создаются отдельно до записи времени.

Счет строится сразу после установки?

Сначала требуется шаблон счета. Затем можно отобрать оплачиваемые записи за период, задать ставку и сохранить результат.

Что будет без SMTP?

Учет времени работает, но восстановлению пароля и другим письмам нужен почтовый транспорт. На стенде доставка тестового письма проверена.

Хватит ли 2 ГБ RAM?

Такой тариф не испытывали. Рекомендуем CPU2-RAM4-DISK50 по измеренному стеку на 4 ГБ; это не официальный минимум Kimai.

Можно ли поменять домен после установки?

Нужно обновить адрес в прокси, допустимые хосты Kimai и сертификат. Простого DNS-переключения без проверки этих настроек недостаточно.

Как сохранить данные при обновлении?

Сохраняйте дамп MySQL и тома приложения и плагинов, затем проверяйте восстановление. Мы подтвердили сохранность после пересоздания контейнера, но полный restore не тестировали.

Есть ли плата за каждого сотрудника?

За открытый self-hosted код - нет; сервер и сопровождение оплачиваются отдельно. В облачном предложении вендора оплата идет за пользователя.

Итог

Kimai связывает часы, ставку и клиента в одном самостоятельном экземпляре. На стенде удалось сохранить запись и счет; путь установки требует MySQL, прокси с TLS, уникальных секретов и плановой работы с копиями. Для проверенного простоя подходит CPU2-RAM4-DISK50.

Анонсы новых разборов в Telegram-каналеНовые гайды и карточки в маркетплейсе первыми@fatmetal_channel →

Проверено на стенде fatmetal-dev в октябре 2026. Условия клиентского заказа и результаты под нагрузкой требуют отдельной проверки.

Спросить инженера в TelegramМы на связи