DTPulse on-prem
Self-hosted DTPulse — полная функциональность нашего SaaS dtpulse.ru, развёрнутая на вашей инфраструктуре. Один Docker-стек, лицензионный ключ, периодический phone-home к нашему license-серверу для проверки валидности.
Требования
- Linux-хост (любой дистрибутив с поддержкой Docker)
- Docker 24+ и Docker Compose v2
- 4 ГБ RAM, 20 ГБ свободного места на диске
- Открытые порты 80 и 443 из публичного интернета (Caddy автоматически выпускает TLS-сертификаты через Let's Encrypt)
- DNS A/AAAA-запись, указывающая на этот хост
- Исходящий HTTPS к
dtpulse.ruтолько на этапе установки —/api/license/redeemбиндит ключ кinstanceIdэтого хоста. После установки instance работает полностью офлайн весь срок действия лицензии: ключ HMAC-подписан с встроеннымexpiresAt,planиmaxEmployees, проверка идёт локально без обращения к нашему серверу.
Air-gapped после установки. Опциональный лицензионный heartbeat по умолчанию выключен (env LICENSE_HEARTBEAT_ENABLED не задан). Если хочется автоматических продлений и возможности удалённого отзыва ключа — включается env-флагом; рекомендуемая частота — раз в день, не в час. Для полностью air-gapped установок (нет интернета и при первой установке тоже) — обратитесь в отдел продаж за заранее привязанным ключом.
Быстрая установка (10 минут)
Установка одной командой:
sh -c "$(curl -fsSL https://dtpulse.ru/install)"
Инсталлятор спросит:
- Лицензионный ключ — токен
dtp_op_…, выдан вам отделом продаж. Сразу проверяется на license-сервере: отозванные, опечатанные или ключи для другой платформы выдают ошибку и инсталлятор снова просит ключ — установка не пойдёт дальше с неправильным ключом. - Email администратора — логин первого администратора
- Название компании — отображается в интерфейсе и письмах
- HTTP-порт — по умолчанию
80; можно выбрать другой (например,8080), если 80 занят - SMTP host / user / password / from — для приглашений, восстановления пароля, уведомлений об истечении лицензии (можно пропустить, но настоятельно рекомендуем настроить сразу)
- Yandex Maps API key — ключ от developer.tech.yandex.ru; если пропустить, карты будут использовать OpenStreetMap
Инсталлятор скачает Docker-образы, поднимет стек и напечатает одноразовый пароль администратора прямо в выводе между маркерами SEED_CREDENTIALS. Всё занимает 2–5 минут на свежей VPS.
Перед запуском: Linux-хост с Docker 24+ и Docker Compose v2. Если Docker не установлен:
curl -fsSL https://get.docker.com | sh
Расширенный инсталлятор (с доменом + Caddy + автоматическим TLS) — если у вас уже есть домен и нужен HTTPS с первого старта, запросите у отдела продаж production-инсталлятор: он сразу поднимает Caddy с Let's Encrypt. Команда выше — HTTP-only по голому IP, для тестового запуска.
Первый вход
1. Откройте https://ваш-домен.ру/ (TLS автоматически выпустит Caddy)
2. Войдите с email администратора и одноразовым паролем из вывода инсталлятора
3. Приложение сразу попросит сменить пароль
Не успели сохранить одноразовый пароль? Вытащите из логов:
cd /opt/dtpulse
docker compose logs app | grep -A4 SEED_CREDENTIALS
(Работает пока логи не ротировались. Если SMTP настроен, на /signin доступна форма «Забыли пароль?».)
Настройка почты
Инсталлятор спрашивает SMTP сразу — если вы пропустили этот шаг, приложение работает, но:
- Приглашения не отправляются
- Восстановление пароля сломано (риск блокировки, если админ забудет пароль)
- Уведомления о согласовании отсутствий не приходят
- Предупреждения об истечении лицензии не дойдут — узнаете о проблеме в день блокировки доступа, а не за 14 дней. Главная причина не пропускать настройку SMTP.
Чтобы добавить SMTP позже — отредактируйте /opt/dtpulse/.env:
SMTP_HOST=smtp.yandex.ru # либо mail.ru, ваш собственный Postfix и т.п.
SMTP_PORT=465
SMTP_USER=noreply@yourcompany.ru
SMTP_PASS=ваш-пароль-или-API-key
EMAIL_FROM=DTPulse noreply@yourcompany.ru
Затем перезапустите контейнер:
cd /opt/dtpulse && docker compose restart app
Проверьте: в DTPulse зайдите в /admin/staff, отправьте приглашение себе на другой email, убедитесь что письмо пришло. Если нет — посмотрите логи:
docker compose logs app | grep -i 'email\|smtp'
SSO (опционально)
DTPulse поддерживает SAML 2.0 (Okta, Azure AD, Google Workspace, OneLogin, Keycloak, ADFS). Настройка — /admin/integrations после первого входа. Конфигурация per-tenant, env-переменные не нужны.
Карты (Yandex Maps API key)
CityPicker в карточках сотрудников и страница /map (офисы + сотрудники по городам) используют Yandex.Карты. Без API-ключа автоматически переключаются на OpenStreetMap. Чтобы включить Яндекс:
1. Получите ключ — зайдите на developer.tech.yandex.ru, войдите под своим Yandex-аккаунтом (НЕ общим с поставщиком — биллинг привязан к владельцу ключа).
2. Нажмите «Подключить API» → выберите «JavaScript API и HTTP Геокодер».
3. В разделе «HTTP Referer» добавьте домен вашей инсталляции (например, dtpulse.yourcompany.ru или *.yourcompany.ru). Без правильного referer Yandex отказывается загружать тайлы и карта остаётся пустой.
4. Скопируйте ключ (выглядит как aB1cD2ef-3456-7890-abcd-ef1234567890).
5. Добавьте в /opt/dtpulse/.env:
echo 'YANDEX_MAPS_API_KEY=aB1cD2ef-3456-7890-abcd-ef1234567890' >> /opt/dtpulse/.env
cd /opt/dtpulse && docker compose restart app
6. Жёстко обновите открытую вкладку (⌘+Shift+R / Ctrl+Shift+R) — карта должна показать тайлы Яндекса с русскими подписями и копирайтом Yandex в углу.
Важно — не используйте чужие ключи (включая наши). Ключ привязан к конкретному домену (Yandex блокирует запросы с других хостов) и расход API биллится на аккаунт владельца ключа. Нужен ваш собственный.
Смена домена после установки
Если вы установили на одно имя (IP, dtpulse.staging.example.ru и т.п.) и позже хотите переехать на другое — обновите NEXTAUTH_URL и перезапустите:
cd /opt/dtpulse
sed -i 's|^NEXTAUTH_URL=.*|NEXTAUTH_URL=https://new-domain.example.ru|' .env
sed -i 's|^DOMAIN=.*|DOMAIN=new-domain.example.ru|' .env
docker compose up -d app caddy
Зачем это важно: все письма (восстановление пароля, верификация email, согласования отсутствий, уведомления, приглашения на ревью) собирают ссылки как ${NEXTAUTH_URL}/.... Если NEXTAUTH_URL остался указывать на старое имя — пользователи получат письма со ссылками на хост, который больше не обслуживает приложение, а токены reset/verify хранятся в локальной БД (открыть их с другого хоста нельзя). Приложение пишет warning при старте, если NEXTAUTH_URL пуст или указывает на наш SaaS-домен:
docker compose logs app | grep '\[on-prem startup\]'
Бэкапы
Два тома для бэкапа:
pgdata— данные Postgres (всё: тенанты, сотрудники, статьи KB и т.д.)./data/— runtime-файлы (license cache, initial credentials)
Рекомендуется ночной pg_dump:
docker compose exec db pg_dump -U dtpulse dtpulse | gzip > backups/$(date +%F).sql.gz
Обновления
cd /opt/dtpulse && docker compose pull && docker compose up -d
Стянет последний опубликованный образ, перевыкатит app + cron-контейнеры. Данные Postgres и конфиги сохраняются. Миграции применяются автоматически; если миграция падает — docker-compose оставляет работать предыдущий контейнер, безопасный rollback.
Чтобы зафиксировать конкретную версию вместо :latest, отредактируйте .env:
IMAGE_TAG=v1.4.2
Продление лицензии
У лицензии есть дата окончания. Приложение шлёт email админам за 14 дней, за 7 дней и в день истечения; ещё 30 дней работает в льготном режиме, после чего вход блокируется. Данные не удаляются ни на каком этапе — ввод нового ключа на странице /blocked (или через продажи по email) восстанавливает доступ мгновенно.
Продление: запросите новый ключ у sales@dtpulse.ru, затем либо:
- Отредактируйте
LICENSE_KEYв.envиdocker compose restart app - Либо, если уже заблокировано, вставьте новый ключ на странице
/blocked
Поиск проблем
Инсталлятор отказывается принимать лицензионный ключ:
Couldn't reach the license server— исходящий HTTPS кdtpulse.ruзаблокирован на этом хосте на момент redeem'а. Откройте egress дляdtpulse.ru:443единоразово и повторите ввод ключа; после этого порт можно закрывать обратно — для рантайма он не нужен.Key not recognized— опечатка, либо вы используете ключ, выпущенный для другой платформы. Перепроверьте ключ, отправленный продажами; он должен начинаться сdtp_op_.This key was revoked/already bound to another installation— обратитесь в продажи за заменой или перепривязкой ключа при легитимной миграции на новую VPS.
Сайт не открывается (нет TLS, нет ответа):
- DNS: проверьте что домен указывает на этот хост:
dig +short ваш-домен.ру
- Firewall: открыты ли порты 80 и 443:
sudo ufw status
- Логи Caddy:
docker compose logs caddy
Сразу после установки появляется страница /blocked:
- License-сервер недоступен с этого хоста
- Проверка:
curl https://dtpulse.ru/api/license/verify
- Убедитесь что
LICENSE_KEYв env соответствует ключу, выданному продажами
Одноразовый пароль админа не показан / уже прокрутился:
- Вытащите из логов:
docker compose logs app | grep -A4 SEED_CREDENTIALS
- Если логи ротировались — используйте «Забыли пароль?» на
/signin(требуется настроенный SMTP).
Падают подключения к БД после перезагрузки хоста:
- Postgres стартует раньше Docker;
restart: unless-stoppedобычно справляется. Если нет:
docker compose restart
Поддержка
- Продажи / продление лицензии:
sales@dtpulse.ru - Сообщения об уязвимостях:
security@dtpulse.ru