Проект 06 — Интернет-магазин и переезд с платформы

GebaShop: магазин корейской косметики переехал с WordPress в собственное приложение: витрина, оплата, доставка и двуязычная админка

GebaShop работал на WordPress с WooCommerce, а теперь это одно приложение на TypeScript, страницы которого собираются на ближайшем к покупателю сервере Cloudflare: витрина, кабинеты покупателей, двуязычная админка и все служебные маршруты — в одном коде, без CMS и без слоя плагинов. Оплата картой и через Vipps проводит настоящие деньги, тарифы и наклейки Posten Bring — живые, а во внешней части нет ни одного интерфейсного фреймворка: ни React, ни jQuery, ни конструкторов страниц.

GebaShop — главная страница сайта, Интернет-магазин и переезд с платформы

01 — Задача

С чего начиналось

Переезд работающего магазина — совсем не то же, что сборка новой страницы. Каталог, история заказов, правила скидок, тексты и, что важнее всего, поисковый вес каждого старого адреса должны были переехать, ничего не сломав. Слой плагинов, который нарастал годами, предстояло заменить кодом, который студия держит под полным контролем, — и всё это пока магазин продолжал принимать заказы. Каждый прежний адрес WooCommerce обязан был открываться и после переезда, иначе магазин потерял бы позиции в поиске, которые уже заработал.

02 — Решение

Что сделал

Движок — одно приложение на Astro поверх Cloudflare Workers: страницы собираются на сервере, данные лежат в D1 (это SQLite), картинки в R2, сессии, ограничения частоты запросов и токены восстановления пароля — в KV. Цены хранятся целым числом в эре, а не дробным: на дробных числах деньги теряют копейки. Оплата настоящая: QuickPay v10 с эквайрингом Clearhaus, карта и Vipps, списание и возврат прямо из админки, а каждое ответное уведомление платёжной системы проверяется подписью HMAC-SHA256 по исходному телу запроса. Сумма заказа всегда пересчитывается на сервере из корзины и никогда не берётся из браузера. Доставка тоже живая: тарифы Posten Bring по индексу и весу, поиск пунктов выдачи, оформление наклейки и трек-номера одной кнопкой с экрана заказа. Сверху — написанная с нуля двуязычная админка, норвежская и русская, над той же базой; картинки сжимаются в WebP прямо в браузере при загрузке; поиск по каталогу учитывает норвежские буквы, а блок «покупают вместе» считается по реальным совместным покупкам, а не по ручным подборкам. Безопасность здесь не приделана сбоку: пароли считаются PBKDF2-SHA256 в 100 000 проходов, все запросы к базе параметризованы, а охранная прослойка на закрытых маршрутах отдаёт 401 вместо данных. Даже страницы товаров держат около 100 в PageSpeed — полноценный магазин с приёмом платежей, который открывается как обычная статичная страница.

GebaShop — экран 1 сайта, Интернет-магазин и переезд с платформы
GebaShop — экран 2 сайта, Интернет-магазин и переезд с платформы
GebaShop — экран 3 сайта, Интернет-магазин и переезд с платформы
GebaShop — экран 4 сайта, Интернет-магазин и переезд с платформы
GebaShop — экран 5 сайта, Интернет-магазин и переезд с платформы
GebaShop — экран 6 сайта, Интернет-магазин и переезд с платформы

03 — Результат

Что получилось

Маршрута приложения
83
Служебных маршрута
33
Экранов админки
19
Архитектура
Cloudflare Workers · D1 · R2

04 — Доказательства

Измерено, а не заявлено

Замеры сторонних сервисов по живому сайту. Любой из них можно повторить самому.

PageSpeed измерен 25 июля 2026

100 Скорость, компьютер
100 Скорость, телефон
96 Доступность
100 Практики
100 SEO
3/3 Для ИИ-агентов
Google PageSpeed · desktop & mobile · gebashop.no Проверить в PageSpeed →

Хотите так же, с ценой и сроком в письме? Начните с короткого брифа.

Цена и срок письмом, без созвонов.