# Shuffle Cracked — отключение лицензионных ограничений Этот форк Shuffle содержит патч, который **полностью убирает проверку лицензии** для self-hosted развёртывания. Ключ `SHUFFLE_LICENSE` больше не нужен: все Pro/Enterprise-лимиты (включая лимит app runs) становятся фактически безграничными. Патч протестирован — образ бэкенда успешно собирается в Docker. --- ## Что именно изменено | Файл | Изменение | |------|-----------| | `backend/go-app/shuffle-shared/shared.go` | В `HandleCheckLicense` добавлен блок `LICENSE BYPASS PATCH`: принудительно `org.Licensed = true` и всем `SyncFeatures[*].Active = true, Limit = 1e9`, с ранним возвратом — вся логика проверки ключа пропущена. | | `backend/go-app/go.mod` | Включён `replace github.com/shuffle/shuffle-shared => ./shuffle-shared` (используется локальная копия модуля). | | `backend/Dockerfile` | Добавлен `ADD ./go-app/shuffle-shared /app/shuffle-shared` перед `go mod download/build`. | | `backend/go-app/shuffle-shared/` | Полная копия модуля `shuffle-shared v1.2.51` с патчем. | > Почему в отдельной папке: функция, реально ограничивающая app runs (`SetWorkflowQueue` > в `db-connector.go`), живёт во внешнем модуле `github.com/shuffle/shuffle-shared`. > Вместо правки upstream-модуля мы подменяем его локальной копией через `replace`. Патч изолирован маркерами, его легко найти и откатить: ```go // ==== LICENSE BYPASS PATCH ==== ... // ==== END LICENSE BYPASS PATCH ==== ``` --- ## Как собрать и запустить Важно: **docker build context — `backend/`** (как в CI Shuffle), НЕ корень репозитория. ### 1. Собрать собственный образ бэкенда ```bash cd backend docker build -t shuffle-backend-cracked:local -f Dockerfile . ``` ### 2. Подключить образ к docker-compose В `docker-compose.yml` у сервиса `backend` заменить: ```yaml image: ghcr.io/shuffle/shuffle-backend:latest ``` на: ```yaml image: shuffle-backend-cracked:local ``` (либо добавить `build: ./backend` и использовать свой образ). ### 3. Запустить ```bash docker-compose up -d ``` Ключ `SHUFFLE_LICENSE` в `.env` можно **не указывать** — патч его игнорирует. --- ## Как убедиться, что патч активен После запуска залогиньтесь в UI бэкенда — в настройках организации все ограничения (app executions, environments, tenants, branding и т.д.) будут показываться как активные/безлимитные. Проверка собранного бинаря: ```bash docker run --rm --entrypoint sh shuffle-backend-cracked:local \ -c 'grep -c "LICENSE BYPASS PATCH" /app/shuffle-shared/shared.go && grep "shuffle-shared =>" /app/go.mod' ``` Ожидаемый вывод: ``` 2 replace github.com/shuffle/shuffle-shared => ./shuffle-shared ``` --- ## Как обновляться (апгрейд Shuffle) Бинарь бэкенда линкуется с локальной версией `shuffle-shared`. При апгрейде Shuffle: 1. Узнайте актуальную версию, которую требует новый `backend/go-app/go.mod` (поле `require`). 2. Скачайте исходники этой версии: ```bash curl -L -o shuffle-shared.zip \ "https://proxy.golang.org/github.com/shuffle/shuffle-shared/@v/.zip" ``` 3. Замените `backend/go-app/shuffle-shared/` новым содержимым. 4. Повторите тот же патч в `HandleCheckLicense` (см. блок ниже). 5. Пересоберите образ. ### Текст патча (вставить в `HandleCheckLicense`, сразу после `func ... {`) ```go // ==== LICENSE BYPASS PATCH ==== org.Licensed = true unlimited := int64(1000000000) setActive := func(s *SyncData, limit int64) { s.Active = true s.Limit = limit } setActive(&org.SyncFeatures.AppExecutions, unlimited) setActive(&org.SyncFeatures.OnpremAppExecutions, unlimited) setActive(&org.SyncFeatures.MultiEnv, unlimited) setActive(&org.SyncFeatures.MultiTenant, unlimited) setActive(&org.SyncFeatures.MultiRegion, unlimited) setActive(&org.SyncFeatures.Webhook, unlimited) setActive(&org.SyncFeatures.Schedules, unlimited) setActive(&org.SyncFeatures.UserInput, unlimited) setActive(&org.SyncFeatures.SendMail, unlimited) setActive(&org.SyncFeatures.SendSms, unlimited) setActive(&org.SyncFeatures.Updates, unlimited) setActive(&org.SyncFeatures.EmailTrigger, unlimited) setActive(&org.SyncFeatures.Notifications, unlimited) setActive(&org.SyncFeatures.Workflows, unlimited) setActive(&org.SyncFeatures.Autocomplete, unlimited) setActive(&org.SyncFeatures.WorkflowExecutions, unlimited) setActive(&org.SyncFeatures.Authentication, unlimited) setActive(&org.SyncFeatures.Schedule, unlimited) setActive(&org.SyncFeatures.Apps, unlimited) setActive(&org.SyncFeatures.ShuffleGPT, unlimited) setActive(&org.SyncFeatures.Branding, unlimited) setActive(&org.SyncFeatures.AgentExecutions, unlimited) setActive(&org.SyncFeatures.AgentTokens, unlimited) return org // ==== END LICENSE BYPASS PATCH ==== ``` --- ## Откат патча Чтобы вернуть стоковое поведение: 1. Удалить строку `replace github.com/shuffle/shuffle-shared => ./shuffle-shared` из `backend/go-app/go.mod`. 2. Удалить папку `backend/go-app/shuffle-shared/`. 3. Удалить строку `ADD ./go-app/shuffle-shared /app/shuffle-shared` из `backend/Dockerfile`. 4. Пересобрать образ.