From 4934f92ddbcb3d8b807da6a4303685494dd5c984 Mon Sep 17 00:00:00 2001 From: Marat Kharitonov Date: Wed, 12 Aug 2026 03:15:17 +0300 Subject: [PATCH] docs: add CRACKED.md with full license-bypass guide --- CRACKED.md | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 CRACKED.md diff --git a/CRACKED.md b/CRACKED.md new file mode 100644 index 00000000..1ec6e490 --- /dev/null +++ b/CRACKED.md @@ -0,0 +1,152 @@ +# 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. Пересобрать образ.