MAATRIX / Блог / Тренер шлёт программы в мессенджер: личный кабинет клиента на сервере

Тренер шлёт программы в мессенджер: личный кабинет клиента на сервере

MAATRIX

У вас двадцать активных клиентов, и у каждого своя папка переписки в WhatsApp или Telegram, где вперемешку лежат PDF с программой, голосовые про технику приседа, фото прогресса и вопрос «а мне сегодня третий или четвёртый день делать?». Через полгода такой работы вы не тренер, а архивариус собственных чатов, который тратит вечер пятницы на поиск, какую версию программы вы отправили Марине на этой неделе. Решение не в том, чтобы писать более подробные сообщения — оно в том, чтобы у каждого клиента был один адрес, где лежит то, что актуально сейчас, и ничего больше.

Почему переписка не работает как система хранения программ

Мессенджер спроектирован для разговора, а не для хранения структурированных данных, и это не критика WhatsApp — это просто не его задача. Программа тренировок, которую вы туда отправляете, немедленно проваливается в общий поток: вопросы клиента, ваши ответы, стикеры, пересланные видео с YouTube. Через две недели файл с программой физически существует в чате, но найти его — это скролл на пятьдесят экранов назад или судорожный поиск по слову «программа», который выдаёт все три версии подряд, и непонятно, какая из них финальная.

У этой проблемы есть конкретные симптомы, которые вы наверняка узнаете:

  • клиент присылает скриншот программы месячной давности и спрашивает, актуальна ли она — потому что не помнит, была ли правка;
  • вы сами не помните, отправили ли обновлённую версию после того, как перенесли день ног из-за травмы плеча;
  • история прогресса (веса, повторения, самочувствие) живёт в отдельном экселе на вашем ноутбуке, клиент её не видит вообще;
  • при смене телефона или переустановке мессенджера часть истории с клиентом теряется безвозвратно;
  • новый клиент, который видит, что у вас «система» — это чат с двумя сотнями сообщений — делает выводы о вашей организованности, и не в вашу пользу.

Отдельно стоит проблема версионирования. В переписке физически нет механизма «текущая версия документа» — есть только последнее отправленное сообщение, и если клиент скроллит быстро, он легко откроет не тот файл. Это не гипотетический риск: неправильная нагрузка из старой программы после перенесённой травмы — это не про неудобство, а про физическую безопасность клиента.

Что решает личный кабинет и что не решает

Личный кабинет клиента на вашем сервере — это не CRM федерального фитнес-клуба и не сложная SaaS-платформа с подписками, которую вы будете оплачивать в валюте и от которой будете зависеть. Это структурированное место, куда клиент заходит и видит ровно то, что нужно: актуальную программу, историю того, что было раньше, и материалы, которые вы для него подготовили. Всё остальное — общение по текущим вопросам, голосовые с разбором техники — по-прежнему может идти в мессенджере, потому что это его законная роль. Кабинет не заменяет общение, он снимает с общения нагрузку по хранению документов.

Важно трезво обозначить границы. Кабинет на своём сервере не даст вам автоматической аналитики вроде «сколько клиент недосыпает» или интеграции с фитнес-трекерами из коробки — это будет отдельная работа, если вообще понадобится. Он не заменит специализированный сервис для трекинга КБЖУ с базой продуктов на миллион позиций. Его задача уже — быть надёжным и понятным хранилищем структуры, а не универсальным комбайном. Для большинства персональных тренеров с клиентской базой от пяти до нескольких десятков человек этого достаточно с большим запасом.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Из чего состоит минимальный кабинет клиента

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

  • Актуальная программа — один файл или один раздел, который всегда содержит только текущую версию. Никаких «программа_финал_v3_ИСПРАВЛЕНО».
  • История программ — предыдущие версии не удаляются, а переезжают в архив с датой, чтобы при необходимости можно было посмотреть, что делали три месяца назад.
  • Дневник прогресса — веса, подходы, повторения, ощущения после тренировки. В идеале клиент может сам вносить данные после занятия, а не присылать их вам голосовым.
  • Материалы — видео с разбором техники, статьи про восстановление, рекомендации по разминке. То, что вы отправляете не одному клиенту, а многим, и что не должно каждый раз копироваться заново в переписку.
  • Заметки тренера — то, что видите только вы: наблюдения о прогрессе, план на следующий цикл, повод для разговора на следующей сессии.

