Блог

Заметки о разработке и продуктах

Практика из наших проектов: архитектура, оценки, интеграции и поддержка.

Синхронизация ролевой модели между окружениями: как мы избавились от «работает только на проде»

Синхронизация ролевой модели между окружениями: как мы избавились от «работает только на проде»

На проекте было три окружения: тест, препрод и прод. Ролевую модель вели поддержка и менеджеры только на проде — остальные окружения оставались с неполной моделью. В итоге повторить некоторые сценарии на тесте или препроде было невозможно. Мы построили систему синхронизации: добавляем и удаляем сущности, ставим флаги игнорирования, синхронизируем только из прода, запускаем по cron и по кнопке из админки, сверяем по slug. Ролевая модель теперь успешно синхронизируется между окружениями.

Сервис документов для руководства: как мы построили защищённое файловое хранилище за 3 месяца

Сервис документов для руководства: как мы построили защищённое файловое хранилище за 3 месяца

Бизнес запросил сервис для учёта и обмена документами высшего руководства. Функционал — как у Google Drive: вложенные папки, обмен доступом, поиск, избранное, корзина. Но с жёсткими требованиями по безопасности: шифрование файлов, сессия на 1 час, авторизация через наш сервис. Мы выбрали Laravel, PostgreSQL и DocumentDB (позже MongoDB) для хэшей, подключили WebSockets для real-time. Проект сдали в срок — бизнес успешно пользуется.

Неудачный опыт с SAML: как мы полтора месяца разрабатывали решение, которое пришлось отключить

Неудачный опыт с SAML: как мы полтора месяца разрабатывали решение, которое пришлось отключить

У компании был портал на Active Directory с входом по логину и паролю. Бизнес решил сделать единую сквозную авторизацию через SAML 2.0. Мы выбрали пакет aacotroneo/laravel-saml2, настроили обмен с Active Directory и запустились. Но выяснилось: пользователям приходится проходить две авторизации — сначала в нашем сервисе, затем на портале. Через неделю поступили жалобы от большинства сотрудников. Позже решение отключили. Рассказываем, почему так вышло и что мы вынесли из этого опыта.

Сквозная авторизация через OAuth 2.0: как мы объединили 6 сервисов на «1С-Битрикс»

Сквозная авторизация через OAuth 2.0: как мы объединили 6 сервисов на «1С-Битрикс»

На крупном проекте было 6 сервисов на «1С-Битрикс», у каждого — своя авторизация. Бизнес решил сделать единую точку входа на Laravel. Мы внедрили сквозную авторизацию через OAuth 2.0, создали технических пользователей для API-обменов, оптимизировали передачу больших объектов, а затем доработали механизм редиректов для гостевых сервисов и прямых ссылок на файлы. Клиент авторизуется один раз — и попадает в любой сервис без повторного входа.

Ролевая модель для мультисервисной структуры: от проверки по ролям к сетке доступов

Ролевая модель для мультисервисной структуры: от проверки по ролям к сетке доступов

В мультисервисном проекте авторизация в каждый сервис ограничивалась по роли пользователя. Количество ролей росло, и стало ясно: проверять нужно не по роли, а по доступам. Мы внедрили гибкую ролевую модель, где пользователь имеет роль и принадлежность к организации, роль — набор доступов по умолчанию, а для каждой организации можно выдать кастомные доступы. Затем создали интерфейс, через который бизнес сам управляет ролями, доступами и видит историю изменений с возможностью отката.

Как мы отстояли клиентов: история одного перехода между агрегаторами рассылок

Как мы отстояли клиентов: история одного перехода между агрегаторами рассылок

В процессе создания сервиса рассылок мы начинали с Mailchimp, затем перешли на DashaMail. Когда бизнес попросил перейти на внутренний агрегатор, мы провели анализ и выявили критичные ограничения: нет API, нет вебхуков статусов, не выдерживает нагрузку. Мы предложили компромисс — использовать внутренний агрегатор только для инфраструктурных писем, а клиентские оставить на внешнем. Сервис стал мультиагрегаторным.

Сервис рассылок на Laravel: как мы объединили отправку email и SMS для всех внутренних сервисов

Сервис рассылок на Laravel: как мы объединили отправку email и SMS для всех внутренних сервисов

В крупном проекте каждый сервис отправлял email и SMS по-своему: дублирование кода, отсутствие дашборда статусов, долгие доработки. Мы спроектировали единый сервис рассылок на Laravel и RabbitMQ из трёх решений — дашборд, API и отправитель. Провайдеры подключаются один раз, статусы видны через вебхуки агрегаторов, а команда больше не тратит время на дублирующиеся интеграции.

Асинхронная активация подарочных карт: продолжение истории

Асинхронная активация подарочных карт: продолжение истории

После автоматизации склада активность на сайте выросла. В пиковые дни количество активаций доходило до десятков тысяч в сутки. Синхронная активация начала давать сбои: задержки, дублирование запросов, ошибки в данных. Мы перевели активацию на асинхронную обработку через RabbitMQ и Laravel Jobs, увеличили количество воркеров и подключили WebSockets для мгновенного обновления баланса. Нагрузка снизилась, дубли исчезли, пользователь видит результат сразу.

Как мы автоматизировали склад подарочных карт: от Excel к системе с API для 1С

Как мы автоматизировали склад подарочных карт: от Excel к системе с API для 1С

Компания по продаже подарочных решений вела склад карт и промокодов в Excel. Обмен бонусов происходил вручную: клиент оставлял заявку, менеджер проверял активность карты и отправлял вознаграждение. Мы разработали на Laravel систему, которая заменила Excel на админ-панель: учёт карт, активация, бронирование, отчёты и API для 1С. Ручная работа сократилась до нуля — специалист переключился на более важные задачи.

Как мы отказались от Vue.js ради надёжности: история одного модуля авторизации

Как мы отказались от Vue.js ради надёжности: история одного модуля авторизации

Регулярные инциденты с зацикливанием авторизации заставили нас детально разобраться в проблеме. Причина оказалась неожиданной — старые устройства и браузеры пользователей в связке с корпоративным софтом безопасности начинали DDoS-ить сайт из-за особенностей Vue.js. Волевое решение: перевести сервис авторизации на максимально простой стек — HTML, CSS и нативный JavaScript без библиотек. После перехода проблема исчезла полностью.

ROSTU — экосистема для роста малого бизнеса

ROSTU — экосистема для роста малого бизнеса

ROSTU — белорусская SaaS-платформа, которая объединяет каталог для привлечения клиентов, CRM, виджет онлайн-записи, складской учёт и аналитику в одной системе. Базовый функционал — бесплатно. Без кассовых узлов и сложных интеграций. Подходит для салонов, СТО, ресторанов, магазинов, клиник и фитнес-клубов.

Как Vpodarok прошёл путь от монолита на Yii1 до сервисной архитектуры с собственным процессингом

Как Vpodarok прошёл путь от монолита на Yii1 до сервисной архитектуры с собственным процессингом

Проект Vpodarok начинался как обычный интернет-магазин подарочных сертификатов на Yii1. Со временем он превратился в экосистему с B2B-витринами, API и сложной бизнес-логикой. Рассказываем, как команда поэтапно вынесла ядро в отдельный сервис Processing, зачем понадобился Data Connector, и какие компромиссы пришлось принять при переходе к сервисной модели

Обсудим проект

Расскажите о задаче — оценим за пару дней

Контакты