История изменений
Технические изменения в Quickmock — фичи, фиксы, ужесточения безопасности. Источник правды — git-история; эта страница — собранный «человеко-читаемый» срез для разработчиков.
2026-08-22 — Go 1.27 и обновление CI
Изменено
- Бэкенд и production-образ теперь собираются на Go 1.27.0; полный набор тестов с race detector продолжает проходить на новом toolchain.
- GitHub Actions переведён на совместимые с Node.js 24 версии checkout и setup-go, а версия Go теперь читается прямо из
go.mod, чтобы CI и production не расходились.
2026-08-19 — Детерминированные сценарии, API-workspace и приватные логи
Добавлено
- Появились именованные варианты ответа: нужный edge case можно явно выбрать через
X-Quickmock-Variant или __quickmock_variant и стабильно воспроизводить в тестах.
- Упорядоченные условные правила выбирают вариант по методу, пути, query, заголовкам или JSON-телу запроса; доступны операторы
equals, not_equals, contains и exists.
- Один мок теперь может отдавать до 50 маршрутов method + path. В конструктор можно вставить OpenAPI 3.x в JSON или YAML, чтобы получить маршруты workspace и примеры ответов.
- Новые документация API и машиночитаемый контракт OpenAPI 3.1 описывают создание, варианты, правила, workspace и приватность инспектора.
Безопасность
- Логи запросов новых моков по умолчанию приватны. Admin-токен открывает ограниченную путём HttpOnly-сессию инспектора; сохранение тел запросов и IP отправителей можно отключить отдельно.
Изменено
- SEO/GEO-метаданные теперь публикуют взаимные языковые записи sitemap, включают страницу документации и актуальную дату обновления, а URL моков, workspace, шаринга и инспектора помечены как неиндексируемые.
2026-08-15 — Защита от злоупотреблений и безопасные ответы моков
Безопасность
- У fallback-поллинга инспектора запросов появился отдельный per-IP лимит: автоматические всплески ограничиваются, а обычные живые обновления продолжают работать.
- Ответ мока больше не может расширить область действия Service Worker, а редиректы принимают только относительные, HTTP- или HTTPS-адреса.
- Встроенный фильтр злоупотреблений теперь отклоняет типичные SSRF-примитивы, конфигурации исполняемых обработчиков и известные шаблоны backlink-страниц. В self-hosted установке также можно задать denylist IP/CIDR.
Исправлено
- Логи контейнеров теперь ротируются по умолчанию, а при штатной остановке закрытая очередь больше не порождает пустые записи журнала запросов.
2026-08-10 — Защита создания моков из браузера
Безопасность
- Создание мока с сайта — через форму на главной и кнопкой в один клик на странице шаблона — теперь отклоняется, если запрос инициировал в вашем браузере посторонний сайт. Программный доступ это не задевает:
curl, задачи CI и публичный API не шлют браузерных заголовков происхождения и работают ровно как раньше.
- У этих же двух действий появился собственный лимит запросов, отдельный от того, что обслуживает обращения к самим мокам, — сорвавшийся скрипт больше не израсходует вашу квоту активных моков.
Изменено
- Шапка больше не разъезжается на телефоне: с разделом Шаблоны шести ссылок стало слишком много для одной строки, поэтому ссылка на GitHub переехала в подвал к остальным ссылкам автора, а оставшаяся навигация переносится на свою строку вместо того, чтобы уезжать за край экрана.
- Для своего инстанса: сервер теперь предупреждает при старте о переменных окружения, оставшихся от старого префикса
MOCKAPI_. После переименования их никто не читает, так что до сих пор устаревший ключ молча оставлял значение по умолчанию — включая QUICKMOCK_BASE_URL, на который опирается новая проверка происхождения запроса.
2026-08-09 — Галерея готовых шаблонов моков
Добавлено
- Новый раздел /templates: десять готовых конфигураций моков в четырёх категориях (платежи, инструменты разработчика, авторизация и идентификация, общего назначения) — вебхуки Stripe и Shopify, push-события GitHub, хендшейк
url_verification из Slack, discovery для OAuth2/OIDC и JWKS, тела ошибок по RFC 9457 и другое.
- У каждого шаблона кнопка «Создать этот мок» создаёт его в один клик, а ссылка «Открыть в конструкторе моков и сначала поправить» открывает ту же конфигурацию в обычной форме мока, где можно подправить поля, заголовки или код ответа перед сохранением.
- На каждой странице шаблона разобраны ключевые поля payload'а и честно перечислены отличия мока от настоящего сервиса, который он имитирует — без выдавания статичного мока за настоящий API.
Исправлено
- Баннер «вы упёрлись в лимит активных моков» на главной странице показывал лимит размера тела запроса вместо реального лимита количества моков, да ещё с мусорным хвостом
%!(EXTRA int=…). Теперь показывает верное число без лишнего хвоста.
2026-07-26 — Потолок TTL, продление мока, выгрузка логов
Добавлено
- Срок жизни мока теперь ограничен:
ttl_seconds не может превышать 30 дней (настраивается на сервере) — ни при создании, ни при последующем изменении.
- На странице мока появилась кнопка «Продлить» — она отодвигает срок истечения дальше, но не больше чем на те же 30 дней от даты создания мока; требует admin-токен, как и редактирование или удаление мока.
- В шаблонах тела ответа появились четыре новых токена:
{{random.pick:a|b|c}} выбирает один вариант на каждое обращение, {{seq}} считает обращения, плюс {{faker.price}} и {{faker.lorem}}.
- Инспектор запросов теперь фильтруется по HTTP-методу, а ссылка «Скачать JSON» выгружает полную историю захваченных запросов и ответов (включая IP отправителей) — требует admin-токен, в отличие от экспорта конфига.
2026-07-17 — Admin-токен для мока
Добавлено
- Теперь при создании мока в ответе приходит одноразовый admin-токен — он показывается один раз, в баннере на странице мока с кнопкой копирования; сохрани его, второй раз он не покажется.
- Редактирование мока, удаление или очистка его логов теперь требуют этот токен: передавай его в заголовке
Authorization: Bearer <токен>. Чтение мока, его логов и живой инспектор по-прежнему работают только по slug, без токена.
- Моки, созданные до этого релиза, продолжают работать без токена до истечения срока. Новый гайд: Управляй моками с любого устройства.
2026-07-05 — Живой инспектор, экспорт и импорт, антиспам
Добавлено
- Инспектор запросов работает через Server-Sent Events: новые запросы появляются мгновенно, без поллинга; там, где SSE недоступен, страница автоматически возвращается к поллингу.
- Конфиг мока можно выгрузить в JSON со страницы мока (без логов и IP) и импортировать на форме создания — из файла или вставкой текста, целиком в браузере. Формат совпадает с
POST /api/mocks, так что экспорт можно проиграть через API.
- Антиспам-фильтр блокирует создание мошеннических моков. Встроенный список паттернов можно заменить (
QUICKMOCK_SPAM_PATTERNS_FILE), выключить или добавить IP в список исключений (QUICKMOCK_SPAM_ALLOW_IPS).
2026-06-19 — Переключатель CORS
Добавлено
- Один чекбокс на форме создания включает разрешающий CORS-пресет без credentials (
Access-Control-Allow-Origin: * и др.) и отвечает на preflight OPTIONS кодом 204 — вызывайте мок из браузерного JS с любого origin, без прокси.
- Новый гайд: Замокать API с CORS.
2026-06-13 — Гайды по сценариям
Добавлено
- Новый раздел /guide: сценарные лендинги под частые задачи — замокать REST API, протестировать ретраи, имитировать нестабильный или медленный API, ловить вебхуки, отдавать фейковые данные, отразить запрос. На каждой странице готовый curl-пример; все они в sitemap.
- На каждом гайде теперь есть кнопка копировать у curl-примеров и CTA Создать мок в один клик: она открывает форму на главной, заранее заполненную конфигом этого рецепта — метод, тело, задержка, доля ошибок, последовательность — остаётся отправить.
2026-06-11 — Симуляция нестабильного API
Добавлено
- Последовательности ответов: мок может хранить упорядоченный список до 10 дополнительных ответов (у каждого свои статус, тело и заголовки), отдаваемых по кругу — 1-й вызов → основной ответ, 2-й → шаг 2, … затем заново. Классический тест retry-логики. Позиция — общий для мока счётчик (Redis, с запасным вариантом в памяти процесса), так что все вызывающие двигаются по одной последовательности.
- Доля ошибок и джиттер задержки: настраиваемая доля запросов (0–100%, бросок на каждый запрос) может отвечать альтернативным статусом/телом, а задержку можно задать диапазоном мин–макс для случайного разброса вместо фиксированного значения. Все три настройки сочетаются, а новый заголовок ответа
X-Mockapi-Variant (default, error или seq-i/n) показывает, какая ветка обслужила вызов. Настраивается в форме создания (новая секция «Симуляция нестабильности») и через API.
- Блок «Кто это сделал» на главной теперь ссылается на личный сайт автора (deadsquirrel.dev), с учётом языка локали.
2026-06-10 — Эхо-токены запроса
Добавлено
- Новые динамические токены
request.* возвращают части входящего запроса прямо в тело ответа: {{request.method}}, {{request.path}}, {{request.ip}}, {{request.query.id}}, {{request.header.x-request-id}}, {{request.body}} и JSON-пути через точку вроде {{request.body.user.name}}. Значения вставляются как есть, ничего дополнительно не сохраняется — статический мок теперь может отвечать данными из самого запроса.
Исправлено
- Запись от 2026-05-20 ниже показывала Go-template экранирование (
{{`…`}}) вокруг каждого токена вместо самого токена — след копирования разметки из HTML-шаблона. Теперь отображается обычный {{faker.uuid}} и компания.
2026-06-08 — Ссылка на автора
Добавлено
- Имя автора в подвале теперь ведёт на личный сайт мейнтейнера (deadsquirrel.dev) — с языковым маппингом под локаль и атрибутом
rel="me" как identity-сигналом.
2026-05-25 — Контент на главной
Добавлено
- Сама эта /changelog страница, на EN и RU, с hreflang и записью в
sitemap.xml.
- На главной — секция Краткий глоссарий (Mock API, Эндпоинт, TTL, Faker-токен, Content-Type) для тех, кто пришёл сюда без контекста.
- На главной — блок Кто это сделал с био автора и прямыми ссылками на GitHub, LinkedIn, Telegram; плюс секция Зачем я это сделал с историей создания — чтобы страница не выглядела «безымянной утилитой».
- Видимая отметка Обновлено внизу главной;
dateModified продублирован в WebApplication JSON-LD, чтобы AI-краулеры видели свежесть.
Исправлено
?lang=<code> в URL теперь действительно отдаёт указанный язык. Раньше canonical / hreflang ссылались на ?lang=ru, но резолвер читал только cookie и Accept-Language, поэтому бот, идущий по hreflang, видел английский контент — мультиязычный сигнал был обманом.
Безопасность
- Усиление origin для
/m/*: публичный mock-router теперь вырезает заголовки, через которые злоумышленник мог запутать downstream-прокси; slug-и стали длиннее (больше энтропии); внутренние сообщения об ошибках редактируются перед отдачей наружу — никаких фрагментов DSN, никаких стек-фреймов.
- Переключение языка (
POST /language) теперь принимает same-origin абсолютные Referer-ы — редирект «обратно» работает за reverse-прокси, которые переписывают Referer. Cross-origin Referer-ы по-прежнему отбрасываются.
Исправлено
- Middleware RealIP теперь доверяет
X-Forwarded-For / X-Real-IP, когда непосредственный peer — loopback или private / link-local адрес. Раньше XFF принимался только от loopback, поэтому за Docker Compose все запросы атрибутировались bridge-шлюзу (например, 172.18.0.1) — creator_ip и request_ip становились бесполезными, а лимит «50 моков на IP» превращался в глобальный.
- Mock router теперь сохраняет ключи входящих заголовков в нижнем регистре, чтобы
request_headers->>'user-agent' работал независимо от регистра в проводе.
- UI: примеры slug-ов обновлены на новый 12-символьный формат; кнопка «Copy URL» на странице мока починена.
2026-05-21 — Дисклеймер UGC
Добавлено
- Дисклеймер в подвале и модалка с условиями использования: содержимое моков — UGC, явно перечислены запрещённые категории (вредоносное ПО, фишинг, CSAM, инфраструктура для атак), опубликован канал для жалоб.
- Модалка в футере остаётся юзабельной на маленьких экранах — кнопка закрытия больше не уезжает за край на мобильных.
2026-05-20 — Динамические токены
Добавлено
- Подстановка faker / now токенов в теле ответа:
{{faker.uuid}}, {{faker.email}}, {{faker.name}}, {{now.iso8601}} и ещё 18 других (люди, ID, сеть, текст, время). Мок хранит шаблон как есть и подставляет свежие случайные значения на каждый запрос — один мок отдаёт разные данные в разных вызовах. Полный список — в разделе Динамические токены на форме создания.
2026-05-18 — Усиление и удобство
Исправлено
- Docker Compose деплой теперь ждёт
--wait healthcheck вместо опроса /healthz в shell-цикле — деплои больше не печатают косметический curl: (52) Empty reply в момент, когда прокси и Go-процесс заканчивают «гонку».
- Пример
POSTGRES_PASSWORD в .env.example теперь предупреждает против base64 — pgx DSN-парсер ломается на + / = в пароле.
2026-05-17 — Первый публичный релиз
Добавлено
- Ядро mock-движка: создание, просмотр, редактирование, удаление; все HTTP-методы, включая
ANY.
- Публичный роутер
/m/:slug с настраиваемыми статусом, телом, заголовками, задержкой ответа (0–30 с) и TTL.
- Живой инспектор запросов: HTMX-опрос раз в 2 секунды, счётчик попаданий, очистка лога.
- Импорт из cURL — вставь команду
curl …, и форма создания заполнится сама.
- Сниппеты кода на странице мока для JavaScript, Python, Go, PHP.
- Превью только для чтения по
/share/:slug с Open Graph тегами.
- Per-IP rate limit (5000 хитов / 8 часов) и потолок активных моков на IP (50).
- Максимальный размер тела ответа — 512 КБ, обеспечивается handler-ом и DB
CHECK-констрейнтом.
- Docker Compose стек (app + Postgres + Redis + one-shot миграционный контейнер) и bare-metal путь через systemd.
- EN + RU локализация, переключатель языка (cookie + Accept-Language).
- Privacy by design: никакого стороннего JS, никакой аналитики, никакого CDN-шрифтов; CI это проверяет на каждом билде.
Полная git-история на GitHub →
← На главную