История изменений

Технические изменения в 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, видел английский контент — мультиязычный сигнал был обманом.

2026-05-23

Безопасность

  • Усиление 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 →

← На главную