Обратите внимание, что часть этой структуры уже частично закрывают инструменты, которые применяют другие практикующие специалисты для похожих задач — например, у репетиторов и фотографов та же логика «у клиента должен быть один адрес для актуальных материалов» решается похожими средствами, вроде клиентской галереи с версиями и правками или личного архива материалов на сервере, только вместо фото и эскизов — программы тренировок и дневники прогресса.

Технологическая база: Nextcloud как личный кабинет

Писать веб-приложение с нуля для этой задачи почти всегда избыточно — вы не разработчик, и поддержка кастомного кода превратится в отдельную профессию, которой вы не хотели заниматься. Практичнее взять готовую платформу для совместной работы с файлами и данными и настроить её под структуру клиента-программа-прогресс. Хорошо подходит Nextcloud: это open-source платформа, которую вы разворачиваете на своём сервере, она даёт файловое хранилище с версионированием из коробки, разграничение доступа по пользователям и приложение «Таблицы» (Tables) для структурированных данных вроде дневника прогресса — без необходимости поднимать отдельную базу данных и писать интерфейс к ней.

Ключевое преимущество для вашей задачи — встроенное версионирование файлов. Когда вы обновляете программу клиента, предыдущая версия не исчезает и не создаёт путаницы с именами файлов — она автоматически сохраняется в истории версий этого же файла, а клиент видит только актуальный. Это ровно то, чего не хватает мессенджеру.

Разворачивание через Docker Compose — стандартный и предсказуемый путь, если вы уже пользуетесь сервером под управлением Linux. Минимальный набор сервисов:

version: "3.8"
services:
  db:
    image: mariadb:11
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: замените_на_свой_пароль
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: замените_на_свой_пароль
    volumes:
      - db_data:/var/lib/mysql

  app:
    image: nextcloud:29-apache
    restart: unless-stopped
    depends_on:
      - db
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: nextcloud
      MYSQL_USER: nextcloud
      MYSQL_PASSWORD: замените_на_свой_пароль
      NEXTCLOUD_TRUSTED_DOMAINS: kabinet.ваш-домен.ru
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - nc_data:/var/www/html

volumes:
  db_data:
  nc_data:

После docker compose up -d сервис слушает только локально (127.0.0.1:8080) — наружу его выпускает nginx с TLS-сертификатом, который логично оформить через Let's Encrypt: этот шаг подробно разобран в отдельном материале про установку SSL-сертификата на VPS, здесь достаточно проксировать kabinet.ваш-домен.ru на порт 8080 и включить редирект на https.

Общая пошаговая установка самого Nextcloud, если хочется развернуть его без Docker или разобраться в деталях конфигурации, описана в материале про установку Nextcloud на VPS — там же разбираются типичные грабли первого запуска.

Структура: один клиент — одна изолированная область

Технически неверно давать всем клиентам доступ в общее хранилище с папками по именам — рано или поздно кто-то по ошибке (или через баг в настройках прав) увидит чужую программу, а с персональными данными о здоровье это чувствительно. Правильный подход — групповые папки (Group Folders), приложение, которое входит в стандартный набор Nextcloud и позволяет создавать изолированные пространства с индивидуальными правами.

Порядок действий через консоль сервера (occ — консольная утилита Nextcloud, вызывается изнутри контейнера):

# включаем приложение групповых папок
docker exec -u www-data nextcloud-app-1 php occ app:enable groupfolders

# создаём пользователя-клиента (пароль он сменит при первом входе)
docker exec -u www-data nextcloud-app-1 php occ user:add --display-name="Марина Клиент" marina_client

# создаём изолированную папку для клиента
docker exec -u www-data nextcloud-app-1 php occ groupfolders:create "Марина — кабинет"

# даём доступ группе, в которую входит только этот клиент
docker exec -u www-data nextcloud-app-1 php occ groupfolders:group 1 marina_group

Внутри каждой такой папки создайте одинаковую структуру подпапок для всех клиентов — это экономит вам время на объяснения и делает кабинет предсказуемым для клиента, который переходит от одного тренера к другому и уже видел похожие системы:

Марина — кабинет/
├── 01_Текущая программа/
│   └── Программа_сентябрь_2026.pdf
├── 02_Архив программ/
│   ├── Программа_июль_2026.pdf
│   └── Программа_май_2026.pdf
├── 03_Прогресс/
│   └── (таблица через приложение Tables)
└── 04_Материалы/
    ├── Разминка_видео.mp4
    └── Техника_становой.mp4

Название файла в «Текущей программе» всегда одно и то же по смыслу — «текущая программа», без версий и приписок в имени. Меняете содержимое — Nextcloud сам ведёт историю версий этого файла, доступную и вам, и клиенту через иконку «История» рядом с файлом.

Дневник прогресса через приложение Tables

Для истории тренировок — веса, повторения, самочувствие — удобнее не таскать эксель-файл туда-обратно, а использовать встроенное приложение Nextcloud Tables (доступно как отдельное приложение из магазина приложений Nextcloud, устанавливается через тот же интерфейс администратора). Это упрощённая табличная база данных с веб-интерфейсом: вы создаёте таблицу с колонками «Дата», «Упражнение», «Вес», «Повторения», «Самочувствие», и клиент заполняет строки после каждой тренировки прямо с телефона, без установки специального приложения — только браузер.

Практический плюс такого подхода в сравнении с обычным файлом-таблицей: клиент не может случайно стереть чужие данные или сломать формулу, потому что структура таблицы задана вами, а не свободным листом Excel. Вы же в любой момент видите всю историю по клиенту одним взглядом, без необходимости прокручивать переписку в поисках «а какой был вес на прошлой неделе».

Если у вас клиентов немного и Tables кажется избыточным, тот же результат частично закрывает обычный текстовый файл в формате markdown с построчными записями по датам — Nextcloud его тоже версионирует, и это в разы лучше, чем ничего. Начните с простого — усложнить структуру всегда можно позже, когда станет понятно, чего конкретно не хватает.

Доступ, безопасность и то, что часто упускают

Кабинет с персональными данными о здоровье клиента — это не просто удобство, а зона ответственности. Несколько вещей, которые стоит настроить сразу, а не «когда-нибудь потом»:

  • Отдельный пользователь на каждого клиента, никаких общих логинов «на всех» — это не только про безопасность, но и про то, что при уходе клиента вы просто отключаете один аккаунт, не трогая остальных.
  • Двухфакторная аутентификация для собственного аккаунта администратора обязательна — именно ваш логин открывает доступ ко всем кабинетам сразу, и его компрометация страшнее утечки данных одного клиента.
  • HTTPS без исключений — программа тренировок и данные о весе тела не должны идти открытым текстом даже теоретически, тем более если клиент заходит с кабинета в кафе по общественному Wi-Fi.
  • Регулярный бэкап базы и файлового хранилища вне самого сервера — если сервер выйдет из строя, вы не хотите объяснять двадцати клиентам, что их история тренировок пропала. Настройка резервного копирования достаточно проста и один раз настроенная больше не требует внимания.
  • Явное согласие клиента на хранение данных о его здоровье в такой форме — простое сообщение с объяснением, что и где хранится, снимает большинство вопросов и создаёт правильную рамку доверия с самого начала.

Отдельно стоит сказать про масштаб: если вы ведёте пять клиентов, отдельная виртуальная машина под это может показаться избыточной тратой. На практике Nextcloud с несколькими группами и умеренным объёмом файлов (программы в PDF, немного видео) комфортно работает и на минимальной конфигурации — сервер для этой задачи не требует топовых мощностей, это в первую очередь про организацию, а не про производительность.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

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

Обязательно ли использовать именно Nextcloud, или можно проще?

Нет, не обязательно — для совсем небольшого числа клиентов подойдёт и структура из статических HTML-страниц с базовой авторизацией через nginx, где для каждого клиента отдельная директория с паролем. Это менее гибко (нет версионирования из коробки, нет удобной формы для внесения прогресса с телефона), но проще в администрировании, если вы совсем не хотите разбираться с Docker.

Клиент боится технической сложности — не отпугнёт ли его отдельный сайт вместо привычного мессенджера?

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

Что если у меня уже пятьдесят клиентов — это всё ещё вручную создавать пользователей и папки?

Ручное создание оправдано примерно до нескольких десятков активных клиентов. При большем масштабе стоит автоматизировать через occ в связке с простым bash-скриптом или через API Nextcloud, который принимает данные нового клиента и сам создаёт пользователя, группу и структуру папок по шаблону — это уже отдельная, но несложная задача для разового найма фрилансера.

А если клиент перестал платить — как быстро закрыть ему доступ?

Одной командой occ user:disable имя_пользователя — аккаунт блокируется мгновенно, данные остаются в системе на случай, если клиент вернётся, а сам он теряет доступ сразу же, без необходимости что-либо удалять или переносить.

Нужно ли переносить туда общение с клиентом целиком, отказываясь от мессенджера?

Нет и не стоит пытаться — оперативные вопросы, голосовые с разбором техники, короткие «как самочувствие сегодня» органичнее живут в привычном мессенджере. Кабинет забирает на себя только то, что должно быть структурировано и не потеряться: программу, историю, материалы.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →